feat(公网判断): 优化公网判断

This commit is contained in:
2026-01-22 20:49:16 +08:00
parent 0db61ab91d
commit f32ac95f8b
+23 -1
View File
@@ -74,6 +74,24 @@ type NATResult struct {
MappedIP string 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 解析探测目标地址 // resolveAddr 解析探测目标地址
// 入参: conn 当前连接, addrStr 目标地址字符串, network 网络协议 // 入参: conn 当前连接, addrStr 目标地址字符串, network 网络协议
// 返回: addr 解析后的网络地址, err 解析错误 // 返回: addr 解析后的网络地址, err 解析错误
@@ -151,7 +169,11 @@ func DetectNAT(conn net.PacketConn, primarySTUN, secondarySTUN, network string,
res.MappedIP = mappedAddr1.String() res.MappedIP = mappedAddr1.String()
if _, isSocks5 := conn.(*socks5PacketConn); !isSocks5 { if _, isSocks5 := conn.(*socks5PacketConn); !isSocks5 {
if localAddr, ok := conn.LocalAddr().(*net.UDPAddr); ok { 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.Type = NATOpen
res.Mapping = MappingEndpointIndependent res.Mapping = MappingEndpointIndependent
res.Filtering = FilteringEndpointIndependent res.Filtering = FilteringEndpointIndependent