From ab5d8dec9ecc76b13541bee947f172417015b64e Mon Sep 17 00:00:00 2001 From: mykola2312 <49044616+mykola2312@users.noreply.github.com> Date: Tue, 28 Jan 2025 04:27:19 +0200 Subject: [PATCH] simple DNS response works --- main.go | 10 ++++++++++ node/lux_dns.go | 43 +++++++++++++++++++++++++++++++++++++++---- node/lux_node.go | 15 +++++++++++++++ 3 files changed, 64 insertions(+), 4 deletions(-) diff --git a/main.go b/main.go index 71c3da7..91c7827 100644 --- a/main.go +++ b/main.go @@ -54,6 +54,8 @@ type NodeConfig struct { RPCEndpoints []string `xml:"rpc"` + DNS []string `xml:"dns"` + Log LogConfig `xml:"log"` } @@ -276,6 +278,14 @@ func nodeMain() { } } + // add dns server frontends + for _, dnsListen := range config.DNS { + if err := node.AddDnsFrontend(dnsListen); err != nil { + log.Criticalf("failed to spawn dns %s: %v\n", dnsListen, err) + os.Exit(1) + } + } + // start node node.Start() diff --git a/node/lux_dns.go b/node/lux_dns.go index bcc286d..bee65aa 100644 --- a/node/lux_dns.go +++ b/node/lux_dns.go @@ -1,21 +1,56 @@ package node -import "net" +import ( + "encoding/binary" + "net" +) type LuxDnsServer struct { node *LuxNode stopChan chan bool } -func NewLuxDnsServer(node *LuxNode) LuxDnsServer { - return LuxDnsServer{ +func NewLuxDnsServer(node *LuxNode) *LuxDnsServer { + return &LuxDnsServer{ node: node, stopChan: make(chan bool), } } +var NO = binary.BigEndian + func (sv *LuxDnsServer) HandleRequest(req []byte) []byte { - return nil + id := NO.Uint16(req[0:2]) + flags := NO.Uint16(req[2:4]) + qdcount := NO.Uint16(req[4:6]) + ancount := NO.Uint16(req[6:8]) + nscount := NO.Uint16(req[8:10]) + arcount := NO.Uint16(req[10:12]) + data := req[12:] + + qr := flags >> 15 + opcode := (flags >> 11) & 0b1111 + var rcode uint16 + + if qr != 0 || opcode != 0 { + // throw not supported + goto reply + } + + qr = 1 + rcode = 4 +reply: + flags |= (qr << 15) | rcode + + hdr := make([]byte, 12) + NO.PutUint16(hdr[0:2], id) + NO.PutUint16(hdr[2:4], flags) + NO.PutUint16(hdr[4:6], qdcount) + NO.PutUint16(hdr[6:8], ancount) + NO.PutUint16(hdr[8:10], nscount) + NO.PutUint16(hdr[10:12], arcount) + + return append(hdr, data...) } func (sv *LuxDnsServer) CreateFrontend(udpListen string) error { diff --git a/node/lux_node.go b/node/lux_node.go index 8a60c0a..2361d65 100644 --- a/node/lux_node.go +++ b/node/lux_node.go @@ -24,6 +24,8 @@ type LuxNode struct { stateLock sync.RWMutex genlist net.LuxNonceList + + dns *LuxDnsServer } func NewLuxNode(nodeKey crypto.LuxKey, ks crypto.LuxKeyStore) LuxNode { @@ -34,6 +36,7 @@ func NewLuxNode(nodeKey crypto.LuxKey, ks crypto.LuxKeyStore) LuxNode { neighbors: make(map[proto.LuxID]*ipnet.UDPAddr), state: NewLuxNodeState(), genlist: net.NewLuxNonceList(), + dns: nil, } } @@ -81,6 +84,14 @@ func (node *LuxNode) AddNeighbor(id proto.LuxID, udpAddr string) error { return nil } +func (node *LuxNode) AddDnsFrontend(udpListen string) error { + if node.dns == nil { + node.dns = NewLuxDnsServer(node) + } + + return node.dns.CreateFrontend(udpListen) +} + func (node *LuxNode) GetState() *LuxNodeState { return &node.state } @@ -228,6 +239,10 @@ func (node *LuxNode) Start() { } func (node *LuxNode) Stop() { + if node.dns != nil { + node.dns.Stop() + } + node.running = false node.router.Stop() }