Add .meship protocol support (#7)

This commit is contained in:
George 2021-04-01 12:49:09 -04:00
parent b2082295c2
commit 61c74e0568

View File

@ -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 {