diff --git a/adapter/outbound/base.go b/adapter/outbound/base.go index 0aa8dfc5..cb959ef8 100644 --- a/adapter/outbound/base.go +++ b/adapter/outbound/base.go @@ -128,7 +128,12 @@ func NewBase(opt BaseOption) *Base { type conn struct { net.Conn - chain C.Chain + chain C.Chain + lastAdapterRemote string +} + +func (c *conn) RemoteDestination() string { + return c.lastAdapterRemote } // Chains implements C.Connection @@ -142,12 +147,17 @@ func (c *conn) AppendToChains(a C.ProxyAdapter) { } func NewConn(c net.Conn, a C.ProxyAdapter) C.Conn { - return &conn{c, []string{a.Name()}} + return &conn{c, []string{a.Name()}, a.Addr()} } type packetConn struct { net.PacketConn - chain C.Chain + chain C.Chain + lastAdapterRemote string +} + +func (c *packetConn) RemoteDestination() string { + return c.lastAdapterRemote } // Chains implements C.Connection @@ -161,5 +171,5 @@ func (c *packetConn) AppendToChains(a C.ProxyAdapter) { } func newPacketConn(pc net.PacketConn, a C.ProxyAdapter) C.PacketConn { - return &packetConn{pc, []string{a.Name()}} + return &packetConn{pc, []string{a.Name()}, a.Addr()} } diff --git a/constant/adapters.go b/constant/adapters.go index b2339c5d..4e40f21e 100644 --- a/constant/adapters.go +++ b/constant/adapters.go @@ -41,6 +41,7 @@ const ( type Connection interface { Chains() Chain AppendToChains(adapter ProxyAdapter) + RemoteDestination() string } type Chain []string diff --git a/tunnel/tunnel.go b/tunnel/tunnel.go index ddc0670a..22f2c507 100644 --- a/tunnel/tunnel.go +++ b/tunnel/tunnel.go @@ -288,14 +288,12 @@ func handleUDPConn(packet *inbound.PacketAdapter) { } pCtx.InjectPacketConn(rawPc) - actualProxy := proxy.Unwrap(metadata) - if actualProxy != nil { - if dst, _, err := net.SplitHostPort(actualProxy.Addr()); err == nil { - metadata.RemoteDst = dst - } else { - if addrError, ok := err.(*net.AddrError); ok && strings.Contains(addrError.Err, "missing port") { - metadata.RemoteDst = actualProxy.Addr() - } + addr := rawPc.RemoteDestination() + if dst, _, err := net.SplitHostPort(addr); err == nil { + metadata.RemoteDst = dst + } else { + if addrError, ok := err.(*net.AddrError); ok && strings.Contains(addrError.Err, "missing port") { + metadata.RemoteDst = addr } }