我在本地网络内的 debian 8 服务器上运行 DNS 和 DHCP 服务器。
问题是客户端通过 DHCP 服务器以错误/不期望的顺序获取名称服务器。
DHCP服务器配置:
subnet 192.168.10.0 netmask 255.255.255.0 {
option routers 192.168.10.1;
option subnet-mask 255.255.255.0;
option domain-name-servers 192.168.10.1, 8.8.8.8, 8.8.4.4;
option time-offset -18000;
default-lease-time 21600;
max-lease-time 43200;
}
其中 192.168.10.1 是 DNS 和 DHCP 服务器。
为客户端上的本地接口列出的名称服务器:
IP4.DNS[1]: 8.8.8.8
IP4.DNS[2]: 8.8.4.4
IP4.DNS[3]: 192.168.10.1
客户端是带有 isc-dhcp-client 的 Ubuntu 17.10
编辑:/etc/dhcp/dhclient.conf 的内容
send host-name = gethostname();
request subnet-mask, broadcast-address, time-offset, routers,
domain-name, domain-name-servers, domain-search, host-name,
dhcp6.name-servers, dhcp6.domain-search, dhcp6.fqdn, dhcp6.sntp-servers,
netbios-name-servers, netbios-scope, interface-mtu,
rfc3442-classless-static-routes, ntp-servers;
如何从 DHCP 服务器获取正确顺序的名称服务器?
所需的顺序是首先使用本地名称服务器。
因此:
IP4.DNS[1]: 192.168.10.1
IP4.DNS[2]: 8.8.8.8
IP4.DNS[3]: 8.8.4.4
答案1
与其尝试控制客户端上 DNS 服务器的顺序,不如只通告内部 DNS 服务器会更干净。如果内部服务器配置为将它们无法满足的请求转发到一组给定的公共 DNS 服务器,则这是可能的。
例如,我的 BIND9 配置(在 IP 上192.168.2.1
)包含
options {
...
forwarders {
208.67.220.220;
208.67.222.222;
8.8.8.8;
8.8.4.4;
}
...
}
或者(感谢@RuiFRibeiro),您可以使用区域块与根名称服务器进行通信:
zone "." IN {
type hint;
file "root.hint"
}
(您的发行版可能会使用db.root
代替root.hint
)。
在任一配置中,如果服务器无法确定所请求名称的 IP,它会尝试联系另一台服务器(即定义的服务器forwarders
或根名称服务器)以查找适当的 IP。换句话说,总是首先尝试本地服务器,如果失败,则使用不同的服务器作为替代。
那么选项dhcpd.conf
就很简单
option domain-name-servers 192.168.2.1;
如果您配置多个冗余本地 DNS 服务器,则可以在配置中指定每个服务器,dhcpd
而不必担心它们的顺序,因为它们的行为都是相同的。
答案2
对于某些客户端 DHCP 守护进程优化首先提供具有公共 IP 地址的 DNS 服务器,我不会感到惊讶。
但是,考虑到您对订单的坚持:
我不建议依赖 DNS 应答顺序来提供不同的 DNS 视图或答案。
将此类决策留给本地基础设施中的客户可能会导致一些不可预测的行为,至少在您需要这些问题时,尤其是考虑到负 DNS 缓存。它还将导致更大的 DNS 流量。您最终还会在层次结构中加载 DNS 服务器,并询问有关您的内部域的问题。
我建议设计一个经过深思熟虑的 DNS 基础设施,可以使用互联网和内部专用服务器,也可以使用视图,并且至少有两个内部 DNS 服务器。
TLDR 通过 DHCP 提供多个具有不同“世界”视图的 DNS 服务器并不会为服务带来更多稳定性,恰恰相反。