Support returning AAAA records from delegated DNS queries
This commit is contained in:
1 parent
624db7bdff
commit
3af058481e
2 files changed
+19
-18
No files matched your search
+12
-8
@@ -24,16 +24,20 @@ func NewMDNSServer(zone Zone) (*MDNSServer, error) {
|
||||
return retval, nil
|
||||
}
|
||||
|
||||
func makeDNSReply(r *dns.Msg, name string, addrs []net.IP) *dns.Msg {
|
||||
func makeDNSReply(r *dns.Msg, name string, qtype uint16, addrs []net.IP) *dns.Msg {
|
||||
m := new(dns.Msg)
|
||||
m.SetReply(r)
|
||||
m.RecursionAvailable = true
|
||||
m.Answer = make([]dns.RR, len(addrs))
|
||||
for i, addr := range addrs {
|
||||
if ip4 := addr.To4(); ip4 != nil {
|
||||
hdr := dns.RR_Header{Name: name, Rrtype: dns.TypeA,
|
||||
Class: dns.ClassINET, Ttl: 3600}
|
||||
m.Answer[i] = &dns.A{hdr, addr}
|
||||
hdr := dns.RR_Header{Name: name, Rrtype: qtype, Class: dns.ClassINET, Ttl: 3600}
|
||||
for _, addr := range addrs {
|
||||
if qtype == dns.TypeA {
|
||||
if ip4 := addr.To4(); ip4 != nil {
|
||||
m.Answer = append(m.Answer, &dns.A{hdr, addr})
|
||||
}
|
||||
} else if qtype == dns.TypeAAAA {
|
||||
if ip4 := addr.To4(); ip4 == nil {
|
||||
m.Answer = append(m.Answer, &dns.AAAA{hdr, addr})
|
||||
}
|
||||
}
|
||||
}
|
||||
return m
|
||||
@@ -60,7 +64,7 @@ func (s *MDNSServer) Start(ifi *net.Interface) error {
|
||||
q := r.Question[0]
|
||||
ip, err := s.zone.MatchLocal(q.Name)
|
||||
if err == nil {
|
||||
m := makeDNSReply(r, q.Name, []net.IP{ip})
|
||||
m := makeDNSReply(r, q.Name, dns.TypeA, []net.IP{ip})
|
||||
s.SendResponse(m)
|
||||
} else if s.addrIsLocal(w.RemoteAddr()) {
|
||||
// ignore this - it's our own query received via multicast
|
||||
|
||||
+7
-10
@@ -52,7 +52,7 @@ func queryHandler(zone Zone, mdnsClient *MDNSClient) dns.HandlerFunc {
|
||||
q := r.Question[0]
|
||||
ip, err := zone.MatchLocal(q.Name)
|
||||
if err == nil {
|
||||
m := makeDNSReply(r, q.Name, []net.IP{ip})
|
||||
m := makeDNSReply(r, q.Name, dns.TypeA, []net.IP{ip})
|
||||
w.WriteMsg(m)
|
||||
} else {
|
||||
log.Printf("Failed lookup for %s; sending mDNS query", q.Name)
|
||||
@@ -67,7 +67,7 @@ func queryHandler(zone Zone, mdnsClient *MDNSClient) dns.HandlerFunc {
|
||||
}
|
||||
var response_msg *dns.Msg
|
||||
if len(replies) > 0 {
|
||||
response_msg = makeDNSReply(r, q.Name, replies)
|
||||
response_msg = makeDNSReply(r, q.Name, dns.TypeA, replies)
|
||||
} else {
|
||||
response_msg = makeDNSFailResponse(r)
|
||||
}
|
||||
@@ -79,20 +79,17 @@ func queryHandler(zone Zone, mdnsClient *MDNSClient) dns.HandlerFunc {
|
||||
}
|
||||
}
|
||||
|
||||
/* When we receive a request for a name outside of our '.weave' domain, call
|
||||
the underlying lookup mechanism and return the answer(s) it gives.
|
||||
Unfortunately, this means that TTLs from a real DNS server are lost - FIXME.
|
||||
*/
|
||||
func notUsHandler() dns.HandlerFunc {
|
||||
return func(w dns.ResponseWriter, r *dns.Msg) {
|
||||
q := r.Question[0]
|
||||
addrs, err := net.LookupIP(q.Name)
|
||||
var response_msg *dns.Msg
|
||||
if err == nil {
|
||||
// Filter out ipv6 addresses
|
||||
filtered := make([]net.IP, 0)
|
||||
for _, addr := range addrs {
|
||||
if ip4 := addr.To4(); ip4 != nil {
|
||||
filtered = append(filtered, ip4)
|
||||
}
|
||||
}
|
||||
response_msg = makeDNSReply(r, q.Name, filtered)
|
||||
response_msg = makeDNSReply(r, q.Name, q.Qtype, addrs)
|
||||
} else {
|
||||
response_msg = makeDNSFailResponse(r)
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user