package main import ( "flag" "fmt" "log" "net" "net/http" "time" "github.com/miekg/dns" ) 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 (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)") blockForwardAddr = flag.String("block-forward-ip", "127.0.0.1", "IP address to forward blocked traffic to. Preferably has https running.") ) func main() { log.SetPrefix("[Entrypoint] ") log.SetFlags(log.LUTC | log.Lshortfile) flag.Parse() cfg, err := LoadConfig(*configFilePath) if err != nil { log.Fatal(err) } domainBlacklist, err := NewDomainBlacklist(cfg.Blocklists) if err != nil { log.Fatal(err) } go func(bm BlocklistManager) { httpAddr := fmt.Sprintf("%s:80", *httpAddress) log.Printf("HTTP server listening @ %s", httpAddr) handler := NewHTTPHandler(*cfg, bm) if err := http.ListenAndServe(httpAddr, handler); err != nil { log.Fatal(err) } }(domainBlacklist) ips := []net.IP{} for _, strIP := range cfg.Upstream { ips = append(ips, net.ParseIP(strIP)) } handler, err := NewDNSHandler(*blockForwardAddr, &memoryDNSCacher{TTL: time.Minute}, domainBlacklist, DNSResolver(ips), *cfg) if err != nil { log.Fatal(err) } dnsAddr := fmt.Sprintf("%s:53", *dnsAddress) log.Printf("DNS server listening @ %s", dnsAddr) srv := &dns.Server{ Addr: dnsAddr, Net: "udp", Handler: handler, ReadTimeout: time.Second * 3, } if err := srv.ListenAndServe(); err != nil { log.Fatal(err) } }