You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

68 lines
1.6 KiB

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)
}
}