绑定

源代码

bind 覆盖了服务器应绑定的主机。

描述

通常,监听程序会绑定到通配符主机。然而,你可能希望监听程序绑定到另一个 IP。

如果提供了多个地址,将在每个提供的 IP 上打开一个监听程序。

每个地址都必须是 IP 或主机的一个接口的名称。按接口名称绑定,在启动或重新加载时绑定到该接口上的 IP(重新加载将在收到 SIGHUP 时发生,或如果配置文件更改)。

如果给定的参数是接口名称,并且该接口具有多个 IP 地址,CoreDNS 将监听所有接口 IP 地址(包括 IPv4 和 IPv6),但该接口上的 IPv6 链路本地地址除外。

语法

在基本形式中,一个简单的 bind 使用以下语法

bind ADDRESS|IFACE  ...

你也可以在扩展语法中通过它们的 IP 地址或接口名称排除一些地址

bind ADDRESS|IFACE ... {
    except ADDRESS|IFACE ...
}
  • ADDRESS|IFACE 是要绑定的 IP 地址或接口名称。当提供了多个地址时,将在每个地址上打开一个监听程序。请阅读描述了解更多详细信息。
  • except 排除要绑定的接口或 IP 地址。except 选项只排除了当前 bind 指令中的地址,前提是在同一个服务器块中使用了多个 bind 指令。

实例

若要使你的套接字只能对那台机器访问,请绑定到 IP 127.0.0.1(本地主机)

. {
    bind 127.0.0.1
}

为了允许在 IPv4 和 IPv6 协议栈上仅处理本地主机的 DNS 请求,请使用以下语法

. {
    bind 127.0.0.1 ::1
}

如果在配置文件中出现多个 bind 插件,则所有地址都会合并在一起:以下示例等效于前面的示例

. {
    bind 127.0.0.1
    bind ::1
}

以下服务器块使用其接口名称在本地主机上绑定(“127.0.0.1”和“::1”)

. {
    bind lo
}

你可以通过它们的 IP 或接口名称来排除一些地址(以下内容将只监听 ::1 或已分配给 lo 接口的任何地址)

. {
    bind lo {
        except 127.0.0.1
    }
}

漏洞

避免监听程序竞争

换句话说,当向服务器块添加 bind 插件时,也必须将其添加到监听同一端口的所有其他服务器块。

当多个服务器块被配置为监听一个公共端口时,这些服务器块必须要么全部使用绑定插件,要么全部使用默认绑定(没有绑定插件)。注意,此处的“端口”是指服务器块被配置为服务的 TCP/UDP 端口(默认 53)——而不是网络接口。对于在同一端口上监听的两个服务器块,如果一个使用绑定插件而另一个不使用,那么将创建两个单独的侦听器,它们将争夺处理发送到同一地址的数据包。这样做会导致行为不可预测(请求可能是由任一服务器随机处理的)。发生这种情况是因为没有使用绑定插件时,服务器将绑定到所有接口,如果另一服务器使用绑定来侦听同一端口上的地址,则这将与另一服务器冲突。例如,以下操作创建了两个同时侦听 127.0.0.1:53 的服务器,这将导致对 a.bad.example.com 中的查询产生不可预测的行为

a.bad.example.com {
    bind 127.0.0.1
    forward . 1.2.3.4
}

bad.example.com {
    forward . 5.6.7.8
}

此外,MacOS 上有一个(公开)错误,导致此功能无法正常工作。有关详细信息,请参见 https://github.com/miekg/dns/issues/724,但没有解决方案。