Add .meship protocol support (#7)
This commit is contained in:
parent
b2082295c2
commit
61c74e0568
@ -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 {
|
||||
|
Loading…
Reference in New Issue
Block a user