我在 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
Run Code Online (Sandbox Code Playgroud)
where10.88.94.1和8.8.8.8由 vpn dhcp10.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
Run Code Online (Sandbox Code Playgroud)
由于 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)
Run Code Online (Sandbox Code Playgroud)
在 Windows 和 OSX 上,相同的设置按预期工作(使用第一个 DNS 结果)。但不是在 Ubuntu 上。无论“非递归”标志如何,我都可以在 Ubuntu 中修复它以便正确处理权威响应,或者它完全损坏了,我无能为力吗?
您似乎期望的那种后备行为并不是 DNS 应该如何工作的一部分。仅当第一个名称服务器未响应或存在其他类型的网络错误时,才应联系 resolv.conf 中的第二个名称服务器。
微软显然已经做了他们自己的事情,它当然对你想做的事情很有用,但不应该依赖它来设置 VPN。微软还有一个想法,即针对不同的网络接口使用不同的名称解析。
如果您无法影响 VPN 配置,那么在 Linux 上最好的选择可能是设置您自己的名称服务器,该服务器决定按域将请求转发到哪里。