Files
nutdns/main.go

62 lines
1.1 KiB
Go

package main
import (
"log"
"strings"
"github.com/miekg/dns"
)
const upstream = "1.1.1.1:53"
var blocklist = []string{
"x.com.",
"twitter.com.",
"example.com.",
}
func isBlocked(domain string) bool {
domain = strings.ToLower(domain)
for _, blocked := range blocklist {
// Check exact match or subdomain
if domain == blocked || strings.HasSuffix(domain, "."+blocked) {
return true
}
}
return false
}
func handleDNS(w dns.ResponseWriter, r *dns.Msg) {
m := new(dns.Msg)
m.SetReply(r)
c := new(dns.Client)
for _, q := range r.Question {
log.Printf("question: %s", q.Name)
if isBlocked(q.Name) {
res, err := dns.NewRR(q.Name + " 60 IN A 0.0.0.0")
if err != nil {
log.Fatal(err)
}
m.Answer = append(m.Answer, res)
} else {
req := new(dns.Msg)
req.Question = append(req.Question, q)
res, _, err := c.Exchange(req, upstream)
if err != nil {
log.Fatal(err)
}
m.Answer = append(m.Answer, res.Answer...)
}
}
w.WriteMsg(m)
}
func main() {
dns.HandleFunc(".", handleDNS)
server := &dns.Server{Addr: ":53", Net: "udp"}
log.Println("Starting DNS Server on :53")
log.Fatal(server.ListenAndServe())
}