feat(强化检查): 实现更多的检查

This commit is contained in:
2026-01-22 20:10:42 +08:00
parent 1d6d419f86
commit 1107d353e3
+33 -12
View File
@@ -195,28 +195,49 @@ func DetectNAT(conn net.PacketConn, primarySTUN, secondarySTUN, network string,
}
}
}
var mappedAddr3 *net.UDPAddr
var mappedAddr2 *net.UDPAddr
if targetSTUN2 != "" {
resp3, _, err := performTest(conn, targetSTUN2, network, timeout, false, false)
if err == nil && resp3 != nil {
mappedAddr3 = resp3.GetMappedAddress()
resp2, _, err := performTest(conn, targetSTUN2, network, timeout, false, false)
if err == nil && resp2 != nil {
mappedAddr2 = resp2.GetMappedAddress()
}
}
if mappedAddr3 != nil {
if mappedAddr1.String() == mappedAddr3.String() {
if mappedAddr2 == nil {
res.Mapping = MappingUnknown
} else if mappedAddr1.String() == mappedAddr2.String() {
res.Mapping = MappingEndpointIndependent
} else {
res.Mapping = MappingAddressPortDependent
changedAddr := resp1.GetChangedAddress()
if changedAddr != nil {
host, _, _ := net.SplitHostPort(primarySTUN)
primaryIP := net.ParseIP(host)
if primaryIP == nil {
if ipAddr, err := net.ResolveIPAddr("ip", host); err == nil {
primaryIP = ipAddr.IP
}
} else {
res.Mapping = MappingUnknown
}
resp2, _, _ := performTest(conn, primarySTUN, network, timeout, true, true)
if resp2 != nil {
if primaryIP != nil && changedAddr.Port != 0 {
altPortSTUN := net.JoinHostPort(primaryIP.String(), strconv.Itoa(changedAddr.Port))
if altPortSTUN != primarySTUN {
resp3, _, err := performTest(conn, altPortSTUN, network, timeout, false, false)
if err == nil && resp3 != nil {
if mappedAddr3 := resp3.GetMappedAddress(); mappedAddr3 != nil {
if mappedAddr1.String() == mappedAddr3.String() {
res.Mapping = MappingAddressDependent
}
}
}
}
}
}
}
respF1, _, _ := performTest(conn, primarySTUN, network, timeout, true, true)
if respF1 != nil {
res.Filtering = FilteringEndpointIndependent
} else {
resp4, _, _ := performTest(conn, primarySTUN, network, timeout, false, true)
if resp4 != nil {
respF2, _, _ := performTest(conn, primarySTUN, network, timeout, false, true)
if respF2 != nil {
res.Filtering = FilteringAddressDependent
} else {
res.Filtering = FilteringAddressPortDependent