Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5d74ff1142 | ||
|
|
37db83e5b7 | ||
|
|
41a1cff0ae | ||
|
|
4f5fad0d32 | ||
|
|
5651772837 |
@@ -325,6 +325,13 @@ logformat = "text"
|
|||||||
|
|
||||||
## Changelog
|
## Changelog
|
||||||
|
|
||||||
|
- v0.7.2
|
||||||
|
- Changed
|
||||||
|
- Fixed: Regression error of not being able to answer to incoming random-case requests.
|
||||||
|
- Fixed: SOA record added to a correct header field in NXDOMAIN responses.
|
||||||
|
- v0.7.1
|
||||||
|
- Changed
|
||||||
|
- Fixed: SOA record correctly added to the TCP DNS server when using both, UDP and TCP servers.
|
||||||
- v0.7
|
- v0.7
|
||||||
- New
|
- New
|
||||||
- Added an endpoint to perform health checks
|
- Added an endpoint to perform health checks
|
||||||
|
|||||||
@@ -104,7 +104,7 @@ func (d *DNSServer) readQuery(m *dns.Msg) {
|
|||||||
m.MsgHdr.Authoritative = authoritative
|
m.MsgHdr.Authoritative = authoritative
|
||||||
if authoritative {
|
if authoritative {
|
||||||
if m.MsgHdr.Rcode == dns.RcodeNameError {
|
if m.MsgHdr.Rcode == dns.RcodeNameError {
|
||||||
m.Answer = append(m.Answer, d.SOA)
|
m.Ns = append(m.Ns, d.SOA)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -113,7 +113,7 @@ func (d *DNSServer) readQuery(m *dns.Msg) {
|
|||||||
func (d *DNSServer) getRecord(q dns.Question) ([]dns.RR, error) {
|
func (d *DNSServer) getRecord(q dns.Question) ([]dns.RR, error) {
|
||||||
var rr []dns.RR
|
var rr []dns.RR
|
||||||
var cnames []dns.RR
|
var cnames []dns.RR
|
||||||
domain, ok := d.Domains[q.Name]
|
domain, ok := d.Domains[strings.ToLower(q.Name)]
|
||||||
if !ok {
|
if !ok {
|
||||||
return rr, fmt.Errorf("No records for domain %s", q.Name)
|
return rr, fmt.Errorf("No records for domain %s", q.Name)
|
||||||
}
|
}
|
||||||
@@ -133,7 +133,7 @@ func (d *DNSServer) getRecord(q dns.Question) ([]dns.RR, error) {
|
|||||||
|
|
||||||
// answeringForDomain checks if we have any records for a domain
|
// answeringForDomain checks if we have any records for a domain
|
||||||
func (d *DNSServer) answeringForDomain(name string) bool {
|
func (d *DNSServer) answeringForDomain(name string) bool {
|
||||||
_, ok := d.Domains[name]
|
_, ok := d.Domains[strings.ToLower(name)]
|
||||||
return ok
|
return ok
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -141,7 +141,7 @@ func (d *DNSServer) isAuthoritative(q dns.Question) bool {
|
|||||||
if d.answeringForDomain(q.Name) {
|
if d.answeringForDomain(q.Name) {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
domainParts := strings.Split(q.Name, ".")
|
domainParts := strings.Split(strings.ToLower(q.Name), ".")
|
||||||
for i := range domainParts {
|
for i := range domainParts {
|
||||||
if d.answeringForDomain(strings.Join(domainParts[i:], ".")) {
|
if d.answeringForDomain(strings.Join(domainParts[i:], ".")) {
|
||||||
return true
|
return true
|
||||||
|
|||||||
+28
-4
@@ -140,11 +140,11 @@ func TestAuthoritative(t *testing.T) {
|
|||||||
if answer.Rcode != dns.RcodeNameError {
|
if answer.Rcode != dns.RcodeNameError {
|
||||||
t.Errorf("Was expecing NXDOMAIN rcode, but got [%s] instead.", dns.RcodeToString[answer.Rcode])
|
t.Errorf("Was expecing NXDOMAIN rcode, but got [%s] instead.", dns.RcodeToString[answer.Rcode])
|
||||||
}
|
}
|
||||||
if len(answer.Answer) != 1 {
|
if len(answer.Ns) != 1 {
|
||||||
t.Errorf("Was expecting exactly one answer (SOA) for invalid subdomain, but got %d", len(answer.Answer))
|
t.Errorf("Was expecting exactly one answer (SOA) for invalid subdomain, but got %d", len(answer.Ns))
|
||||||
}
|
}
|
||||||
if answer.Answer[0].Header().Rrtype != dns.TypeSOA {
|
if answer.Ns[0].Header().Rrtype != dns.TypeSOA {
|
||||||
t.Errorf("Was expecting SOA record as answer for NXDOMAIN but got [%s]", dns.TypeToString[answer.Answer[0].Header().Rrtype])
|
t.Errorf("Was expecting SOA record as answer for NXDOMAIN but got [%s]", dns.TypeToString[answer.Ns[0].Header().Rrtype])
|
||||||
}
|
}
|
||||||
if !answer.MsgHdr.Authoritative {
|
if !answer.MsgHdr.Authoritative {
|
||||||
t.Errorf("Was expecting authoritative bit to be set")
|
t.Errorf("Was expecting authoritative bit to be set")
|
||||||
@@ -218,3 +218,27 @@ func TestResolveTXT(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestCaseInsensitiveResolveA(t *testing.T) {
|
||||||
|
resolv := resolver{server: "127.0.0.1:15353"}
|
||||||
|
answer, err := resolv.lookup("aUtH.eXAmpLe.org", dns.TypeA)
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("%v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(answer.Answer) == 0 {
|
||||||
|
t.Error("No answer for DNS query")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestCaseInsensitiveResolveSOA(t *testing.T) {
|
||||||
|
resolv := resolver{server: "127.0.0.1:15353"}
|
||||||
|
answer, _ := resolv.lookup("doesnotexist.aUtH.eXAmpLe.org", dns.TypeSOA)
|
||||||
|
if answer.Rcode != dns.RcodeNameError {
|
||||||
|
t.Errorf("Was expecing NXDOMAIN rcode, but got [%s] instead.", dns.RcodeToString[answer.Rcode])
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(answer.Ns) == 0 {
|
||||||
|
t.Error("No SOA answer for DNS query")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -73,6 +73,7 @@ func main() {
|
|||||||
dnsServerTCP := NewDNSServer(DB, Config.General.Listen, tcpProto)
|
dnsServerTCP := NewDNSServer(DB, Config.General.Listen, tcpProto)
|
||||||
// No need to parse records from config again
|
// No need to parse records from config again
|
||||||
dnsServerTCP.Domains = dnsServerUDP.Domains
|
dnsServerTCP.Domains = dnsServerUDP.Domains
|
||||||
|
dnsServerTCP.SOA = dnsServerUDP.SOA
|
||||||
go dnsServerUDP.Start(errChan)
|
go dnsServerUDP.Start(errChan)
|
||||||
go dnsServerTCP.Start(errChan)
|
go dnsServerTCP.Start(errChan)
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
Reference in New Issue
Block a user