Skip to content

Commit 197f4c8

Browse files
improved logging, arrows, errors, etc
1 parent 28fe10f commit 197f4c8

File tree

4 files changed

+39
-37
lines changed

4 files changed

+39
-37
lines changed

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ You can download the binary for your platform from [Releases](https://github.com
9898
Example:
9999

100100
```shell
101-
HPTS_RELEASE=v1.8.4; wget -v https://github.com/shadowy-pycoder/go-http-proxy-to-socks/releases/download/$HPTS_RELEASE/gohpts-$HPTS_RELEASE-linux-amd64.tar.gz -O gohpts && tar xvzf gohpts && mv -f gohpts-$HPTS_RELEASE-linux-amd64 gohpts && ./gohpts -h
101+
HPTS_RELEASE=v1.8.5; wget -v https://github.com/shadowy-pycoder/go-http-proxy-to-socks/releases/download/$HPTS_RELEASE/gohpts-$HPTS_RELEASE-linux-amd64.tar.gz -O gohpts && tar xvzf gohpts && mv -f gohpts-$HPTS_RELEASE-linux-amd64 gohpts && ./gohpts -h
102102
```
103103

104104
Alternatively, you can install it using `go install` command (requires Go [1.24](https://go.dev/doc/install) or later):
@@ -495,7 +495,7 @@ sudo env PATH=$PATH gohpts -d -T 8888 -M tproxy -sniff -body -auto -mark 100 -ar
495495
Run `bettercap` with this command (see [documentation](https://www.bettercap.org/)):
496496
497497
```shell
498-
sudo bettercap -eval "set net.probe on;set net.recon on;;set arp.spoof.fullduplex true;arp.spoof on"
498+
sudo bettercap -eval "net.probe on;net.recon on;set arp.spoof.fullduplex true;arp.spoof on"
499499
```
500500
501501
Check proxy logs for traffic from other devices from your LAN

gohpts.go

Lines changed: 18 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -212,7 +212,7 @@ func (p *proxyapp) colorizeHTTP(
212212
if req.ContentLength > 0 {
213213
sb.WriteString(fmt.Sprintf(" Len: %d", req.ContentLength))
214214
}
215-
sb.WriteString(" -> ")
215+
sb.WriteString(" ")
216216
sb.WriteString(fmt.Sprintf("%s %s ", resp.Proto, resp.Status))
217217
if resp.ContentLength > 0 {
218218
sb.WriteString(fmt.Sprintf("Len: %d", resp.ContentLength))
@@ -246,7 +246,7 @@ func (p *proxyapp) colorizeHTTP(
246246
if req.ContentLength > 0 {
247247
sb.WriteString(colors.BeigeBg(fmt.Sprintf(" Len: %d", req.ContentLength)).String())
248248
}
249-
sb.WriteString(colors.MagentaBg(" -> ").String())
249+
sb.WriteString(colors.MagentaBg(" ").String())
250250
sb.WriteString(colors.BlueBg(fmt.Sprintf("%s ", resp.Proto)).String())
251251
sb.WriteString(p.colorizeStatus(resp.StatusCode, fmt.Sprintf("%s ", resp.Status), true))
252252
if resp.ContentLength > 0 {
@@ -294,7 +294,7 @@ func (p *proxyapp) colorizeTLS(req *layers.TLSClientHello, resp *layers.TLSServe
294294
if req.ALPN != nil {
295295
sb.WriteString(fmt.Sprintf(" ALPN: %v", req.ALPN))
296296
}
297-
sb.WriteString(" -> ")
297+
sb.WriteString(" ")
298298
sb.WriteString("\n")
299299
sb.WriteString(fmt.Sprintf("%s ", p.colorizeTimestamp()))
300300
sb.WriteString(id)
@@ -330,7 +330,7 @@ func (p *proxyapp) colorizeTLS(req *layers.TLSClientHello, resp *layers.TLSServe
330330
if req.ALPN != nil {
331331
sb.WriteString(colors.BlueBg(fmt.Sprintf(" ALPN: %v", req.ALPN)).String())
332332
}
333-
sb.WriteString(colors.MagentaBg(" -> ").String())
333+
sb.WriteString(colors.MagentaBg(" ").String())
334334
sb.WriteString("\n")
335335
sb.WriteString(fmt.Sprintf("%s ", p.colorizeTimestamp()))
336336
sb.WriteString(id)
@@ -534,7 +534,7 @@ func isLocalAddress(addr string) bool {
534534

535535
func (p *proxyapp) printProxyChain(pc []proxyEntry) string {
536536
var sb strings.Builder
537-
sb.WriteString("client -> ")
537+
sb.WriteString("client ")
538538
if p.httpServerAddr != "" {
539539
sb.WriteString(p.httpServerAddr)
540540
if p.tproxyAddr != "" {
@@ -546,10 +546,10 @@ func (p *proxyapp) printProxyChain(pc []proxyEntry) string {
546546
sb.WriteString(p.tproxyAddr)
547547
sb.WriteString(fmt.Sprintf(" (%s)", p.tproxyMode))
548548
}
549-
sb.WriteString(" -> ")
549+
sb.WriteString(" ")
550550
for _, pe := range pc {
551551
sb.WriteString(pe.String())
552-
sb.WriteString(" -> ")
552+
sb.WriteString(" ")
553553
}
554554
sb.WriteString("target")
555555
return sb.String()
@@ -942,8 +942,8 @@ func (p *proxyapp) handleTunnel(w http.ResponseWriter, r *http.Request) {
942942
}
943943
defer srcConn.Close()
944944

945-
dstConnStr := fmt.Sprintf("%s->%s->%s", dstConn.LocalAddr().String(), dstConn.RemoteAddr().String(), r.Host)
946-
srcConnStr := fmt.Sprintf("%s->%s", srcConn.RemoteAddr().String(), srcConn.LocalAddr().String())
945+
dstConnStr := fmt.Sprintf("%s→ %s→ %s", dstConn.LocalAddr().String(), dstConn.RemoteAddr().String(), r.Host)
946+
srcConnStr := fmt.Sprintf("%s%s", srcConn.RemoteAddr().String(), srcConn.LocalAddr().String())
947947

948948
p.logger.Debug().Msgf("%s - %s - %s", r.Proto, r.Method, r.Host)
949949
p.logger.Debug().Msgf("src: %s - dst: %s", srcConnStr, dstConnStr)
@@ -971,16 +971,16 @@ func (p *proxyapp) handleTunnel(w http.ResponseWriter, r *http.Request) {
971971
var sb strings.Builder
972972
if p.nocolor {
973973
sb.WriteString(id)
974-
sb.WriteString(fmt.Sprintf(" Src: %s->%s -> Dst: %s->%s", srcConn.RemoteAddr(), srcConn.LocalAddr(), dstConn.LocalAddr(), dstConn.RemoteAddr()))
974+
sb.WriteString(fmt.Sprintf(" Src: %s%s Dst: %s%s", srcConn.RemoteAddr(), srcConn.LocalAddr(), dstConn.LocalAddr(), dstConn.RemoteAddr()))
975975
sb.WriteString("\n")
976976
sb.WriteString(fmt.Sprintf("%s ", p.colorizeTimestamp()))
977977
sb.WriteString(id)
978978
sb.WriteString(fmt.Sprintf(" %s %s %s ", r.Method, r.Host, r.Proto))
979979
} else {
980980
sb.WriteString(id)
981-
sb.WriteString(colors.Green(fmt.Sprintf(" Src: %s->%s", srcConn.RemoteAddr(), srcConn.LocalAddr())).String())
982-
sb.WriteString(colors.Magenta(" -> ").String())
983-
sb.WriteString(colors.Blue(fmt.Sprintf("Dst: %s->%s", dstConn.LocalAddr(), dstConn.RemoteAddr())).String())
981+
sb.WriteString(colors.Green(fmt.Sprintf(" Src: %s%s", srcConn.RemoteAddr(), srcConn.LocalAddr())).String())
982+
sb.WriteString(colors.Magenta(" ").String())
983+
sb.WriteString(colors.Blue(fmt.Sprintf("Dst: %s%s", dstConn.LocalAddr(), dstConn.RemoteAddr())).String())
984984
sb.WriteString("\n")
985985
sb.WriteString(fmt.Sprintf("%s ", p.colorizeTimestamp()))
986986
sb.WriteString(id)
@@ -1516,7 +1516,7 @@ func (p *proxyapp) Run() {
15161516
}
15171517
close(p.closeConn)
15181518
if tproxyServer != nil {
1519-
p.logger.Info().Msg("[tproxy] Server is shutting down...")
1519+
p.logger.Info().Msgf("[%s] Server is shutting down...", p.tproxyMode)
15201520
tproxyServer.Shutdown()
15211521
}
15221522
p.logger.Info().Msg("Server is shutting down...")
@@ -1557,7 +1557,7 @@ func (p *proxyapp) Run() {
15571557
}
15581558
}
15591559
close(p.closeConn)
1560-
p.logger.Info().Msg("[tproxy] Server is shutting down...")
1560+
p.logger.Info().Msgf("[%s] Server is shutting down...", p.tproxyMode)
15611561
tproxyServer.Shutdown()
15621562
close(done)
15631563
}()
@@ -1724,6 +1724,7 @@ func New(conf *Config) *proxyapp {
17241724
result = domainPattern.ReplaceAllStringFunc(result, func(match string) string {
17251725
return colors.Red(match).String()
17261726
})
1727+
result = strings.ReplaceAll(result, "->", "→ ")
17271728
return result
17281729
}
17291730
logger = zerolog.New(output).With().Timestamp().Logger()
@@ -1756,6 +1757,7 @@ func New(conf *Config) *proxyapp {
17561757
result = domainPattern.ReplaceAllStringFunc(result, func(match string) string {
17571758
return colors.Red(match).String()
17581759
})
1760+
result = strings.ReplaceAll(result, "->", "→ ")
17591761
return result
17601762
}
17611763
snifflogger = zerolog.New(sniffoutput).With().Timestamp().Logger()
@@ -1774,7 +1776,7 @@ func New(conf *Config) *proxyapp {
17741776
conf.TProxy = ""
17751777
conf.TProxyOnly = ""
17761778
conf.TProxyMode = ""
1777-
p.logger.Warn().Msg("[tproxy] functionality only available on linux system")
1779+
p.logger.Warn().Msgf("[%s] functionality only available on linux system", conf.TProxyMode)
17781780
}
17791781
p.tproxyMode = conf.TProxyMode
17801782
tproxyonly := conf.TProxyOnly != ""

tproxy_linux.go

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -117,11 +117,11 @@ func (ts *tproxyServer) getOriginalDst(rawConn syscall.RawConn) (string, error)
117117
optlen := uint32(unsafe.Sizeof(originalDst))
118118
err := getsockopt(int(fd), unix.SOL_IP, unix.SO_ORIGINAL_DST, unsafe.Pointer(&originalDst), &optlen)
119119
if err != nil {
120-
ts.pa.logger.Error().Err(err).Msg("[tproxy] getsockopt SO_ORIGINAL_DST failed")
120+
ts.pa.logger.Error().Err(err).Msgf("[%s] getsockopt SO_ORIGINAL_DST failed", ts.pa.tproxyMode)
121121
}
122122
})
123123
if err != nil {
124-
ts.pa.logger.Error().Err(err).Msg("[tproxy] Failed invoking control connection")
124+
ts.pa.logger.Error().Err(err).Msgf("[%s] Failed invoking control connection", ts.pa.tproxyMode)
125125
return "", err
126126
}
127127
dstHost := netip.AddrFrom4(originalDst.Addr)
@@ -140,47 +140,47 @@ func (ts *tproxyServer) handleConnection(srcConn net.Conn) {
140140
case "redirect":
141141
rawConn, err := srcConn.(*net.TCPConn).SyscallConn()
142142
if err != nil {
143-
ts.pa.logger.Error().Err(err).Msg("[tproxy] Failed to get raw connection")
143+
ts.pa.logger.Error().Err(err).Msgf("[%s] Failed to get raw connection", ts.pa.tproxyMode)
144144
return
145145
}
146146
dst, err = ts.getOriginalDst(rawConn)
147147
if err != nil {
148-
ts.pa.logger.Error().Err(err).Msg("[tproxy] Failed to get destination address")
148+
ts.pa.logger.Error().Err(err).Msgf("[%s] Failed to get destination address", ts.pa.tproxyMode)
149149
return
150150
}
151-
ts.pa.logger.Debug().Msgf("[tproxy] getsockopt SO_ORIGINAL_DST %s", dst)
151+
ts.pa.logger.Debug().Msgf("[%s] getsockopt SO_ORIGINAL_DST %s", ts.pa.tproxyMode, dst)
152152
case "tproxy":
153153
dst = srcConn.LocalAddr().String()
154-
ts.pa.logger.Debug().Msgf("[tproxy] IP_TRANSPARENT %s", dst)
154+
ts.pa.logger.Debug().Msgf("[%s] IP_TRANSPARENT %s", ts.pa.tproxyMode, dst)
155155
default:
156156
ts.pa.logger.Fatal().Msg("Unknown tproxyMode")
157157
}
158158
if isLocalAddress(dst) {
159159
dstConn, err = getBaseDialer(timeout, ts.pa.mark).Dial("tcp", dst)
160160
if err != nil {
161-
ts.pa.logger.Error().Err(err).Msgf("[tproxy] Failed connecting to %s", dst)
161+
ts.pa.logger.Error().Err(err).Msgf("[%s] Failed connecting to %s", ts.pa.tproxyMode, dst)
162162
return
163163
}
164164
} else {
165165
sockDialer, _, err := ts.pa.getSocks()
166166
if err != nil {
167-
ts.pa.logger.Error().Err(err).Msg("[tproxy] Failed getting SOCKS5 client")
167+
ts.pa.logger.Error().Err(err).Msgf("[%s] Failed getting SOCKS5 client", ts.pa.tproxyMode)
168168
return
169169
}
170170
ctx, cancel := context.WithTimeout(context.Background(), timeout)
171171
defer cancel()
172172
dstConn, err = sockDialer.(proxy.ContextDialer).DialContext(ctx, "tcp", dst)
173173
if err != nil {
174-
ts.pa.logger.Error().Err(err).Msgf("[tproxy] Failed connecting to %s", dst)
174+
ts.pa.logger.Error().Err(err).Msgf("[%s] Failed connecting to %s", ts.pa.tproxyMode, dst)
175175
return
176176
}
177177
}
178178
defer dstConn.Close()
179179

180-
dstConnStr := fmt.Sprintf("%s->%s->%s", dstConn.LocalAddr().String(), dstConn.RemoteAddr().String(), dst)
181-
srcConnStr := fmt.Sprintf("%s->%s", srcConn.RemoteAddr().String(), srcConn.LocalAddr().String())
180+
dstConnStr := fmt.Sprintf("%s→ %s→ %s", dstConn.LocalAddr().String(), dstConn.RemoteAddr().String(), dst)
181+
srcConnStr := fmt.Sprintf("%s%s", srcConn.RemoteAddr().String(), srcConn.LocalAddr().String())
182182

183-
ts.pa.logger.Debug().Msgf("[tproxy] src: %s - dst: %s", srcConnStr, dstConnStr)
183+
ts.pa.logger.Debug().Msgf("[%s] src: %s - dst: %s", ts.pa.tproxyMode, srcConnStr, dstConnStr)
184184

185185
reqChan := make(chan layers.Layer)
186186
respChan := make(chan layers.Layer)
@@ -209,12 +209,12 @@ func (ts *tproxyServer) handleConnection(srcConn net.Conn) {
209209
var sb strings.Builder
210210
if ts.pa.nocolor {
211211
sb.WriteString(id)
212-
sb.WriteString(fmt.Sprintf(" Src: %s->%s -> Dst: %s->%s Orig: %s", srcConn.RemoteAddr(), srcConn.LocalAddr(), dstConn.LocalAddr(), dstConn.RemoteAddr(), dst))
212+
sb.WriteString(fmt.Sprintf(" Src: %s%s Dst: %s%s Orig: %s", srcConn.RemoteAddr(), srcConn.LocalAddr(), dstConn.LocalAddr(), dstConn.RemoteAddr(), dst))
213213
} else {
214214
sb.WriteString(id)
215-
sb.WriteString(colors.Green(fmt.Sprintf(" Src: %s->%s", srcConn.RemoteAddr(), srcConn.LocalAddr())).String())
216-
sb.WriteString(colors.Magenta(" -> ").String())
217-
sb.WriteString(colors.Blue(fmt.Sprintf("Dst: %s->%s ", dstConn.LocalAddr(), dstConn.RemoteAddr())).String())
215+
sb.WriteString(colors.Green(fmt.Sprintf(" Src: %s%s", srcConn.RemoteAddr(), srcConn.LocalAddr())).String())
216+
sb.WriteString(colors.Magenta(" ").String())
217+
sb.WriteString(colors.Blue(fmt.Sprintf("Dst: %s%s ", dstConn.LocalAddr(), dstConn.RemoteAddr())).String())
218218
sb.WriteString(colors.BeigeBg(fmt.Sprintf("Orig Dst: %s", dst)).String())
219219
}
220220
sniffheader = append(sniffheader, sb.String())
@@ -235,10 +235,10 @@ func (ts *tproxyServer) Shutdown() {
235235

236236
select {
237237
case <-done:
238-
ts.pa.logger.Info().Msg("[tproxy] Server gracefully shutdown")
238+
ts.pa.logger.Info().Msgf("[%s] Server gracefully shutdown", ts.pa.tproxyMode)
239239
return
240240
case <-time.After(timeout):
241-
ts.pa.logger.Error().Msg("[tproxy] Server timed out waiting for connections to finish")
241+
ts.pa.logger.Error().Msgf("[%s] Server timed out waiting for connections to finish", ts.pa.tproxyMode)
242242
return
243243
}
244244
}

version.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
package gohpts
22

3-
const Version string = "gohpts v1.8.4"
3+
const Version string = "gohpts v1.8.5"

0 commit comments

Comments
 (0)