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