@ -13,22 +13,24 @@ import (
)
type dnsHandler struct {
Config Configuration
logger * log . Logger
Resolver DNSResolver
Blocklist BlocklistManager
Cache DNSCacher
Config Configuration
httpBindIP net . IP
logger * log . Logger
Resolver DNSResolver
Blocklist BlocklistManager
Cache DNSCacher
}
//NewDNSHandler creates a new DNS server handler
func NewDNSHandler ( cache DNSCacher , blocklist BlocklistManager , r DNSResolver , cfg Configuration ) ( dns . Handler , error ) {
func NewDNSHandler ( httpBindIP string , cache DNSCacher , blocklist BlocklistManager , r DNSResolver , cfg Configuration ) ( dns . Handler , error ) {
l := log . New ( os . Stdout , "[DNS Server] " , log . LUTC | log . Lmicroseconds | log . Lshortfile )
return & dnsHandler {
logger : l ,
Resolver : r ,
Config : cfg ,
Blocklist : blocklist ,
Cache : cache ,
logger : l ,
httpBindIP : net . ParseIP ( httpBindIP ) ,
Resolver : r ,
Config : cfg ,
Blocklist : blocklist ,
Cache : cache ,
} , nil
}
@ -36,13 +38,14 @@ func (h *dnsHandler) ServeDNS(w dns.ResponseWriter, r *dns.Msg) {
var msg dns . Msg
msg . Authoritative = true
msg . RecursionAvailable = true
msg . Answer = [ ] dns . RR { }
msg . SetReply ( r )
for _ , question := range r . Question {
rawDomain := question . Name
domain := rawDomain [ : len ( rawDomain ) - 1 ]
header := dns . RR_Header {
Name : d omain,
Name : rawD omain,
Rrtype : question . Qtype ,
Class : dns . ClassINET ,
Ttl : 60 ,
@ -65,7 +68,7 @@ func (h *dnsHandler) ServeDNS(w dns.ResponseWriter, r *dns.Msg) {
}
} else if list , block := h . Blocklist . IsBlacklisted ( domain ) ; block {
h . logger . Printf ( "blocked dns query for '%s' from list '%s'" , domain , list )
msg . Answer = append ( msg . Answer , & dns . A { Hdr : header , A : net. ParseIP ( "127.0.0.1" ) } )
msg . Answer = append ( msg . Answer , & dns . A { Hdr : header , A : h. httpBindIP } )
} else if cacheAnswers , ok := h . Cache . Get ( domain ) ; ok && len ( cacheAnswers ) > 0 {
msg . Answer = append ( msg . Answer , cacheAnswers ... )
} else {
@ -81,7 +84,9 @@ func (h *dnsHandler) ServeDNS(w dns.ResponseWriter, r *dns.Msg) {
}
}
w . WriteMsg ( & msg )
if err := w . WriteMsg ( & msg ) ; err != nil {
h . logger . Printf ( "could not write msg: %v" , err )
}
}
func shouldBlock ( bls [ ] Blocklist , domain string ) ( string , bool ) {