VirtualBox 网络连接方式研究(二)
本文由本人(六六Coding的地方)翻译自VirtualBox官方文档,尊重知识产权转载请注明出处。谢谢!
官方:https://www.virtualbox.org/manual/ch06.html
目录:
1.1 虚拟化网络硬件
1.2 网络模式介绍
1.3 Network Address Translation(NAT)
1.3.1 配置NAT端口转换
1.3.2 NAT模式的局限性
1.4 Network Address Translation Service
1.5 桥接网络(Bridged Networking)
1.6 内部网络(Internal networking)
1.7 仅主机模式(Host-only networking)
1.8 UDP通道网络(UDP Tunnel networking)
1.9 VDE networking
1.10 限制I/O网络的带宽
1.11 提高网络性能
接上篇:VirtualBox 网络连接方式研究(一)
1.5 桥接网络(Bridged Networking)
在桥接网络模式下,VirtualBox在你的物理主机上启用了一个设备驱动,用以过滤从物理网络适配器中过来的数据。因此这个驱动被称为“网络过滤”设备。它允许VirtualBox拦截物理网络数据和注入数据有效地在软件中创建一个新的网络接口。当虚拟机在应用这个新的软件接口时,看起来就好像是虚拟机物理地连接到了网线上:物理主机可以通过这个接口与虚拟机进行数据的收发。这意味着你可以在虚拟机和网络之间设置路由和“桥梁”。
Note
桥接无线接口和桥接有线接口是完全不同的,因为大多数无线适配器不支持混合模式。所有通信必须使用主机的无线适配器的MAC地址,因此VirtualBox需要将传出包的以太网报头取代源MAC地址,以确保回复将发送到主机接口。当VirtualBox收到一个带有目标IP的传入包时,比对IP从属于虚拟机适配器,VirtualBox将会把以太网报头的目标MAC地址替换到虚拟机适配器的MAC地址中,并接收数据包。为了获取虚拟机的IP地址,VirtualBox会检查ARP和DHCP数据包。
桥接网络的局限性取决于你的物理主机操作系统:
* Macintosh 主机。使用AirPort(Mac的无线网络)时功能受限。目前的VirtualBox只支持IPv4和IPv6的AirPort。如果要使用其他协议(比如IPX),你必须选择有线接口。
* Linux主机。应用无线接口是功能受限,目前的VirtualBox只支持IPv4和IPv6的无线。如果要使用其他协议(比如IPX),你必须选择有线接口。
此外,Marvell Yukon II EC Ultra Ethernet NIC上的sky2提供的有线接口中把MTU设置为小于1500字节,将会导致丢包现象。
Linux 内核2.6.27版本不允许通过VLAN适配器实现虚拟机与外部网络之间的中继,Linux以外的操作系统亦然。
* Solaris主机。不支持使用无线接口。因为Solaris子系统的技术限制,不能完全支持用IPFilter进行虚拟机通信过滤。这些问题将在未来的Solaris 11版本中得到解决。
从VirtualBox4.1开始,在Solaris11的物理主机上(build159及以上版本),无需任何配置就可以通过Solaris的Crossbow Virtual Network Interfaces (VNICs) 直接与VirtualBox相连,但VNIC需单独地与虚拟机网络接口对应。
从VirtualBox2.0.4开始到VirtualBox 4.0,VNIC可被使用,但具有以下注意事项:
1)将VNIC无法在多个虚拟机网络接口间共享,即每个虚拟机网络接口都必须有自己独有的VNIC
2) 使用VNIC虚拟网卡和虚拟机VNIC网络接口必须有相同的MAC地址。
使用VLAN接口与VirtualBox时,他们必须根据PPA-hack命名方案(如“e1000g513001”)来命名,否则虚拟机可能会以错误的格式接收数据包。
1.6 内部网络(Internal networking)
内部网络模式类似于桥接网络模式那样可以直接与“外部网络”通信。这里的“外部网络”是指连接在内网中的同一台物理主机上的其他虚拟机。
从技术层面上说,内部网络实现网络连接需求,桥接网络模式也可以实现。但是应用内部网络模式能够提高安全性。在桥接网络模式中,所有的数据通信都需要通过主机系统的物理接口。因此可以添加一个数据嗅探器(类似Wireshark)到主机接口和所有通过的数据的日志中。如果你想实现一台机器上的多台虚拟机之间的私下通信,并向物理主机和用户隐藏虚拟机的数据的话,桥接网络就不适合了。
在有需要的情况下,内部网络模式将会自动创建而不需要其他配置。每一个内部网路简单地一名称来区分。一旦多于一个有相同内网ID的网卡活动,VirtualBox的支持驱动会自动连接这些网卡并从当网络交换机的角色。VirtualBox支持驱动实现了一个完整的以太网交换机,并支持支持广播/多播帧和混杂模式。
为了把多台虚拟机的网卡连接成内网,将网络设置成内网模式,有以下两种方式:
1)通过图形界面进行设置,在网络设置对话框里选择一个存在的内网并输入新的名字。
2)命令行:
VBoxManage modifyvm "VM name" --nicintnet
可以指定网络名字:
VBoxManage modifyvm "虚拟机名称" --intnet"network name”
如果不指定网络名字,默认情况下网卡将会连接到intnet网络。
出于安全考虑,在默认情况下,Linux实现内部联网只允许在相同的用户ID运行的虚拟机建立一个内部网络。但是,可以建立一个共享的内部网络接口,通过用不同的UUID用户访问。
1.7 仅主机模式(Host-only networking)
仅主机模式是2.2版本之后加入的新的连网模式。可以将它视为桥接模式和内网模式的混合体:像桥接网络模式那样够通过物理以太网交换机与物理主机、其他主机相连。类似地,像内网模式一样,不需要存在物理网络接口,又因为它们没有连接到物理网络接口,所以虚拟机不能够与物理主机之外的外网连接。
在应用仅主机网络模式时,VirtualBox会在物理主机上创建一个新的软件接口。换言之,桥接模式下
一个现存的物理接口会被用于连接虚拟机,而仅主机网络模式下在主机上会创建一个新的“回环”接口,在内部网络模式下,虚拟机之间的通信数据是不可见的,但主机”回环“接口上的数据能够被截获。
在多台虚拟机装配到一起进行合作的情景下,对于预先配置的虚拟设备来说,仅主机网络模式十分的有用。例如,一台虚拟机可以包含一个web服务器和一个第二数据库,并且,由于他们主要用于相互访问,设备可以指示VirtualBox可以为这两台虚拟机创建一个仅主机网络模式,然后第二个虚拟机(桥接)网络将在Web服务器连接到外界提供数据,但外界无法连接到数据库。
将虚拟机的网络接口更改成仅主机网络模式:
* VirtualBox图形用户界面进行网络设置修改
* 命令行输入:
VBoxManage modifyvm "VM name" --nichostonly
详见:Section 8.8, “VBoxManage modifyvm”
在能够添加仅主机网络模式到虚拟机之前,需要创建至少一个仅主机接口,用户界面:”File" → "Preferences" → "Network" → "Host-only network" → "(+)Add host-only network”。
命令行:
VBoxManage hostonlyif create
详见:Section 8.34, “VBoxManage hostonlyif”
仅主机网络模式像内部网络模式一样,你会发现VirtualBox内置的DCHP服务器非常的有用。它可以在仅主机网络模式下管理IP地址,否则你需要配置所有的静态IP。
* 在用户图形界面可以在网络设置中的仅主机选项中设置DCHP服务;
* 或者你也可以用命令行操作,详见:Section 8.35, “VBoxManage dhcpserver”
Note:在Linux和Mac OS X主机上,仅主机网络接口限制在128个。在Windows和Solaris主机上没有这样的限制。
1.8 UDP通道网络(UDP Tunnel networking)
这种组网方式允许在不同主机运行的虚拟机之间实现互联。
从技术实现上讲,这是把虚拟机网卡收发的以太网帧封装成UDP/IP的数据包,再通过可用网络将它发送给主机。
UDP 通道网络模式有以下三个字段属性:
* Source UDP port
主机监听的端口。主机从该端口收到源地址来的数据包后,将会转发给接收端的虚拟机网卡
* Destination address
传送数据的目标主机的IP地址
* Destination UDP port
传输数据所用的端口号
当不同主机上的两台虚拟机互联时,必须交换他们的IP地址。在单一主机上,源UDP端口必须与目标UDP端口交换。
下例:主机1用10.0.0.1端口,主机2用10.0.0.2端口,配置UDP通道网络模式命令如下:
VBoxManage modifyvm "VM 01 on host 1" --nicgeneric VBoxManage modifyvm "VM 01 on host 1" --nicgenericdrv UDPTunnel VBoxManage modifyvm "VM 01 on host 1" --nicproperty dest=10.0.0.2 VBoxManage modifyvm "VM 01 on host 1" --nicproperty sport=10001 VBoxManage modifyvm "VM 01 on host 1" --nicproperty dport=10002
and
VBoxManage modifyvm "VM 02 on host 2" --nicgeneric VBoxManage modifyvm "VM 02 on host 2" --nicgenericdrv UDPTunnel VBoxManage modifyvm "VM 02 on host 2" --nicproperty dest=10.0.0.1 VBoxManage modifyvm "VM 02 on host 2" --nicproperty sport=10002 VBoxManage modifyvm "VM 02 on host 2" --nicproperty dport=10001
当然,你也可以设置成一台主机上的虚拟机互联,只要把目标地址(Destination port)都设置成127.0.0.1就好了。设置成一台主机时,这就类似于”内部网络“了,区别在于对于主机来说,虚拟机之间的数据通信是可见的,而一般的内部网络模式是不可见的。
NOTE:基于Unix的主机(例如Linux,Solaris,Mac OS X),不能绑定端口号<1024的应用程序,因为它无法被root.所运行。如果配置了这样的源UDP端口,虚拟机将不会启动。
1.9 VDE networking
分布式虚拟以太网(VDE)是灵活的,虚拟网络的基础设施系统以一种安全的方式跨越多台主机。
它允许L2 / L3交换,包括生成树协议,VLANs和WAN仿真。这是VirtualBox的可选部分,只包含在源代码中。
VirtualBox VDE只有一个参数.
* VDE network
虚拟机将要连接的VDE交换机名称。
以下简单的例子演示如何把虚拟机连接到VDE交换机:
1、创建一个VDE交换机
de_switch -s /tmp/switch1
2、 用命令行做一下配置:
VBoxManage modifyvm "VM name" --nicgeneric VBoxManage modifyvm "VM name" --nicgenericdrv VDE
连接到自动分配的交换机端口:
VBoxManage modifyvm "VM name" --nicpropertynetwork=/tmp/switch1
连接到指定的switch
VBoxManage modifyvm "VM name" --nicpropertynetwork=/tmp/switch1[ ]
3、VDE交换机端口和VLAN之间的映射(可选):(从交换机CLI)
vde$ vlan/createvde$ port/setvlan
VDE只能在Linux和FreeBSD主机上应用。只能在从VirtualSquare项目上安装了VDE软件和VDE插件类库的主机系统上运行。了解更多关于VDE网络模式,官方文档传送门:
http://wiki.virtualsquare.org/wiki/index.php/VDE_Basic_Networking
1.10 限制I/O网络的带宽
从4.2开始,VirtualBox允许对网络传输的最大带宽进行限制。一台虚拟机的多个网络适配器可以共享带宽群组限制,这样的限制可能会超过一个以上。
NOTE:VirtualBox只会对发送端的虚拟机数据进行延迟发送,不会对虚拟机接受的数据进行限制。
通过VBoxManage可以进行限制器的配置,以下示例创建了一个名为”Limit“的带宽群组,设置限制为20 Mbit/s 并将群组分配到虚拟机的第一第二个网络适配器中:
VBoxManage bandwidthctl "VM name" add Limit --type network --limit 20m VBoxManage modifyvm "VM name" --nicbandwidthgroup1 Limit VBoxManage modifyvm "VM name" --nicbandwidthgroup2 Limit
所有的群组中的适配器都会共享带宽限制,意味着以上例子中的两个适配器的带宽都不会超过 20 Mbit/s 。但是,如果其中一个适配器不需要带宽,那另一个将会占用它所在群组的剩余带宽。
在虚拟机运行时,都可以动态改变带宽群组的限制,即时生效。下例是将上例创建的带宽群组限制更改为 100 Kbit/s :
VBoxManage bandwidthctl "VM name" set Limit --limit 100k
要完全禁用虚拟机的第一个适配器,用以下命令:
VBoxManage modifyvm "VM name" --nicbandwidthgroup1 none
也可以在虚拟机运行时禁用所有分配到带宽群组中的适配器,通过将群组限制设为0,下例对名为”Limit“的带宽群组进行适配器禁用:
VBoxManage bandwidthctl "VM name" set Limit --limit 0
1.11 提高网络性能
VirtualBox中提供多种可以”附着“在主机网络上的虚拟网络适配器,可以通过多种方法进行配置。对于不同类型的适配器和所用的不同”附件“,网络性能也会不同。性能方面,Virtio网络适配器要优于Intel PRO / 1000仿真适配器,也优于PCNet系列适配器。Virtio和 Intel PRO/1000 适配器都得益于分段(segmentation)和卸载(offloading)校验。分段卸载是高性能的基础,因为它允许较少的内容交换,显著增加了虚拟机与主机之间传输的数据包大小限制。
NOTE:Virtio和Intel PRO/1000 for Windows XP驱动都不支持分段卸载,因此Windows XP系统上的虚拟永远无法达到与其他类型的虚拟同样的传输速率。请参考Microsoft知识库中其他信息,相应文章842264。
三种网络模式:内部网络、桥接网路和仅主机网络几乎具备相同的网络性能。因为内网模式下的数据包不经过主机网络堆栈,所以运行要更快更节省CPU的占用。NAT模式下,因为NAT提供网络地址解析,所以是最慢(也最安全)的模式。通用驱动附件是特殊的,不能替代其他类型的附件。
分配到虚拟机上的CPU数不能提高虚拟机的网络性能,在某些情况下还会有害于虚拟机,因为这增加了虚拟机的并发。
对于提高虚拟机的网络性能,有以下几点需要注意:
1、尽可能使用Virtio网络适配器,至少使用Intel/1000 适配器;
2、尽量使用桥接网络模式而不是NAT模式;
3、确定分段卸载在虚拟机操作系统上是否可用。一般默认情况下是可用的,你可以在Linux虚拟机上用ethtool命令行检查确认offloading设置;
4、要像第三方工具Wireshark那样在虚拟机网络适配器上对网络流量进行全面而细致的分析,需要在虚拟机的网络适配器上使用一个混合模式的规则(policy),并且只能在NAT网络、桥接网络适配器、内部网络和仅主机模式的适配器下使用。
设置混合模式规则( promiscuous mode policy)可以在用户界面的网络设置中配置,也可以用命令行工具VBoxManage配置,详见:Section 8.8, “VBoxManage modifyvm”
混杂模式规则是:
a)deny(默认设置),它可以隐藏不适合该虚拟机的网络适配器的流量。
b)allow-vms,它可以隐藏在这个虚拟机的网络适配器中的所有主机的流量,但允许它对来自其它虚拟机或发送到其他虚拟机的流量可见。
c)allow-all 删除所有限制——虚拟机的网络适配器能看到的所有通信流量。