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 (
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)

View File

@ -15,6 +15,7 @@ type MeshnameServer struct {
dnsClient *dns.Client
dnsServer *dns.Server
networks map[string]*net.IPNet
meshipNetworks map[string]*net.IPNet
enableMeshIP bool
startedLock sync.RWMutex
@ -22,7 +23,7 @@ type MeshnameServer struct {
}
// 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
@ -30,6 +31,7 @@ func New(log *log.Logger, listenAddr string, networks map[string]*net.IPNet, ena
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
}