From 4741ac6702e1b47ebbcda0a591c66d6bdca854bf Mon Sep 17 00:00:00 2001 From: wwqgtxx Date: Tue, 27 May 2025 16:32:42 +0800 Subject: [PATCH] fix: in-port not work with shadowsocks listener --- go.mod | 4 ++-- go.sum | 8 ++++---- listener/sing/context.go | 16 ++++++++++++++++ listener/sing/sing.go | 3 +++ listener/sing_shadowsocks/server.go | 10 ++++------ 5 files changed, 29 insertions(+), 12 deletions(-) diff --git a/go.mod b/go.mod index 8186a5d8..f9039e07 100644 --- a/go.mod +++ b/go.mod @@ -28,8 +28,8 @@ require ( github.com/metacubex/sing v0.5.3 github.com/metacubex/sing-mux v0.3.2 github.com/metacubex/sing-quic v0.0.0-20250523120938-f1a248e5ec7f - github.com/metacubex/sing-shadowsocks v0.2.9 - github.com/metacubex/sing-shadowsocks2 v0.2.3 + github.com/metacubex/sing-shadowsocks v0.2.10 + github.com/metacubex/sing-shadowsocks2 v0.2.4 github.com/metacubex/sing-shadowtls v0.0.0-20250503063515-5d9f966d17a2 github.com/metacubex/sing-tun v0.4.6-0.20250524142129-9d110c0af70c github.com/metacubex/sing-vmess v0.2.1 diff --git a/go.sum b/go.sum index e7e83e59..e8c0f38c 100644 --- a/go.sum +++ b/go.sum @@ -122,10 +122,10 @@ github.com/metacubex/sing-mux v0.3.2 h1:nJv52pyRivHcaZJKk2JgxpaVvj1GAXG81scSa9N7 github.com/metacubex/sing-mux v0.3.2/go.mod h1:3rt1soewn0O6j89GCLmwAQFsq257u0jf2zQSPhTL3Bw= github.com/metacubex/sing-quic v0.0.0-20250523120938-f1a248e5ec7f h1:mP3vIm+9hRFI0C0Vl3pE0NESF/L85FDbuB0tGgUii6I= github.com/metacubex/sing-quic v0.0.0-20250523120938-f1a248e5ec7f/go.mod h1:JPTpf7fpnojsSuwRJExhSZSy63pVbp3VM39+zj+sAJM= -github.com/metacubex/sing-shadowsocks v0.2.9 h1:2e++13WNN7EGjGtvrGLUzW1xrCdQbW2gIFpgw5GEw00= -github.com/metacubex/sing-shadowsocks v0.2.9/go.mod h1:CJSEGO4FWQAWe+ZiLZxCweGdjRR60A61SIoVjdjQeBA= -github.com/metacubex/sing-shadowsocks2 v0.2.3 h1:v3rNS/5Ywh0NIZ6VU/NmdERQIN5RePzyxCFeQsU4Cx0= -github.com/metacubex/sing-shadowsocks2 v0.2.3/go.mod h1:/WNy/Q8ahLCoPRriWuFZFD0Jy+JNp1MEQl28Zw6SaF8= +github.com/metacubex/sing-shadowsocks v0.2.10 h1:Pr7LDbjMANIQHl07zWgl1vDuhpsfDQUpZ8cX6DPabfg= +github.com/metacubex/sing-shadowsocks v0.2.10/go.mod h1:MtRM0ZZjR0kaDOzy9zWSt6/4/UlrnsNBq+1FNAF4vBk= +github.com/metacubex/sing-shadowsocks2 v0.2.4 h1:Ec0x3hHR7xkld5Z09IGh16wtUUpBb2HgqZ9DExd8Q7s= +github.com/metacubex/sing-shadowsocks2 v0.2.4/go.mod h1:WP8+S0kqtnSbX1vlIpo5i8Irm/ijZITEPBcZ26B5unY= github.com/metacubex/sing-shadowtls v0.0.0-20250503063515-5d9f966d17a2 h1:gXU+MYPm7Wme3/OAY2FFzVq9d9GxPHOqu5AQfg/ddhI= github.com/metacubex/sing-shadowtls v0.0.0-20250503063515-5d9f966d17a2/go.mod h1:mbfboaXauKJNIHJYxQRa+NJs4JU9NZfkA+I33dS2+9E= github.com/metacubex/sing-tun v0.4.6-0.20250524142129-9d110c0af70c h1:Y6jk7AH5BEg9Dsvczrf/KokYsvxeKSZZlCLHg+hC4ro= diff --git a/listener/sing/context.go b/listener/sing/context.go index 0193cb88..f3c34a81 100644 --- a/listener/sing/context.go +++ b/listener/sing/context.go @@ -3,6 +3,7 @@ package sing import ( "context" "golang.org/x/exp/slices" + "net" "github.com/metacubex/mihomo/adapter/inbound" @@ -29,3 +30,18 @@ func getAdditions(ctx context.Context) (additions []inbound.Addition) { } return } + +var ctxKeyInAddr = contextKey("InAddr") + +func WithInAddr(ctx context.Context, inAddr net.Addr) context.Context { + return context.WithValue(ctx, ctxKeyInAddr, inAddr) +} + +func getInAddr(ctx context.Context) net.Addr { + if v := ctx.Value(ctxKeyInAddr); v != nil { + if a, ok := v.(net.Addr); ok { + return a + } + } + return nil +} diff --git a/listener/sing/sing.go b/listener/sing/sing.go index 3a455c90..2742da76 100644 --- a/listener/sing/sing.go +++ b/listener/sing/sing.go @@ -187,6 +187,9 @@ func (h *ListenerHandler) NewPacketConnection(ctx context.Context, conn network. lAddr: conn.LocalAddr(), buff: buff, } + if lAddr := getInAddr(ctx); lAddr != nil { + cPacket.lAddr = lAddr + } h.handlePacket(ctx, cPacket, metadata.Source, dest) } return nil diff --git a/listener/sing_shadowsocks/server.go b/listener/sing_shadowsocks/server.go index 52b062ed..65adce65 100644 --- a/listener/sing_shadowsocks/server.go +++ b/listener/sing_shadowsocks/server.go @@ -156,11 +156,7 @@ func New(config LC.ShadowsocksServer, tunnel C.Tunnel, additions ...inbound.Addi go func() { conn := bufio.NewPacketConn(ul) - rwOptions := network.ReadWaitOptions{ - FrontHeadroom: network.CalculateFrontHeadroom(sl.service), - RearHeadroom: network.CalculateRearHeadroom(sl.service), - MTU: network.CalculateMTU(conn, sl.service), - } + rwOptions := network.NewReadWaitOptions(conn, sl.service) readWaiter, isReadWaiter := bufio.CreatePacketReadWaiter(conn) if isReadWaiter { readWaiter.InitializeReadWaiter(rwOptions) @@ -188,7 +184,9 @@ func New(config LC.ShadowsocksServer, tunnel C.Tunnel, additions ...inbound.Addi } continue } - _ = sl.service.NewPacket(context.TODO(), conn, buff, M.Metadata{ + ctx := context.TODO() + ctx = sing.WithInAddr(ctx, ul.LocalAddr()) + _ = sl.service.NewPacket(ctx, conn, buff, M.Metadata{ Protocol: "shadowsocks", Source: dest, })