我在 VirtualBox 中拥有 Ubuntu 客户操作系统,并使用 eth0 的默认 NAT。
在办公室和家里都可以正常工作,除了在家里使用办公室 VPN 时。
当主机操作系统 (Windows 7) 连接到 VPN 时,DNS 查找在 Virtualbox 客户机中不起作用。DNS 查找在主机上正常。在 Virtualbox 中,我可以直接 ping VPN 内部和外部的 IP,因此这不是连接问题。
/etc/resolv.conf
根据和,Ubuntu 客户机似乎正在使用 localhost 作为 DNS 入口点nslookup
。因此,看起来本地某些东西正在分派到其他底层 DNS。
我该如何解决这个问题?
答案1
由于某种原因,这有效
C:\...\VirtualBox\VBoxManage modifyvm "VM name" --natdnshostresolver1 on
我怀疑这是因为当 VPN 处于活动状态时,主机除了将请求转发到 VirtualBox 从 Windows 配置中获取的指定 DNS 服务器之外,还对 DNS 查找执行一些特殊操作。
答案2
总结:
- 重新启动虚拟机,确保主机的 VPN 状态(连接或断开连接)在此期间不会改变;
- 让 VirtualBox NAT 引擎拦截 DNS 请求并将其转发到主机的解析器,即使用主机的 DNS API 查询信息并将其返回给客户机。您可以通过以下方式设置:
VBoxManage modifyvm "VM name" --natdnshostresolver1 on
在连接到 VPN 的主机上运行虚拟机可能会导致每次 VPN 状态发生变化时都出现 DNS 问题。有两种情况:
- VM 在 VPN 连接的主机中生成,并且在某个时间点 VPN 断开连接;
- VM 在非 VPN 连接的主机中生成,并且在某个时刻 VPN 连接
1) VPN 连接 --> VPN 断开连接
在这种情况下,虚拟机可能会收到属于 VPN 提供商网络的 DNS 地址。这通常是内部私有 IP 地址。检查 的内容cat /etc/resolv.conf
。就我而言,我得到了以下内容:
nameserver 10.8.8.1
<--- 这是 VPN 提供商网络的内部
nameserver 192.168.178.1
<--- 这是我的家庭网关(路由器)
现在断开主机与 VPN 连接:
- VM 中的 DNS 配置不会改变 --> VM 仍将向目标 IP 10.8.8.1 发送 DNS 请求,但该 IP 无法到达,因为主机不再连接到 VPN
详细信息:
- 数据包将被发送到 VirtualBox NAT 网络定义的 def GW,进行源 NATT(使用主机 IP 地址),最后由主机的路由表处理并将其转发到您的家庭网关。
- 这里数据包将被丢弃,因为您的家庭网关在 LAN 端(私有地址)没有 10.8.8.1 的条目,并且无法在 WAN 端(公共地址)将其转发为私有地址。
2)VPN 断开 --> VPN 连接
在这种情况下,VM 将不会收到 VPN 网络提供商的 DNS 地址,因为 VM 启动时主机未连接到 VPN。检查 的内容cat /etc/resolv.conf
。就我而言,我得到了以下内容:
nameserver 192.168.178.1
<--- 这是我的家庭网关(路由器)
现在将主机连接到 VPN 连接:
- VM 中的 DNS 配置不会改变 --> VM 仍会向无法访问的目标 IP 192.168.178.1 发送 DNS 请求(但 ping 仍然有效),因为现在来自 VM 的 DNS 请求由 VPN Tap 接口处理,该接口会将数据包转发到无法访问 192.168.178.1(您的内部家庭网关 IP 地址)的 VPN 网络。
详细信息:
- 数据包将被发送到 VirtualBox NAT 网络定义的 def GW,发送到 VPN Tap 接口,该接口将修改 IP 标头,将 VM IP 源地址替换为 VPN 网络分配给主机的 IP 地址,而目标地址仍然是 DNS 地址 192.168.178.1。
- 然后,该数据包将被封装在外部 IP 标头中,该标头将以主机 IP 地址作为源(顺便说一下,该地址稍后将被家庭网关上的源 NAT 替换),并以 VPN 服务器作为目标地址。
- 当数据包到达 VPN 网络时,它会被解封装。目标 IP 地址现在又变成了 VPN 提供商网络无法到达的 DNS 地址 192.168.178.1(除非碰巧这个 IP 地址与您的 VPN 网络提供商的 DNS 服务器使用的 IP 地址完全相同)。
答案3
我在 Lubuntu 16.04 上遇到了非常类似的情况(在其他 Ubuntu 上应该也一样),但这个修复并没有改善这种情况。至少在 16.04 中,问题似乎是 NetworkManager 使用本地 DNS 代理(dnsmasq),这在 VPN 连接中效果不佳,至少在默认配置下是这样。
在 /etc/NetworkManager/NetworkManager.conf 中注释/删除 dns=dnsmasq
[main]
plugins=ifupdown,keyfile,ofono
# dns=dnsmasq
可能有一种方法可以配置 dnsmasq,但这会给予(我)对主机(dns 等)同等的访问权限,所以我没有调查。YMMV。