![连接到 VPN 时网络仅使用一个 DNS](https://linux22.com/image/852620/%E8%BF%9E%E6%8E%A5%E5%88%B0%20VPN%20%E6%97%B6%E7%BD%91%E7%BB%9C%E4%BB%85%E4%BD%BF%E7%94%A8%E4%B8%80%E4%B8%AA%20DNS.png)
我公司有需要连接的 VPN。在 OSX 中,我使用openvpn
以下配置来实现此目的:
client
dev tun
proto udp
remote <GATEWAY_ADDRESS> <PORT>
resolv-retry infinite
nobind
user nobody
group nobody
persist-key
persist-tun
ca /Users/Tommy/.openvpn/dev/ca-dev.crt
cert /Users/Tommy/.openvpn/dev/tommy.brunn-20131122-dev.crt
key /Users/Tommy/.openvpn/dev/tommy.brunn-20131122-dev.key
ns-cert-type server
tls-auth /Users/Tommy/.openvpn/dev/ta-dev.key 1
cipher BF-CBC
comp-lzo
verb 3
auth-nocache
;daemon
;writepid openvpn.pid
在 Ubuntu 中,我安装network-manager-openvpn
并添加了一个新的 VPN 连接(尝试导入配置文件导致崩溃),并使用相同的配置选项设置:我的设置的截图
一旦我连接到 VPN,我无法解析任何域名。
如果我编辑/etc/NetworkManager/NetworkManager.conf
,注释掉该行dns=dnsmasq
并重新启动network-manager
,我可以解析公司的内部域,但其他域(如 google.com)根本无法解析。我已确保在网络管理器的 IPv4 和 IPv6 选项卡中将 VPN 连接的“方法”设置为“仅自动(VPN)地址”,但似乎没有任何区别。
我也尝试过重新启用dnsmasq
和修改/etc/resolvconf/resolv.conf.d/base
以包含nameserver 127.0.1.1
,然后运行sudo resolveconf -u
,但没有域会再次解析。
我希望能够连接到我的 VPN,以便我公司的 DNS 服务器推送的域名能够通过这种方式进行解析,并且所有其他域名都能正常解析。
编辑:结果发现 dnsmasq 实际上并未安装,我以为默认情况下会安装。然而,如果我安装它,在 中重新启用它/etc/NetworkManager/NetworkManager.conf
,在 中添加本地名称服务器地址/etc/resolvconf/resolv.conf.d/base
,重新启动所有服务并连接到 VPN,我可以从公司 DNS 解析域,但无法解析任何其他域。所以基本上与我完全禁用 dnsmasq 时的情况相同。
编辑:内容/etc/dnsmasq.conf
:http://paste.ubuntu.com/7297231/
答案1
从您的配置来看,您的 dnsmasq 安装正在从 获取要使用的 DNS 服务器列表/etc/resolv.conf
。默认情况下,dnsmasq 会尝试优先使用已启动的 DNS 服务器,但只会将给定请求发送到单个 DNS 服务器。如果您有多个 DNS 服务器,而这些服务器只能/只会处理某些查询,则这可能会导致问题。
我相信您可以通过确保您的 LAN 上有一个 DNS 服务器(未连接到 VPN 时使用的服务器)/etc/resolv.conf
以及您想要通过 VPN 使用的公司网络上的 DNS 服务器来解决此问题。
然后,您将需要编辑/etc/default/dnsmasq
并添加或编辑该DNSMASQ_OPTS=
行以包含--all-servers
。
如果使用此设置仍无法获取 DNS 查询,请将在上述步骤中创建的 resolv.conf 文件复制到另一个位置,例如~/resolv.conf
,使用/etc/resolv.conf
进行设置nameserver 127.0.0.1
并在 中设置以下选项/etc/dnsmasq.conf
:
resolv-file=/home/your_username/resolv.conf
这应该配置您的系统以查询您的 dnsmasq 安装的 DNS,并且它将依次使用您的本地 DNS 服务器和 VPN DNS 服务器进行每个查询。
编辑:您可以使用该工具找到当前用于特定连接的 DNS 服务器nmcli
。为了查找我的无线连接使用的 DNS 服务器,我使用了以下语法:
nmcli dev list iface wlan0 | grep IP4.DNS
如果您在未连接到 VPN 时运行此命令,然后在连接并能够解析公司地址时再次运行此命令,则应该可以关闭和打开 VPN 来获取 DNS 服务器列表。希望这对您有所帮助。
编辑2:查看您的路由表,似乎您的 VPN 管理员已将您设置为在您连接时通过 VPN 路由所有流量(您的默认网关更改为 VPN 地址)。由于您的两个 DNS 服务器都是公共地址,并且在您使用 VPN 时都没有设置特定路由,因此您尝试通过 VPN 进行正常的 DNS 查找,但结果失败了。
您可以通过多种方式来实现此功能,具体取决于您的 VPN 设置:
如果 VPN 允许您通过公司网络访问互联网,但不对互联网上的服务器执行 DNS 查询,
sudo route add -host 83.255.245.11 gw 192.168.0.1
请sudo route add -host 193.150.193.150 gw 192.168.0.1
在连接到 VPN 后像这样向您的 DNS 服务器添加路由:。如果 VPN 不允许您通过公司网络访问互联网,则您需要在连接到 VPN 后将计算机上的默认网关设置更改为指向 192.168.0.1。在这种情况下,您需要设置常用的默认网关,然后添加网络路由以访问仅支持 VPN 的设备。
您可能需要将第二个 pastebin 中显示的连接到 VPN 案例中的路由表缩小到以下内容:
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.0.1 0.0.0.0 UG 0 0 0 eth0
192.168.0.0 0.0.0.0 255.255.255.0 U 1 0 0 eth0
10.100.0.0 10.100.0.105 255.255.255.0 UGH 0 0 0 tun0
10.100.0.105 0.0.0.0 255.255.255.255 UH 0 0 0 tun0
然后,根据需要添加路由以访问公司设备。在上面显示的路由表中,我假设 VPN 上的网络为 /24,这可能不正确。您必须适当地设置掩码。
答案2
关于如何让 NetworkManager 为您协调事物,有些空白我无法为您填补。不过,我会尝试阐明它协调的事物需要如何工作。这不是一个完美的答案,但希望有用。实际上,鉴于这是一个老问题,这确实是为了后人着想。
您可能不想使用企业 VPN,除非要连接到企业网络。在这种情况下,如果您的 VPN 设置仅将适当的网络范围路由到 VPN,并保持默认路由指向您的本地路由器,就像以前一样,那就更好了。如果公司将他们的 VPN 设置为仅路由流量或他们的网络,那就太好了,但不幸的是,这种情况似乎很少见。幸运的是,您可以在本地设置中配置路由。
这仍然会给您带来潜在的 DNS 问题。jtk123 关于 dnsmasq 对 DNS 的操作的评论并非针对 dnsmasq - DNS 的工作方式就是这样。如果 DNS 客户端或中间解析器收到 DNS 条目不存在的响应,则回退到询问另一个 DNS 服务器不是正常行为。这意味着您需要一个 DNS 解析器,无论请求是否与公司网络相关,它都会按照您的意愿进行回答。
也许您的公司网络可以回答与更广泛的互联网相关的 DNS 查询,在这种情况下,您只需使用它,这可能没问题。否则,您需要一个本地 DNS 服务器,它将与公司相关的域的请求转发到他们的 DNS 服务器,并根据需要将其他请求转发到其他地方。
可以指示 dnsmasq 将特定域的请求转发到特定的上游 DNS 服务器。例如,请参阅 dnsmasq.conf 手册页中概述的 --server 选项。但我不清楚如何让 networkmanager 与此配合良好(这是我目前正在寻找的)。