From d9a2f44a789821acffdb049b8372ff09e9fedc75 Mon Sep 17 00:00:00 2001 From: ginuerzh Date: Wed, 2 Jul 2025 21:35:02 +0800 Subject: [PATCH] add src field for logger and recorder --- handler/forward/local/handler.go | 10 +++++++--- handler/forward/remote/handler.go | 10 +++++++--- handler/http/handler.go | 12 ++++++++++-- handler/http/udp.go | 3 +++ handler/http2/handler.go | 17 +++++++++++++---- handler/http3/handler.go | 10 +++++----- handler/redirect/tcp/handler.go | 16 ++++++++++------ handler/redirect/udp/handler.go | 15 ++++++++++----- handler/relay/bind.go | 23 +++++++++++++---------- handler/relay/connect.go | 7 +++++-- handler/relay/forward.go | 16 ++++++++++++---- handler/relay/handler.go | 7 +++++-- handler/sni/handler.go | 1 + handler/socks/v4/handler.go | 19 +++++++++++++++---- handler/socks/v5/bind.go | 20 +++++++++++--------- handler/socks/v5/connect.go | 4 ++++ handler/socks/v5/handler.go | 15 ++++++++------- handler/socks/v5/mbind.go | 20 +++++++++++--------- handler/socks/v5/udp.go | 10 ++++++---- handler/socks/v5/udp_tun.go | 7 +++++++ handler/ss/handler.go | 5 +++++ handler/ss/udp/handler.go | 8 +++++--- handler/sshd/handler.go | 19 ++++++++++++++----- handler/unix/handler.go | 8 +++++--- internal/util/forwarder/sniffer.go | 14 ++++++++++++-- internal/util/sniffing/sniffer.go | 12 ++++++++++++ recorder/recorder.go | 1 + 27 files changed, 217 insertions(+), 92 deletions(-) diff --git a/handler/forward/local/handler.go b/handler/forward/local/handler.go index febaec52..714d8e40 100644 --- a/handler/forward/local/handler.go +++ b/handler/forward/local/handler.go @@ -5,7 +5,6 @@ import ( "bytes" "context" "errors" - "fmt" "net" "time" @@ -223,8 +222,9 @@ func (h *forwardHandler) Handle(ctx context.Context, conn net.Conn, opts ...hand ro.Host = addr log = log.WithFields(map[string]any{ - "node": target.Name, - "dst": fmt.Sprintf("%s/%s", addr, network), + "node": target.Name, + "dst": addr, + "network": network, }) log.Debugf("%s >> %s", conn.RemoteAddr(), addr) @@ -246,6 +246,10 @@ func (h *forwardHandler) Handle(ctx context.Context, conn net.Conn, opts ...hand } defer cc.Close() + log = log.WithFields(map[string]any{"src": cc.LocalAddr().String(), "dst": cc.RemoteAddr().String()}) + ro.Src = cc.LocalAddr().String() + ro.Dst = cc.RemoteAddr().String() + t := time.Now() log.Infof("%s <-> %s", conn.RemoteAddr(), target.Addr) xnet.Transport(conn, cc) diff --git a/handler/forward/remote/handler.go b/handler/forward/remote/handler.go index 8f96f245..d15769ca 100644 --- a/handler/forward/remote/handler.go +++ b/handler/forward/remote/handler.go @@ -5,7 +5,6 @@ import ( "bytes" "context" "errors" - "fmt" "net" "strconv" "time" @@ -233,8 +232,9 @@ func (h *forwardHandler) Handle(ctx context.Context, conn net.Conn, opts ...hand ro.Host = target.Addr log = log.WithFields(map[string]any{ - "node": target.Name, - "dst": fmt.Sprintf("%s/%s", target.Addr, network), + "node": target.Name, + "dst": target.Addr, + "network": network, }) log.Debugf("%s >> %s", conn.RemoteAddr(), target.Addr) @@ -256,6 +256,10 @@ func (h *forwardHandler) Handle(ctx context.Context, conn net.Conn, opts ...hand marker.Reset() } + log = log.WithFields(map[string]any{"src": cc.LocalAddr().String(), "dst": cc.RemoteAddr().String()}) + ro.Src = cc.LocalAddr().String() + ro.Dst = cc.RemoteAddr().String() + cc = proxyproto.WrapClientConn(h.md.proxyProtocol, conn.RemoteAddr(), convertAddr(conn.LocalAddr()), cc) t := time.Now() diff --git a/handler/http/handler.go b/handler/http/handler.go index 4a9dd461..9a074041 100644 --- a/handler/http/handler.go +++ b/handler/http/handler.go @@ -229,8 +229,9 @@ func (h *httpHandler) handleRequest(ctx context.Context, conn net.Conn, req *htt ro.Host = addr fields := map[string]any{ - "dst": addr, - "host": addr, + "dst": addr, + "host": addr, + "network": network, } if u, _, _ := h.basicProxyAuth(req.Header.Get("Proxy-Authorization")); u != "" { @@ -288,6 +289,9 @@ func (h *httpHandler) handleRequest(ctx context.Context, conn net.Conn, req *htt return errors.New("authentication failed") } + log = log.WithFields(map[string]any{"clientID": clientID}) + ro.ClientID = clientID + if resp.Header.Get("Proxy-Agent") == "" { resp.Header.Set("Proxy-Agent", h.md.proxyAgent) } @@ -354,6 +358,10 @@ func (h *httpHandler) handleRequest(ctx context.Context, conn net.Conn, req *htt } defer cc.Close() + log = log.WithFields(map[string]any{"src": cc.LocalAddr().String(), "dst": cc.RemoteAddr().String()}) + ro.Src = cc.LocalAddr().String() + ro.Dst = cc.RemoteAddr().String() + resp.StatusCode = http.StatusOK resp.Status = "200 Connection established" diff --git a/handler/http/udp.go b/handler/http/udp.go index 8337da77..36cd4bbe 100644 --- a/handler/http/udp.go +++ b/handler/http/udp.go @@ -63,6 +63,9 @@ func (h *httpHandler) handleUDP(ctx context.Context, conn net.Conn, ro *xrecorde } defer c.Close() + log.WithFields(map[string]any{"src": c.LocalAddr().String()}) + ro.Src = c.LocalAddr().String() + pc, ok := c.(net.PacketConn) if !ok { err = errors.New("wrong connection type") diff --git a/handler/http2/handler.go b/handler/http2/handler.go index e3f7e4fd..42e71b10 100644 --- a/handler/http2/handler.go +++ b/handler/http2/handler.go @@ -111,10 +111,11 @@ func (h *http2Handler) Handle(ctx context.Context, conn net.Conn, opts ...handle ro.ClientIP, _, _ = net.SplitHostPort(conn.RemoteAddr().String()) log := h.options.Logger.WithFields(map[string]any{ - "remote": conn.RemoteAddr().String(), - "local": conn.LocalAddr().String(), - "sid": ctxvalue.SidFromContext(ctx), - "client": ro.ClientIP, + "remote": conn.RemoteAddr().String(), + "local": conn.LocalAddr().String(), + "sid": ctxvalue.SidFromContext(ctx), + "client": ro.ClientIP, + "network": ro.Network, }) log.Infof("%s <> %s", conn.RemoteAddr(), conn.LocalAddr()) defer func() { @@ -230,6 +231,10 @@ func (h *http2Handler) roundTrip(ctx context.Context, w http.ResponseWriter, req if !ok { return errors.New("authentication failed") } + + log = log.WithFields(map[string]any{"clientID": clientID}) + ro.ClientID = clientID + ctx = ctxvalue.ContextWithClientID(ctx, ctxvalue.ClientID(clientID)) if h.options.Bypass != nil && h.options.Bypass.Contains(ctx, "tcp", host) { @@ -261,6 +266,10 @@ func (h *http2Handler) roundTrip(ctx context.Context, w http.ResponseWriter, req } defer cc.Close() + log = log.WithFields(map[string]any{"src": cc.LocalAddr().String(), "dst": cc.RemoteAddr().String()}) + ro.Src = cc.LocalAddr().String() + ro.Dst = cc.RemoteAddr().String() + if req.Method == http.MethodConnect { resp.StatusCode = http.StatusOK w.WriteHeader(http.StatusOK) diff --git a/handler/http3/handler.go b/handler/http3/handler.go index b38cc2f3..a56678b1 100644 --- a/handler/http3/handler.go +++ b/handler/http3/handler.go @@ -3,7 +3,6 @@ package http3 import ( "context" "errors" - "fmt" "net" "net/http" "net/http/httputil" @@ -58,9 +57,10 @@ func (h *http3Handler) Handle(ctx context.Context, conn net.Conn, opts ...handle start := time.Now() log := h.options.Logger.WithFields(map[string]any{ - "remote": conn.RemoteAddr().String(), - "local": conn.LocalAddr().String(), - "sid": ctxvalue.SidFromContext(ctx), + "remote": conn.RemoteAddr().String(), + "local": conn.LocalAddr().String(), + "sid": ctxvalue.SidFromContext(ctx), + "network": "udp", }) log.Infof("%s <> %s", conn.RemoteAddr(), conn.LocalAddr()) defer func() { @@ -124,7 +124,7 @@ func (h *http3Handler) roundTrip(ctx context.Context, w http.ResponseWriter, req } log = log.WithFields(map[string]any{ - "dst": fmt.Sprintf("%s/%s", target.Addr, "tcp"), + "dst": target.Addr, "host": target.Addr, }) diff --git a/handler/redirect/tcp/handler.go b/handler/redirect/tcp/handler.go index c0f9f960..2354dca8 100644 --- a/handler/redirect/tcp/handler.go +++ b/handler/redirect/tcp/handler.go @@ -5,7 +5,6 @@ import ( "bytes" "context" "crypto/tls" - "fmt" "net" "strings" "time" @@ -17,10 +16,10 @@ import ( xbypass "github.com/go-gost/x/bypass" ctxvalue "github.com/go-gost/x/ctx" xnet "github.com/go-gost/x/internal/net" - xstats "github.com/go-gost/x/observer/stats" "github.com/go-gost/x/internal/util/sniffing" tls_util "github.com/go-gost/x/internal/util/tls" rate_limiter "github.com/go-gost/x/limiter/rate" + xstats "github.com/go-gost/x/observer/stats" stats_wrapper "github.com/go-gost/x/observer/stats/wrapper" xrecorder "github.com/go-gost/x/recorder" "github.com/go-gost/x/registry" @@ -85,9 +84,10 @@ func (h *redirectHandler) Handle(ctx context.Context, conn net.Conn, opts ...han ro.ClientIP, _, _ = net.SplitHostPort(conn.RemoteAddr().String()) log := h.options.Logger.WithFields(map[string]any{ - "remote": conn.RemoteAddr().String(), - "local": conn.LocalAddr().String(), - "sid": ctxvalue.SidFromContext(ctx), + "remote": conn.RemoteAddr().String(), + "local": conn.LocalAddr().String(), + "sid": ctxvalue.SidFromContext(ctx), + "network": ro.Network, }) log.Infof("%s <> %s", conn.RemoteAddr(), conn.LocalAddr()) @@ -132,7 +132,7 @@ func (h *redirectHandler) Handle(ctx context.Context, conn net.Conn, opts ...han ro.Dst = dstAddr.String() log = log.WithFields(map[string]any{ - "dst": fmt.Sprintf("%s/%s", dstAddr, dstAddr.Network()), + "dst": dstAddr.String(), "host": dstAddr.String(), }) @@ -236,6 +236,10 @@ func (h *redirectHandler) Handle(ctx context.Context, conn net.Conn, opts ...han } defer cc.Close() + log = log.WithFields(map[string]any{"src": cc.LocalAddr().String(), "dst": cc.RemoteAddr().String()}) + ro.Src = cc.LocalAddr().String() + ro.Dst = cc.RemoteAddr().String() + t := time.Now() log.Infof("%s <-> %s", conn.RemoteAddr(), dstAddr) xnet.Transport(conn, cc) diff --git a/handler/redirect/udp/handler.go b/handler/redirect/udp/handler.go index e8c692a3..7d55c1b0 100644 --- a/handler/redirect/udp/handler.go +++ b/handler/redirect/udp/handler.go @@ -3,7 +3,6 @@ package redirect import ( "bytes" "context" - "fmt" "net" "time" @@ -66,15 +65,17 @@ func (h *redirectHandler) Handle(ctx context.Context, conn net.Conn, opts ...han Service: h.options.Service, RemoteAddr: conn.RemoteAddr().String(), LocalAddr: conn.LocalAddr().String(), + Network: "udp", Time: start, SID: string(ctxvalue.SidFromContext(ctx)), } ro.ClientIP, _, _ = net.SplitHostPort(conn.RemoteAddr().String()) log := h.options.Logger.WithFields(map[string]any{ - "remote": conn.RemoteAddr().String(), - "local": conn.LocalAddr().String(), - "sid": ctxvalue.SidFromContext(ctx), + "remote": conn.RemoteAddr().String(), + "local": conn.LocalAddr().String(), + "sid": ctxvalue.SidFromContext(ctx), + "network": ro.Network, }) log.Infof("%s <> %s", conn.RemoteAddr(), conn.LocalAddr()) @@ -109,7 +110,7 @@ func (h *redirectHandler) Handle(ctx context.Context, conn net.Conn, opts ...han ro.Host = dstAddr.String() log = log.WithFields(map[string]any{ - "dst": fmt.Sprintf("%s/%s", dstAddr, dstAddr.Network()), + "dst": dstAddr, "host": dstAddr.String(), }) @@ -130,6 +131,10 @@ func (h *redirectHandler) Handle(ctx context.Context, conn net.Conn, opts ...han } defer cc.Close() + log = log.WithFields(map[string]any{"src": cc.LocalAddr().String(), "dst": cc.RemoteAddr().String()}) + ro.Src = cc.LocalAddr().String() + ro.Dst = cc.RemoteAddr().String() + t := time.Now() log.Infof("%s <-> %s", conn.RemoteAddr(), dstAddr) xnet.Transport(conn, cc) diff --git a/handler/relay/bind.go b/handler/relay/bind.go index d1c49e50..2ff7aa0a 100644 --- a/handler/relay/bind.go +++ b/handler/relay/bind.go @@ -20,12 +20,13 @@ import ( traffic_wrapper "github.com/go-gost/x/limiter/traffic/wrapper" metrics "github.com/go-gost/x/metrics/wrapper" stats_wrapper "github.com/go-gost/x/observer/stats/wrapper" + xrecorder "github.com/go-gost/x/recorder" xservice "github.com/go-gost/x/service" ) -func (h *relayHandler) handleBind(ctx context.Context, conn net.Conn, network, address string, log logger.Logger) error { +func (h *relayHandler) handleBind(ctx context.Context, conn net.Conn, network, address string, ro *xrecorder.HandlerRecorderObject, log logger.Logger) error { log = log.WithFields(map[string]any{ - "dst": fmt.Sprintf("%s/%s", address, network), + "dst": address, "cmd": "bind", }) @@ -68,13 +69,13 @@ func (h *relayHandler) handleBind(ctx context.Context, conn net.Conn, network, a } if network == "tcp" { - return h.bindTCP(ctx, conn, network, address, log) + return h.bindTCP(ctx, conn, network, address, ro, log) } else { - return h.bindUDP(ctx, conn, network, address, log) + return h.bindUDP(ctx, conn, network, address, ro, log) } } -func (h *relayHandler) bindTCP(ctx context.Context, conn net.Conn, network, address string, log logger.Logger) error { +func (h *relayHandler) bindTCP(ctx context.Context, conn net.Conn, network, address string, ro *xrecorder.HandlerRecorderObject, log logger.Logger) error { resp := relay.Response{ Version: relay.Version1, Status: relay.StatusOK, @@ -98,7 +99,9 @@ func (h *relayHandler) bindTCP(ctx context.Context, conn net.Conn, network, addr "listener": "tcp", "handler": "ep-tcp", "bind": fmt.Sprintf("%s/%s", ln.Addr(), ln.Addr().Network()), + "src": ln.Addr().String(), }) + ro.Src = ln.Addr().String() af := &relay.AddrFeature{} if err := af.ParseFrom(ln.Addr().String()); err != nil { @@ -157,7 +160,7 @@ func (h *relayHandler) bindTCP(ctx context.Context, conn net.Conn, network, addr return srv.Serve() } -func (h *relayHandler) bindUDP(ctx context.Context, conn net.Conn, network, address string, log logger.Logger) error { +func (h *relayHandler) bindUDP(ctx context.Context, conn net.Conn, network, address string, ro *xrecorder.HandlerRecorderObject, log logger.Logger) error { resp := relay.Response{ Version: relay.Version1, Status: relay.StatusOK, @@ -177,8 +180,11 @@ func (h *relayHandler) bindUDP(ctx context.Context, conn net.Conn, network, addr "service": serviceName, "listener": "udp", "handler": "ep-udp", - "bind": fmt.Sprintf("%s/%s", pc.LocalAddr(), pc.LocalAddr().Network()), + "bind": pc.LocalAddr().String(), + "src": pc.LocalAddr().String(), }) + ro.Src = pc.LocalAddr().String() + pc = metrics.WrapPacketConn(serviceName, pc) // pc = admission.WrapPacketConn(l.options.Admission, pc) // pc = limiter.WrapPacketConn(l.options.TrafficLimiter, pc) @@ -195,9 +201,6 @@ func (h *relayHandler) bindUDP(ctx context.Context, conn net.Conn, network, addr return err } - log = log.WithFields(map[string]any{ - "bind": pc.LocalAddr().String(), - }) log.Debugf("bind on %s OK", pc.LocalAddr()) r := udp.NewRelay(relay_util.UDPTunServerConn(conn), pc). diff --git a/handler/relay/connect.go b/handler/relay/connect.go index ccf74cfb..ace9787c 100644 --- a/handler/relay/connect.go +++ b/handler/relay/connect.go @@ -6,7 +6,6 @@ import ( "context" "crypto/tls" "errors" - "fmt" "io" "net" "time" @@ -33,7 +32,7 @@ func (h *relayHandler) handleConnect(ctx context.Context, conn net.Conn, network } log = log.WithFields(map[string]any{ - "dst": fmt.Sprintf("%s/%s", address, network), + "dst": address, "cmd": "connect", "host": address, }) @@ -114,6 +113,10 @@ func (h *relayHandler) handleConnect(ctx context.Context, conn net.Conn, network } defer cc.Close() + log = log.WithFields(map[string]any{"src": cc.LocalAddr().String(), "dst": cc.RemoteAddr().String()}) + ro.Src = cc.LocalAddr().String() + ro.Dst = cc.RemoteAddr().String() + if h.md.noDelay { if _, err := resp.WriteTo(conn); err != nil { log.Error(err) diff --git a/handler/relay/forward.go b/handler/relay/forward.go index 64f93383..48fde166 100644 --- a/handler/relay/forward.go +++ b/handler/relay/forward.go @@ -1,9 +1,9 @@ package relay import ( + "bytes" "context" "errors" - "fmt" "net" "time" @@ -15,9 +15,10 @@ import ( xnet "github.com/go-gost/x/internal/net" "github.com/go-gost/x/limiter/traffic/wrapper" stats_wrapper "github.com/go-gost/x/observer/stats/wrapper" + xrecorder "github.com/go-gost/x/recorder" ) -func (h *relayHandler) handleForward(ctx context.Context, conn net.Conn, network string, log logger.Logger) error { +func (h *relayHandler) handleForward(ctx context.Context, conn net.Conn, network string, ro *xrecorder.HandlerRecorderObject, log logger.Logger) error { resp := relay.Response{ Version: relay.Version1, Status: relay.StatusOK, @@ -32,7 +33,7 @@ func (h *relayHandler) handleForward(ctx context.Context, conn net.Conn, network } log = log.WithFields(map[string]any{ - "dst": fmt.Sprintf("%s/%s", target.Addr, network), + "dst": target.Addr, "cmd": "forward", }) @@ -61,7 +62,9 @@ func (h *relayHandler) handleForward(ctx context.Context, conn net.Conn, network conn = xnet.NewReadWriteConn(rw, rw, conn) } - cc, err := h.options.Router.Dial(ctx, network, target.Addr) + var buf bytes.Buffer + cc, err := h.options.Router.Dial(ctxvalue.ContextWithBuffer(ctx, &buf), network, target.Addr) + ro.Route = buf.String() if err != nil { // TODO: the router itself may be failed due to the failed node in the router, // the dead marker may be a wrong operation. @@ -76,6 +79,11 @@ func (h *relayHandler) handleForward(ctx context.Context, conn net.Conn, network return err } defer cc.Close() + + log = log.WithFields(map[string]any{"src": cc.LocalAddr().String(), "dst": cc.RemoteAddr().String()}) + ro.Src = cc.LocalAddr().String() + ro.Dst = cc.RemoteAddr().String() + if marker := target.Marker(); marker != nil { marker.Reset() } diff --git a/handler/relay/handler.go b/handler/relay/handler.go index 035c873d..73cc84b6 100644 --- a/handler/relay/handler.go +++ b/handler/relay/handler.go @@ -208,6 +208,8 @@ func (h *relayHandler) Handle(ctx context.Context, conn net.Conn, opts ...handle resp.WriteTo(conn) return ErrUnauthorized } + log = log.WithFields(map[string]any{"clientID": clientID}) + ro.ClientID = clientID ctx = ctxvalue.ContextWithClientID(ctx, ctxvalue.ClientID(clientID)) } @@ -217,17 +219,18 @@ func (h *relayHandler) Handle(ctx context.Context, conn net.Conn, opts ...handle } ro.Network = network ro.Host = address + log = log.WithFields(map[string]any{"network": network}) if h.hop != nil { // forward mode - return h.handleForward(ctx, conn, network, log) + return h.handleForward(ctx, conn, network, ro, log) } switch req.Cmd & relay.CmdMask { case 0, relay.CmdConnect: return h.handleConnect(ctx, conn, network, address, ro, log) case relay.CmdBind: - return h.handleBind(ctx, conn, network, address, log) + return h.handleBind(ctx, conn, network, address, ro, log) default: resp.Status = relay.StatusBadRequest resp.WriteTo(conn) diff --git a/handler/sni/handler.go b/handler/sni/handler.go index a850bb59..dbbfe160 100644 --- a/handler/sni/handler.go +++ b/handler/sni/handler.go @@ -94,6 +94,7 @@ func (h *sniHandler) Handle(ctx context.Context, conn net.Conn, opts ...handler. "local": conn.LocalAddr().String(), "sid": ctxvalue.SidFromContext(ctx), "client": ro.ClientIP, + "network": ro.Network, }) log.Infof("%s <> %s", conn.RemoteAddr(), conn.LocalAddr()) diff --git a/handler/socks/v4/handler.go b/handler/socks/v4/handler.go index e4c548f7..744ecdbd 100644 --- a/handler/socks/v4/handler.go +++ b/handler/socks/v4/handler.go @@ -121,10 +121,11 @@ func (h *socks4Handler) Handle(ctx context.Context, conn net.Conn, opts ...handl } log := h.options.Logger.WithFields(map[string]any{ - "remote": conn.RemoteAddr().String(), - "local": conn.LocalAddr().String(), - "sid": ctxvalue.SidFromContext(ctx), - "client": ro.ClientIP, + "remote": conn.RemoteAddr().String(), + "local": conn.LocalAddr().String(), + "sid": ctxvalue.SidFromContext(ctx), + "client": ro.ClientIP, + "network": ro.Network, }) log.Infof("%s <> %s", conn.RemoteAddr(), conn.LocalAddr()) @@ -163,6 +164,11 @@ func (h *socks4Handler) Handle(ctx context.Context, conn net.Conn, opts ...handl return err } + if userid := string(req.Userid); userid != "" { + log = log.WithFields(map[string]any{"user": userid}) + ro.ClientID = userid + } + ro.Host = req.Addr.String() log.Trace(req) @@ -177,6 +183,7 @@ func (h *socks4Handler) Handle(ctx context.Context, conn net.Conn, opts ...handl } ctx = ctxvalue.ContextWithClientID(ctx, ctxvalue.ClientID(clientID)) ro.ClientID = clientID + log = log.WithFields(map[string]any{"clientID": clientID}) } switch req.Cmd { @@ -254,6 +261,10 @@ func (h *socks4Handler) handleConnect(ctx context.Context, conn net.Conn, req *g } defer cc.Close() + log = log.WithFields(map[string]any{"src": cc.LocalAddr().String(), "dst": cc.RemoteAddr().String()}) + ro.Src = cc.LocalAddr().String() + ro.Dst = cc.RemoteAddr().String() + resp := gosocks4.NewReply(gosocks4.Granted, nil) log.Trace(resp) if err := resp.Write(conn); err != nil { diff --git a/handler/socks/v5/bind.go b/handler/socks/v5/bind.go index 1b3e2180..b22cea84 100644 --- a/handler/socks/v5/bind.go +++ b/handler/socks/v5/bind.go @@ -2,7 +2,6 @@ package v5 import ( "context" - "fmt" "net" "time" @@ -14,11 +13,12 @@ import ( xnet "github.com/go-gost/x/internal/net" traffic_wrapper "github.com/go-gost/x/limiter/traffic/wrapper" stats_wrapper "github.com/go-gost/x/observer/stats/wrapper" + xrecorder "github.com/go-gost/x/recorder" ) -func (h *socks5Handler) handleBind(ctx context.Context, conn net.Conn, network, address string, log logger.Logger) error { +func (h *socks5Handler) handleBind(ctx context.Context, conn net.Conn, network, address string, ro *xrecorder.HandlerRecorderObject, log logger.Logger) error { log = log.WithFields(map[string]any{ - "dst": fmt.Sprintf("%s/%s", address, network), + "dst": address, "cmd": "bind", }) @@ -56,10 +56,10 @@ func (h *socks5Handler) handleBind(ctx context.Context, conn net.Conn, network, } // BIND does not support chain. - return h.bindLocal(ctx, conn, network, address, log) + return h.bindLocal(ctx, conn, network, address, ro, log) } -func (h *socks5Handler) bindLocal(ctx context.Context, conn net.Conn, network, address string, log logger.Logger) error { +func (h *socks5Handler) bindLocal(ctx context.Context, conn net.Conn, network, address string, ro *xrecorder.HandlerRecorderObject, log logger.Logger) error { lc := xnet.ListenConfig{ Netns: h.options.Netns, } @@ -74,6 +74,12 @@ func (h *socks5Handler) bindLocal(ctx context.Context, conn net.Conn, network, a return err } + log = log.WithFields(map[string]any{ + "src": ln.Addr().String(), + "bind": ln.Addr().String(), + }) + ro.Src = ln.Addr().String() + socksAddr := gosocks5.Addr{} if err := socksAddr.ParseFrom(ln.Addr().String()); err != nil { log.Warn(err) @@ -90,10 +96,6 @@ func (h *socks5Handler) bindLocal(ctx context.Context, conn net.Conn, network, a return err } - log = log.WithFields(map[string]any{ - "bind": fmt.Sprintf("%s/%s", ln.Addr(), ln.Addr().Network()), - }) - log.Debugf("bind on %s OK", ln.Addr()) h.serveBind(ctx, conn, ln, log) diff --git a/handler/socks/v5/connect.go b/handler/socks/v5/connect.go index e71fed86..3a62b402 100644 --- a/handler/socks/v5/connect.go +++ b/handler/socks/v5/connect.go @@ -76,6 +76,10 @@ func (h *socks5Handler) handleConnect(ctx context.Context, conn net.Conn, networ } defer cc.Close() + log = log.WithFields(map[string]any{"src": cc.LocalAddr().String(), "dst": cc.RemoteAddr().String()}) + ro.Src = cc.LocalAddr().String() + ro.Dst = cc.RemoteAddr().String() + resp := gosocks5.NewReply(gosocks5.Succeeded, nil) log.Trace(resp) if err := resp.Write(conn); err != nil { diff --git a/handler/socks/v5/handler.go b/handler/socks/v5/handler.go index 2cdd5173..76bf9ab8 100644 --- a/handler/socks/v5/handler.go +++ b/handler/socks/v5/handler.go @@ -122,10 +122,11 @@ func (h *socks5Handler) Handle(ctx context.Context, conn net.Conn, opts ...handl } log := h.options.Logger.WithFields(map[string]any{ - "remote": conn.RemoteAddr().String(), - "local": conn.LocalAddr().String(), - "sid": ctxvalue.SidFromContext(ctx), - "client": ro.ClientIP, + "remote": conn.RemoteAddr().String(), + "local": conn.LocalAddr().String(), + "sid": ctxvalue.SidFromContext(ctx), + "client": ro.ClientIP, + "network": ro.Network, }) log.Infof("%s <> %s", conn.RemoteAddr(), conn.LocalAddr()) @@ -166,7 +167,7 @@ func (h *socks5Handler) Handle(ctx context.Context, conn net.Conn, opts ...handl if clientID := sc.ID(); clientID != "" { ctx = ctxvalue.ContextWithClientID(ctx, ctxvalue.ClientID(clientID)) - log = log.WithFields(map[string]any{"user": clientID}) + log = log.WithFields(map[string]any{"user": clientID, "clientID": clientID}) ro.ClientID = clientID } @@ -180,9 +181,9 @@ func (h *socks5Handler) Handle(ctx context.Context, conn net.Conn, opts ...handl case gosocks5.CmdConnect: return h.handleConnect(ctx, conn, "tcp", address, ro, log) case gosocks5.CmdBind: - return h.handleBind(ctx, conn, "tcp", address, log) + return h.handleBind(ctx, conn, "tcp", address, ro, log) case socks.CmdMuxBind: - return h.handleMuxBind(ctx, conn, "tcp", address, log) + return h.handleMuxBind(ctx, conn, "tcp", address, ro, log) case gosocks5.CmdUdp: ro.Network = "udp" return h.handleUDP(ctx, conn, ro, log) diff --git a/handler/socks/v5/mbind.go b/handler/socks/v5/mbind.go index 6a1b2c79..b3c56489 100644 --- a/handler/socks/v5/mbind.go +++ b/handler/socks/v5/mbind.go @@ -2,7 +2,6 @@ package v5 import ( "context" - "fmt" "net" "time" @@ -15,11 +14,12 @@ import ( "github.com/go-gost/x/internal/util/mux" traffic_wrapper "github.com/go-gost/x/limiter/traffic/wrapper" stats_wrapper "github.com/go-gost/x/observer/stats/wrapper" + xrecorder "github.com/go-gost/x/recorder" ) -func (h *socks5Handler) handleMuxBind(ctx context.Context, conn net.Conn, network, address string, log logger.Logger) error { +func (h *socks5Handler) handleMuxBind(ctx context.Context, conn net.Conn, network, address string, ro *xrecorder.HandlerRecorderObject, log logger.Logger) error { log = log.WithFields(map[string]any{ - "dst": fmt.Sprintf("%s/%s", address, network), + "dst": address, "cmd": "mbind", }) @@ -56,10 +56,10 @@ func (h *socks5Handler) handleMuxBind(ctx context.Context, conn net.Conn, networ conn = xnet.NewReadWriteConn(rw, rw, conn) } - return h.muxBindLocal(ctx, conn, network, address, log) + return h.muxBindLocal(ctx, conn, network, address, ro, log) } -func (h *socks5Handler) muxBindLocal(ctx context.Context, conn net.Conn, network, address string, log logger.Logger) error { +func (h *socks5Handler) muxBindLocal(ctx context.Context, conn net.Conn, network, address string, ro *xrecorder.HandlerRecorderObject, log logger.Logger) error { lc := xnet.ListenConfig{ Netns: h.options.Netns, } @@ -74,6 +74,12 @@ func (h *socks5Handler) muxBindLocal(ctx context.Context, conn net.Conn, network return err } + log = log.WithFields(map[string]any{ + "src": ln.Addr().String(), + "bind": ln.Addr().String(), + }) + + ro.Src = ln.Addr().String() socksAddr := gosocks5.Addr{} err = socksAddr.ParseFrom(ln.Addr().String()) if err != nil { @@ -91,10 +97,6 @@ func (h *socks5Handler) muxBindLocal(ctx context.Context, conn net.Conn, network return err } - log = log.WithFields(map[string]any{ - "bind": fmt.Sprintf("%s/%s", ln.Addr(), ln.Addr().Network()), - }) - log.Debugf("bind on %s OK", ln.Addr()) return h.serveMuxBind(ctx, conn, ln, log) diff --git a/handler/socks/v5/udp.go b/handler/socks/v5/udp.go index 2011187b..0bff79ad 100644 --- a/handler/socks/v5/udp.go +++ b/handler/socks/v5/udp.go @@ -4,7 +4,6 @@ import ( "bytes" "context" "errors" - "fmt" "io" "net" "time" @@ -49,6 +48,12 @@ func (h *socks5Handler) handleUDP(ctx context.Context, conn net.Conn, ro *xrecor } defer cc.Close() + log = log.WithFields(map[string]any{ + "src": cc.LocalAddr().String(), + "bind": cc.LocalAddr().String(), + }) + ro.Src = cc.LocalAddr().String() + saddr := gosocks5.Addr{} saddr.ParseFrom(cc.LocalAddr().String()) reply := gosocks5.NewReply(gosocks5.Succeeded, &saddr) @@ -58,9 +63,6 @@ func (h *socks5Handler) handleUDP(ctx context.Context, conn net.Conn, ro *xrecor return err } - log = log.WithFields(map[string]any{ - "bind": fmt.Sprintf("%s/%s", cc.LocalAddr(), cc.LocalAddr().Network()), - }) log.Debugf("bind on %s OK", cc.LocalAddr()) // obtain a udp connection diff --git a/handler/socks/v5/udp_tun.go b/handler/socks/v5/udp_tun.go index 5f416ba8..4f4b067c 100644 --- a/handler/socks/v5/udp_tun.go +++ b/handler/socks/v5/udp_tun.go @@ -102,9 +102,16 @@ func (h *socks5Handler) handleUDPTun(ctx context.Context, conn net.Conn, network reply.Write(conn) return err } + } defer pc.Close() + log = log.WithFields(map[string]any{ + "src": pc.LocalAddr().String(), + "bind": pc.LocalAddr().String(), + }) + ro.Src = pc.LocalAddr().String() + saddr := gosocks5.Addr{} saddr.ParseFrom(pc.LocalAddr().String()) reply := gosocks5.NewReply(gosocks5.Succeeded, &saddr) diff --git a/handler/ss/handler.go b/handler/ss/handler.go index 60fcb27f..ad28f8ca 100644 --- a/handler/ss/handler.go +++ b/handler/ss/handler.go @@ -104,6 +104,7 @@ func (h *ssHandler) Handle(ctx context.Context, conn net.Conn, opts ...handler.H "local": conn.LocalAddr().String(), "sid": ctxvalue.SidFromContext(ctx), "client": ro.ClientIP, + "network": ro.Network, }) log.Infof("%s <> %s", conn.RemoteAddr(), conn.LocalAddr()) @@ -173,6 +174,10 @@ func (h *ssHandler) Handle(ctx context.Context, conn net.Conn, opts ...handler.H } defer cc.Close() + log = log.WithFields(map[string]any{"src": cc.LocalAddr().String(), "dst": cc.RemoteAddr().String()}) + ro.Src = cc.LocalAddr().String() + ro.Dst = cc.RemoteAddr().String() + if h.md.sniffing { if h.md.sniffingTimeout > 0 { conn.SetReadDeadline(time.Now().Add(h.md.sniffingTimeout)) diff --git a/handler/ss/udp/handler.go b/handler/ss/udp/handler.go index f00693b0..5cefa7ab 100644 --- a/handler/ss/udp/handler.go +++ b/handler/ss/udp/handler.go @@ -82,9 +82,11 @@ func (h *ssuHandler) Handle(ctx context.Context, conn net.Conn, opts ...handler. ro.ClientIP, _, _ = net.SplitHostPort(conn.RemoteAddr().String()) log := h.options.Logger.WithFields(map[string]any{ - "remote": conn.RemoteAddr().String(), - "local": conn.LocalAddr().String(), - "sid": ctxvalue.SidFromContext(ctx), + "remote": conn.RemoteAddr().String(), + "local": conn.LocalAddr().String(), + "sid": ctxvalue.SidFromContext(ctx), + "client": ro.ClientIP, + "network": ro.Network, }) log.Infof("%s <> %s", conn.RemoteAddr(), conn.LocalAddr()) diff --git a/handler/sshd/handler.go b/handler/sshd/handler.go index 47b6272e..355d1e80 100644 --- a/handler/sshd/handler.go +++ b/handler/sshd/handler.go @@ -93,9 +93,11 @@ func (h *forwardHandler) Handle(ctx context.Context, conn net.Conn, opts ...hand ro.ClientIP, _, _ = net.SplitHostPort(conn.RemoteAddr().String()) log := h.options.Logger.WithFields(map[string]any{ - "remote": conn.RemoteAddr().String(), - "local": conn.LocalAddr().String(), - "sid": ctxvalue.SidFromContext(ctx), + "remote": conn.RemoteAddr().String(), + "local": conn.LocalAddr().String(), + "sid": ctxvalue.SidFromContext(ctx), + "client": ro.ClientIP, + "network": ro.Network, }) log.Infof("%s <> %s", conn.RemoteAddr(), conn.LocalAddr()) @@ -161,6 +163,10 @@ func (h *forwardHandler) handleDirectForward(ctx context.Context, conn *sshd_uti } defer cc.Close() + log = log.WithFields(map[string]any{"src": cc.LocalAddr().String(), "dst": cc.RemoteAddr().String()}) + ro.Src = cc.LocalAddr().String() + ro.Dst = cc.RemoteAddr().String() + if h.md.sniffing { if h.md.sniffingTimeout > 0 { conn.SetReadDeadline(time.Now().Add(h.md.sniffingTimeout)) @@ -235,7 +241,7 @@ func (h *forwardHandler) handleRemoteForward(ctx context.Context, conn *sshd_uti ro.Host = addr log = log.WithFields(map[string]any{ - "dst": fmt.Sprintf("%s/%s", addr, network), + "dst": addr, "cmd": "bind", }) @@ -251,8 +257,11 @@ func (h *forwardHandler) handleRemoteForward(ctx context.Context, conn *sshd_uti defer ln.Close() log = log.WithFields(map[string]any{ - "bind": fmt.Sprintf("%s/%s", ln.Addr(), ln.Addr().Network()), + "src": ln.Addr().String(), + "bind": ln.Addr().String(), }) + ro.Src = ln.Addr().String() + log.Debugf("bind on %s OK", ln.Addr()) err = func() error { diff --git a/handler/unix/handler.go b/handler/unix/handler.go index c5cd0113..055c6c8b 100644 --- a/handler/unix/handler.go +++ b/handler/unix/handler.go @@ -90,9 +90,11 @@ func (h *unixHandler) Handle(ctx context.Context, conn net.Conn, opts ...handler ro.ClientIP, _, _ = net.SplitHostPort(conn.RemoteAddr().String()) log := h.options.Logger.WithFields(map[string]any{ - "remote": conn.RemoteAddr().String(), - "local": conn.LocalAddr().String(), - "sid": ctxvalue.SidFromContext(ctx), + "remote": conn.RemoteAddr().String(), + "local": conn.LocalAddr().String(), + "sid": ctxvalue.SidFromContext(ctx), + "client": ro.ClientIP, + "network": ro.Network, }) log.Infof("%s <> %s", conn.RemoteAddr(), conn.LocalAddr()) diff --git a/internal/util/forwarder/sniffer.go b/internal/util/forwarder/sniffer.go index 60f90e8a..35848a86 100644 --- a/internal/util/forwarder/sniffer.go +++ b/internal/util/forwarder/sniffer.go @@ -175,9 +175,12 @@ func (h *Sniffer) HandleHTTP(ctx context.Context, conn net.Conn, opts ...HandleO } defer cc.Close() + ho.Log = ho.Log.WithFields(map[string]any{"src": cc.LocalAddr().String(), "dst": cc.RemoteAddr().String()}) log := ho.Log log.Debugf("connected to node %s(%s)", node.Name, node.Addr) + ro.Src = cc.LocalAddr().String() + ro.Dst = cc.RemoteAddr().String() ro.Time = time.Time{} shouldClose, err := h.httpRoundTrip(ctx, xio.NewReadWriter(br, conn), cc, node, req, &pStats, &ho) @@ -330,7 +333,11 @@ func (h *Sniffer) serveH2(ctx context.Context, conn net.Conn, ho *HandleOptions) if err != nil { return nil, err } - ho.Log.Debugf("connected to node %s(%s)", node.Name, node.Addr) + + log = log.WithFields(map[string]any{"src": cc.LocalAddr().String(), "dst": cc.RemoteAddr().String()}) + ro.Src = cc.LocalAddr().String() + ro.Dst = cc.RemoteAddr().String() + log.Debugf("connected to node %s(%s)", node.Name, node.Addr) return cc, nil }, } @@ -798,9 +805,12 @@ func (h *Sniffer) HandleTLS(ctx context.Context, conn net.Conn, opts ...HandleOp defer cc.Close() ho.Node = node - log := ho.Log + log := ho.Log.WithFields(map[string]any{"src": cc.LocalAddr().String(), "dst": cc.RemoteAddr().String()}) log.Debugf("connected to node %s(%s)", node.Name, node.Addr) + ro.Src = cc.LocalAddr().String() + ro.Dst = cc.RemoteAddr().String() + if h.Certificate != nil && h.PrivateKey != nil && len(clientHello.SupportedProtos) > 0 && (clientHello.SupportedProtos[0] == "h2" || clientHello.SupportedProtos[0] == "http/1.1") { if host == "" { diff --git a/internal/util/sniffing/sniffer.go b/internal/util/sniffing/sniffer.go index e1a7eb58..989359d2 100644 --- a/internal/util/sniffing/sniffer.go +++ b/internal/util/sniffing/sniffer.go @@ -186,6 +186,10 @@ func (h *Sniffer) HandleHTTP(ctx context.Context, conn net.Conn, opts ...HandleO } defer cc.Close() + log = log.WithFields(map[string]any{"src": cc.LocalAddr().String(), "dst": cc.RemoteAddr().String()}) + + ro.Src = cc.LocalAddr().String() + ro.Dst = cc.RemoteAddr().String() ro.Time = time.Time{} shouldClose, err := h.httpRoundTrip(ctx, xio.NewReadWriter(br, conn), cc, req, ro, &pStats, log) @@ -243,6 +247,10 @@ func (h *Sniffer) serveH2(ctx context.Context, conn net.Conn, ho *HandleOptions) return nil, err } + log = log.WithFields(map[string]any{"src": cc.LocalAddr().String(), "dst": cc.RemoteAddr().String()}) + ro.Src = cc.LocalAddr().String() + ro.Dst = cc.RemoteAddr().String() + cc = tls.Client(cc, cfg) return cc, nil }, @@ -603,6 +611,10 @@ func (h *Sniffer) HandleTLS(ctx context.Context, conn net.Conn, opts ...HandleOp } defer cc.Close() + log = log.WithFields(map[string]any{"src": cc.LocalAddr().String(), "dst": cc.RemoteAddr().String()}) + ro.Src = cc.LocalAddr().String() + ro.Dst = cc.RemoteAddr().String() + if h.Certificate != nil && h.PrivateKey != nil && len(clientHello.SupportedProtos) > 0 && (clientHello.SupportedProtos[0] == "h2" || clientHello.SupportedProtos[0] == "http/1.1") { if host == "" { diff --git a/recorder/recorder.go b/recorder/recorder.go index 2190678e..f0f8a9cf 100644 --- a/recorder/recorder.go +++ b/recorder/recorder.go @@ -78,6 +78,7 @@ type HandlerRecorderObject struct { RemoteAddr string `json:"remote"` LocalAddr string `json:"local"` Host string `json:"host"` + Src string `json:"src"` Dst string `json:"dst"` Proto string `json:"proto,omitempty"` ClientIP string `json:"clientIP"`