描述
通常,监听程序会绑定到通配符主机。然而,你可能希望监听程序绑定到另一个 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,但没有解决方案。