题 如何在Ubuntu中正确配置DNS使用?没有RA标志的权威答案将被忽略


我从Virtualbox中安装的官方网站上获得了64位最新的Ubuntu 14.04.1。我使用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中修复的东西,以便正确处理权威响应而不管“非递归”标志还是它完全被破坏,我无能为力?


5
2017-09-19 09:28




您是否尝试过该DNS服务器,忽略所有其他服务器?如果做不到这一点,我会尝试设置自己的DNS存根,指向该域的10.88 .. - Grizly
@Grizly这两个DNS服务器都是公司的,不受我的控制。是否有任何改变客户端行为的方法,因此它将更符合RFC(权威答案不需要递归)。 - grigoryvp
这很奇怪。我刚刚在Fedora 19中尝试了相同的配置,没有任何问题,即使它们不是递归的,也可以接受权威的答案。名称解析由glibc执行,这在所有linux上都很常见(版本可能会有所不同),所以我不明白你遇到这些问题的原因。 - Migtor
作为解决方法,您可以在客户端计算机上安装本地dnscache。一个非常容易配置的是dnsmasq:您可以将其设置为根据域等转发查询。 - Migtor
@Migtor,是的,这就是我的意思。 ;-) - Grizly


答案:


您似乎期望的那种回退行为不是DNS应该如何工作的一部分。只有在第一个没有响应或存在其他类型的网络错误的情况下,才应联系resolv.conf中的第二个名称服务器。

微软显然已经做了自己的事情,它肯定对你要做的事情有用,但不应该依赖它来设置VPN。 Microsoft还有一种为不同的网络接口使用不同名称解析的概念。

如果您无法影响VPN配置,那么您在Linux上的最佳选择可能是设置自己的名称服务器,该服务器决定将域请求转发到何处。


4
2017-09-24 22:55



是否有任何RFC或文档说明客户端如何在没有RA标志的情况下对权威响应作出反应? - grigoryvp
@ mc0e,但如果我理解正确,主要问题是第一个有效的DNS响应被丢弃,显然是因为非递归(只是可能)。另外,让我感到困惑的是,我无法重现这些问题。 Glibc到处都应该做同样的事情...... - Migtor
@Migtor我认为你会发现它不是glibc,而是一个单独的解析器库,也许是ISC作为bind的一部分分发的库,尽管可能是由ubuntu单独打包的。从IPv6开始,也可能涉及lwresd。 nslookup的行为看起来不像标准的解析器行为,但它不是标准的解析器,它是一个诊断工具。 (它也早已被弃用)。 - mc0e
@ mc0e但我想@EyeofHell除了进行了其他测试 nslookup 并经历了相同的行为......例如a ping 将使用标准库解析。通常我用 dig 用于调试DNS问题,或 dnsq 如果安装了djbdns。你能用其他工具@EyeofHell重现这种行为吗? - Migtor


为了使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递归)。


0
2017-09-24 16:37



这是不正确的。如果名字服务器完全回答,则不查询第二个名称服务器。 - mc0e