我在 Virtualbox 中安装了官方网站上最新的 Ubuntu 14.04.1 64 位。我使用 vpnc 连接到 VPN 网络,该网络使用 DHCP 设置了 2 个 DNS 服务器:
user@virtual:~$ cat /etc/resolv.conf
# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
nameserver 10.88.94.1
nameserver 8.8.8.8
nameserver 10.40.0.1
其中10.88.94.1
和8.8.8.8
由 vpn dhcp 返回,10.40.0.1
由 lan dhcp 返回。vpn dhcp 返回的第一个 DNS 服务器被配置为某些内部名称的权威、非递归名称服务器。
问题是 - Ubuntu 以某种方式忽略了权威标志并丢弃有效响应,因为它是非递归的:
user@virtual:~$ nslookup
> video.something.com
;; Got recursion not available from 10.88.94.1, trying next server
Server: 8.8.8.8
Address: 8.8.8.8#53
Non-authoritative answer:
Name: video.something.com
Address: 180.112.94.1
正如 tcpdump 清楚地显示的那样,第一个 DNS 服务器的答案设置了“权威”标志,但不知何故它被忽略了(第二个响应中的“*”代表“权威”,“-”代表“非递归”):
13:23:44.505098 IP 10.40.130.209.44159 > 10.88.94.1.domain: 63790+ A? video.something.com. (32)
13:23:44.506285 IP 10.88.94.1.domain > 10.40.130.209.44159: 63790*- 1/0/0 A 10.88.94.12 (48)
13:23:44.506390 IP 10.40.130.209.45437 > 8.8.8.8.domain: 63790+ A? video.something.com. (32)
13:23:44.608414 IP 8.8.8.8.domain > 10.40.130.209.45437: 63790 1/0/0 A 180.112.94.1 (48)
相同的设置在 Windows 和 OSX 上均按预期工作(使用第一个 DNS 结果)。但在 Ubuntu 上却不行。我可以在 Ubuntu 中修复这个问题,以便无论“非递归”标志如何都能正确处理权威响应,还是它完全坏了,我无能为力?
答案1
您似乎期望的那种后备行为并不是 DNS 应有的工作方式。只有当第一个名称服务器没有响应或出现其他类型的网络错误时,才应联系 resolv.conf 中的第二个名称服务器。
微软显然已经做了他们自己的事情,它对于您要做的事情肯定很有用,但不应该依赖于它来设置 VPN。微软还提出了对不同网络接口使用不同名称解析的想法。
如果您无法影响 VPN 配置,那么在 Linux 上最好的选择可能是设置您自己的名称服务器,由它来决定按域将请求转发到哪里。
答案2
为了使 DNS 递归适用于 Ubuntu bind9 服务器,您需要确保 DNS 服务器上的 /etc/bind/named.conf.options 中包含以下行:
recursion yes;
allow-recursion { any; };
话虽如此,您声称您无权访问 DNS 服务器。在这种情况下,您是否考虑过更改 DNS 服务器的顺序?例如,如果您将最后一个 DNS 条目设置为...
nameserver 10.40.0.1
并将其放入 /etc/resolvconf/resolv.conf.d/head 文件中,然后运行该resolvconf -u
命令,该条目将自动添加到 /etc/resolv.conf 的顶部。这样做的目的是使 10.40.0.1 成为第一个要使用的 DNS 服务器,然后它会检查 VPN 记录(假设 10.40.0.1 允许 DNS 递归)。