主机接入 VPN 后 VirtualBox 虚拟机的 DNS 就失效了
虚拟机有自己的解析器,NAT 也能用两种方式应答 DNS。依次检查适配器模式、解析器路径、主机解析器模式和 VPN 重连这四项。
VPN 一连上,内网应用在 Windows 主机上就能解析,而 VirtualBox NAT 后面的 Ubuntu 虚拟机却仍找不到它。虚拟机有自己的解析器,NAT 适配器处理 DNS 的方式也不止一种。把虚拟机的解析器换成公共服务器,普通网站能上、内网名称却失败,这只是把问题挪了地方而没有解决。按顺序做这四项检查,在第一项不成立处停下。
确认你调试的是哪种适配器模式
只有处于普通 NAT 模式的适配器才符合本文描述。桥接适配器带着自己的身份直接位于物理网络,NAT 网络是带 DHCP 与 DNS 设置的具名虚拟交换机,而虚拟机内部的 VPN 客户端会再加一个完全独立的解析器。继续往下读之前先确认模式,因为这几种情况下的修法各不相同。
一台虚拟机可以有两块不同模式的适配器,出问题的那块不一定是第一块。
也要确认主机到底能不能解析这个名字。在隧道开启的状态下,在主机上打开同一个应用,使用虚拟机将要使用的同一个完全限定名。如果主机也失败,问题就不在虚拟机,改虚拟网络也修不好。
用一个名字走一遍虚拟机的解析器
选一个内网名称和一个公网对照名称,两处各测一遍。公网名称能解析而内网名称不能,说明故障在内网路径上,而不是普遍的域名解析。只测内网名称,你就分不清是解析器坏了还是路由坏了。
在虚拟机里看解析器实际配置成用什么。运行 systemd-resolved 的 Ubuntu 虚拟机中,按链路状态会显示收到的服务器,而 resolv.conf 可能只有一条桩地址,这是正常的,不是可疑迹象。手工改过的文件或单独的加密 DNS 客户端会把查询发到完全别处。改动之前先把你看到的内容记下来。
resolvectl status
resolvectl query app.internal.example这里要把解析和连通性分开。地址能返回而服务仍不可达,这是路由或策略问题,不是 DNS 问题。
在那块适配器上试主机解析器模式
VirtualBox 的 NAT DNS 选项描述的是不同机制,一旦主机自身解析器随隧道改变,差别就显现出来。DNS 代理把虚拟机的请求转给它被指派的服务器。主机解析器模式拦截请求并调用主机的 DNS API,跟随被 VPN 客户端重新配置的 Windows 解析器的正是这个模式。
开了错误的机制,命令照样成功而行为不变,这是白丢一个下午的迷惑方式。
VBoxManage modifyvm "work-ubuntu" --natdnshostresolver1 on记下虚拟机当前设置,关机,然后针对先前确认的那块适配器。选项末尾的数字是适配器编号而不是常量,所以用到受影响适配器是第二块的那台机器上就是无声的空操作。启动虚拟机,检查它实际收到的解析器配置,因为虚拟机内的手工设置会压过 NAT 层提供的一切。记住主机解析器模式还假定主机自己的 DNS 路径就是你想共享的那条。
在 VPN 重连前后重跑同样的测试
在虚拟机里重做两次查询,然后打开真实应用,让它自己去验证证书。只测地址适合把域名解析单独隔出来,并不等于可用的 TLS 会话,所以不要停在 ping。然后在一个获批的时间窗内断开并重新连接主机隧道,再重复一次。只在启动后第一次连接时成立的行为属于要上报的生命周期问题,而不是换个解析器就能追的 DNS 谜案。
公网解析能用,并不能证明内网查询仍走在策略要求的路径上。
主机解析器模式什么都没改变时,把记录的配置放回去,并保留这四项观察:主机返回了什么、虚拟机返回了什么、适配器模式以及解析器状态。不可达的内网服务器、把虚拟机监控程序流量排除在外的过滤器以及虚拟机侧的覆盖设置,各自需要不同的纠正。把适配器改成桥接是改网络设计,不是重置 DNS。