diff --git a/adapter/outbound/util.go b/adapter/outbound/util.go index ea39db1f..f84193a5 100644 --- a/adapter/outbound/util.go +++ b/adapter/outbound/util.go @@ -54,6 +54,8 @@ func resolveUDPAddr(ctx context.Context, network, address string, prefer C.DNSPr if err != nil { return nil, err } + + ip, port = resolver.LookupIP4P(ip, port) return net.ResolveUDPAddr(network, net.JoinHostPort(ip.String(), port)) } diff --git a/component/dialer/dialer.go b/component/dialer/dialer.go index 0ecccdf8..6e1f2426 100644 --- a/component/dialer/dialer.go +++ b/component/dialer/dialer.go @@ -7,14 +7,12 @@ import ( "net" "net/netip" "os" - "strconv" "strings" "sync" "time" "github.com/metacubex/mihomo/component/keepalive" "github.com/metacubex/mihomo/component/resolver" - "github.com/metacubex/mihomo/log" ) const ( @@ -138,9 +136,7 @@ func GetTcpConcurrent() bool { func dialContext(ctx context.Context, network string, destination netip.Addr, port string, opt *option) (net.Conn, error) { var address string - if IP4PEnable { - destination, port = lookupIP4P(destination, port) - } + destination, port = resolver.LookupIP4P(destination, port) address = net.JoinHostPort(destination.String(), port) netDialer := opt.netDialer @@ -396,21 +392,3 @@ func NewDialer(options ...Option) Dialer { opt := applyOptions(options...) return Dialer{Opt: *opt} } - -func GetIP4PEnable(enableIP4PConvert bool) { - IP4PEnable = enableIP4PConvert -} - -// kanged from https://github.com/heiher/frp/blob/ip4p/client/ip4p.go - -func lookupIP4P(addr netip.Addr, port string) (netip.Addr, string) { - ip := addr.AsSlice() - if ip[0] == 0x20 && ip[1] == 0x01 && - ip[2] == 0x00 && ip[3] == 0x00 { - addr = netip.AddrFrom4([4]byte{ip[12], ip[13], ip[14], ip[15]}) - port = strconv.Itoa(int(ip[10])<<8 + int(ip[11])) - log.Debugln("Convert IP4P address %s to %s", ip, net.JoinHostPort(addr.String(), port)) - return addr, port - } - return addr, port -} diff --git a/component/resolver/ip4p.go b/component/resolver/ip4p.go new file mode 100644 index 00000000..e910929a --- /dev/null +++ b/component/resolver/ip4p.go @@ -0,0 +1,37 @@ +package resolver + +import ( + "net" + "net/netip" + "strconv" + + "github.com/metacubex/mihomo/log" +) + +var ( + ip4PEnable bool +) + +func GetIP4PEnable() bool { + return ip4PEnable +} + +func SetIP4PEnable(enableIP4PConvert bool) { + ip4PEnable = enableIP4PConvert +} + +// kanged from https://github.com/heiher/frp/blob/ip4p/client/ip4p.go + +func LookupIP4P(addr netip.Addr, port string) (netip.Addr, string) { + if ip4PEnable { + ip := addr.AsSlice() + if ip[0] == 0x20 && ip[1] == 0x01 && + ip[2] == 0x00 && ip[3] == 0x00 { + addr = netip.AddrFrom4([4]byte{ip[12], ip[13], ip[14], ip[15]}) + port = strconv.Itoa(int(ip[10])<<8 + int(ip[11])) + log.Debugln("Convert IP4P address %s to %s", ip, net.JoinHostPort(addr.String(), port)) + return addr, port + } + } + return addr, port +} diff --git a/hub/executor/executor.go b/hub/executor/executor.go index 3fed360c..d046223e 100644 --- a/hub/executor/executor.go +++ b/hub/executor/executor.go @@ -221,7 +221,7 @@ func updateExperimental(c *config.Experimental) { if c.QUICGoDisableECN { _ = os.Setenv("QUIC_GO_DISABLE_ECN", strconv.FormatBool(true)) } - dialer.GetIP4PEnable(c.IP4PEnable) + resolver.SetIP4PEnable(c.IP4PEnable) } func updateNTP(c *config.NTP) {