From 73c604e9c47f39fcc84da2ba1070656de7b3021f Mon Sep 17 00:00:00 2001 From: root Date: Tue, 21 May 2024 03:21:12 +0000 Subject: [PATCH] accept custom meship domains --- cmd/meshnamed/main.go | 5 +++- pkg/meshname/server.go | 52 +++++++++++++++++++++++++++--------------- 2 files changed, 38 insertions(+), 19 deletions(-) diff --git a/cmd/meshnamed/main.go b/cmd/meshnamed/main.go index 4378db3..23bd101 100644 --- a/cmd/meshnamed/main.go +++ b/cmd/meshnamed/main.go @@ -30,6 +30,7 @@ func parseNetworks(networksconf string) (map[string]*net.IPNet, error) { var ( listenAddr, networksconf string + meshipNetworksconf string getName, getIP string debug, noMeshIP bool ) @@ -37,6 +38,7 @@ var ( func init() { flag.StringVar(&listenAddr, "listenaddr", "[::1]:53535", "address to listen on") flag.StringVar(&networksconf, "networks", "ygg=200::/7,cjd=fc00::/8,meshname=::/0,popura=::/0", "TLD=subnet list separated by comma") + flag.StringVar(&meshipNetworksconf, "meshipnetworks", "meship=::/0", "TLD=subnet list separated by comma") flag.BoolVar(&noMeshIP, "nomeship", false, "disable .meship resolver") flag.StringVar(&getName, "getname", "", "convert IPv6 address to a name") flag.StringVar(&getIP, "getip", "", "convert a name to IPv6 address") @@ -73,11 +75,12 @@ func main() { } networks, err := parseNetworks(networksconf) + meshipNetworks, err := parseNetworks(meshipNetworksconf) if err != nil { logger.Fatalln(err) } - s := meshname.New(logger, listenAddr, networks, !noMeshIP) + s := meshname.New(logger, listenAddr, networks, meshipNetworks, !noMeshIP) if err := s.Start(); err != nil { logger.Fatal(err) diff --git a/pkg/meshname/server.go b/pkg/meshname/server.go index be44e0e..9aaab5f 100644 --- a/pkg/meshname/server.go +++ b/pkg/meshname/server.go @@ -10,28 +10,30 @@ import ( ) type MeshnameServer struct { - log *log.Logger - listenAddr string - dnsClient *dns.Client - dnsServer *dns.Server - networks map[string]*net.IPNet - enableMeshIP bool + log *log.Logger + listenAddr string + dnsClient *dns.Client + dnsServer *dns.Server + networks map[string]*net.IPNet + meshipNetworks map[string]*net.IPNet + enableMeshIP bool - startedLock sync.RWMutex - started bool + startedLock sync.RWMutex + started bool } // New is a constructor for MeshnameServer -func New(log *log.Logger, listenAddr string, networks map[string]*net.IPNet, enableMeshIP bool) *MeshnameServer { +func New(log *log.Logger, listenAddr string, networks map[string]*net.IPNet, meshipNetworks map[string]*net.IPNet, enableMeshIP bool) *MeshnameServer { dnsClient := new(dns.Client) dnsClient.Timeout = 5000000000 // increased 5 seconds timeout return &MeshnameServer{ - log: log, - listenAddr: listenAddr, - networks: networks, - dnsClient: dnsClient, - enableMeshIP: enableMeshIP, + log: log, + listenAddr: listenAddr, + networks: networks, + meshipNetworks: meshipNetworks, + dnsClient: dnsClient, + enableMeshIP: enableMeshIP, } } @@ -63,8 +65,12 @@ func (s *MeshnameServer) Start() error { s.log.Debugln("Handling:", tld, subnet) } if s.enableMeshIP { - dns.HandleFunc("meship", s.handleMeshIPRequest) - s.log.Debugln("Handling: meship ::/0") + for mtld, subnet := range s.meshipNetworks { + //dns.HandleFunc("meship", s.handleMeshIPRequest) + dns.HandleFunc(mtld, s.handleMeshIPRequest) + //s.log.Debugln("Handling: meship ::/0") + s.log.Debugln("Handling as meship:", mtld, subnet) + } } go func() { @@ -87,14 +93,23 @@ func (s *MeshnameServer) handleMeshnameRequest(w dns.ResponseWriter, r *dns.Msg) m := new(dns.Msg) m.SetReply(r) s.log.Debugln(r.String()) + s.log.Debugln(s.networks) // DEBUG + + var tldList []string + for tld := range s.networks { + tldList = append(tldList, tld) + } + s.log.Debugln(tldList) // DEBUG for _, q := range r.Question { labels := dns.SplitDomainName(q.Name) + s.log.Debugln(labels) // DEBUG if len(labels) < 2 { s.log.Debugln("Error: invalid domain requested") continue } subDomain := labels[len(labels)-2] + s.log.Debugln(subDomain) // DEBUG resolvedAddr, err := IPFromDomain(&subDomain) if err != nil { @@ -134,11 +149,12 @@ func (s *MeshnameServer) handleMeshnameRequest(w dns.ResponseWriter, r *dns.Msg) func (s *MeshnameServer) handleMeshIPRequest(w dns.ResponseWriter, r *dns.Msg) { m := new(dns.Msg) m.SetReply(r) + s.log.Debugln(r.String()) 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 { + // resolve only AAAA type + if q.Qtype != dns.TypeAAAA || q.Qclass != dns.ClassINET { s.log.Debugln("Error: invalid resource requested") continue }