optimization: only handle A and AAAA records and .lan and .internal only
This commit is contained in:
parent
9d0eb1c5a3
commit
e4bf55d8bc
1 changed files with 30 additions and 26 deletions
56
main.go
56
main.go
|
|
@ -39,8 +39,6 @@ type PageData struct {
|
||||||
Upstreams []Upstream
|
Upstreams []Upstream
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
func initDB(dbPath string) *sql.DB {
|
func initDB(dbPath string) *sql.DB {
|
||||||
db, err := sql.Open("sqlite3", dbPath)
|
db, err := sql.Open("sqlite3", dbPath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
@ -72,33 +70,39 @@ func (resolver *DNSResolver) handleDNSRequest(w dns.ResponseWriter, r *dns.Msg)
|
||||||
switch r.Opcode {
|
switch r.Opcode {
|
||||||
case dns.OpcodeQuery:
|
case dns.OpcodeQuery:
|
||||||
for _, q := range m.Question {
|
for _, q := range m.Question {
|
||||||
var qTypeString string
|
isLanOrInternal := strings.HasSuffix(q.Name, ".lan.") || strings.HasSuffix(q.Name, ".internal.")
|
||||||
switch q.Qtype {
|
isARecord := q.Qtype == dns.TypeA
|
||||||
case dns.TypeA:
|
isAaaaRecord := q.Qtype == dns.TypeAAAA
|
||||||
qTypeString = "A"
|
|
||||||
case dns.TypeAAAA:
|
if (isARecord || isAaaaRecord) && isLanOrInternal {
|
||||||
qTypeString = "AAAA"
|
var qTypeString string
|
||||||
|
if isARecord {
|
||||||
|
qTypeString = "A"
|
||||||
|
} else {
|
||||||
|
qTypeString = "AAAA"
|
||||||
|
}
|
||||||
|
|
||||||
|
ip, err := resolver.getRecordFromDB(q.Name, qTypeString)
|
||||||
|
if err == nil && ip != "" {
|
||||||
|
log.Printf("[LOCAL] Resolved %s -> %s", q.Name, ip)
|
||||||
|
rr, err := dns.NewRR(fmt.Sprintf("%s %d %s %s", q.Name, resolver.defaultTTL, qTypeString, ip))
|
||||||
|
if err == nil {
|
||||||
|
m.Answer = append(m.Answer, rr)
|
||||||
|
}
|
||||||
|
continue
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ip, err := resolver.getRecordFromDB(q.Name, qTypeString)
|
// Fallback to upstream for all other cases
|
||||||
if err == nil && ip != "" {
|
resp, err := resolver.resolveUpstream(r)
|
||||||
log.Printf("[LOCAL] Resolved %s -> %s", q.Name, ip)
|
if err == nil && resp != nil {
|
||||||
rr, err := dns.NewRR(fmt.Sprintf("%s %d %s %s", q.Name, resolver.defaultTTL, qTypeString, ip))
|
log.Printf("[UPSTREAM] Forwarded %s", q.Name)
|
||||||
if err == nil {
|
m.Answer = resp.Answer
|
||||||
m.Answer = append(m.Answer, rr)
|
m.Ns = resp.Ns
|
||||||
}
|
m.Extra = resp.Extra
|
||||||
} else {
|
} else {
|
||||||
resp, err := resolver.resolveUpstream(r)
|
log.Printf("[ERROR] Could not resolve %s", q.Name)
|
||||||
if err == nil && resp != nil {
|
m.Rcode = dns.RcodeServerFailure
|
||||||
log.Printf("[UPSTREAM] Forwarded %s", q.Name)
|
|
||||||
m.Answer = resp.Answer
|
|
||||||
m.Ns = resp.Ns
|
|
||||||
m.Extra = resp.Extra
|
|
||||||
m.Rcode = resp.Rcode
|
|
||||||
} else {
|
|
||||||
log.Printf("[ERROR] Could not resolve %s", q.Name)
|
|
||||||
m.Rcode = dns.RcodeServerFailure
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue