我正在为一家小公司设置内部网站。我还在办公网络内设置了一个私有 DNS 服务器,用于解析该内部网站的主机名。然后,我更改了路由器的 DHCP 设置,将公共 DNS 服务器设置为主 DNS,并将我的私有 DNS 服务器设置为辅助 DNS。但是,我做错了一些事情,导致公司内部网络不稳定。以下是我所做的:
- 公司网络的网关地址/路由器地址是192.168.0.1。
- 我在一台固定IP地址为192.168.0.10的服务器上建立了一个内部网站。
- 在同一台服务器上,我设置了一个 BIND DNS 服务器。我希望它将主机名“mywebsite.local”解析为 192.168.0.10,并将所有其他查询转发到公共 DNS 服务器。BIND 服务器的配置文件如下所示
zone "." {
type forward;
forward only;
forwarders{
192.168.0.1;
};
};
zone "local" {
type master;
file "/var/lib/bind/local.hosts";
};
zone "localhost" {
type master;
file "/etc/bind/db.local";
};
zone "127.in-addr.arpa" {
type master;
file "/etc/bind/db.127";
};
zone "0.in-addr.arpa" {
type master;
file "/etc/bind/db.0";
};
zone "255.in-addr.arpa" {
type master;
file "/etc/bind/db.255";
};
/var/lib/bind/local.hosts
如下所示
local. IN SOA ns.local. foo.bar.com. (
1602646014
10800
3600
604800
38400 )
local. IN NS ns.local.
ns.local. IN A 192.168.0.10
mywebsite.local. IN A 192.168.0.10
- 我更改了路由器上的 DHCP 设置,将 8.8.8.8 作为主 DNS 服务器,将 192.168.0.10 作为辅助 DNS 服务器。
- 完成上述设置后,我的客户出现了网络故障。
我做错了什么?
答案1
我更改了路由器上的 DHCP 设置,将 8.8.8.8 作为主 DNS 服务器,将 192.168.0.10 作为辅助 DNS 服务器。
这是不正确的。如果您指定多个 DNS 服务器,则它们都应提供相同的内容 - 如果 Google 的 8.8.8.8 响应“mywebsite.local”未知,则客户端将把它作为最终答案,而不会尝试其他服务器。
如果原始服务器没有响应,客户端才会切换到另一台服务器根本。
因此,您应该只列出您的自定义服务器 - 如果您希望在服务器出现故障时保证可靠性,那么您应该设置两个本地服务器(其中一个从另一个复制本地区域)。
完成上述设置后,我的客户出现了网络故障。
对于网络停电,确保named.conf中的全局选项部分指定了您的整个LAN子网allow-recursion
。
allow-recursion { 127.0.0.1; ::1; 192.168.0.0/24; }
避免暴行在将配置强加给其他人之前,您应该先测试一下配置——也就是说,手动验证您的服务器是否按照您想要的方式响应 DNS 查询。nslookup
从另一台 Windows PC 或 Linux 或 macOS 计算机使用该工具dig
——host
它们允许您查询指定的服务器,而无需更改 DHCP 设置:
nslookup mywebsite.local 192.168.0.10
nslookup google.com 192.168.0.10
host google.com 192.168.0.10
第二个可能的问题是,通过更改 DHCP 设置,你可能还告诉了路由器本身使用您的 DNS 服务器,从而创建一个循环:您的命名服务器将查询转发到路由器,然后路由器将其转发到您的服务器,然后路由器将其转发到您的服务器...
为了避免这种情况,请在 named.conf 中指定 8.8.8.8 作为转发目的地,而不是指定路由器的地址。
(并非所有路由器都以这种方式链接这两种设置,但有些路由器会这样做。)
其他说明
我建议不要使用.local
DNS,因为它可能与 mDNS 冲突。请考虑使用类似的东西.lan
。(但在我看来,对于公司网络来说,更好的选择是使用公司互联网域的子域,例如.lan.example.org
或.corp.example.com
。)
我还建议在 named.conf ( zone "local." IN {...}
) 中定义区域类,并使用区域文件中的 $ORIGIN 宏定义通用后缀,这样您就不必为每个记录重复它们:
$ORIGIN local.
$TTL 1h
@ SOA ns admin.mycompany.com. ( 1602646014 3h 1h 7d 1h )
NS ns
ns A 192.168.0.10
mywebsite A 192.168.0.10