|
@@ -10,6 +10,7 @@ import (
|
|
|
|
|
|
"github.com/sagernet/sing-box/adapter"
|
|
|
"github.com/sagernet/sing-box/common/conntrack"
|
|
|
+ "github.com/sagernet/sing-box/common/listener"
|
|
|
C "github.com/sagernet/sing-box/constant"
|
|
|
"github.com/sagernet/sing-box/experimental/libbox/platform"
|
|
|
"github.com/sagernet/sing-box/option"
|
|
@@ -35,6 +36,7 @@ type DefaultDialer struct {
|
|
|
udpListener net.ListenConfig
|
|
|
udpAddr4 string
|
|
|
udpAddr6 string
|
|
|
+ netns string
|
|
|
networkManager adapter.NetworkManager
|
|
|
networkStrategy *C.NetworkStrategy
|
|
|
defaultNetworkStrategy bool
|
|
@@ -198,6 +200,7 @@ func NewDefault(ctx context.Context, options option.DialerOptions) (*DefaultDial
|
|
|
udpListener: listener,
|
|
|
udpAddr4: udpAddr4,
|
|
|
udpAddr6: udpAddr6,
|
|
|
+ netns: options.NetNs,
|
|
|
networkManager: networkManager,
|
|
|
networkStrategy: networkStrategy,
|
|
|
defaultNetworkStrategy: defaultNetworkStrategy,
|
|
@@ -214,19 +217,21 @@ func (d *DefaultDialer) DialContext(ctx context.Context, network string, address
|
|
|
return nil, E.New("domain not resolved")
|
|
|
}
|
|
|
if d.networkStrategy == nil {
|
|
|
- switch N.NetworkName(network) {
|
|
|
- case N.NetworkUDP:
|
|
|
+ return trackConn(listener.ListenNetworkNamespace[net.Conn](d.netns, func() (net.Conn, error) {
|
|
|
+ switch N.NetworkName(network) {
|
|
|
+ case N.NetworkUDP:
|
|
|
+ if !address.IsIPv6() {
|
|
|
+ return d.udpDialer4.DialContext(ctx, network, address.String())
|
|
|
+ } else {
|
|
|
+ return d.udpDialer6.DialContext(ctx, network, address.String())
|
|
|
+ }
|
|
|
+ }
|
|
|
if !address.IsIPv6() {
|
|
|
- return trackConn(d.udpDialer4.DialContext(ctx, network, address.String()))
|
|
|
+ return DialSlowContext(&d.dialer4, ctx, network, address)
|
|
|
} else {
|
|
|
- return trackConn(d.udpDialer6.DialContext(ctx, network, address.String()))
|
|
|
+ return DialSlowContext(&d.dialer6, ctx, network, address)
|
|
|
}
|
|
|
- }
|
|
|
- if !address.IsIPv6() {
|
|
|
- return trackConn(DialSlowContext(&d.dialer4, ctx, network, address))
|
|
|
- } else {
|
|
|
- return trackConn(DialSlowContext(&d.dialer6, ctx, network, address))
|
|
|
- }
|
|
|
+ }))
|
|
|
} else {
|
|
|
return d.DialParallelInterface(ctx, network, address, d.networkStrategy, d.networkType, d.fallbackNetworkType, d.networkFallbackDelay)
|
|
|
}
|
|
@@ -282,13 +287,15 @@ func (d *DefaultDialer) DialParallelInterface(ctx context.Context, network strin
|
|
|
|
|
|
func (d *DefaultDialer) ListenPacket(ctx context.Context, destination M.Socksaddr) (net.PacketConn, error) {
|
|
|
if d.networkStrategy == nil {
|
|
|
- if destination.IsIPv6() {
|
|
|
- return trackPacketConn(d.udpListener.ListenPacket(ctx, N.NetworkUDP, d.udpAddr6))
|
|
|
- } else if destination.IsIPv4() && !destination.Addr.IsUnspecified() {
|
|
|
- return trackPacketConn(d.udpListener.ListenPacket(ctx, N.NetworkUDP+"4", d.udpAddr4))
|
|
|
- } else {
|
|
|
- return trackPacketConn(d.udpListener.ListenPacket(ctx, N.NetworkUDP, d.udpAddr4))
|
|
|
- }
|
|
|
+ return trackPacketConn(listener.ListenNetworkNamespace[net.PacketConn](d.netns, func() (net.PacketConn, error) {
|
|
|
+ if destination.IsIPv6() {
|
|
|
+ return d.udpListener.ListenPacket(ctx, N.NetworkUDP, d.udpAddr6)
|
|
|
+ } else if destination.IsIPv4() && !destination.Addr.IsUnspecified() {
|
|
|
+ return d.udpListener.ListenPacket(ctx, N.NetworkUDP+"4", d.udpAddr4)
|
|
|
+ } else {
|
|
|
+ return d.udpListener.ListenPacket(ctx, N.NetworkUDP, d.udpAddr4)
|
|
|
+ }
|
|
|
+ }))
|
|
|
} else {
|
|
|
return d.ListenSerialInterfacePacket(ctx, destination, d.networkStrategy, d.networkType, d.fallbackNetworkType, d.networkFallbackDelay)
|
|
|
}
|