From f32ac95f8bcb81579de2cc1e7c96bd039fc45d7f Mon Sep 17 00:00:00 2001 From: xiaoqidun Date: Thu, 22 Jan 2026 20:49:16 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E5=85=AC=E7=BD=91=E5=88=A4=E6=96=AD):=20?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E5=85=AC=E7=BD=91=E5=88=A4=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- probe_nat.go | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/probe_nat.go b/probe_nat.go index 5ea70cc..db29af4 100644 --- a/probe_nat.go +++ b/probe_nat.go @@ -74,6 +74,24 @@ type NATResult struct { MappedIP string } +// isLocalIP 判断IP是否为本地IP +// 入参: ip 待判断IP +// 返回: bool 是否为本地IP +func isLocalIP(ip net.IP) bool { + addrs, err := net.InterfaceAddrs() + if err != nil { + return false + } + for _, addr := range addrs { + if ipNet, ok := addr.(*net.IPNet); ok { + if ipNet.IP.Equal(ip) { + return true + } + } + } + return false +} + // resolveAddr 解析探测目标地址 // 入参: conn 当前连接, addrStr 目标地址字符串, network 网络协议 // 返回: addr 解析后的网络地址, err 解析错误 @@ -151,7 +169,11 @@ func DetectNAT(conn net.PacketConn, primarySTUN, secondarySTUN, network string, res.MappedIP = mappedAddr1.String() if _, isSocks5 := conn.(*socks5PacketConn); !isSocks5 { if localAddr, ok := conn.LocalAddr().(*net.UDPAddr); ok { - if localAddr.IP.Equal(mappedAddr1.IP) && localAddr.Port == mappedAddr1.Port { + isLocal := localAddr.IP.Equal(mappedAddr1.IP) + if !isLocal && localAddr.IP.IsUnspecified() { + isLocal = isLocalIP(mappedAddr1.IP) + } + if isLocal && localAddr.Port == mappedAddr1.Port { res.Type = NATOpen res.Mapping = MappingEndpointIndependent res.Filtering = FilteringEndpointIndependent