Fix wg detour

This commit is contained in:
世界
2026-07-20 11:32:04 +08:00
parent a6703e71ac
commit f39ab0e9f4
3 changed files with 33 additions and 36 deletions
+10 -19
View File
@@ -75,23 +75,6 @@ func NewEndpoint(ctx context.Context, router adapter.Router, logger log.ContextL
udpTimeout = C.UDPTimeout
}
networkManager := service.FromContext[adapter.NetworkManager](ctx)
var egressPool *tun.UDPEgressPool
udpListener, isUDPListener := common.Cast[dialer.UDPListener](outboundDialer)
if isUDPListener {
anchorControl, egressEnabled := udpListener.UDPListenerControl()
if egressEnabled {
egressPool = tun.NewUDPEgressPool(tun.UDPEgressPoolOptions{
Logger: logger,
Control: anchorControl,
InterfaceFinder: networkManager.InterfaceFinder(),
InterfaceMonitor: networkManager.InterfaceMonitor(),
ExcludeInterface: options.Name,
IsExempt: func() bool {
return networkManager.AutoRedirectOutputMark() != 0
},
})
}
}
wgEndpoint, err := wireguard.NewEndpoint(wireguard.EndpointOptions{
Context: ctx,
Logger: logger,
@@ -103,8 +86,16 @@ func NewEndpoint(ctx context.Context, router adapter.Router, logger log.ContextL
UDPFiltering: tun.NATFiltering(options.UDPFiltering),
UDPNATMax: options.UDPNATMax,
InterfaceFinder: networkManager.InterfaceFinder(),
EgressPool: egressPool,
Dialer: outboundDialer,
EgressPoolOptions: tun.UDPEgressPoolOptions{
Logger: logger,
InterfaceFinder: networkManager.InterfaceFinder(),
InterfaceMonitor: networkManager.InterfaceMonitor(),
ExcludeInterface: options.Name,
IsExempt: func() bool {
return networkManager.AutoRedirectOutputMark() != 0
},
},
Dialer: outboundDialer,
CreateDialer: func(interfaceName string) N.Dialer {
return common.Must1(dialer.NewDefault(ctx, option.DialerOptions{
BindInterface: interfaceName,
+11 -5
View File
@@ -13,6 +13,7 @@ import (
"unsafe"
"github.com/sagernet/sing-box/common/dialer"
"github.com/sagernet/sing-tun"
"github.com/sagernet/sing/common"
E "github.com/sagernet/sing/common/exceptions"
F "github.com/sagernet/sing/common/format"
@@ -35,6 +36,7 @@ type Endpoint struct {
returnDevice *returnDeviceWrapper
device *device.Device
allowedIPs *device.AllowedIPs
egressPool *tun.UDPEgressPool
pause pause.Manager
pauseCallback *list.Element[pause.Callback]
}
@@ -154,13 +156,16 @@ func (e *Endpoint) Start(resolve bool) error {
var bind conn.Bind
udpListener, isUDPListener := common.Cast[dialer.UDPListener](e.options.Dialer)
if isUDPListener {
listenerControl, _ := udpListener.UDPListenerControl()
listenerControl, egressEnabled := udpListener.UDPListenerControl()
standardBind := conn.NewStdNetBind(listenerControl).(*conn.StdNetBind)
if e.options.ListenPort == 0 && len(e.peers) == 1 && e.peers[0].endpoint.IsValid() {
standardBind.SetSinglePeerMode()
}
if e.options.EgressPool != nil {
standardBind.SetEgressProvider(e.options.EgressPool)
if egressEnabled {
egressPoolOptions := e.options.EgressPoolOptions
egressPoolOptions.Control = listenerControl
e.egressPool = tun.NewUDPEgressPool(egressPoolOptions)
standardBind.SetEgressProvider(e.egressPool)
}
bind = standardBind
} else {
@@ -235,8 +240,9 @@ func (e *Endpoint) Close() error {
e.pause.UnregisterCallback(e.pauseCallback)
e.pauseCallback = nil
}
if e.options.EgressPool != nil {
e.options.EgressPool.Close()
if e.egressPool != nil {
e.egressPool.Close()
e.egressPool = nil
}
if e.device != nil {
e.device.Down()
+12 -12
View File
@@ -23,18 +23,18 @@ type EndpointOptions struct {
UDPFiltering tun.NATFiltering
UDPNATMax uint32
InterfaceFinder control.InterfaceFinder
EgressPool *tun.UDPEgressPool
Dialer N.Dialer
CreateDialer func(interfaceName string) N.Dialer
Name string
MTU uint32
Address []netip.Prefix
PrivateKey string
ListenPort uint16
ResolvePeer func(domain string) (netip.Addr, error)
Peers []PeerOptions
Workers int
InterfaceFinder control.InterfaceFinder
EgressPoolOptions tun.UDPEgressPoolOptions
Dialer N.Dialer
CreateDialer func(interfaceName string) N.Dialer
Name string
MTU uint32
Address []netip.Prefix
PrivateKey string
ListenPort uint16
ResolvePeer func(domain string) (netip.Addr, error)
Peers []PeerOptions
Workers int
}
type PeerOptions struct {