use correct name in dns header, fixes blacklisting
pass http bind address to handler so we can forward blocked domains to our http server. Should change this to use a custom CLI flag so users can have more control over this.master
parent
e40b3a7dba
commit
cd553b4fad
|
|
@ -86,7 +86,7 @@ func TestFetchBlockList(t *testing.T) {
|
|||
}
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
got, err := FetchBlockList(tt.source)
|
||||
got, err := CreateBlockList(tt.source)
|
||||
if (err != nil) != tt.wantErr {
|
||||
t.Errorf("FetchBlockList() error = %v, wantErr %v", err, tt.wantErr)
|
||||
return
|
||||
|
|
|
|||
33
dns.go
33
dns.go
|
|
@ -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: domain,
|
||||
Name: rawDomain,
|
||||
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) {
|
||||
|
|
|
|||
6
main.go
6
main.go
|
|
@ -13,8 +13,8 @@ import (
|
|||
|
||||
var (
|
||||
configFilePath = flag.String("config", "./config.json", "config file path")
|
||||
httpAddress = flag.String("bind-http", "127.0.0.1", "interface to bind the HTTP server to")
|
||||
dnsAddress = flag.String("bind-dns", "127.0.0.1", "interface to bind the DNS server to")
|
||||
httpAddress = flag.String("bind-http", "127.0.0.1", "interface to bind the HTTP server to (0.0.0.0 for all)")
|
||||
dnsAddress = flag.String("bind-dns", "127.0.0.1", "interface to bind the DNS server to (0.0.0.0 for all)")
|
||||
)
|
||||
|
||||
func main() {
|
||||
|
|
@ -47,7 +47,7 @@ func main() {
|
|||
ips = append(ips, net.ParseIP(strIP))
|
||||
}
|
||||
|
||||
handler, err := NewDNSHandler(&memoryDNSCacher{TTL: time.Minute}, domainBlacklist, DNSResolver(ips), *cfg)
|
||||
handler, err := NewDNSHandler(*httpAddress, &memoryDNSCacher{TTL: time.Minute}, domainBlacklist, DNSResolver(ips), *cfg)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue