我在数据中心设置了一个 OpenVPN 服务器,并使用 tunnelblick 作为客户端。连接后,它会将路由添加到我的 DC LAN 10.0.0.0/24 网络,并使用 10.0.0.1 作为主 DNS,8.8.8.8 作为辅助 DNS。
10.0.0.1 在 dc.example.com 中托管我的子域名 DNS 条目
问题是当 VPN 隧道建立时,DNS 解析不一致。
据我检查,/etc/resolve.conf 和“系统偏好设置 - 网络 - DNS 服务器”都显示相同的结果,即预期的“10.0.0.1”和“8.8.8.8”。
然而,在终端中,我得到了“dig”和“ping”的混合结果。对于 dig,我可以得到类似
➜ ~ dig ftp.dc.example.com
; <<>> DiG 9.8.3-P1 <<>> ftp.dc.example.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 22990
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
;ftp.dc.example.com. IN A
;; ANSWER SECTION:
ftp.dc.example.com. 3600 IN A 10.0.1.13
;; Query time: 84 msec
;; SERVER: 10.0.0.1#53(10.0.0.1)
;; WHEN: Thu Nov 24 15:39:21 2016
;; MSG SIZE rcvd: 55
但 ping 的时候我
➜ ~ ping ftp.dc.example.com
ping: cannot resolve ftp.dc.example.com: Unknown host
而在浏览器等其他应用程序中,我得到了与“ping”相同的结果,基本上无法解析。
如您所见,没有网络问题或 DNS 服务器问题,否则“dig”将不起作用。
但是,如果我查询“www.google.com”,那么“ping”和“dig”都可以。
因此,当 VPN 连接建立时,resolve.conf 似乎会相应更新,但某些应用程序可能仍在查询旧的 DNS 服务器。
我尝试重新打开终端应用程序,或使用 iTerm 等其他终端,结果相同。但如果我等待一段时间,比如 10-15 分钟,ping 和浏览器就会正常工作。
答案1
当 OS X 配置了多个 DNS 服务器(例如 10.0.0.1 和 8.8.8.8)时,系统解析器不会将它们视为主服务器或次服务器,而是会使用所有服务器。因此,当您尝试访问 ftp.dc.example.com 时,它可能会尝试使用 10.0.0.1 服务器查找该名称(并成功),或者可能会尝试使用 8.8.8.8 服务器(并失败)。它对任何给定查找使用哪一个服务器或多或少是随机的。
我知道的唯一解决方案是不将 DNS 服务器包含在列表中,除非您希望它使用它们。在这种情况下,这意味着使用 10.0.0.1仅有的,而不是 8.8.8.8。
顺便说一句,、、dig
和host
不nslookup
通过系统解析器,因此不会以相同的方式运行——除非您明确告诉它们查询不同的服务器,否则它们都使用第一个列出的 DNS 服务器。
答案2
这似乎表明您受到了 OS X 的 DNS 缓存的影响。您可能需要手动刷新 VPN 连接的客户端“up”脚本中的缓存。本文可能对您有所帮助http://osxdaily.com/2014/11/20/flush-dns-cache-mac-os-x/
答案3
虽然有点晚了,但当我在寻找与 VPN 结合的 DNS 问题时,Google 一直向我指出了这个问题。VPN 设置对我来说的问题是 OSX 不使用 /etc/resolv.conf,而是使用可通过 scutil 访问的信息。
您可以通过 查看当前的 DNS 配置scutil --dns
。在我的例子中,它列出了一些来自 VPN 网络的内部 DNS 服务器,我们用于解析:
DNS configuration
resolver #1
nameserver[0] : 80.84.224.26
nameserver[1] : 80.84.224.249
flags : Request A records
reach : 0x00000002 (Reachable)
...
它适用于 VPN 上的查找,但不允许我访问其他任何内容。由于我对按名称访问这些内容不感兴趣,因此我使用 sc-util 将此处列出的 DNS 条目替换为公共条目:
scutil
> open
> d.init
> get State:/Network/Service/FctVpnService/DNS
> d.add ServerAddresses * 8.8.8.8 9.9.9.9
> set State:/Network/Service/FctVpnService/DNS
> exit
现在当我scutil --dns
再次使用时,它应该显示刚刚配置的服务器地址:
resolver #1
nameserver[0] : 8.8.8.8
nameserver[1] : 9.9.9.9
flags : Request A records
reach : 0x00000002 (Reachable)
注意:FctVpnService
这可能不是正确的密钥,您可能需要为您的环境搜索正确的密钥。您可以list
在启动后通过调用命令来找到密钥scutil
。