编辑:这个问题总体上很糟糕,因为没有很好的文档记录。但这并不是很糟糕,因为我真的不知道哪里出了问题,而且一直在搜索和研究。最后我向 ServerFault 提出了一个“BBBBLLLLaaarrggghhh”类型的问题。标题仍然有效,但正文应该是:
我的 DNS 服务器似乎根据我所连接的网络以不同的答案解析我的查询。示例如下:
# DiG command
resulting output from first zone
# DiG command
resulting output from second zone
我很乐意提供更多支持细节。不过,请解释一下我应该如何获取支持细节。
现在回到我那个可怕的问题:
我读过很多其他有关 ServerFault BIND9 DNS 不转发的问题和答案。对于我期望转发的 FQDN 的查询(使用 DiG),其响应就像公共互联网有权威答案一样。除了 DiG,我还可以使用哪些工具来跟踪我的 BIND9 配置?看来我尝试转发的区域没有转发。
具体来说,我在家里使用 VPN 来访问我的工作。我想访问我的家庭区域(myhome.com.,DNS 服务器位于 10.71.73.10)以及我的工作区域(mywork.com.,DNS 服务器位于 10.10.1.33)。
使用 DiG 查询 hostname.mywork.com,DiG 报告 AUTHORITY 为公共名称服务器。本地解析器似乎忽略了 BIND 转发区域 (db.mywork.com)。
In /etc/bind/zones/db.mywork.com
// forwards mywork queries to the mywork DNS servers
zone "mywork.com" {
type forward;
forwarders { 10.10.1.33; };
};
bind.conf:包括“/etc/bind/named.conf.options”;包括“/etc/bind/named.conf.local”;包括“/etc/bind/named.conf.default-zones”;包括“/etc/bind/rndc.key”;包括“/etc/bind/named.conf.logging”;
controls {
inet 127.0.0.1 port 953
allow { 127.0.0.1; } keys { "rndc-key"; };
};
命名的.conf.选项
acl goodclients {
10.71.73.0/24;
localhost;
localnets;
};
options {
directory "/var/cache/bind";
forwarders {
8.8.8.8; # Google DNS #1
8.8.4.4; # Google DNS #2
};
recursion yes;
allow-query { goodclients; };
dnssec-enable no;
auth-nxdomain no; # conform to RFC1035
listen-on-v6 { any; };
listen-on port 53 { localhost; };
};
和 named.conf.local
# Forward zone
zone "myhome.com." {
type master;
file "/etc/bind/zones/db.myhome.com";
};
# Reverse zone
zone "73.71.10.in-addr.arpa" IN {
type master;
notify no;
file "/etc/bind/zones/db.10";
};
答案1
编辑:我现在对域名服务器和解析器有了更多的经验。这个问题的根源在于一个区域有多个权威名称服务器。这意味着两个不同的名称服务器声称自己是解析特定区域(如“example.com”)的 DNS 查询的权威来源。名称服务器通过 SOA(权威起始)记录声称拥有权威,说“在 example.com 区域进行任何查询时都来找我。”
我曾使用公共域名(在此解释中为“example.com”)来指代公开可用的 URL(如 www.example.com = 183.34.22.82,它会被重定向并转换为某个私有地址,如 192.168.1.2)和私有 URL(private-server-1.example.com = 192.168.1.1)。我已指定两个不同的名称服务器对同一域拥有权限。第一个是公共 DNS(在我的情况下是 Cloudflare)。第二个是我的私有 DNS - 在内部私有 URL(private-dns-server-1.example.com)上运行的 BIND 服务器。我的本地网络(无处不在的 192.168.xx 地址)之外的计算机无法访问此服务器。
这种双 SOA 是可行的,但有点。当你在公共电脑上时,你很容易访问 www.example.com,因为你的公共电脑必须使用公共 DNS 作为“www.example.com 的 IP 地址是多少?”的权威答案。公共计算机无法访问其他权威机构(private-dns-server-1.example.com)。公共计算机不知道专用网络内的名称或 IP 地址。当您在工作时,在专用网络上(您有一个 IP 地址,如 192.168.1.32,其他一些范围也可以使用),您的计算机可能会从内部 private-dns-server-1.example.com 获取“www.example.com 的 IP”的答案。这会将您直接发送到 192.168.1.1,而不是将您发送到我上面使用的示例公共地址(183.34.22.82),然后重定向并转换为专用 192.168.1.1 地址。
听起来不错,但你得考虑一下 DNS 缓存。DNS 解析器(在 DNS 术语中是“客户端”)会存储先前的答案以供重复使用。这可以加快浏览速度,并减少服务器的整体负载。让我们重新运行上面的例子。
连接到机场公共 wifi 后,您浏览了 www.example.com。您的 DNS 解析器询问 Cloudflare,并返回 183.34.22.82。转换和重定向成功,您看到了自己的网页。
回到办公室后,您连接到办公室 wifi。您刷新了浏览器,但 DNS 查询仍将您指向 183.34.22.82,这可能与您直接访问 192.168.1.1 时的工作方式相同,也可能不同。在许多情况下,您会得到相同的网页。在某些情况下,您不会得到相同的行为。这就是问题所在。对似乎在某一时间以一种方式运行而在另一时间以另一种方式运行的东西进行故障排除可能是最困难的任务。
最好避免为单个区域设置多个权威名称服务器。BIND9 等 DNS 服务器有一些巧妙的结构来解决此问题。另一种方法是选择一个与外部区域分开的内部区域。这并不意味着您必须对每个人都是“example.com”,而在您的组织内部是“awful324.int”。您可以在“example.com”内开辟一个区域,如“int.example.com”作为您的内部地址。无论您选择什么,请确保您公开拥有它(即您已注册域名“awful324.com”),这样其他人就不会注册它并为该域名/区域创建授权起始 (SOA) 记录。
几年前,当我还在研究 Linux 和互联网协议时,我写了以下内容:
在这种情况下,我曾经tail
使用 来监控 /var/log/syslog 上的日志文件 $ tail -f /var/log/syslog
。我的配置存在多个问题:
- 我已将转发指令放在区域定义内。我将其移至
/etc/bind/named.conf.options
。 - 另一个问题是,一些公共 DNS 查询无法解析。通过监控 syslog 文件,我发现服务器的时间不同步。我
ntp
在服务器上进行了配置以解决此问题。