@@ -546,7 +546,7 @@ func (p *proxyapp) updateSocksList() {
546546 p .mu .Lock ()
547547 defer p .mu .Unlock ()
548548 p .availProxyList = p .availProxyList [:0 ]
549- var base proxy.Dialer = getBaseSockDialer (timeout , p .mark )
549+ var base proxy.Dialer = getBaseDialer (timeout , p .mark )
550550 var dialer proxy.Dialer
551551 var err error
552552 failed := 0
@@ -685,7 +685,7 @@ func (p *proxyapp) getSocks() (proxy.Dialer, *http.Client, error) {
685685 p .logger .Error ().Msgf ("%s Not all SOCKS5 Proxy available" , ctl )
686686 return nil , nil , fmt .Errorf ("not all socks5 proxy available" )
687687 }
688- var dialer proxy.Dialer = getBaseSockDialer (timeout , p .mark )
688+ var dialer proxy.Dialer = getBaseDialer (timeout , p .mark )
689689 var err error
690690 for _ , pr := range copyProxyList {
691691 auth := proxy.Auth {
@@ -890,7 +890,7 @@ func (p *proxyapp) handleTunnel(w http.ResponseWriter, r *http.Request) {
890890 var dstConn net.Conn
891891 var err error
892892 if isLocalAddress (r .Host ) {
893- dstConn , err = net . DialTimeout ("tcp" , r .Host , timeout )
893+ dstConn , err = getBaseDialer ( timeout , p . mark ). Dial ("tcp" , r .Host )
894894 if err != nil {
895895 p .logger .Error ().Err (err ).Msgf ("Failed connecting to %s" , r .Host )
896896 http .Error (w , err .Error (), http .StatusServiceUnavailable )
@@ -1156,80 +1156,83 @@ func (p *proxyapp) handler() http.HandlerFunc {
11561156}
11571157
11581158func (p * proxyapp ) applyRedirectRules () string {
1159- cmd0 := exec .Command ("bash" , "-c" , `
1159+ cmdClear := exec .Command ("bash" , "-c" , `
11601160 set -ex
11611161 iptables -t nat -D PREROUTING -p tcp -j GOHPTS 2>/dev/null || true
11621162 iptables -t nat -D OUTPUT -p tcp -j GOHPTS 2>/dev/null || true
11631163 iptables -t nat -F GOHPTS 2>/dev/null || true
11641164 iptables -t nat -X GOHPTS 2>/dev/null || true
11651165 ` )
1166- cmd0 .Stdout = os .Stdout
1167- cmd0 .Stderr = os .Stderr
1168- if err := cmd0 .Run (); err != nil {
1166+ cmdClear .Stdout = os .Stdout
1167+ cmdClear .Stderr = os .Stderr
1168+ if err := cmdClear .Run (); err != nil {
11691169 p .logger .Fatal ().Err (err ).Msg ("Failed while configuring iptables. Are you root?" )
11701170 }
1171- cmd1 := exec .Command ("bash" , "-c" , `
1171+ cmdInit := exec .Command ("bash" , "-c" , `
11721172 set -ex
11731173 iptables -t nat -N GOHPTS 2>/dev/null
11741174 iptables -t nat -F GOHPTS
11751175
11761176 iptables -t nat -A GOHPTS -d 127.0.0.0/8 -j RETURN
11771177 iptables -t nat -A GOHPTS -p tcp --dport 22 -j RETURN
11781178 ` )
1179- cmd1 .Stdout = os .Stdout
1180- cmd1 .Stderr = os .Stderr
1181- if err := cmd1 .Run (); err != nil {
1179+ cmdInit .Stdout = os .Stdout
1180+ cmdInit .Stderr = os .Stderr
1181+ if err := cmdInit .Run (); err != nil {
11821182 p .logger .Fatal ().Err (err ).Msg ("Failed while configuring iptables. Are you root?" )
11831183 }
1184+ if p .httpServerAddr != "" {
1185+ _ , httpPort , _ := net .SplitHostPort (p .httpServerAddr )
1186+ cmdHttp := exec .Command ("bash" , "-c" , fmt .Sprintf (`
1187+ set -ex
1188+ iptables -t nat -A GOHPTS -p tcp --dport %s -j RETURN
1189+ ` , httpPort ))
1190+ cmdHttp .Stdout = os .Stdout
1191+ cmdHttp .Stderr = os .Stderr
1192+ if err := cmdHttp .Run (); err != nil {
1193+ p .logger .Fatal ().Err (err ).Msg ("Failed while configuring iptables. Are you root?" )
1194+ }
1195+ }
11841196 _ , tproxyPort , _ := net .SplitHostPort (p .tproxyAddr )
11851197 if p .mark > 0 {
1186- cmd2 := exec .Command ("bash" , "-c" , fmt .Sprintf (`
1198+ cmdMark := exec .Command ("bash" , "-c" , fmt .Sprintf (`
11871199 set -ex
11881200 iptables -t nat -A GOHPTS -p tcp -m mark --mark %d -j RETURN
11891201 ` , p .mark ))
1190- cmd2 .Stdout = os .Stdout
1191- cmd2 .Stderr = os .Stderr
1192- if err := cmd2 .Run (); err != nil {
1202+ cmdMark .Stdout = os .Stdout
1203+ cmdMark .Stderr = os .Stderr
1204+ if err := cmdMark .Run (); err != nil {
11931205 p .logger .Fatal ().Err (err ).Msg ("Failed while configuring iptables. Are you root?" )
11941206 }
11951207 } else {
1196- cmd2 := exec .Command ("bash" , "-c" , fmt .Sprintf (`
1208+ cmd0 := exec .Command ("bash" , "-c" , fmt .Sprintf (`
11971209 set -ex
11981210 iptables -t nat -A GOHPTS -p tcp --dport %s -j RETURN
11991211 ` , tproxyPort ))
1200- cmd2 .Stdout = os .Stdout
1201- cmd2 .Stderr = os .Stderr
1202- if err := cmd2 .Run (); err != nil {
1212+ cmd0 .Stdout = os .Stdout
1213+ cmd0 .Stderr = os .Stderr
1214+ if err := cmd0 .Run (); err != nil {
12031215 p .logger .Fatal ().Err (err ).Msg ("Failed while configuring iptables. Are you root?" )
12041216 }
12051217 if len (p .proxylist ) > 0 {
12061218 for _ , pr := range p .proxylist {
12071219 _ , port , _ := net .SplitHostPort (pr .Address )
1208- cmd3 := exec .Command ("bash" , "-c" , fmt .Sprintf (`
1220+ cmd1 := exec .Command ("bash" , "-c" , fmt .Sprintf (`
12091221 set -ex
12101222 iptables -t nat -A GOHPTS -p tcp --dport %s -j RETURN
12111223 ` , port ))
1212- cmd3 .Stdout = os .Stdout
1213- cmd3 .Stderr = os .Stderr
1214- if err := cmd3 .Run (); err != nil {
1224+ cmd1 .Stdout = os .Stdout
1225+ cmd1 .Stderr = os .Stderr
1226+ if err := cmd1 .Run (); err != nil {
12151227 p .logger .Fatal ().Err (err ).Msg ("Failed while configuring iptables. Are you root?" )
12161228 }
1217- }
1218- }
1219- if p .httpServerAddr != "" {
1220- _ , httpPort , _ := net .SplitHostPort (p .httpServerAddr )
1221- cmd4 := exec .Command ("bash" , "-c" , fmt .Sprintf (`
1222- set -ex
1223- iptables -t nat -A GOHPTS -p tcp --dport %s -j RETURN
1224- ` , httpPort ))
1225- cmd4 .Stdout = os .Stdout
1226- cmd4 .Stderr = os .Stderr
1227- if err := cmd4 .Run (); err != nil {
1228- p .logger .Fatal ().Err (err ).Msg ("Failed while configuring iptables. Are you root?" )
1229+ if p .proxychain .Type == "strict" {
1230+ break
1231+ }
12291232 }
12301233 }
12311234 }
1232- cmd5 := exec .Command ("bash" , "-c" , fmt .Sprintf (`
1235+ cmdDocker := exec .Command ("bash" , "-c" , fmt .Sprintf (`
12331236 set -ex
12341237 if command -v docker >/dev/null 2>&1
12351238 then
@@ -1246,25 +1249,25 @@ func (p *proxyapp) applyRedirectRules() string {
12461249 iptables -t nat -C OUTPUT -p tcp -j GOHPTS 2>/dev/null || \
12471250 iptables -t nat -A OUTPUT -p tcp -j GOHPTS
12481251 ` , tproxyPort ))
1249- cmd5 .Stdout = os .Stdout
1250- cmd5 .Stderr = os .Stderr
1251- if err := cmd5 .Run (); err != nil {
1252+ cmdDocker .Stdout = os .Stdout
1253+ cmdDocker .Stderr = os .Stderr
1254+ if err := cmdDocker .Run (); err != nil {
12521255 p .logger .Fatal ().Err (err ).Msg ("Failed while configuring iptables. Are you root?" )
12531256 }
1254- cmd6 := exec .Command ("bash" , "-c" , `
1257+ cmdCat := exec .Command ("bash" , "-c" , `
12551258 cat /proc/sys/net/ipv4/ip_forward
12561259 ` )
1257- output , err := cmd6 .CombinedOutput ()
1260+ output , err := cmdCat .CombinedOutput ()
12581261 if err != nil {
12591262 p .logger .Fatal ().Err (err ).Msg ("Failed while configuring iptables. Are you root?" )
12601263 }
1261- cmd7 := exec .Command ("bash" , "-c" , `
1264+ cmdForward := exec .Command ("bash" , "-c" , `
12621265 set -ex
12631266 sysctl -w net.ipv4.ip_forward=1
12641267 ` )
1265- cmd7 .Stdout = os .Stdout
1266- cmd7 .Stderr = os .Stderr
1267- _ = cmd7 .Run ()
1268+ cmdForward .Stdout = os .Stdout
1269+ cmdForward .Stderr = os .Stderr
1270+ _ = cmdForward .Run ()
12681271 return string (output )
12691272}
12701273
@@ -1677,7 +1680,7 @@ func New(conf *Config) *proxyapp {
16771680 User : conf .User ,
16781681 Password : conf .Pass ,
16791682 }
1680- dialer , err := proxy .SOCKS5 ("tcp" , addrSOCKS , & auth , getBaseSockDialer (timeout , p .mark ))
1683+ dialer , err := proxy .SOCKS5 ("tcp" , addrSOCKS , & auth , getBaseDialer (timeout , p .mark ))
16811684 if err != nil {
16821685 p .logger .Fatal ().Err (err ).Msg ("Unable to create SOCKS5 dialer" )
16831686 }
@@ -1717,6 +1720,7 @@ func New(conf *Config) *proxyapp {
17171720 p .httpClient = & http.Client {
17181721 Transport : & http.Transport {
17191722 TLSClientConfig : & tls.Config {InsecureSkipVerify : true },
1723+ DialContext : getBaseDialer (timeout , p .mark ).DialContext ,
17201724 },
17211725 CheckRedirect : func (req * http.Request , via []* http.Request ) error {
17221726 return http .ErrUseLastResponse
0 commit comments