diff --git a/cmd/meshnamed/main.go b/cmd/meshnamed/main.go index ef620f8..78e147b 100644 --- a/cmd/meshnamed/main.go +++ b/cmd/meshnamed/main.go @@ -5,6 +5,7 @@ import ( "fmt" "net" "os" + "strings" "os/signal" "syscall" @@ -18,7 +19,7 @@ func main() { subdomain := flag.String("subdomain", "meshname.", "subdomain used to generate config") useconffile := flag.String("useconffile", "", "run daemon with a config file") listenAddr := flag.String("listenaddr", "[::1]:53535", "address to listen on") - meshSubnetStr := flag.String("meshsubnet", "::/0", "valid IPv6 address space") + networksconf := flag.String("networks", "ygg=200::/7,cjd=fc00::/8,meshname=::/0", "TLD=subnet list separated by comma") debug := flag.Bool("debug", false, "enable debug logging") flag.Parse() @@ -42,15 +43,21 @@ func main() { return } - s := new(meshname.MeshnameServer) + networks := make(map[string]*net.IPNet) + for _, item := range strings.Split(*networksconf, ",") { + tokens := strings.SplitN(item, "=", 2) + domain, subnet := tokens[0], tokens[1] - _, validSubnet, err := net.ParseCIDR(*meshSubnetStr) - if err != nil { - logger.Errorln(err) - os.Exit(1) + _, validSubnet, err := net.ParseCIDR(subnet) + if err != nil { + logger.Errorln(err) + os.Exit(1) + } + networks[domain] = validSubnet } - s.Init(logger, *listenAddr, *useconffile, validSubnet) + s := new(meshname.MeshnameServer) + s.Init(logger, *listenAddr, *useconffile, networks) s.Start() c := make(chan os.Signal, 1) diff --git a/meshnamed.service b/meshnamed.service index ea3c0c7..f1bf916 100644 --- a/meshnamed.service +++ b/meshnamed.service @@ -9,7 +9,7 @@ Group=nogroup ProtectHome=true ProtectSystem=true SyslogIdentifier=meshnamed -ExecStart=/usr/local/bin/meshnamed -listenaddr [::1]:53535 -meshsubnet 200::/7 -useconffile /etc/meshnamed.conf +ExecStart=/usr/local/bin/meshnamed -listenaddr [::1]:53535 -useconffile /etc/meshnamed.conf Restart=always TimeoutStopSec=5 diff --git a/src/meshname/server.go b/src/meshname/server.go index a3988f9..5366812 100644 --- a/src/meshname/server.go +++ b/src/meshname/server.go @@ -49,18 +49,18 @@ func GenConf(target, zone string) (string, error) { } type MeshnameServer struct { - validSubnet *net.IPNet log *log.Logger listenAddr, zoneConfigPath string zoneConfig map[string][]dns.RR dnsClient *dns.Client dnsServer *dns.Server + networks map[string]*net.IPNet } -func (s *MeshnameServer) Init(log *log.Logger, listenAddr string, zoneConfigPath string, validSubnet *net.IPNet) { +func (s *MeshnameServer) Init(log *log.Logger, listenAddr string, zoneConfigPath string, networks map[string]*net.IPNet) { s.log = log s.listenAddr = listenAddr - s.validSubnet = validSubnet + s.networks = networks s.zoneConfigPath = zoneConfigPath s.zoneConfig = make(map[string][]dns.RR) if s.dnsClient == nil { @@ -119,8 +119,9 @@ func (s *MeshnameServer) Stop() error { func (s *MeshnameServer) Start() error { s.dnsServer = &dns.Server{Addr: s.listenAddr, Net: "udp"} - for _, domain := range DomainZones { + for domain := range s.networks { dns.HandleFunc(domain, s.handleRequest) + s.log.Debugln("Handling:", domain) } go s.dnsServer.ListenAndServe() s.log.Infoln("Started meshnamed on:", s.listenAddr) @@ -153,11 +154,14 @@ func (s *MeshnameServer) handleRequest(w dns.ResponseWriter, r *dns.Msg) { s.log.Debugln(err) continue } - if !s.validSubnet.Contains(resolvedAddr) { + // check subnet validity + tld := labels[len(labels)-1] + + if subnet, ok := s.networks[tld]; ok && subnet.Contains(resolvedAddr) { + remoteLookups[resolvedAddr.String()] = append(remoteLookups[resolvedAddr.String()], q) + } else { s.log.Debugln("Error: subnet doesn't match") - continue } - remoteLookups[resolvedAddr.String()] = append(remoteLookups[resolvedAddr.String()], q) } }