refactor: New tun udpnat

This commit is contained in:
世界
2026-07-16 21:35:01 +08:00
parent 64f833d8f7
commit c8ee3497b2
27 changed files with 428 additions and 102 deletions
+23 -4
View File
@@ -13,12 +13,13 @@ import (
C "github.com/sagernet/sing-box/constant"
"github.com/sagernet/sing-box/log"
"github.com/sagernet/sing-box/option"
"github.com/sagernet/sing-tun"
"github.com/sagernet/sing/common"
"github.com/sagernet/sing/common/buf"
"github.com/sagernet/sing/common/control"
M "github.com/sagernet/sing/common/metadata"
N "github.com/sagernet/sing/common/network"
"github.com/sagernet/sing/common/udpnat2"
"github.com/sagernet/sing/service"
)
func RegisterTProxy(registry *inbound.Registry) {
@@ -31,7 +32,7 @@ type TProxy struct {
router adapter.Router
logger log.ContextLogger
listener *listener.Listener
udpNat *udpnat.Service
udpNat *tun.UDPNat
}
func NewTProxy(ctx context.Context, router adapter.Router, logger log.ContextLogger, tag string, options option.TProxyInboundOptions) (adapter.Inbound, error) {
@@ -47,7 +48,16 @@ func NewTProxy(ctx context.Context, router adapter.Router, logger log.ContextLog
} else {
udpTimeout = C.UDPTimeout
}
tproxy.udpNat = udpnat.New(tproxy, tproxy.preparePacketConnection, udpTimeout, false)
networkManager := service.FromContext[adapter.NetworkManager](ctx)
tproxy.udpNat = tun.NewUDPNat(tun.UDPNatOptions{
Handler: tproxy,
Prepare: tproxy.preparePacketConnection,
Timeout: udpTimeout,
Mapping: tun.NATMapping(options.UDPMapping),
Filtering: tun.NATFiltering(options.UDPFiltering),
MaxSize: options.UDPNATMax,
InterfaceFinder: networkManager.InterfaceFinder(),
})
tproxy.listener = listener.New(listener.Options{
Context: ctx,
Logger: logger,
@@ -64,10 +74,19 @@ func (t *TProxy) Start(stage adapter.StartStage) error {
if stage != adapter.StartStateStart {
return nil
}
return t.listener.Start()
err := t.udpNat.Start()
if err != nil {
return err
}
err = t.listener.Start()
if err != nil {
_ = t.udpNat.Close()
}
return err
}
func (t *TProxy) Close() error {
_ = t.udpNat.Close()
return t.listener.Close()
}
+9
View File
@@ -42,6 +42,9 @@ type Inbound struct {
logger log.ContextLogger
tunOptions tun.Options
udpTimeout time.Duration
udpMapping tun.NATMapping
udpFiltering tun.NATFiltering
udpNATMax uint32
dnsHijackAddress []netip.Addr
stack string
tunIf tun.Tun
@@ -230,6 +233,9 @@ func NewInbound(ctx context.Context, router adapter.Router, logger log.ContextLo
EXP_MultiPendingPackets: multiPendingPackets,
},
udpTimeout: udpTimeout,
udpMapping: tun.NATMapping(options.UDPMapping),
udpFiltering: tun.NATFiltering(options.UDPFiltering),
udpNATMax: options.UDPNATMax,
stack: options.Stack,
platformInterface: platformInterface,
platformOptions: common.PtrValueOrDefault(options.Platform),
@@ -450,6 +456,9 @@ func (t *Inbound) Start(stage adapter.StartStage) error {
TunOptions: t.tunOptions,
UDPTimeout: t.udpTimeout,
ICMPTimeout: C.ICMPTimeout,
UDPMapping: t.udpMapping,
UDPFiltering: t.udpFiltering,
UDPNATMax: t.udpNATMax,
Handler: t,
Logger: t.logger,
ForwarderBindInterface: C.IsDarwin,
+12 -7
View File
@@ -73,14 +73,19 @@ func NewEndpoint(ctx context.Context, router adapter.Router, logger log.ContextL
} else {
udpTimeout = C.UDPTimeout
}
networkManager := service.FromContext[adapter.NetworkManager](ctx)
wgEndpoint, err := wireguard.NewEndpoint(wireguard.EndpointOptions{
Context: ctx,
Logger: logger,
System: options.System,
Handler: ep,
UDPTimeout: udpTimeout,
ICMPTimeout: C.ICMPTimeout,
Dialer: outboundDialer,
Context: ctx,
Logger: logger,
System: options.System,
Handler: ep,
UDPTimeout: udpTimeout,
ICMPTimeout: C.ICMPTimeout,
UDPMapping: tun.NATMapping(options.UDPMapping),
UDPFiltering: tun.NATFiltering(options.UDPFiltering),
UDPNATMax: options.UDPNATMax,
InterfaceFinder: networkManager.InterfaceFinder(),
Dialer: outboundDialer,
CreateDialer: func(interfaceName string) N.Dialer {
return common.Must1(dialer.NewDefault(ctx, option.DialerOptions{
BindInterface: interfaceName,