TLD=subnet configuration

This commit is contained in:
George 2020-03-12 10:32:35 -04:00
parent f1cd8b9812
commit 0fe85623e2
3 changed files with 26 additions and 15 deletions

View File

@ -5,6 +5,7 @@ import (
"fmt" "fmt"
"net" "net"
"os" "os"
"strings"
"os/signal" "os/signal"
"syscall" "syscall"
@ -18,7 +19,7 @@ func main() {
subdomain := flag.String("subdomain", "meshname.", "subdomain used to generate config") subdomain := flag.String("subdomain", "meshname.", "subdomain used to generate config")
useconffile := flag.String("useconffile", "", "run daemon with a config file") useconffile := flag.String("useconffile", "", "run daemon with a config file")
listenAddr := flag.String("listenaddr", "[::1]:53535", "address to listen on") 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") debug := flag.Bool("debug", false, "enable debug logging")
flag.Parse() flag.Parse()
@ -42,15 +43,21 @@ func main() {
return 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) _, validSubnet, err := net.ParseCIDR(subnet)
if err != nil { if err != nil {
logger.Errorln(err) logger.Errorln(err)
os.Exit(1) os.Exit(1)
}
networks[domain] = validSubnet
} }
s.Init(logger, *listenAddr, *useconffile, validSubnet) s := new(meshname.MeshnameServer)
s.Init(logger, *listenAddr, *useconffile, networks)
s.Start() s.Start()
c := make(chan os.Signal, 1) c := make(chan os.Signal, 1)

View File

@ -9,7 +9,7 @@ Group=nogroup
ProtectHome=true ProtectHome=true
ProtectSystem=true ProtectSystem=true
SyslogIdentifier=meshnamed 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 Restart=always
TimeoutStopSec=5 TimeoutStopSec=5

View File

@ -49,18 +49,18 @@ func GenConf(target, zone string) (string, error) {
} }
type MeshnameServer struct { type MeshnameServer struct {
validSubnet *net.IPNet
log *log.Logger log *log.Logger
listenAddr, zoneConfigPath string listenAddr, zoneConfigPath string
zoneConfig map[string][]dns.RR zoneConfig map[string][]dns.RR
dnsClient *dns.Client dnsClient *dns.Client
dnsServer *dns.Server 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.log = log
s.listenAddr = listenAddr s.listenAddr = listenAddr
s.validSubnet = validSubnet s.networks = networks
s.zoneConfigPath = zoneConfigPath s.zoneConfigPath = zoneConfigPath
s.zoneConfig = make(map[string][]dns.RR) s.zoneConfig = make(map[string][]dns.RR)
if s.dnsClient == nil { if s.dnsClient == nil {
@ -119,8 +119,9 @@ func (s *MeshnameServer) Stop() error {
func (s *MeshnameServer) Start() error { func (s *MeshnameServer) Start() error {
s.dnsServer = &dns.Server{Addr: s.listenAddr, Net: "udp"} s.dnsServer = &dns.Server{Addr: s.listenAddr, Net: "udp"}
for _, domain := range DomainZones { for domain := range s.networks {
dns.HandleFunc(domain, s.handleRequest) dns.HandleFunc(domain, s.handleRequest)
s.log.Debugln("Handling:", domain)
} }
go s.dnsServer.ListenAndServe() go s.dnsServer.ListenAndServe()
s.log.Infoln("Started meshnamed on:", s.listenAddr) 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) s.log.Debugln(err)
continue 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") s.log.Debugln("Error: subnet doesn't match")
continue
} }
remoteLookups[resolvedAddr.String()] = append(remoteLookups[resolvedAddr.String()], q)
} }
} }