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