accept custom meship domains

This commit is contained in:
root 2024-05-21 03:21:12 +00:00
parent 38781e39fe
commit 73c604e9c4
2 changed files with 38 additions and 19 deletions

View File

@ -30,6 +30,7 @@ func parseNetworks(networksconf string) (map[string]*net.IPNet, error) {
var ( var (
listenAddr, networksconf string listenAddr, networksconf string
meshipNetworksconf string
getName, getIP string getName, getIP string
debug, noMeshIP bool debug, noMeshIP bool
) )
@ -37,6 +38,7 @@ var (
func init() { func init() {
flag.StringVar(&listenAddr, "listenaddr", "[::1]:53535", "address to listen on") 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(&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.BoolVar(&noMeshIP, "nomeship", false, "disable .meship resolver")
flag.StringVar(&getName, "getname", "", "convert IPv6 address to a name") flag.StringVar(&getName, "getname", "", "convert IPv6 address to a name")
flag.StringVar(&getIP, "getip", "", "convert a name to IPv6 address") flag.StringVar(&getIP, "getip", "", "convert a name to IPv6 address")
@ -73,11 +75,12 @@ func main() {
} }
networks, err := parseNetworks(networksconf) networks, err := parseNetworks(networksconf)
meshipNetworks, err := parseNetworks(meshipNetworksconf)
if err != nil { if err != nil {
logger.Fatalln(err) logger.Fatalln(err)
} }
s := meshname.New(logger, listenAddr, networks, !noMeshIP) s := meshname.New(logger, listenAddr, networks, meshipNetworks, !noMeshIP)
if err := s.Start(); err != nil { if err := s.Start(); err != nil {
logger.Fatal(err) logger.Fatal(err)

View File

@ -15,6 +15,7 @@ type MeshnameServer struct {
dnsClient *dns.Client dnsClient *dns.Client
dnsServer *dns.Server dnsServer *dns.Server
networks map[string]*net.IPNet networks map[string]*net.IPNet
meshipNetworks map[string]*net.IPNet
enableMeshIP bool enableMeshIP bool
startedLock sync.RWMutex startedLock sync.RWMutex
@ -22,7 +23,7 @@ type MeshnameServer struct {
} }
// New is a constructor for MeshnameServer // 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 := new(dns.Client)
dnsClient.Timeout = 5000000000 // increased 5 seconds timeout dnsClient.Timeout = 5000000000 // increased 5 seconds timeout
@ -30,6 +31,7 @@ func New(log *log.Logger, listenAddr string, networks map[string]*net.IPNet, ena
log: log, log: log,
listenAddr: listenAddr, listenAddr: listenAddr,
networks: networks, networks: networks,
meshipNetworks: meshipNetworks,
dnsClient: dnsClient, dnsClient: dnsClient,
enableMeshIP: enableMeshIP, enableMeshIP: enableMeshIP,
} }
@ -63,8 +65,12 @@ func (s *MeshnameServer) Start() error {
s.log.Debugln("Handling:", tld, subnet) s.log.Debugln("Handling:", tld, subnet)
} }
if s.enableMeshIP { if s.enableMeshIP {
dns.HandleFunc("meship", s.handleMeshIPRequest) for mtld, subnet := range s.meshipNetworks {
s.log.Debugln("Handling: meship ::/0") //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() { go func() {
@ -87,14 +93,23 @@ func (s *MeshnameServer) handleMeshnameRequest(w dns.ResponseWriter, r *dns.Msg)
m := new(dns.Msg) m := new(dns.Msg)
m.SetReply(r) m.SetReply(r)
s.log.Debugln(r.String()) 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 { for _, q := range r.Question {
labels := dns.SplitDomainName(q.Name) labels := dns.SplitDomainName(q.Name)
s.log.Debugln(labels) // DEBUG
if len(labels) < 2 { if len(labels) < 2 {
s.log.Debugln("Error: invalid domain requested") s.log.Debugln("Error: invalid domain requested")
continue continue
} }
subDomain := labels[len(labels)-2] subDomain := labels[len(labels)-2]
s.log.Debugln(subDomain) // DEBUG
resolvedAddr, err := IPFromDomain(&subDomain) resolvedAddr, err := IPFromDomain(&subDomain)
if err != nil { 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) { func (s *MeshnameServer) handleMeshIPRequest(w dns.ResponseWriter, r *dns.Msg) {
m := new(dns.Msg) m := new(dns.Msg)
m.SetReply(r) m.SetReply(r)
s.log.Debugln(r.String())
for _, q := range r.Question { for _, q := range r.Question {
labels := dns.SplitDomainName(q.Name) labels := dns.SplitDomainName(q.Name)
// resolve only 2nd level domains and AAAA type // resolve only AAAA type
if len(labels) != 2 || q.Qtype != dns.TypeAAAA || q.Qclass != dns.ClassINET { if q.Qtype != dns.TypeAAAA || q.Qclass != dns.ClassINET {
s.log.Debugln("Error: invalid resource requested") s.log.Debugln("Error: invalid resource requested")
continue continue
} }