aboutsummaryrefslogtreecommitdiff
path: root/plugin/bind
diff options
context:
space:
mode:
Diffstat (limited to 'plugin/bind')
-rw-r--r--plugin/bind/README.md22
-rw-r--r--plugin/bind/bind.go11
-rw-r--r--plugin/bind/bind_test.go30
-rw-r--r--plugin/bind/setup.go24
4 files changed, 87 insertions, 0 deletions
diff --git a/plugin/bind/README.md b/plugin/bind/README.md
new file mode 100644
index 000000000..57b3c1e18
--- /dev/null
+++ b/plugin/bind/README.md
@@ -0,0 +1,22 @@
+# bind
+
+*bind* overrides the host to which the server should bind.
+
+Normally, the listener binds to the wildcard host. However, you may force the listener to bind to
+another IP instead. This directive accepts only an address, not a port.
+
+## Syntax
+
+~~~ txt
+bind ADDRESS
+~~~
+
+**ADDRESS** is the IP address to bind to.
+
+## Examples
+
+To make your socket accessible only to that machine, bind to IP 127.0.0.1 (localhost):
+
+~~~ txt
+bind 127.0.0.1
+~~~
diff --git a/plugin/bind/bind.go b/plugin/bind/bind.go
new file mode 100644
index 000000000..bd3c32b51
--- /dev/null
+++ b/plugin/bind/bind.go
@@ -0,0 +1,11 @@
+// Package bind allows binding to a specific interface instead of bind to all of them.
+package bind
+
+import "github.com/mholt/caddy"
+
+func init() {
+ caddy.RegisterPlugin("bind", caddy.Plugin{
+ ServerType: "dns",
+ Action: setupBind,
+ })
+}
diff --git a/plugin/bind/bind_test.go b/plugin/bind/bind_test.go
new file mode 100644
index 000000000..11556f0bd
--- /dev/null
+++ b/plugin/bind/bind_test.go
@@ -0,0 +1,30 @@
+package bind
+
+import (
+ "testing"
+
+ "github.com/coredns/coredns/core/dnsserver"
+
+ "github.com/mholt/caddy"
+)
+
+func TestSetupBind(t *testing.T) {
+ c := caddy.NewTestController("dns", `bind 1.2.3.4`)
+ err := setupBind(c)
+ if err != nil {
+ t.Fatalf("Expected no errors, but got: %v", err)
+ }
+
+ cfg := dnsserver.GetConfig(c)
+ if got, want := cfg.ListenHost, "1.2.3.4"; got != want {
+ t.Errorf("Expected the config's ListenHost to be %s, was %s", want, got)
+ }
+}
+
+func TestBindAddress(t *testing.T) {
+ c := caddy.NewTestController("dns", `bind 1.2.3.bla`)
+ err := setupBind(c)
+ if err == nil {
+ t.Fatalf("Expected errors, but got none")
+ }
+}
diff --git a/plugin/bind/setup.go b/plugin/bind/setup.go
new file mode 100644
index 000000000..796377841
--- /dev/null
+++ b/plugin/bind/setup.go
@@ -0,0 +1,24 @@
+package bind
+
+import (
+ "fmt"
+ "net"
+
+ "github.com/coredns/coredns/core/dnsserver"
+ "github.com/coredns/coredns/plugin"
+
+ "github.com/mholt/caddy"
+)
+
+func setupBind(c *caddy.Controller) error {
+ config := dnsserver.GetConfig(c)
+ for c.Next() {
+ if !c.Args(&config.ListenHost) {
+ return plugin.Error("bind", c.ArgErr())
+ }
+ }
+ if net.ParseIP(config.ListenHost) == nil {
+ return plugin.Error("bind", fmt.Errorf("not a valid IP address: %s", config.ListenHost))
+ }
+ return nil
+}