diff --git a/nameserver/dns.go b/nameserver/dns.go index f2cd8fe7..db128203 100644 --- a/nameserver/dns.go +++ b/nameserver/dns.go @@ -90,7 +90,7 @@ type DNSServer struct { ns *Nameserver domain string ttl uint32 - address string + address string // listen address and port, e.g. 1.2.3.4:53 servers []*dns.Server upstream Upstream @@ -99,6 +99,10 @@ type DNSServer struct { } func NewDNSServer(ns *Nameserver, domain, address string, upstream Upstream, ttl uint32, clientTimeout time.Duration) (*DNSServer, error) { + if _, _, err := net.SplitHostPort(address); err != nil { + return nil, fmt.Errorf("invalid DNS listen address %q: %v", address, err) + } + s := &DNSServer{ ns: ns, domain: dns.Fqdn(domain), diff --git a/nameserver/http.go b/nameserver/http.go index ac421c0e..d7b91dea 100644 --- a/nameserver/http.go +++ b/nameserver/http.go @@ -3,6 +3,7 @@ package nameserver import ( "encoding/json" "fmt" + "net" "net/http" "github.com/gorilla/mux" @@ -84,3 +85,13 @@ func (n *Nameserver) HandleHTTP(router *mux.Router, dockerCli *docker.Client) { } }) } + +func (d *DNSServer) HandleHTTP(router *mux.Router) { + router.Methods("GET").Path("/dns-address-port").HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + fmt.Fprint(w, d.address) + }) + router.Methods("GET").Path("/dns-address").HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + host, _, _ := net.SplitHostPort(d.address) // address is validated in NewDNSServer() + fmt.Fprint(w, host) + }) +} diff --git a/prog/weaver/main.go b/prog/weaver/main.go index 811fc5d9..315a979c 100644 --- a/prog/weaver/main.go +++ b/prog/weaver/main.go @@ -55,10 +55,7 @@ type dnsConfig struct { // return the address part of the DNS listen address, without ":53" on the end func (c dnsConfig) addressOnly() string { - addr, _, err := net.SplitHostPort(c.ListenAddress) - if err != nil { - Log.Fatalf("Error when parsing DNS listen address %q: %s", c.ListenAddress, err) - } + addr, _, _ := net.SplitHostPort(c.ListenAddress) return addr } @@ -474,6 +471,7 @@ func main() { } if ns != nil { ns.HandleHTTP(muxRouter, dockerCli) + dnsserver.HandleHTTP(muxRouter) } router.HandleHTTP(muxRouter) HandleHTTP(muxRouter, version, router, allocator, defaultSubnet, ns, dnsserver, proxy, plugin, &waitReady) diff --git a/site/tasks/weavedns/weavedns.md b/site/tasks/weavedns/weavedns.md index 867bdb21..6b685349 100644 --- a/site/tasks/weavedns/weavedns.md +++ b/site/tasks/weavedns/weavedns.md @@ -39,6 +39,10 @@ the same time, the hostname takes precedence. In this circumstance, if the hostname is not in the weaveDNS domain, the container is *not* registered, but it will still use weaveDNS for resolution. +By default, weaveDNS will listen on port 53 on the address of the +Docker bridge. To make it listen on a different address or port use +`weave launch --dns-listen-address
: