diff --git a/constant/timeout.go b/constant/timeout.go index e1bc7ccdf..dd2e94d83 100644 --- a/constant/timeout.go +++ b/constant/timeout.go @@ -10,6 +10,7 @@ const ( ReadPayloadTimeout = 300 * time.Millisecond DNSTimeout = 10 * time.Second UDPTimeout = 5 * time.Minute + ICMPTimeout = 10 * time.Second DefaultURLTestInterval = 3 * time.Minute DefaultURLTestIdleTimeout = 30 * time.Minute StartTimeout = 10 * time.Second diff --git a/go.mod b/go.mod index 14350ddf4..46cba206d 100644 --- a/go.mod +++ b/go.mod @@ -47,7 +47,7 @@ require ( github.com/sagernet/sing-shadowsocks v0.2.8 github.com/sagernet/sing-shadowsocks2 v0.2.1 github.com/sagernet/sing-shadowtls v0.2.1 - github.com/sagernet/sing-tun v0.8.10-0.20260519125758-eb58efc8915d + github.com/sagernet/sing-tun v0.8.10-0.20260601094923-1d574687f0b2 github.com/sagernet/sing-vmess v0.2.8-0.20250909125414-3aed155119a1 github.com/sagernet/smux v1.5.50-sing-box-mod.1 github.com/sagernet/tailscale v1.92.4-sing-box-1.13-mod.7.0.20260527101438-dc40932c32d9 diff --git a/go.sum b/go.sum index c500e98f2..f0de595f0 100644 --- a/go.sum +++ b/go.sum @@ -266,8 +266,8 @@ github.com/sagernet/sing-shadowsocks2 v0.2.1 h1:dWV9OXCeFPuYGHb6IRqlSptVnSzOelnq github.com/sagernet/sing-shadowsocks2 v0.2.1/go.mod h1:RnXS0lExcDAovvDeniJ4IKa2IuChrdipolPYWBv9hWQ= github.com/sagernet/sing-shadowtls v0.2.1 h1:ZiHZdnEnP+YS73NMsxiZmIFCwNd0M4k7PkGCKNXhbaM= github.com/sagernet/sing-shadowtls v0.2.1/go.mod h1:sWqKnGlMipCHaGsw1sTTlimyUpgzP4WP3pjhCsYt9oA= -github.com/sagernet/sing-tun v0.8.10-0.20260519125758-eb58efc8915d h1:7XmzSeoDAX01aPOKnvUbUHVUJ9fukjFDmBFh1hB4KQA= -github.com/sagernet/sing-tun v0.8.10-0.20260519125758-eb58efc8915d/go.mod h1:QvarqUtHfj1ULaRR+6kZOS/OoCE+pYGq67A5tyIy+dQ= +github.com/sagernet/sing-tun v0.8.10-0.20260601094923-1d574687f0b2 h1:ETHawToP5FVyWXviHIt1KIwczPT9oTYBNNOjD8eE3qU= +github.com/sagernet/sing-tun v0.8.10-0.20260601094923-1d574687f0b2/go.mod h1:QvarqUtHfj1ULaRR+6kZOS/OoCE+pYGq67A5tyIy+dQ= github.com/sagernet/sing-vmess v0.2.8-0.20250909125414-3aed155119a1 h1:aSwUNYUkVyVvdmBSufR8/nRFonwJeKSIROxHcm5br9o= github.com/sagernet/sing-vmess v0.2.8-0.20250909125414-3aed155119a1/go.mod h1:P11scgTxMxVVQ8dlM27yNm3Cro40mD0+gHbnqrNGDuY= github.com/sagernet/smux v1.5.50-sing-box-mod.1 h1:XkJcivBC9V4wBjiGXIXZ229aZCU1hzcbp6kSkkyQ478= diff --git a/protocol/tailscale/endpoint.go b/protocol/tailscale/endpoint.go index 6471ff76f..d85907b9d 100644 --- a/protocol/tailscale/endpoint.go +++ b/protocol/tailscale/endpoint.go @@ -111,7 +111,8 @@ type Endpoint struct { relayServerPort *uint16 relayServerStaticEndpoints []netip.AddrPort - udpTimeout time.Duration + udpTimeout time.Duration + icmpTimeout time.Duration sshServerInstance *tailssh.Server sshServerOptions *option.TailscaleSSHServerOptions @@ -229,6 +230,7 @@ func NewEndpoint(ctx context.Context, router adapter.Router, logger log.ContextL relayServerStaticEndpoints: options.RelayServerStaticEndpoints, sshServerOptions: options.SSHServer, udpTimeout: udpTimeout, + icmpTimeout: C.ICMPTimeout, systemInterface: options.SystemInterface, systemInterfaceName: options.SystemInterfaceName, systemInterfaceMTU: options.SystemInterfaceMTU, @@ -363,7 +365,7 @@ func (t *Endpoint) postStart() error { if gErr != nil { return gonet.TranslateNetstackError(gErr) } - icmpForwarder := tun.NewICMPForwarder(t.ctx, ipStack, t, t.udpTimeout) + icmpForwarder := tun.NewICMPForwarder(t.ctx, ipStack, t, t.icmpTimeout) ipStack.SetTransportProtocolHandler(icmp.ProtocolNumber4, icmpForwarder.HandlePacket) ipStack.SetTransportProtocolHandler(icmp.ProtocolNumber6, icmpForwarder.HandlePacket) t.stack = ipStack diff --git a/protocol/tun/inbound.go b/protocol/tun/inbound.go index 65e87bfdc..44c34ef91 100644 --- a/protocol/tun/inbound.go +++ b/protocol/tun/inbound.go @@ -404,6 +404,7 @@ func (t *Inbound) Start(stage adapter.StartStage) error { Tun: tunInterface, TunOptions: t.tunOptions, UDPTimeout: t.udpTimeout, + ICMPTimeout: C.ICMPTimeout, Handler: t, Logger: t.logger, ForwarderBindInterface: forwarderBindInterface, diff --git a/protocol/wireguard/endpoint.go b/protocol/wireguard/endpoint.go index 2975b05cb..63009bfda 100644 --- a/protocol/wireguard/endpoint.go +++ b/protocol/wireguard/endpoint.go @@ -75,12 +75,13 @@ func NewEndpoint(ctx context.Context, router adapter.Router, logger log.ContextL udpTimeout = C.UDPTimeout } wgEndpoint, err := wireguard.NewEndpoint(wireguard.EndpointOptions{ - Context: ctx, - Logger: logger, - System: options.System, - Handler: ep, - UDPTimeout: udpTimeout, - Dialer: outboundDialer, + Context: ctx, + Logger: logger, + System: options.System, + Handler: ep, + UDPTimeout: udpTimeout, + ICMPTimeout: C.ICMPTimeout, + Dialer: outboundDialer, CreateDialer: func(interfaceName string) N.Dialer { return common.Must1(dialer.NewDefault(ctx, option.DialerOptions{ BindInterface: interfaceName, diff --git a/transport/wireguard/device.go b/transport/wireguard/device.go index 4dd615c58..81d610eae 100644 --- a/transport/wireguard/device.go +++ b/transport/wireguard/device.go @@ -28,6 +28,7 @@ type DeviceOptions struct { System bool Handler tun.Handler UDPTimeout time.Duration + ICMPTimeout time.Duration CreateDialer func(interfaceName string) N.Dialer Name string MTU uint32 diff --git a/transport/wireguard/device_stack.go b/transport/wireguard/device_stack.go index 373a050db..340885012 100644 --- a/transport/wireguard/device_stack.go +++ b/transport/wireguard/device_stack.go @@ -93,7 +93,7 @@ func newStackDevice(options DeviceOptions) (*stackDevice, error) { if options.Handler != nil { ipStack.SetTransportProtocolHandler(tcp.ProtocolNumber, tun.NewTCPForwarder(options.Context, ipStack, options.Handler).HandlePacket) ipStack.SetTransportProtocolHandler(udp.ProtocolNumber, tun.NewUDPForwarder(options.Context, ipStack, options.Handler, options.UDPTimeout).HandlePacket) - icmpForwarder := tun.NewICMPForwarder(options.Context, ipStack, options.Handler, options.UDPTimeout) + icmpForwarder := tun.NewICMPForwarder(options.Context, ipStack, options.Handler, options.ICMPTimeout) icmpForwarder.SetLocalAddresses(inet4Address, inet6Address) ipStack.SetTransportProtocolHandler(icmp.ProtocolNumber4, icmpForwarder.HandlePacket) ipStack.SetTransportProtocolHandler(icmp.ProtocolNumber6, icmpForwarder.HandlePacket) diff --git a/transport/wireguard/device_system_stack.go b/transport/wireguard/device_system_stack.go index 59c5f4abf..1172e6024 100644 --- a/transport/wireguard/device_system_stack.go +++ b/transport/wireguard/device_system_stack.go @@ -78,7 +78,7 @@ func newSystemStackDevice(options DeviceOptions) (*systemStackDevice, error) { if options.Handler != nil { ipStack.SetTransportProtocolHandler(tcp.ProtocolNumber, tun.NewTCPForwarder(options.Context, ipStack, options.Handler).HandlePacket) ipStack.SetTransportProtocolHandler(udp.ProtocolNumber, tun.NewUDPForwarder(options.Context, ipStack, options.Handler, options.UDPTimeout).HandlePacket) - icmpForwarder := tun.NewICMPForwarder(options.Context, ipStack, options.Handler, options.UDPTimeout) + icmpForwarder := tun.NewICMPForwarder(options.Context, ipStack, options.Handler, options.ICMPTimeout) icmpForwarder.SetLocalAddresses(inet4Address, inet6Address) ipStack.SetTransportProtocolHandler(icmp.ProtocolNumber4, icmpForwarder.HandlePacket) ipStack.SetTransportProtocolHandler(icmp.ProtocolNumber6, icmpForwarder.HandlePacket) diff --git a/transport/wireguard/endpoint.go b/transport/wireguard/endpoint.go index 84d9fe729..c86825889 100644 --- a/transport/wireguard/endpoint.go +++ b/transport/wireguard/endpoint.go @@ -109,6 +109,7 @@ func NewEndpoint(options EndpointOptions) (*Endpoint, error) { System: options.System, Handler: options.Handler, UDPTimeout: options.UDPTimeout, + ICMPTimeout: options.ICMPTimeout, CreateDialer: options.CreateDialer, Name: options.Name, MTU: options.MTU, diff --git a/transport/wireguard/endpoint_options.go b/transport/wireguard/endpoint_options.go index bb9a46e69..1f950eff5 100644 --- a/transport/wireguard/endpoint_options.go +++ b/transport/wireguard/endpoint_options.go @@ -17,6 +17,7 @@ type EndpointOptions struct { System bool Handler tun.Handler UDPTimeout time.Duration + ICMPTimeout time.Duration Dialer N.Dialer CreateDialer func(interfaceName string) N.Dialer Name string