AAAA(aaaaaaaaaaanemaramipv6)
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user