Skip to content

Commit 59b12b6

Browse files
Fixed auto config for strict mode, http server, now mark dialer should wark for all requests
1 parent c595580 commit 59b12b6

File tree

3 files changed

+53
-49
lines changed

3 files changed

+53
-49
lines changed

gohpts.go

Lines changed: 50 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -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

11581158
func (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

tproxy_linux.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ func (ts *tproxyServer) handleConnection(srcConn net.Conn) {
146146
ts.pa.logger.Fatal().Msg("Unknown tproxyMode")
147147
}
148148
if isLocalAddress(dst) {
149-
dstConn, err = net.DialTimeout("tcp", dst, timeout)
149+
dstConn, err = getBaseDialer(timeout, ts.pa.mark).Dial("tcp", dst)
150150
if err != nil {
151151
ts.pa.logger.Error().Err(err).Msgf("[tproxy] Failed connecting to %s", dst)
152152
return
@@ -223,7 +223,7 @@ func (ts *tproxyServer) Shutdown() {
223223
}
224224
}
225225

226-
func getBaseSockDialer(timeout time.Duration, mark uint) *net.Dialer {
226+
func getBaseDialer(timeout time.Duration, mark uint) *net.Dialer {
227227
var dialer *net.Dialer
228228
if mark > 0 {
229229
dialer = &net.Dialer{

tproxy_nonlinux.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ func (ts *tproxyServer) handleConnection(srcConn net.Conn) {
4242

4343
func (ts *tproxyServer) Shutdown() {}
4444

45-
func getBaseSockDialer(timeout time.Duration, mark uint) *net.Dialer {
45+
func getBaseDialer(timeout time.Duration, mark uint) *net.Dialer {
4646
_ = mark
4747
return &net.Dialer{Timeout: timeout}
4848
}

0 commit comments

Comments
 (0)