Add client support for multiple listen addresses

This commit is contained in:
gdm85 committed 2018-04-15 19:57:01 +02:00
1 parent 83f20767ea
commit ce656ac3f7
3 files changed
+41 -36

No files matched your search

+35 -32
View File
@@ -42,8 +42,8 @@ import (
type Client struct { type Client struct {
conf *config conf *config
bootstrap []string bootstrap []string
udpServer *dns.Server udpServers []*dns.Server
tcpServer *dns.Server tcpServers []*dns.Server
bootstrapResolver *net.Resolver bootstrapResolver *net.Resolver
cookieJar *cookiejar.Jar cookieJar *cookiejar.Jar
httpClientMux *sync.RWMutex httpClientMux *sync.RWMutex
@@ -64,16 +64,21 @@ func NewClient(conf *config) (c *Client, err error) {
c = &Client{ c = &Client{
conf: conf, conf: conf,
} }
c.udpServer = &dns.Server{
Addr: conf.Listen, udpH := dns.HandlerFunc(c.udpHandlerFunc)
Net: "udp", tcpH := dns.HandlerFunc(c.tcpHandlerFunc)
Handler: dns.HandlerFunc(c.udpHandlerFunc), for _, addr := range conf.Listen {
UDPSize: 4096, c.udpServers = append(c.udpServers, &dns.Server{
} Addr: addr,
c.tcpServer = &dns.Server{ Net: "udp",
Addr: conf.Listen, Handler: udpH,
Net: "tcp", UDPSize: 4096,
Handler: dns.HandlerFunc(c.tcpHandlerFunc), })
c.tcpServers = append(c.tcpServers, &dns.Server{
Addr: addr,
Net: "tcp",
Handler: tcpH,
})
} }
c.bootstrapResolver = net.DefaultResolver c.bootstrapResolver = net.DefaultResolver
if len(conf.Bootstrap) != 0 { if len(conf.Bootstrap) != 0 {
@@ -149,27 +154,25 @@ func (c *Client) newHTTPClient() error {
} }
func (c *Client) Start() error { func (c *Client) Start() error {
result := make(chan error) result := make(chan error, len(c.udpServers)+len(c.tcpServers))
go func() { for _, srv := range append(c.udpServers, c.tcpServers...) {
err := c.udpServer.ListenAndServe() go func(srv *dns.Server) {
if err != nil { err := srv.ListenAndServe()
log.Println(err) if err != nil {
} log.Println(err)
result <- err }
}() result <- err
go func() { }(srv)
err := c.tcpServer.ListenAndServe()
if err != nil {
log.Println(err)
}
result <- err
}()
err := <-result
if err != nil {
return err
} }
err = <-result
return err for i := 0; i < cap(result); i++ {
err := <-result
if err != nil {
return err
}
}
close(result)
return nil
} }
func (c *Client) handlerFunc(w dns.ResponseWriter, r *dns.Msg, isTCP bool) { func (c *Client) handlerFunc(w dns.ResponseWriter, r *dns.Msg, isTCP bool) {
+3 -3
View File
@@ -30,7 +30,7 @@ import (
) )
type config struct { type config struct {
Listen string `toml:"listen"` Listen []string `toml:"listen"`
UpstreamGoogle []string `toml:"upstream_google"` UpstreamGoogle []string `toml:"upstream_google"`
UpstreamIETF []string `toml:"upstream_ietf"` UpstreamIETF []string `toml:"upstream_ietf"`
Bootstrap []string `toml:"bootstrap"` Bootstrap []string `toml:"bootstrap"`
@@ -50,8 +50,8 @@ func loadConfig(path string) (*config, error) {
return nil, &configError{fmt.Sprintf("unknown option %q", key.String())} return nil, &configError{fmt.Sprintf("unknown option %q", key.String())}
} }
if conf.Listen == "" { if len(conf.Listen) == 0 {
conf.Listen = "127.0.0.1:53" conf.Listen = []string{"127.0.0.1:53"}
} }
if len(conf.UpstreamGoogle) == 0 && len(conf.UpstreamIETF) == 0 { if len(conf.UpstreamGoogle) == 0 && len(conf.UpstreamIETF) == 0 {
conf.UpstreamGoogle = []string{"https://dns.google.com/resolve"} conf.UpstreamGoogle = []string{"https://dns.google.com/resolve"}
+3 -1
View File
@@ -1,5 +1,7 @@
# DNS listen port # DNS listen port
listen = "127.0.0.1:53" listen = [
"127.0.0.1:53"
]
# HTTP path for upstream resolver # HTTP path for upstream resolver
# If multiple servers are specified, a random one will be chosen each time. # If multiple servers are specified, a random one will be chosen each time.