@@ -35,6 +35,7 @@ func Init() {
35
35
DefaultClient = & dns.Client {
36
36
Dialer : & net.Dialer {
37
37
Resolver : & net.Resolver {
38
+ PreferGo : true ,
38
39
Dial : func (ctx context.Context , network , address string ) (net.Conn , error ) {
39
40
return net .Dial (network , RoaFinder )
40
41
},
@@ -49,7 +50,7 @@ var ResolveUDPAddr = func(network string, addr string) (*net.UDPAddr, error) {
49
50
return nil , fmt .Errorf ("split host port failed: %w" , err )
50
51
}
51
52
52
- numport , err := strconv .Atoi (port )
53
+ numPort , err := strconv .Atoi (port )
53
54
if err != nil {
54
55
return nil , fmt .Errorf ("parse port failed: %w" , err )
55
56
}
@@ -58,7 +59,7 @@ var ResolveUDPAddr = func(network string, addr string) (*net.UDPAddr, error) {
58
59
if err != nil {
59
60
return nil , fmt .Errorf ("resolve ip addr failed: %w" , err )
60
61
}
61
- return & net.UDPAddr {IP : ip , Port : numport }, nil
62
+ return & net.UDPAddr {IP : ip , Port : numPort }, nil
62
63
}
63
64
64
65
func resolveIPAddr (addr string ) (net.IP , error ) {
@@ -74,11 +75,7 @@ func resolveIPAddr(addr string) (net.IP, error) {
74
75
}); err != nil {
75
76
// fallback
76
77
log .Warn ().Msgf ("directDNS failed: %v" , err )
77
- ip , err := net .ResolveIPAddr ("ip" , addr )
78
- if err != nil {
79
- return nil , fmt .Errorf ("fallback failed: %w" , err )
80
- }
81
- return ip .IP , nil
78
+ return nil , fmt .Errorf ("resolve ip addr failed: %w" , err )
82
79
}
83
80
84
81
return ip , nil
@@ -87,16 +84,6 @@ func resolveIPAddr(addr string) (net.IP, error) {
87
84
func directDNS (addr string ) (net.IP , error ) {
88
85
addr = dns .Fqdn (addr )
89
86
msg := new (dns.Msg )
90
- msg .SetQuestion (addr , dns .TypeCNAME )
91
- rec , _ , err := DefaultClient .Exchange (msg , RoaFinder )
92
- if err != nil {
93
- return nil , fmt .Errorf ("write msg failed: %w" , err )
94
- }
95
- for _ , ans := range rec .Answer {
96
- if a , ok := ans .(* dns.CNAME ); ok {
97
- return directDNS (a .Target )
98
- }
99
- }
100
87
101
88
var NsServer string
102
89
for fa := addr ; dns .Split (fa ) != nil ; {
@@ -112,6 +99,8 @@ func directDNS(addr string) (net.IP, error) {
112
99
NsServer = a .Ns
113
100
case * dns.NS :
114
101
NsServer = a .Ns
102
+ case * dns.CNAME :
103
+ return directDNS (a .Target )
115
104
}
116
105
}
117
106
@@ -124,7 +113,7 @@ func directDNS(addr string) (net.IP, error) {
124
113
125
114
nsAddr := net .JoinHostPort (NsServer , "53" )
126
115
msg .SetQuestion (dns .Fqdn (addr ), dns .TypeA )
127
- rec , _ , err = DefaultClient .Exchange (msg , nsAddr )
116
+ rec , _ , err : = DefaultClient .Exchange (msg , nsAddr )
128
117
if err == nil {
129
118
for _ , ans := range rec .Answer {
130
119
if a , ok := ans .(* dns.A ); ok {
0 commit comments