From be7939da447c20e864cd1f8ff8eaa995673c830e Mon Sep 17 00:00:00 2001 From: shadowy-pycoder <35629483+shadowy-pycoder@users.noreply.github.com> Date: Sun, 6 Jul 2025 15:36:39 +0300 Subject: [PATCH 1/5] fixed indentation --- gohpts.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gohpts.go b/gohpts.go index 1a58680..947e691 100644 --- a/gohpts.go +++ b/gohpts.go @@ -1365,7 +1365,7 @@ func (p *proxyapp) applyRedirectRules() string { _ = cmdForward.Run() if p.arp { cmdClear := exec.Command("bash", "-c", ` - set -ex + set -ex iptables -t filter -F GOHPTS 2>/dev/null || true iptables -t filter -D FORWARD -j GOHPTS 2>/dev/null || true iptables -t filter -X GOHPTS 2>/dev/null || true @@ -1399,7 +1399,7 @@ func (p *proxyapp) applyRedirectRules() string { func (p *proxyapp) clearRedirectRules(output string) error { if p.arp { cmdClear := exec.Command("bash", "-c", ` - set -ex + set -ex iptables -t filter -F GOHPTS 2>/dev/null || true iptables -t filter -D FORWARD -j GOHPTS 2>/dev/null || true iptables -t filter -X GOHPTS 2>/dev/null || true From c2f22ded7f3c16130f0408071bf71a8cebedc904 Mon Sep 17 00:00:00 2001 From: shadowy-pycoder <35629483+shadowy-pycoder@users.noreply.github.com> Date: Sun, 6 Jul 2025 16:46:23 +0300 Subject: [PATCH 2/5] updated bettercap section of README.md --- README.md | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 8088f2d..7c97507 100644 --- a/README.md +++ b/README.md @@ -56,37 +56,37 @@ Specify http server in proxy configuration of Postman [[Back]](#table-of-contents) -- **Proxy Chain functionality** +- **Proxy Chain functionality**\ Supports `strict`, `dynamic`, `random`, `round_robin` chains of SOCKS5 proxy -- **Transparent proxy** +- **Transparent proxy**\ Supports `redirect` (SO_ORIGINAL_DST) and `tproxy` (IP_TRANSPARENT) modes -- **Traffic sniffing** +- **Traffic sniffing**\ Proxy is able to parse HTTP headers and TLS handshake metadata -- **DNS Leak Protection** +- **DNS Leak Protection**\ DNS resolution occurs on SOCKS5 server side. -- **CONNECT Method Support** +- **CONNECT Method Support**\ Supports HTTP CONNECT tunneling, enabling HTTPS and other TCP-based protocols. -- **Trailer Headers Support** +- **Trailer Headers Support**\ Handles HTTP trailer headers -- **Chunked Transfer Encoding** +- **Chunked Transfer Encoding**\ Handles chunked and streaming responses -- **SOCKS5 Authentication Support** +- **SOCKS5 Authentication Support**\ Supports username/password authentication for SOCKS5 proxies. -- **HTTP Authentication Support** +- **HTTP Authentication Support**\ Supports username/password authentication for HTTP proxy server. -- **Lightweight and Fast** +- **Lightweight and Fast**\ Designed with minimal overhead and efficient request handling. -- **Cross-Platform** +- **Cross-Platform**\ Compatible with all major operating systems. ## Installation @@ -492,10 +492,10 @@ ssh remote -D 1080 -Nf sudo env PATH=$PATH gohpts -d -T 8888 -M tproxy -sniff -body -auto -mark 100 -arp ``` -Run `bettercap` +Run `bettercap` with this command (see [documentation](https://www.bettercap.org/)): ```shell -sudo bettercap -eval "set net.probe on;set net.recon on;arp.spoof on" +sudo bettercap -eval "set net.probe on;set net.recon on;;set arp.spoof.fullduplex true;arp.spoof on" ``` Check proxy logs for traffic from other devices from your LAN From 35a2902c45a815f4c5597e69d82dae61aeff9926 Mon Sep 17 00:00:00 2001 From: shadowy-pycoder <35629483+shadowy-pycoder@users.noreply.github.com> Date: Thu, 10 Jul 2025 17:44:11 +0300 Subject: [PATCH 3/5] impoved sniffreporter matching logic (still do not account for corner cases) --- gohpts.go | 59 +++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 46 insertions(+), 13 deletions(-) diff --git a/gohpts.go b/gohpts.go index 947e691..ee184a5 100644 --- a/gohpts.go +++ b/gohpts.go @@ -403,10 +403,7 @@ func (p *proxyapp) colorizeTunnel(req, resp layers.Layer, sniffheader *[]string, switch reqt := req.(type) { case *layers.HTTPMessage: var reqBodySaved, respBodySaved []byte - rest, ok := resp.(*layers.HTTPMessage) - if !ok { - return fmt.Errorf("failed parsing HTTP response") - } + rest := resp.(*layers.HTTPMessage) if p.body { reqBodySaved, _ = io.ReadAll(reqt.Request.Body) respBodySaved, _ = io.ReadAll(rest.Response.Body) @@ -1001,27 +998,63 @@ func (p *proxyapp) handleTunnel(w http.ResponseWriter, r *http.Request) { func (p *proxyapp) sniffreporter(wg *sync.WaitGroup, sniffheader *[]string, reqChan, respChan <-chan layers.Layer, id string) { defer wg.Done() sniffheaderlen := len(*sniffheader) - var reqQueue, respQueue []layers.Layer + var reqTLSQueue, respTLSQueue, reqHTTPQueue, respHTTPQueue []layers.Layer for { select { case req, ok := <-reqChan: if !ok { return } else { - reqQueue = append(reqQueue, req) + switch req.(type) { + case *layers.TLSMessage: + reqTLSQueue = append(reqTLSQueue, req) + case *layers.HTTPMessage: + reqHTTPQueue = append(reqHTTPQueue, req) + } } case resp, ok := <-respChan: if !ok { return - } else if len(reqQueue) > 0 { // HACK: is this right? - respQueue = append(respQueue, resp) + } else { + switch resp.(type) { + case *layers.TLSMessage: + // request comes first or response arrived first + if len(reqTLSQueue) > 0 || len(respTLSQueue) == 0 { + respTLSQueue = append(respTLSQueue, resp) + // remove unmatched response if still no requests + } else if len(reqTLSQueue) == 0 && len(respTLSQueue) == 1 { + respTLSQueue = respTLSQueue[1:] + } + case *layers.HTTPMessage: + if len(reqHTTPQueue) > 0 || len(respHTTPQueue) == 0 { + respHTTPQueue = append(respHTTPQueue, resp) + } else if len(reqHTTPQueue) == 0 && len(respHTTPQueue) == 1 { + respHTTPQueue = respHTTPQueue[1:] + } + } } } - if len(reqQueue) > 0 && len(respQueue) > 0 { - req := reqQueue[0] - resp := respQueue[0] - reqQueue = reqQueue[1:] - respQueue = respQueue[1:] + if len(reqHTTPQueue) > 0 && len(respHTTPQueue) > 0 { + req := reqHTTPQueue[0] + resp := respHTTPQueue[0] + reqHTTPQueue = reqHTTPQueue[1:] + respHTTPQueue = respHTTPQueue[1:] + + err := p.colorizeTunnel(req, resp, sniffheader, id) + if err == nil && len(*sniffheader) > sniffheaderlen { + if p.json { + p.snifflogger.Log().Msg(fmt.Sprintf("[%s]", strings.Join(*sniffheader, ","))) + } else { + p.snifflogger.Log().Msg(strings.Join(*sniffheader, "\n")) + } + } + *sniffheader = (*sniffheader)[:sniffheaderlen] + } + if len(reqTLSQueue) > 0 && len(respTLSQueue) > 0 { + req := reqTLSQueue[0] + resp := respTLSQueue[0] + reqTLSQueue = reqTLSQueue[1:] + respTLSQueue = respTLSQueue[1:] err := p.colorizeTunnel(req, resp, sniffheader, id) if err == nil && len(*sniffheader) > sniffheaderlen { From 28fe10fa2a8c7cd8d141ab13e842426e61057419 Mon Sep 17 00:00:00 2001 From: shadowy-pycoder <35629483+shadowy-pycoder@users.noreply.github.com> Date: Sun, 13 Jul 2025 06:10:00 +0300 Subject: [PATCH 4/5] Updated msahrk dep to latest version --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index cdbcd2a..ef79865 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,7 @@ require ( github.com/google/uuid v1.6.0 github.com/rs/zerolog v1.34.0 github.com/shadowy-pycoder/colors v0.0.1 - github.com/shadowy-pycoder/mshark v0.0.5 + github.com/shadowy-pycoder/mshark v0.0.6 golang.org/x/net v0.40.0 golang.org/x/sys v0.33.0 golang.org/x/term v0.32.0 diff --git a/go.sum b/go.sum index 992a941..bbf4cf1 100644 --- a/go.sum +++ b/go.sum @@ -19,8 +19,8 @@ github.com/rs/zerolog v1.34.0 h1:k43nTLIwcTVQAncfCw4KZ2VY6ukYoZaBPNOE8txlOeY= github.com/rs/zerolog v1.34.0/go.mod h1:bJsvje4Z08ROH4Nhs5iH600c3IkWhwp44iRc54W6wYQ= github.com/shadowy-pycoder/colors v0.0.1 h1:weCj/YIOupqy4BSP8KuVzr20fC+cuAv/tArz7bhhkP4= github.com/shadowy-pycoder/colors v0.0.1/go.mod h1:lkrJS1PY2oVigNLTT6pkbF7B/v0YcU2LD5PZnss1Q4U= -github.com/shadowy-pycoder/mshark v0.0.5 h1:D7L+vW6DsE/OMwxThQLenNJdHKHzufHFWGuL033GKhQ= -github.com/shadowy-pycoder/mshark v0.0.5/go.mod h1:fRWGQuU4BFjz9pTfrvwIT2AtmWWd99PEvdlgv+24vTE= +github.com/shadowy-pycoder/mshark v0.0.6 h1:XmIoj9+uHEwc8RmiPT2iMYEdTvyiJ+zBTRBhIkx9JTg= +github.com/shadowy-pycoder/mshark v0.0.6/go.mod h1:Txx0p8JxYOGd+0V+6N9MeCUGtGdfHAATWE8KB1nd7H0= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= golang.org/x/net v0.40.0 h1:79Xs7wF06Gbdcg4kdCCIQArK11Z1hr5POQ6+fIYHNuY= From 197f4c8545dd6d9c836095fb0abf1fb3432e5e13 Mon Sep 17 00:00:00 2001 From: shadowy-pycoder <35629483+shadowy-pycoder@users.noreply.github.com> Date: Tue, 15 Jul 2025 19:26:37 +0300 Subject: [PATCH 5/5] improved logging, arrows, errors, etc --- README.md | 4 ++-- gohpts.go | 34 ++++++++++++++++++---------------- tproxy_linux.go | 36 ++++++++++++++++++------------------ version.go | 2 +- 4 files changed, 39 insertions(+), 37 deletions(-) diff --git a/README.md b/README.md index 7c97507..e4cfd8d 100644 --- a/README.md +++ b/README.md @@ -98,7 +98,7 @@ You can download the binary for your platform from [Releases](https://github.com Example: ```shell -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 +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 ``` 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 Run `bettercap` with this command (see [documentation](https://www.bettercap.org/)): ```shell -sudo bettercap -eval "set net.probe on;set net.recon on;;set arp.spoof.fullduplex true;arp.spoof on" +sudo bettercap -eval "net.probe on;net.recon on;set arp.spoof.fullduplex true;arp.spoof on" ``` Check proxy logs for traffic from other devices from your LAN diff --git a/gohpts.go b/gohpts.go index ee184a5..69b2e64 100644 --- a/gohpts.go +++ b/gohpts.go @@ -212,7 +212,7 @@ func (p *proxyapp) colorizeHTTP( if req.ContentLength > 0 { sb.WriteString(fmt.Sprintf(" Len: %d", req.ContentLength)) } - sb.WriteString(" -> ") + sb.WriteString(" → ") sb.WriteString(fmt.Sprintf("%s %s ", resp.Proto, resp.Status)) if resp.ContentLength > 0 { sb.WriteString(fmt.Sprintf("Len: %d", resp.ContentLength)) @@ -246,7 +246,7 @@ func (p *proxyapp) colorizeHTTP( if req.ContentLength > 0 { sb.WriteString(colors.BeigeBg(fmt.Sprintf(" Len: %d", req.ContentLength)).String()) } - sb.WriteString(colors.MagentaBg(" -> ").String()) + sb.WriteString(colors.MagentaBg(" → ").String()) sb.WriteString(colors.BlueBg(fmt.Sprintf("%s ", resp.Proto)).String()) sb.WriteString(p.colorizeStatus(resp.StatusCode, fmt.Sprintf("%s ", resp.Status), true)) if resp.ContentLength > 0 { @@ -294,7 +294,7 @@ func (p *proxyapp) colorizeTLS(req *layers.TLSClientHello, resp *layers.TLSServe if req.ALPN != nil { sb.WriteString(fmt.Sprintf(" ALPN: %v", req.ALPN)) } - sb.WriteString(" -> ") + sb.WriteString(" → ") sb.WriteString("\n") sb.WriteString(fmt.Sprintf("%s ", p.colorizeTimestamp())) sb.WriteString(id) @@ -330,7 +330,7 @@ func (p *proxyapp) colorizeTLS(req *layers.TLSClientHello, resp *layers.TLSServe if req.ALPN != nil { sb.WriteString(colors.BlueBg(fmt.Sprintf(" ALPN: %v", req.ALPN)).String()) } - sb.WriteString(colors.MagentaBg(" -> ").String()) + sb.WriteString(colors.MagentaBg(" → ").String()) sb.WriteString("\n") sb.WriteString(fmt.Sprintf("%s ", p.colorizeTimestamp())) sb.WriteString(id) @@ -534,7 +534,7 @@ func isLocalAddress(addr string) bool { func (p *proxyapp) printProxyChain(pc []proxyEntry) string { var sb strings.Builder - sb.WriteString("client -> ") + sb.WriteString("client → ") if p.httpServerAddr != "" { sb.WriteString(p.httpServerAddr) if p.tproxyAddr != "" { @@ -546,10 +546,10 @@ func (p *proxyapp) printProxyChain(pc []proxyEntry) string { sb.WriteString(p.tproxyAddr) sb.WriteString(fmt.Sprintf(" (%s)", p.tproxyMode)) } - sb.WriteString(" -> ") + sb.WriteString(" → ") for _, pe := range pc { sb.WriteString(pe.String()) - sb.WriteString(" -> ") + sb.WriteString(" → ") } sb.WriteString("target") return sb.String() @@ -942,8 +942,8 @@ func (p *proxyapp) handleTunnel(w http.ResponseWriter, r *http.Request) { } defer srcConn.Close() - dstConnStr := fmt.Sprintf("%s->%s->%s", dstConn.LocalAddr().String(), dstConn.RemoteAddr().String(), r.Host) - srcConnStr := fmt.Sprintf("%s->%s", srcConn.RemoteAddr().String(), srcConn.LocalAddr().String()) + dstConnStr := fmt.Sprintf("%s→ %s→ %s", dstConn.LocalAddr().String(), dstConn.RemoteAddr().String(), r.Host) + srcConnStr := fmt.Sprintf("%s→ %s", srcConn.RemoteAddr().String(), srcConn.LocalAddr().String()) p.logger.Debug().Msgf("%s - %s - %s", r.Proto, r.Method, r.Host) p.logger.Debug().Msgf("src: %s - dst: %s", srcConnStr, dstConnStr) @@ -971,16 +971,16 @@ func (p *proxyapp) handleTunnel(w http.ResponseWriter, r *http.Request) { var sb strings.Builder if p.nocolor { sb.WriteString(id) - sb.WriteString(fmt.Sprintf(" Src: %s->%s -> Dst: %s->%s", srcConn.RemoteAddr(), srcConn.LocalAddr(), dstConn.LocalAddr(), dstConn.RemoteAddr())) + sb.WriteString(fmt.Sprintf(" Src: %s→ %s → Dst: %s→ %s", srcConn.RemoteAddr(), srcConn.LocalAddr(), dstConn.LocalAddr(), dstConn.RemoteAddr())) sb.WriteString("\n") sb.WriteString(fmt.Sprintf("%s ", p.colorizeTimestamp())) sb.WriteString(id) sb.WriteString(fmt.Sprintf(" %s %s %s ", r.Method, r.Host, r.Proto)) } else { sb.WriteString(id) - sb.WriteString(colors.Green(fmt.Sprintf(" Src: %s->%s", srcConn.RemoteAddr(), srcConn.LocalAddr())).String()) - sb.WriteString(colors.Magenta(" -> ").String()) - sb.WriteString(colors.Blue(fmt.Sprintf("Dst: %s->%s", dstConn.LocalAddr(), dstConn.RemoteAddr())).String()) + sb.WriteString(colors.Green(fmt.Sprintf(" Src: %s→ %s", srcConn.RemoteAddr(), srcConn.LocalAddr())).String()) + sb.WriteString(colors.Magenta(" → ").String()) + sb.WriteString(colors.Blue(fmt.Sprintf("Dst: %s→ %s", dstConn.LocalAddr(), dstConn.RemoteAddr())).String()) sb.WriteString("\n") sb.WriteString(fmt.Sprintf("%s ", p.colorizeTimestamp())) sb.WriteString(id) @@ -1516,7 +1516,7 @@ func (p *proxyapp) Run() { } close(p.closeConn) if tproxyServer != nil { - p.logger.Info().Msg("[tproxy] Server is shutting down...") + p.logger.Info().Msgf("[%s] Server is shutting down...", p.tproxyMode) tproxyServer.Shutdown() } p.logger.Info().Msg("Server is shutting down...") @@ -1557,7 +1557,7 @@ func (p *proxyapp) Run() { } } close(p.closeConn) - p.logger.Info().Msg("[tproxy] Server is shutting down...") + p.logger.Info().Msgf("[%s] Server is shutting down...", p.tproxyMode) tproxyServer.Shutdown() close(done) }() @@ -1724,6 +1724,7 @@ func New(conf *Config) *proxyapp { result = domainPattern.ReplaceAllStringFunc(result, func(match string) string { return colors.Red(match).String() }) + result = strings.ReplaceAll(result, "->", "→ ") return result } logger = zerolog.New(output).With().Timestamp().Logger() @@ -1756,6 +1757,7 @@ func New(conf *Config) *proxyapp { result = domainPattern.ReplaceAllStringFunc(result, func(match string) string { return colors.Red(match).String() }) + result = strings.ReplaceAll(result, "->", "→ ") return result } snifflogger = zerolog.New(sniffoutput).With().Timestamp().Logger() @@ -1774,7 +1776,7 @@ func New(conf *Config) *proxyapp { conf.TProxy = "" conf.TProxyOnly = "" conf.TProxyMode = "" - p.logger.Warn().Msg("[tproxy] functionality only available on linux system") + p.logger.Warn().Msgf("[%s] functionality only available on linux system", conf.TProxyMode) } p.tproxyMode = conf.TProxyMode tproxyonly := conf.TProxyOnly != "" diff --git a/tproxy_linux.go b/tproxy_linux.go index cab13ce..1caaa31 100644 --- a/tproxy_linux.go +++ b/tproxy_linux.go @@ -117,11 +117,11 @@ func (ts *tproxyServer) getOriginalDst(rawConn syscall.RawConn) (string, error) optlen := uint32(unsafe.Sizeof(originalDst)) err := getsockopt(int(fd), unix.SOL_IP, unix.SO_ORIGINAL_DST, unsafe.Pointer(&originalDst), &optlen) if err != nil { - ts.pa.logger.Error().Err(err).Msg("[tproxy] getsockopt SO_ORIGINAL_DST failed") + ts.pa.logger.Error().Err(err).Msgf("[%s] getsockopt SO_ORIGINAL_DST failed", ts.pa.tproxyMode) } }) if err != nil { - ts.pa.logger.Error().Err(err).Msg("[tproxy] Failed invoking control connection") + ts.pa.logger.Error().Err(err).Msgf("[%s] Failed invoking control connection", ts.pa.tproxyMode) return "", err } dstHost := netip.AddrFrom4(originalDst.Addr) @@ -140,47 +140,47 @@ func (ts *tproxyServer) handleConnection(srcConn net.Conn) { case "redirect": rawConn, err := srcConn.(*net.TCPConn).SyscallConn() if err != nil { - ts.pa.logger.Error().Err(err).Msg("[tproxy] Failed to get raw connection") + ts.pa.logger.Error().Err(err).Msgf("[%s] Failed to get raw connection", ts.pa.tproxyMode) return } dst, err = ts.getOriginalDst(rawConn) if err != nil { - ts.pa.logger.Error().Err(err).Msg("[tproxy] Failed to get destination address") + ts.pa.logger.Error().Err(err).Msgf("[%s] Failed to get destination address", ts.pa.tproxyMode) return } - ts.pa.logger.Debug().Msgf("[tproxy] getsockopt SO_ORIGINAL_DST %s", dst) + ts.pa.logger.Debug().Msgf("[%s] getsockopt SO_ORIGINAL_DST %s", ts.pa.tproxyMode, dst) case "tproxy": dst = srcConn.LocalAddr().String() - ts.pa.logger.Debug().Msgf("[tproxy] IP_TRANSPARENT %s", dst) + ts.pa.logger.Debug().Msgf("[%s] IP_TRANSPARENT %s", ts.pa.tproxyMode, dst) default: ts.pa.logger.Fatal().Msg("Unknown tproxyMode") } if isLocalAddress(dst) { dstConn, err = getBaseDialer(timeout, ts.pa.mark).Dial("tcp", dst) if err != nil { - ts.pa.logger.Error().Err(err).Msgf("[tproxy] Failed connecting to %s", dst) + ts.pa.logger.Error().Err(err).Msgf("[%s] Failed connecting to %s", ts.pa.tproxyMode, dst) return } } else { sockDialer, _, err := ts.pa.getSocks() if err != nil { - ts.pa.logger.Error().Err(err).Msg("[tproxy] Failed getting SOCKS5 client") + ts.pa.logger.Error().Err(err).Msgf("[%s] Failed getting SOCKS5 client", ts.pa.tproxyMode) return } ctx, cancel := context.WithTimeout(context.Background(), timeout) defer cancel() dstConn, err = sockDialer.(proxy.ContextDialer).DialContext(ctx, "tcp", dst) if err != nil { - ts.pa.logger.Error().Err(err).Msgf("[tproxy] Failed connecting to %s", dst) + ts.pa.logger.Error().Err(err).Msgf("[%s] Failed connecting to %s", ts.pa.tproxyMode, dst) return } } defer dstConn.Close() - dstConnStr := fmt.Sprintf("%s->%s->%s", dstConn.LocalAddr().String(), dstConn.RemoteAddr().String(), dst) - srcConnStr := fmt.Sprintf("%s->%s", srcConn.RemoteAddr().String(), srcConn.LocalAddr().String()) + dstConnStr := fmt.Sprintf("%s→ %s→ %s", dstConn.LocalAddr().String(), dstConn.RemoteAddr().String(), dst) + srcConnStr := fmt.Sprintf("%s→ %s", srcConn.RemoteAddr().String(), srcConn.LocalAddr().String()) - ts.pa.logger.Debug().Msgf("[tproxy] src: %s - dst: %s", srcConnStr, dstConnStr) + ts.pa.logger.Debug().Msgf("[%s] src: %s - dst: %s", ts.pa.tproxyMode, srcConnStr, dstConnStr) reqChan := make(chan layers.Layer) respChan := make(chan layers.Layer) @@ -209,12 +209,12 @@ func (ts *tproxyServer) handleConnection(srcConn net.Conn) { var sb strings.Builder if ts.pa.nocolor { sb.WriteString(id) - sb.WriteString(fmt.Sprintf(" Src: %s->%s -> Dst: %s->%s Orig: %s", srcConn.RemoteAddr(), srcConn.LocalAddr(), dstConn.LocalAddr(), dstConn.RemoteAddr(), dst)) + sb.WriteString(fmt.Sprintf(" Src: %s→ %s → Dst: %s→ %s Orig: %s", srcConn.RemoteAddr(), srcConn.LocalAddr(), dstConn.LocalAddr(), dstConn.RemoteAddr(), dst)) } else { sb.WriteString(id) - sb.WriteString(colors.Green(fmt.Sprintf(" Src: %s->%s", srcConn.RemoteAddr(), srcConn.LocalAddr())).String()) - sb.WriteString(colors.Magenta(" -> ").String()) - sb.WriteString(colors.Blue(fmt.Sprintf("Dst: %s->%s ", dstConn.LocalAddr(), dstConn.RemoteAddr())).String()) + sb.WriteString(colors.Green(fmt.Sprintf(" Src: %s→ %s", srcConn.RemoteAddr(), srcConn.LocalAddr())).String()) + sb.WriteString(colors.Magenta(" → ").String()) + sb.WriteString(colors.Blue(fmt.Sprintf("Dst: %s→ %s ", dstConn.LocalAddr(), dstConn.RemoteAddr())).String()) sb.WriteString(colors.BeigeBg(fmt.Sprintf("Orig Dst: %s", dst)).String()) } sniffheader = append(sniffheader, sb.String()) @@ -235,10 +235,10 @@ func (ts *tproxyServer) Shutdown() { select { case <-done: - ts.pa.logger.Info().Msg("[tproxy] Server gracefully shutdown") + ts.pa.logger.Info().Msgf("[%s] Server gracefully shutdown", ts.pa.tproxyMode) return case <-time.After(timeout): - ts.pa.logger.Error().Msg("[tproxy] Server timed out waiting for connections to finish") + ts.pa.logger.Error().Msgf("[%s] Server timed out waiting for connections to finish", ts.pa.tproxyMode) return } } diff --git a/version.go b/version.go index fdcff4e..a0240c4 100644 --- a/version.go +++ b/version.go @@ -1,3 +1,3 @@ package gohpts -const Version string = "gohpts v1.8.4" +const Version string = "gohpts v1.8.5"