returns all found records
This commit is contained in:
23
README.md
23
README.md
@@ -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
32
main.go
@@ -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{
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user