diff --git a/probe.go b/probe.go index 90ecf16..2604cdb 100644 --- a/probe.go +++ b/probe.go @@ -52,7 +52,7 @@ func main() { var err error if s5 != "" { fmt.Printf("通过代理探测: %s\n", s5) - conn, err = DialSocks5UDP(s5) + conn, err = DialSocks5UDP(s5, network) if err != nil { fmt.Printf("连接代理失败: %v\n", err) return diff --git a/probe_nat.go b/probe_nat.go index b35b2cf..cdd84b4 100644 --- a/probe_nat.go +++ b/probe_nat.go @@ -149,6 +149,14 @@ func DetectNAT(conn net.PacketConn, primarySTUN, secondarySTUN, network string, return res } res.MappedIP = mappedAddr1.String() + if localAddr, ok := conn.LocalAddr().(*net.UDPAddr); ok { + if localAddr.IP.Equal(mappedAddr1.IP) && localAddr.Port == mappedAddr1.Port { + res.Type = NATOpen + res.Mapping = MappingEndpointIndependent + res.Filtering = FilteringEndpointIndependent + return res + } + } var targetSTUN2 string if secondarySTUN != "" { targetSTUN2 = secondarySTUN @@ -160,7 +168,10 @@ func DetectNAT(conn net.PacketConn, primarySTUN, secondarySTUN, network string, host, port, _ := net.SplitHostPort(primarySTUN) ips, err := net.LookupIP(host) if err == nil && len(ips) > 1 { - primaryIP, _ := net.ResolveIPAddr("ip", host) + primaryIP, err := net.ResolveIPAddr("ip", host) + if err != nil { + return res + } wantIPv4 := network == "udp4" wantIPv6 := network == "udp6" if network == "udp" { diff --git a/probe_socks5.go b/probe_socks5.go index e5f9afb..feef126 100644 --- a/probe_socks5.go +++ b/probe_socks5.go @@ -180,9 +180,9 @@ func (c *socks5PacketConn) SetWriteDeadline(t time.Time) error { } // DialSocks5UDP 建立SOCKS5 UDP关联 -// 入参: proxyAddr 代理服务器地址 +// 入参: proxyAddr 代理服务器地址, network 网络协议(udp/udp4/udp6) // 返回: conn 数据包连接, err 连接错误 -func DialSocks5UDP(proxyAddr string) (net.PacketConn, error) { +func DialSocks5UDP(proxyAddr, network string) (net.PacketConn, error) { var host string if strings.Contains(proxyAddr, "://") { u, err := url.Parse(proxyAddr) @@ -193,7 +193,14 @@ func DialSocks5UDP(proxyAddr string) (net.PacketConn, error) { } else { host = proxyAddr } - conn, err := net.DialTimeout("tcp", host, 5*time.Second) + tcpNetwork := "tcp" + switch network { + case "udp4": + tcpNetwork = "tcp4" + case "udp6": + tcpNetwork = "tcp6" + } + conn, err := net.DialTimeout(tcpNetwork, host, 5*time.Second) if err != nil { return nil, err } @@ -272,7 +279,7 @@ func DialSocks5UDP(proxyAddr string) (net.PacketConn, error) { } } relayAddr := &net.UDPAddr{IP: relayIP, Port: relayPort} - lConn, err := net.ListenUDP("udp", nil) + lConn, err := net.ListenUDP(network, nil) if err != nil { conn.Close() return nil, err