VirtualBox的NAT模式

安装VirtualBox虚拟机的时候默认是采用NAT模式, 这种模式是专门用于需要在虚拟机中上网而设置的, 但他并不是直接将主机当成一个NAT服务器, 而是虚拟了一个这样的服务器. 虚拟机里面可以上网, 收邮件, 下载文件, 但是外界无法访问这台虚拟机, 准确说是根本不知道他的存在, 这个情形和网吧的情形类似, 但是也有区别.

像网吧这样的环境, 内部的机器访问网络也是通过NAT的, 这里说下NAT的原理, 当NAT服务器接收到一个数据包, 例如来自内部的一台机器, 访问目的是google.com. NAT服务器会将IP数据包中的来源地址改成自己的地址, 然后以NAT服务器的身份访问互联网, 当数据返回来的时候, 又将数据包的目的地址改成内部的那台机器并发送. 在外部网络看来, 只有NAT服务器在访问网络, 而不知道内部机器的存在.

VirtualBox给主机安装了一块虚拟的网卡, 如下

Windows IP 配置


以太网适配器 本地连接:

   连接特定的 DNS 后缀 . . . . . . . : domain
   本地链接 IPv6 地址. . . . . . . . : fe80::91b9:d21b:20e5:327d%12
   IPv4 地址 . . . . . . . . . . . . : 192.168.1.100
   子网掩码  . . . . . . . . . . . . : 255.255.255.0
   默认网关. . . . . . . . . . . . . : 192.168.1.1

以太网适配器 VirtualBox Host-Only Network:

   连接特定的 DNS 后缀 . . . . . . . :
   本地链接 IPv6 地址. . . . . . . . : fe80::99ca:58d5:daed:67c4%16
   IPv4 地址 . . . . . . . . . . . . : 192.168.56.1
   子网掩码  . . . . . . . . . . . . : 255.255.255.0
   默认网关. . . . . . . . . . . . . :

隧道适配器 本地连接* 7:

   媒体状态  . . . . . . . . . . . . : 媒体已断开
   连接特定的 DNS 后缀 . . . . . . . :

这样主机就有了两个本地IP地址, 相当于一台主机的两个身份, 而这个虚拟网卡正是充当了虚拟机网络的NAT服务器. 这种情况下本地连接所代表的身份和一切外网主机都看不到NAT后面的虚拟机, 所有这些虚拟机的流量在他们看来都是来自于虚拟网卡. 所以虚拟机可以ping通192.168.56.1和192.168.1.100一切所有互联网上的主机, 但是所有这些主机都只能看到192.168.56.1, 对背后的虚拟机则一无所知.

这里面有一个不好理解的是, 如果在本机上ping虚拟机, 是以192.168.1.100的身份去ping还是以192.168.56.1的身份去ping ? 如果是后者, 应该ping的通, 如果是前者, 那就ping不通, 从结果来看, 是前者.

关于ping命令的身份问题, 一个答案是ping的时候数据包会走网关优先级高的网卡。实际上我们可以手动指定用那一块网卡来ping. 这里想到一个问题, 如果以192.168.56.1的身份去ping虚拟机, 是否ping的通, 我试过了, ping不通. 虽然虚拟机可以ping 192.168.56.1, 但是这种ping实际上是间接实现的, 即真正进行ping的时候, 是192.168.56.1, 即虚拟机并没有直接ping 192.168.56.1, 尽管他们是直连的, 即虚拟机对任何主机的访问都是通过192.168.56.1, 即使访问的对象就是192.168.56.1本身. 这的确很费解.

这里面NAT和内部主机的连接显然是被动的, 只有内部网络首先向外部网络发起了请求, 并且产生了响应, NAT才会向虚拟机发送数据, 没有这个前提, NAT和虚拟机无法通信. 所以没法用NAT去ping虚拟主机. 这就是所谓"NAT场合下的单向Ping通". 总之任何主机包括NAT服务器对这个隐藏网络的访问只能到NAT为止.

控制面板中的NAT虚拟网卡: