From b5214f65e7828960259766670326c1f50126a15c Mon Sep 17 00:00:00 2001 From: Bryan Boreham Date: Fri, 10 Oct 2014 15:41:09 +0100 Subject: [PATCH] Forward DNS requests that aren't for our 'weave' domain --- server/mdns_server.go | 1 + server/server.go | 23 +++++++++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/server/mdns_server.go b/server/mdns_server.go index ac605a66..b9ccd6ba 100644 --- a/server/mdns_server.go +++ b/server/mdns_server.go @@ -27,6 +27,7 @@ func NewMDNSServer(zone *ZoneDb) (*MDNSServer, error) { func makeDNSReply(r *dns.Msg, name string, addr net.IP) *dns.Msg { m := new(dns.Msg) m.SetReply(r) + m.RecursionAvailable = true hdr := dns.RR_Header{Name: name, Rrtype: dns.TypeA, Class: dns.ClassINET, Ttl: 3600} a := &dns.A{hdr, addr} diff --git a/server/server.go b/server/server.go index e90cd99e..36adf65c 100644 --- a/server/server.go +++ b/server/server.go @@ -39,6 +39,14 @@ func findInterface(ifaceName string) (iface *net.Interface, err error) { return } +func makeDNSFailResponse(r *dns.Msg) *dns.Msg { + m := new(dns.Msg) + m.SetReply(r) + m.RecursionAvailable = true + m.Rcode = dns.RcodeNameError + return m +} + func queryHandler(zone Zone, mdnsClient *MDNSClient) dns.HandlerFunc { return func(w dns.ResponseWriter, r *dns.Msg) { q := r.Question[0] @@ -64,6 +72,20 @@ func queryHandler(zone Zone, mdnsClient *MDNSClient) dns.HandlerFunc { } } +func notUsHandler() dns.HandlerFunc { + return func(w dns.ResponseWriter, r *dns.Msg) { + q := r.Question[0] + addrs, err := net.LookupIP(q.Name) + if err == nil { + m := makeDNSReply(r, q.Name, addrs[0]) + w.WriteMsg(m) + } else { + m := makeDNSFailResponse(r) + w.WriteMsg(m) + } + } +} + func StartServer(ifaceName string, dnsPort int, httpPort int, wait int) error { var zone = new(ZoneDb) @@ -91,6 +113,7 @@ func StartServer(ifaceName string, dnsPort int, httpPort int, wait int) error { LocalServeMux := dns.NewServeMux() LocalServeMux.HandleFunc(LOCAL_DOMAIN, queryHandler(zone, mdnsClient)) + LocalServeMux.HandleFunc(".", notUsHandler()) mdnsServer, err := NewMDNSServer(zone) if err != nil {