diff --git a/go.mod b/go.mod index e90e97d..eee4434 100644 --- a/go.mod +++ b/go.mod @@ -18,7 +18,7 @@ require ( github.com/xtaci/kcp-go/v5 v5.6.1 golang.org/x/crypto v0.0.0-20210415154028-4f45737414dc golang.org/x/net v0.0.0-20210415231046-e915ea6b2b7d // indirect - golang.org/x/sys v0.0.0-20210415045647-66c3f260301c // indirect + golang.org/x/sys v0.0.0-20210419170143-37df388d1f33 // indirect ) // Replace dependency modules with local developing copy diff --git a/go.sum b/go.sum index 828980f..7f4db6e 100644 --- a/go.sum +++ b/go.sum @@ -154,8 +154,8 @@ golang.org/x/sys v0.0.0-20201101102859-da207088b7d1/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20201112073958-5cba982894dd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210415045647-66c3f260301c h1:6L+uOeS3OQt/f4eFHXZcTxeZrGCuz+CLElgEBjbcTA4= -golang.org/x/sys v0.0.0-20210415045647-66c3f260301c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210419170143-37df388d1f33 h1:zah5VTTvBlVRELjcDwGLLaWRHZJQsBtplweVYCii0KM= +golang.org/x/sys v0.0.0-20210419170143-37df388d1f33/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1 h1:v+OssWQX+hTHEmOBgwxdZxK4zHq3yOs8F9J7mk0PY8E= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= diff --git a/proxy/dialer.go b/proxy/dialer.go index 912c68a..57f1ac2 100644 --- a/proxy/dialer.go +++ b/proxy/dialer.go @@ -53,6 +53,10 @@ func DialerFromURL(s string, dialer Dialer) (Dialer, error) { return nil, errors.New("DialerFromURL: dialer cannot be nil") } + if !strings.Contains(s, "://") { + s = s + "://" + } + scheme := s[:strings.Index(s, ":")] c, ok := dialerCreators[strings.ToLower(scheme)] if ok { diff --git a/proxy/socks/socks.go b/proxy/protocol/socks/socks.go similarity index 100% rename from proxy/socks/socks.go rename to proxy/protocol/socks/socks.go diff --git a/proxy/socks5/client.go b/proxy/socks5/client.go index a452e17..ddc39ac 100644 --- a/proxy/socks5/client.go +++ b/proxy/socks5/client.go @@ -9,7 +9,7 @@ import ( "github.com/nadoo/glider/log" "github.com/nadoo/glider/pool" "github.com/nadoo/glider/proxy" - "github.com/nadoo/glider/proxy/socks" + "github.com/nadoo/glider/proxy/protocol/socks" ) // NewSocks5Dialer returns a socks5 proxy dialer. diff --git a/proxy/socks5/packet.go b/proxy/socks5/packet.go index 231fb21..0378af3 100644 --- a/proxy/socks5/packet.go +++ b/proxy/socks5/packet.go @@ -5,7 +5,7 @@ import ( "net" "github.com/nadoo/glider/pool" - "github.com/nadoo/glider/proxy/socks" + "github.com/nadoo/glider/proxy/protocol/socks" ) // PktConn . diff --git a/proxy/socks5/server.go b/proxy/socks5/server.go index 265c5a5..7a721c0 100644 --- a/proxy/socks5/server.go +++ b/proxy/socks5/server.go @@ -11,7 +11,7 @@ import ( "github.com/nadoo/glider/log" "github.com/nadoo/glider/pool" "github.com/nadoo/glider/proxy" - "github.com/nadoo/glider/proxy/socks" + "github.com/nadoo/glider/proxy/protocol/socks" ) // NewSocks5Server returns a socks5 proxy server. diff --git a/proxy/ss/client.go b/proxy/ss/client.go index b4b28a4..4996f77 100644 --- a/proxy/ss/client.go +++ b/proxy/ss/client.go @@ -6,7 +6,7 @@ import ( "github.com/nadoo/glider/log" "github.com/nadoo/glider/proxy" - "github.com/nadoo/glider/proxy/socks" + "github.com/nadoo/glider/proxy/protocol/socks" ) // NewSSDialer returns a ss proxy dialer. diff --git a/proxy/ss/packet.go b/proxy/ss/packet.go index 5e01289..416c4cb 100644 --- a/proxy/ss/packet.go +++ b/proxy/ss/packet.go @@ -5,7 +5,7 @@ import ( "net" "github.com/nadoo/glider/pool" - "github.com/nadoo/glider/proxy/socks" + "github.com/nadoo/glider/proxy/protocol/socks" ) // PktConn . diff --git a/proxy/ss/server.go b/proxy/ss/server.go index 4363caa..dec0181 100644 --- a/proxy/ss/server.go +++ b/proxy/ss/server.go @@ -9,7 +9,7 @@ import ( "github.com/nadoo/glider/log" "github.com/nadoo/glider/proxy" - "github.com/nadoo/glider/proxy/socks" + "github.com/nadoo/glider/proxy/protocol/socks" ) // NewSSServer returns a ss proxy server. diff --git a/proxy/ssh/ssh.go b/proxy/ssh/ssh.go index d4732ca..59ea7d3 100644 --- a/proxy/ssh/ssh.go +++ b/proxy/ssh/ssh.go @@ -17,7 +17,11 @@ type SSH struct { dialer proxy.Dialer proxy proxy.Proxy addr string - config *ssh.ClientConfig + + sshCfg *ssh.ClientConfig + sshConn ssh.Conn + sshChan <-chan ssh.NewChannel + sshReq <-chan *ssh.Request } func init() { @@ -58,14 +62,18 @@ func NewSSH(s string, d proxy.Dialer, p proxy.Proxy) (*SSH, error) { config.Auth = append(config.Auth, keyAuth) } - ssh := &SSH{ + t := &SSH{ dialer: d, proxy: p, addr: u.Host, - config: config, + sshCfg: config, } - return ssh, nil + if _, port, _ := net.SplitHostPort(t.addr); port == "" { + t.addr = net.JoinHostPort(t.addr, "22") + } + + return t, t.initConn() } // NewSSHDialer returns a ssh proxy dialer. @@ -81,21 +89,31 @@ func (s *SSH) Addr() string { return s.addr } -// Dial connects to the address addr on the network net via the proxy. -func (s *SSH) Dial(network, addr string) (net.Conn, error) { - c, err := s.dialer.Dial(network, s.addr) +func (s *SSH) initConn() error { + c, err := s.dialer.Dial("tcp", s.addr) if err != nil { log.F("[ssh]: dial to %s error: %s", s.addr, err) - return nil, err + return err } - sshc, ch, req, err := ssh.NewClientConn(c, s.addr, s.config) + s.sshConn, s.sshChan, s.sshReq, err = ssh.NewClientConn(c, s.addr, s.sshCfg) if err != nil { log.F("[ssh]: initial connection to %s error: %s", s.addr, err) - return nil, err + return err } - return ssh.NewClient(sshc, ch, req).Dial(network, addr) + return nil +} + +// Dial connects to the address addr on the network net via the proxy. +func (s *SSH) Dial(network, addr string) (c net.Conn, err error) { + c, err = ssh.NewClient(s.sshConn, s.sshChan, s.sshReq).Dial(network, addr) + if err != nil { + log.F("[ssh]: create conn to %s via %s error: %s, try again", addr, s.addr, err) + s.initConn() + c, err = ssh.NewClient(s.sshConn, s.sshChan, s.sshReq).Dial(network, addr) + } + return c, err } // DialUDP connects to the given address via the proxy. diff --git a/proxy/ssr/ssr.go b/proxy/ssr/ssr.go index 1c1a5b7..33ee3be 100644 --- a/proxy/ssr/ssr.go +++ b/proxy/ssr/ssr.go @@ -9,7 +9,7 @@ import ( "github.com/nadoo/glider/log" "github.com/nadoo/glider/proxy" - "github.com/nadoo/glider/proxy/socks" + "github.com/nadoo/glider/proxy/protocol/socks" "github.com/nadoo/glider/proxy/ssr/internal" "github.com/nadoo/glider/proxy/ssr/internal/cipher" diff --git a/proxy/trojan/client.go b/proxy/trojan/client.go index 31953b0..09d7606 100644 --- a/proxy/trojan/client.go +++ b/proxy/trojan/client.go @@ -7,7 +7,7 @@ import ( "github.com/nadoo/glider/log" "github.com/nadoo/glider/pool" "github.com/nadoo/glider/proxy" - "github.com/nadoo/glider/proxy/socks" + "github.com/nadoo/glider/proxy/protocol/socks" ) // NewClearTextDialer returns a trojan cleartext proxy dialer. diff --git a/proxy/trojan/packet.go b/proxy/trojan/packet.go index 559cdae..2e13af0 100644 --- a/proxy/trojan/packet.go +++ b/proxy/trojan/packet.go @@ -7,7 +7,7 @@ import ( "net" "github.com/nadoo/glider/pool" - "github.com/nadoo/glider/proxy/socks" + "github.com/nadoo/glider/proxy/protocol/socks" ) // PktConn is a udp Packet.Conn. diff --git a/proxy/trojan/server.go b/proxy/trojan/server.go index 4902a91..459ffbb 100644 --- a/proxy/trojan/server.go +++ b/proxy/trojan/server.go @@ -12,7 +12,7 @@ import ( "github.com/nadoo/glider/log" "github.com/nadoo/glider/pool" "github.com/nadoo/glider/proxy" - "github.com/nadoo/glider/proxy/socks" + "github.com/nadoo/glider/proxy/protocol/socks" ) // NewClearTextServer returns a trojan cleartext proxy server.