AAAA(aaaaaaaaaaanemaramipv6)

This commit is contained in:
LovroG05
2025-03-18 10:59:02 +01:00
parent e9c6582b5d
commit 8b9dfbb96c
4 changed files with 54 additions and 18 deletions

View File

@@ -16,7 +16,7 @@ For now, it successfully recursively resolves A records.
### Supported Query Types ### Supported Query Types
- [x] A (IPv4 address) - [x] A (IPv4 address)
- [ ] AAAA (IPv6 address) - [x] AAAA (IPv6 address)
- [x] CNAME (Canonical name) - [x] CNAME (Canonical name)
- [ ] NS (Nameserver) - [ ] NS (Nameserver)
- [ ] MX (Mail Exchange) - [ ] MX (Mail Exchange)

View File

@@ -95,8 +95,8 @@ func (s *Server) process(addr net.Addr, buf []byte) {
var records []entities.Record var records []entities.Record
if rcode == dnsmessage.RCodeSuccess { if rcode == dnsmessage.RCodeSuccess {
for _, q := range msg.Questions { for _, q := range msg.Questions {
if q.Type == dnsmessage.TypeA { if q.Type == dnsmessage.TypeA || q.Type == dnsmessage.TypeAAAA {
nips, err := resolver.ResolveDN(q.Name, msg.Header.ID, dnsmessage.TypeA, s.cache) nips, err := resolver.ResolveDN(q.Name, msg.Header.ID, q.Type, s.cache)
if err != nil { if err != nil {
log.Printf("Resolution error from %s for %s: %v", addr, q.Name, err) log.Printf("Resolution error from %s for %s: %v", addr, q.Name, err)
@@ -140,17 +140,34 @@ func (s *Server) buildReplyMessage(id uint16, opcode dnsmessage.OpCode, rd bool,
// Build DNS answer section // Build DNS answer section
for _, record := range records { for _, record := range records {
answers = append(answers, dnsmessage.Resource{ var a dnsmessage.Resource
Header: dnsmessage.ResourceHeader{ switch record.RType {
Name: record.Name, case dnsmessage.TypeA:
Type: record.RType, a = dnsmessage.Resource{
Class: record.Class, Header: dnsmessage.ResourceHeader{
TTL: record.TTL, Name: record.Name,
}, Type: record.RType,
Body: &dnsmessage.AResource{ Class: record.Class,
A: [4]byte{record.IP[0], record.IP[1], record.IP[2], record.IP[3]}, TTL: record.TTL,
}, },
}) Body: &dnsmessage.AResource{
A: [4]byte{record.IP[0], record.IP[1], record.IP[2], record.IP[3]},
},
}
case dnsmessage.TypeAAAA:
a = dnsmessage.Resource{
Header: dnsmessage.ResourceHeader{
Name: record.Name,
Type: record.RType,
Class: record.Class,
TTL: record.TTL,
},
Body: &dnsmessage.AAAAResource{
AAAA: [16]byte(record.IP),
},
}
}
answers = append(answers, a)
} }
} }

View File

@@ -10,7 +10,7 @@ import (
) )
func ResolveDN(domainName dnsmessage.Name, id uint16, rtype dnsmessage.Type, cache *recordcache.Cache) ([]entities.Record, error) { func ResolveDN(domainName dnsmessage.Name, id uint16, rtype dnsmessage.Type, cache *recordcache.Cache) ([]entities.Record, error) {
if recs, found := cache.Get(domainName, dnsmessage.TypeA); found { if recs, found := cache.Get(domainName, rtype); found {
return recs, nil return recs, nil
} }
@@ -67,6 +67,16 @@ func resolveFromRoot(domainName dnsmessage.Name, id uint16, rtype dnsmessage.Typ
Name: answer.Header.Name, Name: answer.Header.Name,
} }
records = append(records, r) records = append(records, r)
} else if answer.Header.Type == dnsmessage.TypeAAAA && response.Header.Authoritative {
NSs = append(NSs, answer.Header.Name.String())
r := entities.Record{
IP: answer.Body.(*dnsmessage.AAAAResource).AAAA[:],
RType: answer.Header.Type,
TTL: answer.Header.TTL,
Class: answer.Header.Class,
Name: answer.Header.Name,
}
records = append(records, r)
} else if answer.Header.Type == dnsmessage.TypeNS { } else if answer.Header.Type == dnsmessage.TypeNS {
NSs = append(NSs, answer.Header.Name.String()) NSs = append(NSs, answer.Header.Name.String())
} else if answer.Header.Type == dnsmessage.TypeCNAME { } else if answer.Header.Type == dnsmessage.TypeCNAME {
@@ -113,7 +123,7 @@ func resolveFromRoot(domainName dnsmessage.Name, id uint16, rtype dnsmessage.Typ
NSIPmap[nameserver] = nsip NSIPmap[nameserver] = nsip
} }
ip, err := resolveFromRefferal(domainName, id, dnsmessage.TypeA, nsip.String(), cache) // resolve refferal using nameserver ip, err := resolveFromRefferal(domainName, id, rtype, nsip.String(), cache) // resolve refferal using nameserver
if err != nil { if err != nil {
log.Printf("DNS server %s not resolving domain %s: %s", nameserver, domainName, err) log.Printf("DNS server %s not resolving domain %s: %s", nameserver, domainName, err)
continue continue
@@ -159,6 +169,15 @@ func resolveFromRefferal(domainName dnsmessage.Name, id uint16, rtype dnsmessage
Name: answer.Header.Name, Name: answer.Header.Name,
} }
records = append(records, r) records = append(records, r)
} else if answer.Header.Type == dnsmessage.TypeAAAA && response.Header.Authoritative {
r := entities.Record{
IP: answer.Body.(*dnsmessage.AAAAResource).AAAA[:],
RType: answer.Header.Type,
TTL: answer.Header.TTL,
Class: answer.Header.Class,
Name: answer.Header.Name,
}
records = append(records, r)
} else if answer.Header.Type == dnsmessage.TypeNS { } else if answer.Header.Type == dnsmessage.TypeNS {
NSIPmap[answer.Body.(*dnsmessage.NSResource).NS.String()] = nil NSIPmap[answer.Body.(*dnsmessage.NSResource).NS.String()] = nil
} else if answer.Header.Type == dnsmessage.TypeCNAME { } else if answer.Header.Type == dnsmessage.TypeCNAME {
@@ -201,7 +220,7 @@ func resolveFromRefferal(domainName dnsmessage.Name, id uint16, rtype dnsmessage
NSIPmap[nameserver] = nsip NSIPmap[nameserver] = nsip
} }
ip, err := resolveFromRefferal(domainName, id, dnsmessage.TypeA, nsip.String(), cache) // resolve refferal using nameserver ip, err := resolveFromRefferal(domainName, id, rtype, nsip.String(), cache) // resolve refferal using nameserver
if err != nil { if err != nil {
log.Printf("DNS server %s not resolving domain %s: %s", nameserver, domainName, err) log.Printf("DNS server %s not resolving domain %s: %s", nameserver, domainName, err)
continue continue

View File

@@ -143,7 +143,7 @@ func Test_ARecord(t *testing.T) {
// Test AAAA Record (IPv6) // Test AAAA Record (IPv6)
func Test_AAAARecord(t *testing.T) { func Test_AAAARecord(t *testing.T) {
response := sendDNSQuery(t, "127.0.0.1:53", "govekar.net.", dnsmessage.TypeAAAA, true) response := sendDNSQuery(t, "127.0.0.1:53", "google.com.", dnsmessage.TypeAAAA, true)
if response.Header.RCode != dnsmessage.RCodeSuccess { if response.Header.RCode != dnsmessage.RCodeSuccess {
t.Errorf("Expected RCODE 0 (NoError), got %d", response.Header.RCode) t.Errorf("Expected RCODE 0 (NoError), got %d", response.Header.RCode)