From 3ce87a8d571c904b9db635fb66d6cf29d582445a Mon Sep 17 00:00:00 2001 From: null Date: Sat, 1 Aug 2026 20:49:34 +0800 Subject: [PATCH 1/2] wgn --- proxy/wireguard/client.go | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/proxy/wireguard/client.go b/proxy/wireguard/client.go index cae846077b93..c6e481933342 100644 --- a/proxy/wireguard/client.go +++ b/proxy/wireguard/client.go @@ -11,6 +11,7 @@ import ( "golang.zx2c4.com/wireguard/tun" + "github.com/xtls/xray-core/app/proxyman/outbound" "github.com/xtls/xray-core/common" "github.com/xtls/xray-core/common/buf" "github.com/xtls/xray-core/common/dice" @@ -35,9 +36,10 @@ type Handler struct { policyManager policy.Manager dns dns.Client - streamSettings *internet.MemoryStreamConfig - uplinkCounter stats.Counter - downlinkCounter stats.Counter + setOutboundGateway func(ctx context.Context, ob *session.Outbound) + streamSettings *internet.MemoryStreamConfig + uplinkCounter stats.Counter + downlinkCounter stats.Counter tun tun.Device tnet *Net @@ -49,7 +51,9 @@ func NewClient(ctx context.Context, conf *DeviceConfig) (*Handler, error) { v := core.MustFromContext(ctx) p := v.GetFeature(policy.ManagerType()).(policy.Manager) d := v.GetFeature(dns.ClientType()).(dns.Client) + h := session.FullHandlerFromContext(ctx) + setOutboundGateway := h.(*outbound.Handler).SetOutboundGateway streamSettings := session.StreamSettingsFromContext(ctx).(*internet.MemoryStreamConfig) tag := session.FullHandlerFromContext(ctx).Tag() var uplinkCounter stats.Counter @@ -106,10 +110,10 @@ func NewClient(ctx context.Context, conf *DeviceConfig) (*Handler, error) { var tnet *Net if !conf.NoKernelTun && kernelTunSupported { errors.LogWarning(context.Background(), "Using kernel TUN") - tun, tnet, err = createKernelTun(localAddresses, []netip.Addr{netip.MustParseAddr("1.1.1.1"), netip.MustParseAddr("1.0.0.1"), netip.MustParseAddr("2606:4700:4700::1111"), netip.MustParseAddr("2606:4700:4700::1001")}, int(conf.Mtu)) + tun, tnet, err = createKernelTun(localAddresses, nil, int(conf.Mtu)) } else { errors.LogWarning(context.Background(), "Using gVisor TUN") - tun, tnet, _, err = CreateNetTUN(localAddresses, []netip.Addr{netip.MustParseAddr("1.1.1.1"), netip.MustParseAddr("1.0.0.1"), netip.MustParseAddr("2606:4700:4700::1111"), netip.MustParseAddr("2606:4700:4700::1001")}, int(conf.Mtu), true) + tun, tnet, _, err = CreateNetTUN(localAddresses, nil, int(conf.Mtu), true) } if err != nil { return nil, err @@ -120,9 +124,10 @@ func NewClient(ctx context.Context, conf *DeviceConfig) (*Handler, error) { policyManager: p, dns: d, - streamSettings: streamSettings, - uplinkCounter: uplinkCounter, - downlinkCounter: downlinkCounter, + setOutboundGateway: setOutboundGateway, + streamSettings: streamSettings, + uplinkCounter: uplinkCounter, + downlinkCounter: downlinkCounter, tun: tun, tnet: tnet, @@ -145,7 +150,7 @@ func (h *Handler) Process(ctx context.Context, link *transport.Link, dialer inte var addr netip.Addr if ob.Target.Address.Family().IsDomain() { - ip, err := h.resolveRemote(ob.Target.Address.String()) + ip, err := h.resolveLocal(ob.Target.Address.String()) if err != nil { return errors.New("failed to resolve domain").Base(err) } @@ -206,7 +211,7 @@ func (h *Handler) Process(ctx context.Context, link *transport.Link, dialer inte defer conn.Close() c := &udpConnClient{ PacketConn: conn.(*internet.PacketConnWrapper).PacketConn, - resolveFunc: h.resolveRemote, + resolveFunc: h.resolveLocal, dest: gonet.UDPAddrFromAddrPort(addrPort), } reader = c @@ -260,6 +265,9 @@ func (h *Handler) init(ctx context.Context) error { } resolveFunc := h.resolveLocal listenFunc := func() (net.PacketConn, error) { + outbounds := session.OutboundsFromContext(ctx) + ob := outbounds[len(outbounds)-1] + h.setOutboundGateway(ctx, ob) dest, err := net.ParseDestination("udp:" + h.conf.Peers[0].Endpoint) if err != nil { return nil, err From 3da4e872a194e2ed7044ba695493d174daaeb711 Mon Sep 17 00:00:00 2001 From: null Date: Sat, 1 Aug 2026 20:58:56 +0800 Subject: [PATCH 2/2] SetOutboundGateway --- proxy/wireguard/client.go | 21 +++++++-------------- 1 file changed, 7 insertions(+), 14 deletions(-) diff --git a/proxy/wireguard/client.go b/proxy/wireguard/client.go index c6e481933342..16b74b9f2d5d 100644 --- a/proxy/wireguard/client.go +++ b/proxy/wireguard/client.go @@ -11,7 +11,6 @@ import ( "golang.zx2c4.com/wireguard/tun" - "github.com/xtls/xray-core/app/proxyman/outbound" "github.com/xtls/xray-core/common" "github.com/xtls/xray-core/common/buf" "github.com/xtls/xray-core/common/dice" @@ -36,10 +35,9 @@ type Handler struct { policyManager policy.Manager dns dns.Client - setOutboundGateway func(ctx context.Context, ob *session.Outbound) - streamSettings *internet.MemoryStreamConfig - uplinkCounter stats.Counter - downlinkCounter stats.Counter + streamSettings *internet.MemoryStreamConfig + uplinkCounter stats.Counter + downlinkCounter stats.Counter tun tun.Device tnet *Net @@ -51,9 +49,7 @@ func NewClient(ctx context.Context, conf *DeviceConfig) (*Handler, error) { v := core.MustFromContext(ctx) p := v.GetFeature(policy.ManagerType()).(policy.Manager) d := v.GetFeature(dns.ClientType()).(dns.Client) - h := session.FullHandlerFromContext(ctx) - setOutboundGateway := h.(*outbound.Handler).SetOutboundGateway streamSettings := session.StreamSettingsFromContext(ctx).(*internet.MemoryStreamConfig) tag := session.FullHandlerFromContext(ctx).Tag() var uplinkCounter stats.Counter @@ -124,10 +120,9 @@ func NewClient(ctx context.Context, conf *DeviceConfig) (*Handler, error) { policyManager: p, dns: d, - setOutboundGateway: setOutboundGateway, - streamSettings: streamSettings, - uplinkCounter: uplinkCounter, - downlinkCounter: downlinkCounter, + streamSettings: streamSettings, + uplinkCounter: uplinkCounter, + downlinkCounter: downlinkCounter, tun: tun, tnet: tnet, @@ -144,6 +139,7 @@ func (h *Handler) Process(ctx context.Context, link *transport.Link, dialer inte ob.Name = "wireguard" ob.CanSpliceCopy = 3 + dialer.SetOutboundGateway(ctx, ob) if err := h.init(ctx); err != nil { return err } @@ -265,9 +261,6 @@ func (h *Handler) init(ctx context.Context) error { } resolveFunc := h.resolveLocal listenFunc := func() (net.PacketConn, error) { - outbounds := session.OutboundsFromContext(ctx) - ob := outbounds[len(outbounds)-1] - h.setOutboundGateway(ctx, ob) dest, err := net.ParseDestination("udp:" + h.conf.Peers[0].Endpoint) if err != nil { return nil, err