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
- [x] A (IPv4 address)
- [ ] AAAA (IPv6 address)
- [x] AAAA (IPv6 address)
- [x] CNAME (Canonical name)
- [ ] NS (Nameserver)
- [ ] MX (Mail Exchange)

View File

@@ -95,8 +95,8 @@ func (s *Server) process(addr net.Addr, buf []byte) {
var records []entities.Record
if rcode == dnsmessage.RCodeSuccess {
for _, q := range msg.Questions {
if q.Type == dnsmessage.TypeA {
nips, err := resolver.ResolveDN(q.Name, msg.Header.ID, dnsmessage.TypeA, s.cache)
if q.Type == dnsmessage.TypeA || q.Type == dnsmessage.TypeAAAA {
nips, err := resolver.ResolveDN(q.Name, msg.Header.ID, q.Type, s.cache)
if err != nil {
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
for _, record := range records {
answers = append(answers, dnsmessage.Resource{
Header: dnsmessage.ResourceHeader{
Name: record.Name,
Type: record.RType,
Class: record.Class,
TTL: record.TTL,
},
Body: &dnsmessage.AResource{
A: [4]byte{record.IP[0], record.IP[1], record.IP[2], record.IP[3]},
},
})
var a dnsmessage.Resource
switch record.RType {
case dnsmessage.TypeA:
a = dnsmessage.Resource{
Header: dnsmessage.ResourceHeader{
Name: record.Name,
Type: record.RType,
Class: record.Class,
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) {
if recs, found := cache.Get(domainName, dnsmessage.TypeA); found {
if recs, found := cache.Get(domainName, rtype); found {
return recs, nil
}
@@ -67,6 +67,16 @@ func resolveFromRoot(domainName dnsmessage.Name, id uint16, rtype dnsmessage.Typ
Name: answer.Header.Name,
}
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 {
NSs = append(NSs, answer.Header.Name.String())
} else if answer.Header.Type == dnsmessage.TypeCNAME {
@@ -113,7 +123,7 @@ func resolveFromRoot(domainName dnsmessage.Name, id uint16, rtype dnsmessage.Typ
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 {
log.Printf("DNS server %s not resolving domain %s: %s", nameserver, domainName, err)
continue
@@ -159,6 +169,15 @@ func resolveFromRefferal(domainName dnsmessage.Name, id uint16, rtype dnsmessage
Name: answer.Header.Name,
}
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 {
NSIPmap[answer.Body.(*dnsmessage.NSResource).NS.String()] = nil
} else if answer.Header.Type == dnsmessage.TypeCNAME {
@@ -201,7 +220,7 @@ func resolveFromRefferal(domainName dnsmessage.Name, id uint16, rtype dnsmessage
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 {
log.Printf("DNS server %s not resolving domain %s: %s", nameserver, domainName, err)
continue

View File

@@ -143,7 +143,7 @@ func Test_ARecord(t *testing.T) {
// Test AAAA Record (IPv6)
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 {
t.Errorf("Expected RCODE 0 (NoError), got %d", response.Header.RCode)