Unplug coreDNS and plug dnsforward library.
This commit is contained in:
parent
a904f85e61
commit
feabc21864
97
config.go
97
config.go
|
@ -1,14 +1,11 @@
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"log"
|
"log"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"regexp"
|
|
||||||
"sync"
|
"sync"
|
||||||
"text/template"
|
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"gopkg.in/yaml.v2"
|
"gopkg.in/yaml.v2"
|
||||||
|
@ -56,7 +53,7 @@ type coreDNSConfig struct {
|
||||||
SafeSearchEnabled bool `yaml:"safesearch_enabled"`
|
SafeSearchEnabled bool `yaml:"safesearch_enabled"`
|
||||||
ParentalEnabled bool `yaml:"parental_enabled"`
|
ParentalEnabled bool `yaml:"parental_enabled"`
|
||||||
ParentalSensitivity int `yaml:"parental_sensitivity"`
|
ParentalSensitivity int `yaml:"parental_sensitivity"`
|
||||||
BlockedResponseTTL int `yaml:"blocked_response_ttl"`
|
BlockedResponseTTL uint32 `yaml:"blocked_response_ttl"`
|
||||||
QueryLogEnabled bool `yaml:"querylog_enabled"`
|
QueryLogEnabled bool `yaml:"querylog_enabled"`
|
||||||
Ratelimit int `yaml:"ratelimit"`
|
Ratelimit int `yaml:"ratelimit"`
|
||||||
RefuseAny bool `yaml:"refuse_any"`
|
RefuseAny bool `yaml:"refuse_any"`
|
||||||
|
@ -188,98 +185,8 @@ func (c *configuration) write() error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// --------------
|
|
||||||
// coredns config
|
|
||||||
// --------------
|
|
||||||
func writeCoreDNSConfig() error {
|
|
||||||
coreFile := filepath.Join(config.ourBinaryDir, config.CoreDNS.coreFile)
|
|
||||||
log.Printf("Writing DNS config: %s", coreFile)
|
|
||||||
configText, err := generateCoreDNSConfigText()
|
|
||||||
if err != nil {
|
|
||||||
log.Printf("Couldn't generate DNS config: %s", err)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
err = safeWriteFile(coreFile, []byte(configText))
|
|
||||||
if err != nil {
|
|
||||||
log.Printf("Couldn't save DNS config: %s", err)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func writeAllConfigs() error {
|
func writeAllConfigs() error {
|
||||||
err := config.write()
|
return config.write()
|
||||||
if err != nil {
|
|
||||||
log.Printf("Couldn't write our config: %s", err)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
err = writeCoreDNSConfig()
|
|
||||||
if err != nil {
|
|
||||||
log.Printf("Couldn't write DNS config: %s", err)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
const coreDNSConfigTemplate = `.:{{.Port}} {
|
|
||||||
{{if .ProtectionEnabled}}dnsfilter {
|
|
||||||
{{if .SafeBrowsingEnabled}}safebrowsing{{end}}
|
|
||||||
{{if .ParentalEnabled}}parental {{.ParentalSensitivity}}{{end}}
|
|
||||||
{{if .SafeSearchEnabled}}safesearch{{end}}
|
|
||||||
{{if .QueryLogEnabled}}querylog{{end}}
|
|
||||||
blocked_ttl {{.BlockedResponseTTL}}
|
|
||||||
{{if .FilteringEnabled}}{{range .Filters}}{{if and .Enabled .Contents}}
|
|
||||||
filter {{.ID}} "{{.Path}}"
|
|
||||||
{{end}}{{end}}{{end}}
|
|
||||||
}{{end}}
|
|
||||||
{{.Pprof}}
|
|
||||||
{{if .RefuseAny}}refuseany{{end}}
|
|
||||||
{{if gt .Ratelimit 0}}ratelimit {{.Ratelimit}}{{end}}
|
|
||||||
hosts {
|
|
||||||
fallthrough
|
|
||||||
}
|
|
||||||
{{if .UpstreamDNS}}upstream {{range .UpstreamDNS}}{{.}} {{end}} { bootstrap {{.BootstrapDNS}} }{{end}}
|
|
||||||
{{.Cache}}
|
|
||||||
{{.Prometheus}}
|
|
||||||
}
|
|
||||||
`
|
|
||||||
|
|
||||||
var removeEmptyLines = regexp.MustCompile("([\t ]*\n)+")
|
|
||||||
|
|
||||||
// generate CoreDNS config text
|
|
||||||
func generateCoreDNSConfigText() (string, error) {
|
|
||||||
t, err := template.New("config").Parse(coreDNSConfigTemplate)
|
|
||||||
if err != nil {
|
|
||||||
log.Printf("Couldn't generate DNS config: %s", err)
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
|
|
||||||
var configBytes bytes.Buffer
|
|
||||||
temporaryConfig := config.CoreDNS
|
|
||||||
|
|
||||||
// generate temporary filter list, needed to put userfilter in coredns config
|
|
||||||
filters := []filter{}
|
|
||||||
|
|
||||||
// first of all, append the user filter
|
|
||||||
userFilter := userFilter()
|
|
||||||
|
|
||||||
filters = append(filters, userFilter)
|
|
||||||
|
|
||||||
// then go through other filters
|
|
||||||
filters = append(filters, config.Filters...)
|
|
||||||
temporaryConfig.Filters = filters
|
|
||||||
|
|
||||||
// run the template
|
|
||||||
err = t.Execute(&configBytes, &temporaryConfig)
|
|
||||||
if err != nil {
|
|
||||||
log.Printf("Couldn't generate DNS config: %s", err)
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
configText := configBytes.String()
|
|
||||||
|
|
||||||
// remove empty lines from generated config
|
|
||||||
configText = removeEmptyLines.ReplaceAllString(configText, "\n")
|
|
||||||
return configText, nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set the next filter ID to max(filter.ID) + 1
|
// Set the next filter ID to max(filter.ID) + 1
|
||||||
|
|
145
coredns.go
145
coredns.go
|
@ -3,130 +3,51 @@ package main
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"log"
|
"log"
|
||||||
"os"
|
"net"
|
||||||
"path/filepath"
|
|
||||||
"sync" // Include all plugins.
|
|
||||||
|
|
||||||
_ "github.com/AdguardTeam/AdGuardHome/coredns_plugin"
|
"github.com/AdguardTeam/AdGuardHome/dnsforward"
|
||||||
_ "github.com/AdguardTeam/AdGuardHome/coredns_plugin/ratelimit"
|
"github.com/joomcode/errorx"
|
||||||
_ "github.com/AdguardTeam/AdGuardHome/coredns_plugin/refuseany"
|
|
||||||
_ "github.com/AdguardTeam/AdGuardHome/upstream"
|
|
||||||
"github.com/coredns/coredns/core/dnsserver"
|
|
||||||
"github.com/coredns/coredns/coremain"
|
|
||||||
_ "github.com/coredns/coredns/plugin/auto"
|
|
||||||
_ "github.com/coredns/coredns/plugin/autopath"
|
|
||||||
_ "github.com/coredns/coredns/plugin/bind"
|
|
||||||
_ "github.com/coredns/coredns/plugin/cache"
|
|
||||||
_ "github.com/coredns/coredns/plugin/chaos"
|
|
||||||
_ "github.com/coredns/coredns/plugin/debug"
|
|
||||||
_ "github.com/coredns/coredns/plugin/dnssec"
|
|
||||||
_ "github.com/coredns/coredns/plugin/dnstap"
|
|
||||||
_ "github.com/coredns/coredns/plugin/erratic"
|
|
||||||
_ "github.com/coredns/coredns/plugin/errors"
|
|
||||||
_ "github.com/coredns/coredns/plugin/file"
|
|
||||||
_ "github.com/coredns/coredns/plugin/forward"
|
|
||||||
_ "github.com/coredns/coredns/plugin/health"
|
|
||||||
_ "github.com/coredns/coredns/plugin/hosts"
|
|
||||||
_ "github.com/coredns/coredns/plugin/loadbalance"
|
|
||||||
_ "github.com/coredns/coredns/plugin/log"
|
|
||||||
_ "github.com/coredns/coredns/plugin/loop"
|
|
||||||
_ "github.com/coredns/coredns/plugin/metadata"
|
|
||||||
_ "github.com/coredns/coredns/plugin/metrics"
|
|
||||||
_ "github.com/coredns/coredns/plugin/nsid"
|
|
||||||
_ "github.com/coredns/coredns/plugin/pprof"
|
|
||||||
_ "github.com/coredns/coredns/plugin/proxy"
|
|
||||||
_ "github.com/coredns/coredns/plugin/reload"
|
|
||||||
_ "github.com/coredns/coredns/plugin/rewrite"
|
|
||||||
_ "github.com/coredns/coredns/plugin/root"
|
|
||||||
_ "github.com/coredns/coredns/plugin/secondary"
|
|
||||||
_ "github.com/coredns/coredns/plugin/template"
|
|
||||||
_ "github.com/coredns/coredns/plugin/tls"
|
|
||||||
_ "github.com/coredns/coredns/plugin/whoami"
|
|
||||||
_ "github.com/mholt/caddy/onevent"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// Directives are registered in the order they should be
|
var dnsServer = dnsforward.Server{}
|
||||||
// executed.
|
|
||||||
//
|
|
||||||
// Ordering is VERY important. Every plugin will
|
|
||||||
// feel the effects of all other plugin below
|
|
||||||
// (after) them during a request, but they must not
|
|
||||||
// care what plugin above them are doing.
|
|
||||||
|
|
||||||
var directives = []string{
|
|
||||||
"metadata",
|
|
||||||
"tls",
|
|
||||||
"reload",
|
|
||||||
"nsid",
|
|
||||||
"root",
|
|
||||||
"bind",
|
|
||||||
"debug",
|
|
||||||
"health",
|
|
||||||
"pprof",
|
|
||||||
"prometheus",
|
|
||||||
"errors",
|
|
||||||
"log",
|
|
||||||
"refuseany",
|
|
||||||
"ratelimit",
|
|
||||||
"dnsfilter",
|
|
||||||
"dnstap",
|
|
||||||
"chaos",
|
|
||||||
"loadbalance",
|
|
||||||
"cache",
|
|
||||||
"rewrite",
|
|
||||||
"dnssec",
|
|
||||||
"autopath",
|
|
||||||
"template",
|
|
||||||
"hosts",
|
|
||||||
"file",
|
|
||||||
"auto",
|
|
||||||
"secondary",
|
|
||||||
"loop",
|
|
||||||
"forward",
|
|
||||||
"proxy",
|
|
||||||
"upstream",
|
|
||||||
"erratic",
|
|
||||||
"whoami",
|
|
||||||
"on",
|
|
||||||
}
|
|
||||||
|
|
||||||
func init() {
|
|
||||||
dnsserver.Directives = directives
|
|
||||||
}
|
|
||||||
|
|
||||||
var (
|
|
||||||
isCoreDNSRunningLock sync.Mutex
|
|
||||||
isCoreDNSRunning = false
|
|
||||||
)
|
|
||||||
|
|
||||||
func isRunning() bool {
|
func isRunning() bool {
|
||||||
isCoreDNSRunningLock.Lock()
|
return dnsServer.IsRunning()
|
||||||
value := isCoreDNSRunning
|
|
||||||
isCoreDNSRunningLock.Unlock()
|
|
||||||
return value
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func startDNSServer() error {
|
func startDNSServer() error {
|
||||||
isCoreDNSRunningLock.Lock()
|
if isRunning() {
|
||||||
if isCoreDNSRunning {
|
|
||||||
isCoreDNSRunningLock.Unlock()
|
|
||||||
return fmt.Errorf("Unable to start coreDNS: Already running")
|
return fmt.Errorf("Unable to start coreDNS: Already running")
|
||||||
}
|
}
|
||||||
isCoreDNSRunning = true
|
|
||||||
isCoreDNSRunningLock.Unlock()
|
|
||||||
|
|
||||||
configpath := filepath.Join(config.ourBinaryDir, config.CoreDNS.coreFile)
|
filters := []dnsforward.Filter{}
|
||||||
os.Args = os.Args[:1]
|
for _, filter := range config.Filters {
|
||||||
os.Args = append(os.Args, "-conf")
|
filters = append(filters, dnsforward.Filter{
|
||||||
os.Args = append(os.Args, configpath)
|
ID: filter.ID,
|
||||||
|
Rules: filter.Rules,
|
||||||
err := writeCoreDNSConfig()
|
})
|
||||||
if err != nil {
|
}
|
||||||
errortext := fmt.Errorf("Unable to write coredns config: %s", err)
|
|
||||||
log.Println(errortext)
|
newconfig := dnsforward.ServerConfig{
|
||||||
return errortext
|
UDPListenAddr: &net.UDPAddr{Port: config.CoreDNS.Port},
|
||||||
|
BlockedTTL: config.CoreDNS.BlockedResponseTTL,
|
||||||
|
Filters: filters,
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, u := range config.CoreDNS.UpstreamDNS {
|
||||||
|
upstream, err := dnsforward.GetUpstream(u)
|
||||||
|
if err != nil {
|
||||||
|
log.Printf("Couldn't get upstream: %s", err)
|
||||||
|
// continue, just ignore the upstream
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
newconfig.Upstreams = append(newconfig.Upstreams, upstream)
|
||||||
|
}
|
||||||
|
|
||||||
|
err := dnsServer.Start(&newconfig)
|
||||||
|
if err != nil {
|
||||||
|
return errorx.Decorate(err, "Couldn't start forwarding DNS server")
|
||||||
}
|
}
|
||||||
|
|
||||||
go coremain.Run()
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
1
go.mod
1
go.mod
|
@ -14,6 +14,7 @@ require (
|
||||||
github.com/gobuffalo/packr v1.19.0
|
github.com/gobuffalo/packr v1.19.0
|
||||||
github.com/google/uuid v1.0.0 // indirect
|
github.com/google/uuid v1.0.0 // indirect
|
||||||
github.com/grpc-ecosystem/grpc-opentracing v0.0.0-20180507213350-8e809c8a8645 // indirect
|
github.com/grpc-ecosystem/grpc-opentracing v0.0.0-20180507213350-8e809c8a8645 // indirect
|
||||||
|
github.com/joomcode/errorx v0.1.0
|
||||||
github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect
|
github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect
|
||||||
github.com/mholt/caddy v0.11.0
|
github.com/mholt/caddy v0.11.0
|
||||||
github.com/miekg/dns v1.0.15
|
github.com/miekg/dns v1.0.15
|
||||||
|
|
2
go.sum
2
go.sum
|
@ -41,6 +41,8 @@ github.com/grpc-ecosystem/grpc-opentracing v0.0.0-20180507213350-8e809c8a8645/go
|
||||||
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
|
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
|
||||||
github.com/joho/godotenv v1.3.0 h1:Zjp+RcGpHhGlrMbJzXTrZZPrWj+1vfm90La1wgB6Bhc=
|
github.com/joho/godotenv v1.3.0 h1:Zjp+RcGpHhGlrMbJzXTrZZPrWj+1vfm90La1wgB6Bhc=
|
||||||
github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg=
|
github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg=
|
||||||
|
github.com/joomcode/errorx v0.1.0 h1:QmJMiI1DE1UFje2aI1ZWO/VMT5a32qBoXUclGOt8vsc=
|
||||||
|
github.com/joomcode/errorx v0.1.0/go.mod h1:kgco15ekB6cs+4Xjzo7SPeXzx38PbJzBwbnu9qfVNHQ=
|
||||||
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
|
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
|
||||||
github.com/markbates/oncer v0.0.0-20181014194634-05fccaae8fc4 h1:Mlji5gkcpzkqTROyE4ZxZ8hN7osunMb2RuGVrbvMvCc=
|
github.com/markbates/oncer v0.0.0-20181014194634-05fccaae8fc4 h1:Mlji5gkcpzkqTROyE4ZxZ8hN7osunMb2RuGVrbvMvCc=
|
||||||
github.com/markbates/oncer v0.0.0-20181014194634-05fccaae8fc4/go.mod h1:Ld9puTsIW75CHf65OeIOkyKbteujpZVXDpWK6YGZbxE=
|
github.com/markbates/oncer v0.0.0-20181014194634-05fccaae8fc4/go.mod h1:Ld9puTsIW75CHf65OeIOkyKbteujpZVXDpWK6YGZbxE=
|
||||||
|
|
Loading…
Reference in New Issue