returns all found records

This commit is contained in:
LovroG05
2025-03-11 17:41:33 +01:00
parent 3b6b54f300
commit 310f5766e3
3 changed files with 33 additions and 26 deletions

View File

@@ -2,7 +2,9 @@
This is my simple, barebones, **insecure** implementation of a simple DNS server meant for local use. The goal is to support RFC 1035, local records, ad blocking.
For now it successfully recursively resolves A records, for up to 1 record.
For now it successfully recursively resolves A records.
NOTE: TTLs are hardcoded for now
## Testing
@@ -11,25 +13,28 @@ For now it successfully recursively resolves A records, for up to 1 record.
Example:
```shell
lovro@LHPw:~$ dig @193.2.231.85 govekar.net
lovro@LHPw:~$ dig @193.2.231.164 govekar.net
; <<>> DiG 9.18.30-0ubuntu0.24.04.2-Ubuntu <<>> @193.2.231.85 govekar.net
; <<>> DiG 9.18.30-0ubuntu0.24.04.2-Ubuntu <<>> @193.2.231.164 govekar.net
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 42029
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 6752
;; flags: qr rd ra; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
;govekar.net. IN A
;; ANSWER SECTION:
govekar.net. 300 IN A 185.199.109.153
govekar.net. 300 IN A 185.199.111.153
govekar.net. 300 IN A 185.199.110.153
govekar.net. 300 IN A 185.199.108.153
;; Query time: 347 msec
;; SERVER: 193.2.231.85#53(193.2.231.85) (UDP)
;; WHEN: Tue Mar 11 16:21:04 CET 2025
;; MSG SIZE rcvd: 45
;; Query time: 167 msec
;; SERVER: 193.2.231.164#53(193.2.231.164) (UDP)
;; WHEN: Tue Mar 11 17:40:16 CET 2025
;; MSG SIZE rcvd: 93
lovro@LHPw:~$
```

32
main.go
View File

@@ -31,7 +31,7 @@ func process(udp net.PacketConn, addr net.Addr, buf []byte) {
log.Println(err)
}
faq := map[dnsmessage.Question]net.IP{}
faq := map[dnsmessage.Question][]net.IP{}
for _, q := range msg.Questions {
if q.Type == dnsmessage.TypeA {
nips, err := resolver.ResolveDN(q.Name.String(), msg.Header.ID, dnsmessage.TypeA)
@@ -44,31 +44,33 @@ func process(udp net.PacketConn, addr net.Addr, buf []byte) {
continue
}
faq[q] = nips[0]
faq[q] = nips
}
}
answers := []dnsmessage.Resource{}
for _, q := range msg.Questions {
ip, found := faq[q]
ips, found := faq[q]
if !found {
log.Printf("No answer for %s, skipping...", q.Name.String())
continue
}
fmt.Println(ip)
for _, ip := range ips {
fmt.Println(ip)
answers = append(answers, dnsmessage.Resource{
Header: dnsmessage.ResourceHeader{
Name: q.Name,
Type: dnsmessage.TypeA,
Class: dnsmessage.ClassINET,
TTL: 300, //TODO
},
Body: &dnsmessage.AResource{
A: [4]byte{ip[0], ip[1], ip[2], ip[3]},
},
})
answers = append(answers, dnsmessage.Resource{
Header: dnsmessage.ResourceHeader{
Name: q.Name,
Type: dnsmessage.TypeA,
Class: dnsmessage.ClassINET,
TTL: 300, //TODO
},
Body: &dnsmessage.AResource{
A: [4]byte{ip[0], ip[1], ip[2], ip[3]},
},
})
}
}
response := dnsmessage.Message{

View File

@@ -98,7 +98,7 @@ func resolveFromRoot(domainName string, id uint16, rtype dnsmessage.Type, ROOT_S
continue
}
IPs = append(IPs, ip[0])
IPs = append(IPs, ip...)
break
}
}
@@ -174,7 +174,7 @@ func resolveFromRefferal(domainName string, id uint16, rtype dnsmessage.Type, se
continue
}
IPs = append(IPs, ip[0])
IPs = append(IPs, ip...)
break
}