diff --git a/adapter/inbound/listen.go b/adapter/inbound/listen.go index b4c6bf6b..de4dcf40 100644 --- a/adapter/inbound/listen.go +++ b/adapter/inbound/listen.go @@ -8,6 +8,7 @@ import ( "sync" "github.com/metacubex/mihomo/component/keepalive" + "github.com/metacubex/mihomo/component/mptcp" "github.com/metacubex/tfo-go" ) @@ -34,13 +35,13 @@ func Tfo() bool { func SetMPTCP(open bool) { mutex.Lock() defer mutex.Unlock() - setMultiPathTCP(&lc.ListenConfig, open) + mptcp.SetNetListenConfig(&lc.ListenConfig, open) } func MPTCP() bool { mutex.RLock() defer mutex.RUnlock() - return getMultiPathTCP(&lc.ListenConfig) + return mptcp.GetNetListenConfig(&lc.ListenConfig) } func preResolve(network, address string) (string, error) { diff --git a/adapter/inbound/mptcp_go120.go b/adapter/inbound/mptcp_go120.go deleted file mode 100644 index faae6ec5..00000000 --- a/adapter/inbound/mptcp_go120.go +++ /dev/null @@ -1,14 +0,0 @@ -//go:build !go1.21 - -package inbound - -import "net" - -const multipathTCPAvailable = false - -func setMultiPathTCP(listenConfig *net.ListenConfig, open bool) { -} - -func getMultiPathTCP(listenConfig *net.ListenConfig) bool { - return false -} diff --git a/adapter/inbound/mptcp_go121.go b/adapter/inbound/mptcp_go121.go deleted file mode 100644 index 9163878a..00000000 --- a/adapter/inbound/mptcp_go121.go +++ /dev/null @@ -1,15 +0,0 @@ -//go:build go1.21 - -package inbound - -import "net" - -const multipathTCPAvailable = true - -func setMultiPathTCP(listenConfig *net.ListenConfig, open bool) { - listenConfig.SetMultipathTCP(open) -} - -func getMultiPathTCP(listenConfig *net.ListenConfig) bool { - return listenConfig.MultipathTCP() -} diff --git a/component/dialer/dialer.go b/component/dialer/dialer.go index d490dca3..4bc69baa 100644 --- a/component/dialer/dialer.go +++ b/component/dialer/dialer.go @@ -13,6 +13,7 @@ import ( "time" "github.com/metacubex/mihomo/component/keepalive" + "github.com/metacubex/mihomo/component/mptcp" "github.com/metacubex/mihomo/component/resolver" ) @@ -140,9 +141,7 @@ func dialContext(ctx context.Context, network string, destination netip.Addr, po dialer := netDialer.(*net.Dialer) keepalive.SetNetDialer(dialer) - if opt.mpTcp { - setMultiPathTCP(dialer) - } + mptcp.SetNetDialer(dialer, opt.mpTcp) if DefaultSocketHook != nil { // ignore interfaceName, routingMark and tfo when DefaultSocketHook not null (in CMFA) socketHookToToDialer(dialer) diff --git a/component/dialer/mptcp_go120.go b/component/dialer/mptcp_go120.go deleted file mode 100644 index 6e564673..00000000 --- a/component/dialer/mptcp_go120.go +++ /dev/null @@ -1,12 +0,0 @@ -//go:build !go1.21 - -package dialer - -import ( - "net" -) - -const multipathTCPAvailable = false - -func setMultiPathTCP(dialer *net.Dialer) { -} diff --git a/component/dialer/mptcp_go121.go b/component/dialer/mptcp_go121.go deleted file mode 100644 index 360826c8..00000000 --- a/component/dialer/mptcp_go121.go +++ /dev/null @@ -1,11 +0,0 @@ -//go:build go1.21 - -package dialer - -import "net" - -const multipathTCPAvailable = true - -func setMultiPathTCP(dialer *net.Dialer) { - dialer.SetMultipathTCP(true) -} diff --git a/component/mptcp/mptcp_go120.go b/component/mptcp/mptcp_go120.go new file mode 100644 index 00000000..beee7412 --- /dev/null +++ b/component/mptcp/mptcp_go120.go @@ -0,0 +1,23 @@ +//go:build !go1.21 + +package mptcp + +import ( + "net" +) + +const MultipathTCPAvailable = false + +func SetNetDialer(dialer *net.Dialer, open bool) { +} + +func GetNetDialer(dialer *net.Dialer) bool { + return false +} + +func SetNetListenConfig(listenConfig *net.ListenConfig, open bool) { +} + +func GetNetListenConfig(listenConfig *net.ListenConfig) bool { + return false +} diff --git a/component/mptcp/mptcp_go121.go b/component/mptcp/mptcp_go121.go new file mode 100644 index 00000000..f492d99c --- /dev/null +++ b/component/mptcp/mptcp_go121.go @@ -0,0 +1,23 @@ +//go:build go1.21 + +package mptcp + +import "net" + +const MultipathTCPAvailable = true + +func SetNetDialer(dialer *net.Dialer, open bool) { + dialer.SetMultipathTCP(open) +} + +func GetNetDialer(dialer *net.Dialer) bool { + return dialer.MultipathTCP() +} + +func SetNetListenConfig(listenConfig *net.ListenConfig, open bool) { + listenConfig.SetMultipathTCP(open) +} + +func GetNetListenConfig(listenConfig *net.ListenConfig) bool { + return listenConfig.MultipathTCP() +} diff --git a/listener/tproxy/tproxy.go b/listener/tproxy/tproxy.go index b848c0dc..25c8adf7 100644 --- a/listener/tproxy/tproxy.go +++ b/listener/tproxy/tproxy.go @@ -1,10 +1,12 @@ package tproxy import ( + "context" "net" "github.com/metacubex/mihomo/adapter/inbound" "github.com/metacubex/mihomo/component/keepalive" + "github.com/metacubex/mihomo/component/mptcp" C "github.com/metacubex/mihomo/constant" "github.com/metacubex/mihomo/transport/socks5" ) @@ -46,10 +48,11 @@ func New(addr string, tunnel C.Tunnel, additions ...inbound.Addition) (*Listener inbound.WithSpecialRules(""), } } - //TODO: When we upgrade the major version of go.mod to 1.24 or higher, disable mptcp for tproxy. - // Golang will then enable mptcp support for listeners by default. - // This can cause tproxy to malfunction on certain Linux kernel versions. - l, err := net.Listen("tcp", addr) + // Golang will then enable mptcp support for listeners by default when the major version of go.mod is 1.24 or higher. + // This can cause tproxy to malfunction on certain Linux kernel versions, so we force to disable mptcp for tproxy. + lc := net.ListenConfig{} + mptcp.SetNetListenConfig(&lc, false) + l, err := lc.Listen(context.Background(), "tcp", addr) if err != nil { return nil, err }