个人理解,如有错误,欢迎指正。
1. 桥接网络
虚拟机的网卡桥接到宿主机的物理网卡,不解释。
2. 仅主机(Host-Only)网络
如果你新建一个这样的网络,两样东西会创建:一个是VirtualBox内部的交换机,如图中的"hostonly交换机";另一个是你的宿主机下的虚拟网卡,如上图中的"hostonly网卡"。
windows实际如下图:
hostonly网卡和hostonly交换机实现了一个局域网,虚拟机、宿主机都在同一个网段,可以互相通信。
虚拟机需要这个设置才能访问外网。
注意:
- 防火墙得合理配置,或者关了,否则大概率是不通的;
- hostonly交换机默认使能DHCP,各个网卡默认都有IP,乱改会导致不通;
- VirtualBox可以新建很多这种网络,每个网络都有自己的虚拟网卡和一个对应的hostonly交换机。每个虚拟机都可以选择加入哪个仅主机(Host-Only)网络;
3. 网络地址转换(NAT)
这种网络不会创建虚拟网卡,取而代之的是一个守护进程,如上图中的"VirtualBox守护进程";和一个路由器,如上图中的"NAT路由器"。
ubuntu1、ubuntu2位于同一个网段内,它们可以互通。如果没配端口映射,它们不能访问外网;
NAT路由器使用端口映射来实现内网和外网的互通。设置方法如下:
NAT转换举例:
ubuntu1-IP:192.168.1.100
ubuntu2-IP:192.168.1.101
远端IP:172.100.11.230
NAT路由器IP:172.100.11.231
NAT路由器端口映射:
规则 | 方向 | IP | 源端口 | 目的端口 | 备注 | |
规则1 | 私网->公网 | 私网IP | 192.168.1.100 | 5000 | - | 私网到公网,私网IP转成公网IP,源端口转成公网端口,目的端口不管 |
公网IP | 172.100.11.231 | 6000 | - | |||
公网->私网 | 公网IP | 172.100.11.231 | - | 6000 | 公网到私网,先看目的端口,如果是6000就转成5000并就发给192.168.1.100,源端口不管 | |
私网IP | 192.168.1.100 | - | 5000 | |||
规则2 | 私网->公网 | 私网IP | 192.168.1.101 | 5000 | - | 私网到公网,私网IP转成公网IP,源端口转成公网端口,目的端口不管 |
公网IP | 172.100.11.231 | 6001 | - | |||
公网->私网 | 公网IP | 172.100.11.231 | - | 6001 | 公网到私网,先看目的端口,如果是6001就转成5000并就发给192.168.1.101,源端口不管 | |
私网IP | 192.168.1.101 | - | 5000 |
下表展示了ubuntu1与HTTP服务器的通信过程:
主机 | 源IP | 目的IP | 源端口 | 目的端口 | 备注 |
ubuntu1发送 | 192.168.1.100 | 127.0.0.1 | 5000 | 80 | - |
ubuntu1的TCP/IP协议栈接收 | 192.168.1.100 | 127.0.0.1 | 5000 | 80 | - |
ubuntu1的TCP/IP协议栈发送 | 192.168.1.100 | 127.0.0.1 | 5000 | 80 | ubuntu1的TCP/IP协议栈发现目的IP是本地(127.0.0.1),但是本地进程没有谁在监听80端口,于是只能发往外部 |
NAT路由器接收 | 192.168.1.100 | 127.0.0.1 | 5000 | 80 | - |
NAT路由器发送 | 127.0.0.1 | 127.0.0.1 | 6000 | 80 | 私网到公网,私网IP转成公网IP,源端口转成公网端口,目的端口不管 |
VirtualBox守护进程接收 | 127.0.0.1 | 127.0.0.1 | 6000 | 80 | - |
VirtualBox守护进程发送 | 127.0.0.1 | 127.0.0.1 | 6000 | 80 | - |
宿主机的TCP/IP协议栈接收 | 127.0.0.1 | 127.0.0.1 | 6000 | 80 | - |
宿主机的TCP/IP协议栈发送 | 127.0.0.1 | 127.0.0.1 | 6000 | 80 | 这包是发给本地的,那么本地谁在监听80端口?是HTTP服务器 |
HTTP服务器接收 | 127.0.0.1 | 127.0.0.1 | 6000 | 80 | - |
HTTP服务器发送 | 127.0.0.1 | 127.0.0.1 | 80 | 6000 | HTTP服务器给客户端返回数据 |
宿主机的TCP/IP协议栈接收 | 127.0.0.1 | 127.0.0.1 | 80 | 6000 | - |
宿主机的TCP/IP协议栈发送 | 127.0.0.1 | 127.0.0.1 | 80 | 6000 | 本地只有VirtualBox守护进程在监听6000端口,所以发给它 |
VirtualBox守护进程接收 | 127.0.0.1 | 127.0.0.1 | 80 | 6000 | - |
VirtualBox守护进程发送 | 127.0.0.1 | 127.0.0.1 | 80 | 6000 | - |
NAT路由器接收 | 127.0.0.1 | 127.0.0.1 | 80 | 6000 | - |
NAT路由器发送 | 127.0.0.1 | 192.168.1.100 | 80 | 5000 | NAT路由器查询映射表,发现公网127.0.0.1:6000映射到私网192.168.1.100:5000。于是就把目的端口改成5000,目的IP改成192.168.1.100 |
ubuntu1接收 | 127.0.0.1 | 192.168.1.100 | 80 | 5000 | - |
注意:
- 上面这个例子仅仅是虚拟机访问宿主机的本地HTTP服务器,实际上,它还可以通过网卡1、2访问 公网上的HTTP服务器,这就是真正的上网了;
- NAT映射中,私网端口是可以一样的,公网端口必须唯一;
- 即便配了端口转发,内网和外网的主机也是不能ping通的,因为ping协议没有端口号,NAT无法转发;
- 路由器出来的数据照理是要走网卡->TCP/IP协议栈->进程的,但是VirtualBox中的NAT路由器并不是标准的路由器,它的公网端并不是一个以太网接口,而是一个进程通信接口,可以直接和VirtualBox守护进程通信。
4. NAT网络
基本功能跟"网络地址转换(NAT)"是一样的,区别在于它可以有很多个。也就是说,你可以建立很多个NAT路由器,各个虚拟机可以选择加入哪个NAT路由器,然后每个NAT路由器都通过各自的VirtualBox守护进程连接宿主机。
建立方法如下:
5. 内部网络
这个很好理解,就是一根网线把两个虚拟机的网卡连接起来。下图中的intnet就是一根网线,你可以新建很多网线。
注意:
- 它不能连接到宿主机的任何网卡;
- 当网线有多根且每根网线的网段都不一样的时候,你需要用VirtualBox的命令行来设置些东西才能让它们都用起来,很麻烦。
6. 通用驱动
这个不懂了,从来没用过,以后用到了再写。
7. 和VMWare的区别
VMWare | VirtualBox | 区别 |
桥接 | 桥接 | 无 |
仅主机模式+自定义 | 仅主机(Host-Only)网络 | 无 |
LAN区段 | 内部网络 | VMWare好用,不需要命令行 |
NAT模式 | 网络地址转换(NAT) | VMWare不像VirtualBox那样用守护进程来通信,而是新建一个虚拟网卡,像真机那样连接 |
VMWare的拓扑图如下: