aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Mohammad Yosefpor <47300215+m-yosefpor@users.noreply.github.com> 2021-03-18 10:08:48 +0330
committerGravatar GitHub <noreply@github.com> 2021-03-18 07:38:48 +0100
commit61b5cdb3526649fcc3356c71342a057f472a9985 (patch)
tree89461089a171f88b73ca8da1af1a6c3af533146d
parent5457cdcd4b2a37cdb6fa2e876dfe4b378c2f1fed (diff)
downloadcoredns-61b5cdb3526649fcc3356c71342a057f472a9985.tar.gz
coredns-61b5cdb3526649fcc3356c71342a057f472a9985.tar.zst
coredns-61b5cdb3526649fcc3356c71342a057f472a9985.zip
plugin/bind: Bind by interface name (#4522)
* auto make -f Makefile.doc Signed-off-by: Mohammad Yosefpor <myusefpur@gmail.com> * Bind by interface name Signed-off-by: Mohammad Yosefpor <myusefpur@gmail.com> * README.md: Interface with multiple address Signed-off-by: Mohammad Yosefpor <myusefpur@gmail.com> * auto make -f Makefile.doc Signed-off-by: Mohammad Yosefpor <myusefpur@gmail.com> * auto make -f Makefile.doc Signed-off-by: Mohammad Yosefpor <myusefpur@gmail.com> * Elaborate more on the behaviour in README.md, revert man/*, fix tests Signed-off-by: Mohammad Yosefpor <myusefpur@gmail.com> * auto make -f Makefile.doc Signed-off-by: Mohammad Yosefpor <myusefpur@gmail.com> * --sign-off Revert man/* to fix DCO check Signed-off-by: Mohammad Yosefpor <myusefpur@gmail.com> * auto make -f Makefile.doc * Revert man/* to fix DCO check Signed-off-by: Mohammad Yosefpor <myusefpur@gmail.com> Co-authored-by: coredns-auto-go-mod-tidy[bot] <coredns-auto-go-mod-tidy[bot]@users.noreply.github.com>
-rw-r--r--plugin/bind/README.md12
-rw-r--r--plugin/bind/setup.go38
-rw-r--r--plugin/bind/setup_test.go1
3 files changed, 43 insertions, 8 deletions
diff --git a/plugin/bind/README.md b/plugin/bind/README.md
index 761aa056a..6ff3fb888 100644
--- a/plugin/bind/README.md
+++ b/plugin/bind/README.md
@@ -11,7 +11,9 @@ another IP instead.
If several addresses are provided, a listener will be open on each of the IP provided.
-Each address has to be an IP of one of the interfaces of the host.
+Each address has to be an IP or name of one of the interfaces of the host. Bind by interface name, binds to the IPs on that interface at the time of startup or reload (reload will happen with a SIGHUP or if the config file changes).
+
+If the given argument is an interface name, and that interface has serveral IP addresses, CoreDNS will listen on all of the interface IP addresses (including IPv4 and IPv6).
## Syntax
@@ -50,6 +52,14 @@ The following sample is equivalent to the preceding:
}
~~~
+The following server block, binds on localhost with its interface name (both "127.0.0.1" and "::1"):
+
+~~~ corefile
+. {
+ bind lo
+}
+~~~
+
## Bugs
When defining more than one server block, take care not to bind more than one server to the same
diff --git a/plugin/bind/setup.go b/plugin/bind/setup.go
index 44c9b8a6f..afca06097 100644
--- a/plugin/bind/setup.go
+++ b/plugin/bind/setup.go
@@ -15,16 +15,40 @@ func setup(c *caddy.Controller) error {
// addresses will be consolidated over all BIND directives available in that BlocServer
all := []string{}
for c.Next() {
- addrs := c.RemainingArgs()
- if len(addrs) == 0 {
- return plugin.Error("bind", fmt.Errorf("at least one address is expected"))
+ args := c.RemainingArgs()
+ if len(args) == 0 {
+ return plugin.Error("bind", fmt.Errorf("at least one address or interface name is expected"))
}
- for _, addr := range addrs {
- if net.ParseIP(addr) == nil {
- return plugin.Error("bind", fmt.Errorf("not a valid IP address: %s", addr))
+
+ ifaces, err := net.Interfaces()
+ if err != nil {
+ return plugin.Error("bind", fmt.Errorf("failed to get interfaces list"))
+ }
+
+ var isIface bool
+ for _, arg := range args {
+ isIface = false
+ for _, iface := range ifaces {
+ if arg == iface.Name {
+ isIface = true
+ addrs, err := iface.Addrs()
+ if err != nil {
+ return plugin.Error("bind", fmt.Errorf("failed to get the IP(s) of the interface: %s", arg))
+ }
+ for _, addr := range addrs {
+ if ipnet, ok := addr.(*net.IPNet); ok {
+ all = append(all, ipnet.IP.String())
+ }
+ }
+ }
+ }
+ if !isIface {
+ if net.ParseIP(arg) == nil {
+ return plugin.Error("bind", fmt.Errorf("not a valid IP address: %s", arg))
+ }
+ all = append(all, arg)
}
}
- all = append(all, addrs...)
}
config.ListenHosts = all
return nil
diff --git a/plugin/bind/setup_test.go b/plugin/bind/setup_test.go
index 556aa1ea2..b0cf1087b 100644
--- a/plugin/bind/setup_test.go
+++ b/plugin/bind/setup_test.go
@@ -19,6 +19,7 @@ func TestSetup(t *testing.T) {
{`bind 1.2.3.4 ::5`, []string{"1.2.3.4", "::5"}, false},
{`bind ::1 1.2.3.4 ::5 127.9.9.0`, []string{"::1", "1.2.3.4", "::5", "127.9.9.0"}, false},
{`bind ::1 1.2.3.4 ::5 127.9.9.0 noone`, nil, true},
+ {`bind 1.2.3.4 lo`, []string{"1.2.3.4", "127.0.0.1", "::1"}, false},
} {
c := caddy.NewTestController("dns", test.config)
err := setup(c)