@@ -31,7 +31,7 @@ import (
3131 "github.com/shadowy-pycoder/mshark/arpspoof"
3232 "github.com/shadowy-pycoder/mshark/layers"
3333 "github.com/shadowy-pycoder/mshark/network"
34- "golang.org/x/net/proxy "
34+ "github.com/wzshiming/socks5 "
3535)
3636
3737const (
@@ -127,7 +127,7 @@ type proxyapp struct {
127127 httpServer * http.Server
128128 sockClient * http.Client
129129 httpClient * http.Client
130- sockDialer proxy .Dialer
130+ sockDialer * socks5 .Dialer
131131 logger * zerolog.Logger
132132 snifflogger * zerolog.Logger
133133 certFile string
@@ -390,19 +390,19 @@ func New(conf *Config) *proxyapp {
390390 if err != nil {
391391 p .logger .Fatal ().Err (err ).Msg ("" )
392392 }
393- auth := proxy. Auth {
393+ auth := Auth {
394394 User : conf .User ,
395395 Password : conf .Pass ,
396396 }
397- dialer , err := proxy . SOCKS5 ( "tcp" , addrSOCKS , & auth , getBaseDialer (timeout , p .mark ))
397+ dialer , err := newSOCKS5Dialer ( addrSOCKS , & auth , getBaseDialer (timeout , p .mark ))
398398 if err != nil {
399399 p .logger .Fatal ().Err (err ).Msg ("Unable to create SOCKS5 dialer" )
400400 }
401401 p .sockDialer = dialer
402402 if ! tproxyonly {
403403 p .sockClient = & http.Client {
404404 Transport : & http.Transport {
405- Dial : dialer .Dial ,
405+ DialContext : dialer .DialContext ,
406406 },
407407 CheckRedirect : func (req * http.Request , via []* http.Request ) error {
408408 return http .ErrUseLastResponse
@@ -764,7 +764,7 @@ func (p *proxyapp) handleTunnel(w http.ResponseWriter, r *http.Request) {
764764 }
765765 ctx , cancel := context .WithTimeout (context .Background (), timeout )
766766 defer cancel ()
767- dstConn , err = sockDialer .(proxy. ContextDialer ). DialContext (ctx , "tcp" , r .Host )
767+ dstConn , err = sockDialer .DialContext (ctx , "tcp" , r .Host )
768768 if err != nil {
769769 p .logger .Error ().Err (err ).Msgf ("Failed connecting to %s" , r .Host )
770770 http .Error (w , err .Error (), http .StatusServiceUnavailable )
@@ -849,26 +849,25 @@ func (p *proxyapp) updateSocksList() {
849849 p .mu .Lock ()
850850 defer p .mu .Unlock ()
851851 p .availProxyList = p .availProxyList [:0 ]
852- var base proxy.Dialer = getBaseDialer (timeout , p .mark )
853- var dialer proxy.Dialer
852+ var dialer * socks5.Dialer
854853 var err error
855854 failed := 0
856855 chainType := p .proxychain .Type
857856 ctl := colorizeChainType (chainType , p .nocolor )
858857 for _ , pr := range p .proxylist {
859- auth := proxy. Auth {
858+ auth := Auth {
860859 User : pr .Username ,
861860 Password : pr .Password ,
862861 }
863- dialer , err = proxy . SOCKS5 ( "tcp" , pr .Address , & auth , base )
862+ dialer , err = newSOCKS5Dialer ( pr .Address , & auth , getBaseDialer ( timeout , p . mark ) )
864863 if err != nil {
865864 p .logger .Error ().Err (err ).Msgf ("%s Unable to create SOCKS5 dialer %s" , ctl , pr .Address )
866865 failed ++
867866 continue
868867 }
869868 ctx , cancel := context .WithTimeout (context .Background (), hopTimeout )
870869 defer cancel ()
871- conn , err := dialer .(proxy. ContextDialer ). DialContext (ctx , "tcp" , pr .Address )
870+ conn , err := dialer .DialContext (ctx , "tcp" , pr .Address )
872871 if err != nil && ! errors .Is (err , io .EOF ) { // check for EOF to include localhost SOCKS5 in the chain
873872 p .logger .Error ().Err (err ).Msgf ("%s Unable to connect to %s" , ctl , pr .Address )
874873 failed ++
@@ -890,19 +889,19 @@ func (p *proxyapp) updateSocksList() {
890889 }
891890 currentDialer := dialer
892891 for _ , pr := range p .proxylist [failed + 1 :] {
893- auth := proxy. Auth {
892+ auth := Auth {
894893 User : pr .Username ,
895894 Password : pr .Password ,
896895 }
897- dialer , err = proxy . SOCKS5 ( "tcp" , pr .Address , & auth , currentDialer )
896+ dialer , err = newSOCKS5Dialer ( pr .Address , & auth , currentDialer )
898897 if err != nil {
899898 p .logger .Error ().Err (err ).Msgf ("%s Unable to create SOCKS5 dialer %s" , ctl , pr .Address )
900899 continue
901900 }
902901 // https://github.com/golang/go/issues/37549#issuecomment-1178745487
903902 ctx , cancel := context .WithTimeout (context .Background (), hopTimeout )
904903 defer cancel ()
905- conn , err := dialer .(proxy. ContextDialer ). DialContext (ctx , "tcp" , pr .Address )
904+ conn , err := dialer .DialContext (ctx , "tcp" , pr .Address )
906905 if err != nil {
907906 p .logger .Error ().Err (err ).Msgf ("%s Unable to connect to %s" , ctl , pr .Address )
908907 if conn != nil {
@@ -929,7 +928,7 @@ func shuffle(vals []proxyEntry) {
929928 }
930929}
931930
932- func (p * proxyapp ) getSocks () (proxy .Dialer , * http.Client , error ) {
931+ func (p * proxyapp ) getSocks () (* socks5 .Dialer , * http.Client , error ) {
933932 if p .proxylist == nil {
934933 return p .sockDialer , p .sockClient , nil
935934 }
@@ -984,22 +983,26 @@ func (p *proxyapp) getSocks() (proxy.Dialer, *http.Client, error) {
984983 p .logger .Error ().Msgf ("%s Not all SOCKS5 Proxy available" , ctl )
985984 return nil , nil , fmt .Errorf ("not all socks5 proxy available" )
986985 }
987- var dialer proxy .Dialer = getBaseDialer ( timeout , p . mark )
986+ var dialer * socks5 .Dialer
988987 var err error
989- for _ , pr := range copyProxyList {
990- auth := proxy. Auth {
988+ for i , pr := range copyProxyList {
989+ auth := Auth {
991990 User : pr .Username ,
992991 Password : pr .Password ,
993992 }
994- dialer , err = proxy .SOCKS5 ("tcp" , pr .Address , & auth , dialer )
993+ if i > 0 {
994+ dialer , err = newSOCKS5Dialer (pr .Address , & auth , dialer )
995+ } else {
996+ dialer , err = newSOCKS5Dialer (pr .Address , & auth , getBaseDialer (timeout , p .mark ))
997+ }
995998 if err != nil {
996999 p .logger .Error ().Err (err ).Msgf ("%s Unable to create SOCKS5 dialer %s" , ctl , pr .Address )
9971000 return nil , nil , err
9981001 }
9991002 }
10001003 socks := & http.Client {
10011004 Transport : & http.Transport {
1002- Dial : dialer .Dial ,
1005+ DialContext : dialer .DialContext ,
10031006 },
10041007 CheckRedirect : func (req * http.Request , via []* http.Request ) error {
10051008 return http .ErrUseLastResponse
0 commit comments