From 61c74e0568aabbca1c8c8cd1653573d6f47047e9 Mon Sep 17 00:00:00 2001 From: George Date: Thu, 1 Apr 2021 12:49:09 -0400 Subject: [PATCH] Add .meship protocol support (#7) --- pkg/meshname/server.go | 35 +++++++++++++++++++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) diff --git a/pkg/meshname/server.go b/pkg/meshname/server.go index 71ea538..3849d3c 100644 --- a/pkg/meshname/server.go +++ b/pkg/meshname/server.go @@ -64,9 +64,11 @@ func (s *MeshnameServer) Start() error { NotifyStartedFunc: func(){ close(waitStarted) }, } for tld, subnet := range s.networks { - dns.HandleFunc(tld, s.handleRequest) + dns.HandleFunc(tld, s.handleMeshnameRequest) s.log.Debugln("Handling:", tld, subnet) } + dns.HandleFunc("meship", s.handleMeshIPRequest) + s.log.Debugln("Handling: meship ::/0") go func(){ if err := s.dnsServer.ListenAndServe(); err != nil { s.log.Fatalln("MeshnameServer failed to start:", err) @@ -88,7 +90,7 @@ func (s *MeshnameServer) ConfigureDNSRecords(dnsRecords map[string][]dns.RR) { s.dnsRecordsLock.Unlock() } -func (s *MeshnameServer) handleRequest(w dns.ResponseWriter, r *dns.Msg) { +func (s *MeshnameServer) handleMeshnameRequest(w dns.ResponseWriter, r *dns.Msg) { var remoteLookups = make(map[string][]dns.Question) m := new(dns.Msg) m.SetReply(r) @@ -146,6 +148,35 @@ func (s *MeshnameServer) handleRequest(w dns.ResponseWriter, r *dns.Msg) { } } +func (s *MeshnameServer) handleMeshIPRequest(w dns.ResponseWriter, r *dns.Msg) { + m := new(dns.Msg) + m.SetReply(r) + + for _, q := range r.Question { + labels := dns.SplitDomainName(q.Name) + // resolve only 2nd level domains and AAAA type + if len(labels) != 2 || q.Qtype != dns.TypeAAAA || q.Qclass != dns.ClassINET { + s.log.Debugln("Error: invalid resource requested") + continue + } + subDomain := labels[len(labels)-2] + + if resolvedAddr, err := IPFromDomain(&subDomain); err == nil { + answer := new(dns.AAAA) + answer.Hdr = dns.RR_Header{Name: q.Name, Rrtype: dns.TypeAAAA, Class: dns.ClassINET, Ttl: 3600} + answer.AAAA = resolvedAddr + + m.Answer = append(m.Answer, answer) + } else { + s.log.Debugln(err) + } + } + + if err := w.WriteMsg(m); err != nil { + s.log.Debugln("Error writing response:", err) + } +} + func (s *MeshnameServer) isRemoteLookupAllowed(addr net.Addr) bool { // TODO prefix whitelists ? if s.allowRemote {