@@ -35,6 +35,8 @@ type Resolver struct {
35
35
36
36
udpServerWorking bool
37
37
tcpServerWorking bool
38
+
39
+ dnsAddress string
38
40
}
39
41
40
42
type config struct {
@@ -43,40 +45,39 @@ type config struct {
43
45
reverseMapping map [string ]string
44
46
}
45
47
46
- func NewResolver () * Resolver {
48
+ func NewResolver (dnsAddress string ) * Resolver {
47
49
r := & Resolver {
48
50
logger : log .Logger ("awl/dns" ),
49
51
udpClient : & dns.Client {
50
- Net : "udp" ,
51
- SingleInflight : true ,
52
+ Net : "udp" ,
52
53
},
53
54
tcpClient : & dns.Client {
54
- Net : "tcp" ,
55
- SingleInflight : true ,
55
+ Net : "tcp" ,
56
56
},
57
+ dnsAddress : dnsAddress ,
57
58
}
58
- r .cfg .Store (& config {upstreamDNS : "127.0.0.1:53" })
59
+ r .cfg .Store (& config {})
59
60
60
61
mux := dns .NewServeMux ()
61
62
mux .HandleFunc (LocalDomain , r .dnsLocalDomainHandler )
62
63
mux .HandleFunc (strings .TrimPrefix (ptrV4Suffix , "." ), r .ptrv4Handler )
63
64
mux .HandleFunc ("." , r .dnsProxyHandler )
64
65
65
66
r .udpServer = & dns.Server {
66
- Addr : DNSAddress ,
67
+ Addr : dnsAddress ,
67
68
Net : "udp" ,
68
69
Handler : mux ,
69
70
NotifyStartedFunc : func () {
70
- r .logger .Infof ("udp server has started on %s" , DNSAddress )
71
+ r .logger .Infof ("udp server has started on %s" , dnsAddress )
71
72
r .udpServerWorking = true
72
73
},
73
74
}
74
75
r .tcpServer = & dns.Server {
75
- Addr : DNSAddress ,
76
+ Addr : dnsAddress ,
76
77
Net : "tcp" ,
77
78
Handler : mux ,
78
79
NotifyStartedFunc : func () {
79
- r .logger .Infof ("tcp server has started on %s" , DNSAddress )
80
+ r .logger .Infof ("tcp server has started on %s" , dnsAddress )
80
81
r .tcpServerWorking = true
81
82
},
82
83
}
@@ -127,7 +128,7 @@ func (r *Resolver) DNSAddress() string {
127
128
return ""
128
129
}
129
130
130
- return DNSAddress
131
+ return r . dnsAddress
131
132
}
132
133
133
134
func (r * Resolver ) Close () {
@@ -149,17 +150,18 @@ func (r *Resolver) dnsLocalDomainHandler(resp dns.ResponseWriter, req *dns.Msg)
149
150
150
151
m := new (dns.Msg )
151
152
m .SetReply (req )
152
- m .Authoritative = true
153
153
154
154
for _ , question := range req .Question {
155
155
hostname := question .Name
156
156
qtype := question .Qtype
157
- mappedIP , found := cfg .directMapping [hostname ]
157
+ hostnameLower := strings .ToLower (hostname )
158
+ mappedIP , found := cfg .directMapping [hostnameLower ]
158
159
159
160
switch qtype {
160
161
case dns .TypeA , dns .TypeAAAA , dns .TypeANY :
161
162
aRec := & dns.A {
162
163
Hdr : dns.RR_Header {
164
+ // we should return original name from the request as some clients expect that
163
165
Name : hostname ,
164
166
Rrtype : dns .TypeA ,
165
167
Class : dns .ClassINET ,
@@ -176,6 +178,8 @@ func (r *Resolver) dnsLocalDomainHandler(resp dns.ResponseWriter, req *dns.Msg)
176
178
}
177
179
}
178
180
181
+ processOwnResponse (req , resp , m )
182
+
179
183
_ = resp .WriteMsg (m )
180
184
}
181
185
@@ -201,7 +205,6 @@ func (r *Resolver) ptrv4Handler(resp dns.ResponseWriter, req *dns.Msg) {
201
205
202
206
m := new (dns.Msg )
203
207
m .SetReply (req )
204
- m .Authoritative = true
205
208
206
209
ptr := & dns.PTR {
207
210
Hdr : dns.RR_Header {
@@ -213,6 +216,9 @@ func (r *Resolver) ptrv4Handler(resp dns.ResponseWriter, req *dns.Msg) {
213
216
Ptr : mappedName ,
214
217
}
215
218
m .Answer = append (m .Answer , ptr )
219
+
220
+ processOwnResponse (req , resp , m )
221
+
216
222
_ = resp .WriteMsg (m )
217
223
}
218
224
@@ -244,6 +250,24 @@ func (r *Resolver) loadConfig() config {
244
250
return * cfg
245
251
}
246
252
253
+ func processOwnResponse (req * dns.Msg , respWriter dns.ResponseWriter , resp * dns.Msg ) {
254
+ maxSize := dns .MinMsgSize
255
+ if respWriter .LocalAddr ().Network () == "tcp" {
256
+ maxSize = dns .MaxMsgSize
257
+ } else {
258
+ if optRR := req .IsEdns0 (); optRR != nil {
259
+ udpsize := int (optRR .UDPSize ())
260
+ if udpsize > maxSize {
261
+ maxSize = udpsize
262
+ }
263
+ }
264
+ }
265
+ resp .Truncate (maxSize )
266
+
267
+ resp .Authoritative = true
268
+ resp .RecursionAvailable = true
269
+ }
270
+
247
271
func TrimDomainName (domain string ) string {
248
272
domain = strings .TrimSpace (domain )
249
273
domain = strings .Map (func (r rune ) rune {
0 commit comments