@@ -36,8 +36,8 @@ type Handler struct {
36
36
clientConfig * dns.ClientConfig
37
37
clients []* dns.Client
38
38
IPv6 bool
39
- cname map [string ]string
40
- ip map [string ]net.IP
39
+ cnameToHost map [string ]string
40
+ hostToIP map [string ]net.IP
41
41
}
42
42
43
43
type Server struct {
@@ -99,14 +99,14 @@ func NewHandler(opts HandlerOptions) (dns.Handler, error) {
99
99
clientConfig : cc ,
100
100
clients : clients ,
101
101
IPv6 : opts .IPv6 ,
102
- cname : make (map [string ]string ),
103
- ip : make (map [string ]net.IP ),
102
+ cnameToHost : make (map [string ]string ),
103
+ hostToIP : make (map [string ]net.IP ),
104
104
}
105
105
for host , address := range opts .StaticHosts {
106
106
if ip := net .ParseIP (address ); ip != nil {
107
- h .ip [host ] = ip
107
+ h .hostToIP [host ] = ip
108
108
} else {
109
- h .cname [host ] = limayaml .Cname (address )
109
+ h .cnameToHost [host ] = limayaml .Cname (address )
110
110
}
111
111
}
112
112
return h , nil
@@ -140,26 +140,60 @@ func (h *Handler) handleQuery(w dns.ResponseWriter, req *dns.Msg) {
140
140
qtype = dns .TypeA
141
141
}
142
142
fallthrough
143
- case dns .TypeCNAME , dns .TypeA :
143
+ case dns .TypeA :
144
+ var err error
145
+ var addrs []net.IP
146
+ if _ , ok := h .hostToIP [q .Name ]; ok {
147
+ addrs = []net.IP {h .hostToIP [q .Name ]}
148
+ } else {
149
+ addrs , err = net .LookupIP (q .Name )
150
+ if err != nil {
151
+ logrus .Debugf ("handleQuery lookup IP failed: %v" , err )
152
+ continue
153
+ }
154
+ }
155
+ for _ , ip := range addrs {
156
+ var a dns.RR
157
+ ipv6 := ip .To4 () == nil
158
+ if qtype == dns .TypeA && ! ipv6 {
159
+ hdr .Rrtype = dns .TypeA
160
+ a = & dns.A {
161
+ Hdr : hdr ,
162
+ A : ip .To4 (),
163
+ }
164
+ } else if qtype == dns .TypeAAAA && ipv6 {
165
+ hdr .Rrtype = dns .TypeAAAA
166
+ a = & dns.AAAA {
167
+ Hdr : hdr ,
168
+ AAAA : ip .To16 (),
169
+ }
170
+ } else {
171
+ continue
172
+ }
173
+ reply .Answer = append (reply .Answer , a )
174
+ handled = true
175
+ }
176
+ case dns .TypeCNAME :
144
177
cname := q .Name
145
178
seen := make (map [string ]bool )
146
179
for {
147
180
// break cyclic definition
148
181
if seen [cname ] {
149
182
break
150
183
}
151
- if _ , ok := h .cname [cname ]; ok {
184
+ if _ , ok := h .cnameToHost [cname ]; ok {
152
185
seen [cname ] = true
153
- cname = h .cname [cname ]
186
+ cname = h .cnameToHost [cname ]
154
187
continue
155
188
}
156
189
break
157
190
}
158
191
var err error
159
- if _ , ok := h .ip [cname ]; ! ok {
192
+ if _ , ok := h .hostToIP [cname ]; ! ok {
160
193
cname , err = net .LookupCNAME (cname )
161
194
if err != nil {
162
- break
195
+ logrus .Debugf ("handleQuery lookup CNAME failed: %v" , err )
196
+ continue
163
197
}
164
198
}
165
199
if cname != "" && cname != q .Name {
@@ -171,40 +205,6 @@ func (h *Handler) handleQuery(w dns.ResponseWriter, req *dns.Msg) {
171
205
reply .Answer = append (reply .Answer , a )
172
206
handled = true
173
207
}
174
- if qtype == dns .TypeCNAME {
175
- break
176
- }
177
- hdr .Name = cname
178
- var addrs []net.IP
179
- if _ , ok := h .ip [cname ]; ok {
180
- addrs = []net.IP {h .ip [cname ]}
181
- err = nil
182
- } else {
183
- addrs , err = net .LookupIP (cname )
184
- }
185
- if err == nil && len (addrs ) > 0 {
186
- for _ , ip := range addrs {
187
- var a dns.RR
188
- ipv6 := ip .To4 () == nil
189
- if qtype == dns .TypeA && ! ipv6 {
190
- hdr .Rrtype = dns .TypeA
191
- a = & dns.A {
192
- Hdr : hdr ,
193
- A : ip .To4 (),
194
- }
195
- } else if qtype == dns .TypeAAAA && ipv6 {
196
- hdr .Rrtype = dns .TypeAAAA
197
- a = & dns.AAAA {
198
- Hdr : hdr ,
199
- AAAA : ip .To16 (),
200
- }
201
- } else {
202
- continue
203
- }
204
- reply .Answer = append (reply .Answer , a )
205
- handled = true
206
- }
207
- }
208
208
case dns .TypeTXT :
209
209
txt , err := net .LookupTXT (q .Name )
210
210
if err == nil && len (txt ) > 0 {
0 commit comments