TL; DR:
- 重新启动VM,以确保主机的VPN状态(已连接或已断开)在此期间保持不变;
- 让VirtualBox NAT引擎拦截DNS请求并将其转发到主机的解析器,即使用主机的DNS API查询信息并将其返回给来宾。您通过以下方式设置:
VBoxManage modifyvm "VM name" --natdnshostresolver1 on
每当VPN状态更改时,在连接VPN的主机中运行VM都会导致DNS问题。有两种情况:
- 虚拟机在连接了VPN的主机中生成,并且在某些时候VPN断开连接;
- 虚拟机在未连接VPN的主机中生成,并且在特定时刻VPN连接
1)VPN连接-> VPN断开
在这种情况下,VM可能已接收到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请求,因为主机不再与VPN连接,因此无法访问该IP
详细信息:
- 数据包将被发送到VirtualBox NAT网络定义的def GW,源NATTed(带有主机IP地址),最后由主机的路由表处理,该路由表会将其转发到您的家庭网关。
- 由于您的家庭网关在LAN端没有用于10.8.8.1的条目(专用地址),并且不能在WAN端转发(公用地址),因为它是专用地址,因此该数据包将被丢弃。
2)VPN断开-> VPN连接
在这种情况下,由于启动虚拟机时主机未连接到VPN,因此虚拟机将不会接收VPN网络提供商提供的DNS地址。检查的内容cat /etc/resolv.conf
。就我而言,我得到以下信息:
nameserver 192.168.178.1
<---这是我的家庭网关(路由器)
现在将主机连接到VPN连接:
- VM中的DNS配置不会更改-> VM仍将向目标IP 192.168.178.1发送DNS请求,该IP无法访问(但仍然可以ping通),因为现在VM正在处理来自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地址作为源(该btw以后将由家庭网关上的源NAT代替)并将VPN Server作为目标地址。
- 当数据包到达VPN网络时,将其解封装。现在,目标IP地址再次是VPN提供商网络无法访问的DNS地址192.168.178.1(除非特别确信,该地址与您的VPN网络提供商用于其DNS服务器的IP地址完全相同)。