VirtualBox虚拟网络配置

VirtualBox目前有6种网络模式5种可用网络,分别对5种网络模式的应用场景进行介绍。

VirtualBox网络模式

Not attached/未连接

此模式下能检测到网卡存在,但不会发生任何网络联系。

NAT/网络地址转换

默认模式,如果只是浏览网页下载文件,此模式已经够用了,NAT网络是一种内部网络,但允许出站连接。

Bridged/桥接网络

针对更高级的网络需求,如:网络模拟和在运行服务器。此模式,VirtualBox将使用一个网卡,绕过主机操作系统的网络堆栈,直接交换网络数据包。

Internal/内部网络

对选定的虚拟机可见,对主机上或外部运行的应用程序不可见。此模式模拟了交换机的功能,在使用多个VMs组网时,VMs之间是可见的,但不会暴露在局域网和公网上。

Host-only/主机专用网络

在主机和一组虚拟机之间建立的网络,无需主机的物理网络接口。提供虚拟机和主机之间的连接。

Generic/通用网络

很少用的模式,允许选择一个驱动程序。包含以下几种模式:

- UDP Tunnel:在现有网络基础架构上,将运行在不同主机上的虚拟机进行互连。

- VDE networking(虚拟分布式以太网):用于连接到Linux或FreeBSD主机上的虚拟分布式以太网交换机。目前,此选项需重新编译Oracle VM VirtualBox,默认安装包未包含。

注:本文会将虚拟机上运行的操作系统称为来宾操作系统,宿主机操作系统称为主机操作系统。

网络地址转换(NAT)

NAT是访问外部网络的最简单方法,不需要任何配置,因此,它是VirtualBox中的默认联网模式。启用了NAT的虚拟机就像是一台通过路由器连接到Internet的真实计算机。这种模式下,路由器是VirtualBox网络引擎,透明地映射来往于虚拟机的流量。

VirtualBox路由器放置在每个虚拟机和主机之间。这种分离使安全性最大化,默认情况下虚拟机之间无法相互通信。NAT模式的缺点是,就像路由器后面的专用网络一样,无法从外部互联网访问虚拟机。不能以这种方式运行服务器除非设置端口转发。

来宾操作系统发出的网络帧被VM接收,VirtualBox NAT引擎提取TCP/IP数据,并使用主机操作系统重新发送。对于主机上的其他应用程序,或主机网络上另一台计算机而言,数据来自于主机上的VirtualBox应用程序。

VirtualBox侦听响应数据包,重新打包将其发送到专用网络上的来宾计算机。

虚拟机从VirtualBox集成的DHCP服务上获取网络地址和配置。这样分配给虚拟机的IP地址通常与主机处于完全不同的网络上。由于可以将虚拟机的多个网卡设置为NAT模式,因此,第一张网卡连接到私有网络10.0.2.0,第二张网卡连接到私有网络10.0.3.0,依此类推。分配的IP范围可以手动设置。

使用内部网络的名称创建NAT服务,如果内部网络尚不存在,则将创建内部网络。

VBoxManage natnetwork add --netname natnet1 --network "192.168.15.0/24" --enable

创建DHCP服务器并添加到NAT网络:

VBoxManage natnetwork modify --netname natnet1 --dhcp on

注:若找不到命令,将安装目录下VBoxManage所在目录加入环境变量,如Windows:D:\Program Files\Oracle\VirtualBox\

NAT配置端口转发

由于NAT模式无法直接对外公共网络。但可以像物理路由器一样,VirtualBox通过端口转发,将虚拟机的服务对外公开。VirtualBox会监听主机上的某些端口,并将到达该端口的数据包重新发送给虚拟机。对于主机上的应用程序或网络上的计算机,服务就好像在主机上运行。

要配置端口转发,可在网络设置对话框中操作,将主机端口映射到来宾端口。也可以使用命令行工具VBoxManage:

VBoxManage modifyvm "VM name" --natpf1 "guestssh,tcp,,2222,,22"

示例中,任何到达主机2222端口上的TCP流量,都将被转发到来宾的22端口上。协议名称tcp是一个强制性的属性定义,也可以使用udp,guestsh是一个纯描述性的内容,省略后会自动生成。natpf1表示网卡。

VBoxManage modifyvm "VM name" --natpf1 delete "guestssh"

删除转发如上所示。

如果某种原因,来宾未从内置DHCP获取ip,而使用了静态IP地址,注册转发规则时需要指定来宾IP,如下所示:

VBoxManage modifyvm "VM name" --natpf1 "guestssh,tcp,,2222,10.0.2.19,22"

此示例告知NAT引擎在10.0.2.19地址能找到来宾。

对于安装了多个物理网卡的主机,只转发特定网卡上流量使用如下方式:

VBoxManage modifyvm "VM name" --natpf1 "guestssh,tcp,127.0.0.1,2222,,22"

NAT模式PXE启动

PXE启动现在支持NAT模式。如果用户的VirtualBox.xml所在目录中存在TFTP目录。NAT DHCP服务器会引导vmname.pxe。用户需要提供vmname.pxe。

网络地址转换服务

网络地址转换(NAT)服务的工作原理与家庭路由器类似,把使用它的系统分组到一个网络中,防止网络外部的系统直接访问该系统,内部系统通过IPv4和IPv6相互通信,并通过TCP和UDP与外部系统通信。NAT服务被附加到一个内部网络,虚拟机要使用NAT服务应加入到内部网络。

在创建NAT服务和内部网络时,需要为内部网络选择一个名称,以下是一个创建NAT网络的命令示例:

VBoxManage natnetwork add --netname natnet1 --network "192.168.15.0/24" --enable

natnet1为内部网络名称,192.168.15.0/24是NAT服务接口的网络地址和掩码。默认情况下,此静态配置,网关将被分配到192.168.15.1。

VBoxManage natnetwork add --netname natnet1 --network "192.168.15.0/24" --enable --dhcp on

将DHCP服务器添加到现有网络,使用以下命令:

VBoxManage natnetwork modify --netname natnet1 --dhcp on

禁用DHCP服务器,使用以下命令:

VBoxManage natnetwork modify --netname natnet1 --dhcp off

DHCP服务器提供已注册名称服务器的列表,但不映射来自127/8网络的服务器。要启动NAT服务,使用以下命令:

VBoxManage natnetwork start --netname natnet1

如果网络连接到DHCP服务器,它将与NAT网络服务一起启动。停止NAT网络服务将连同DHCP服务器一起:

VBoxManage natnetwork stop --netname natnet1

删除NAT网络服务:

VBoxManage natnetwork remove --netname natnet1

如果内部网络上启用了DHCP服务器,此命令不会删除DHCP服务器。

端口转发,IPv4使用--port-forward-4,对于IPv6使用--port-forward-6。 如下所示:

VBoxManage natnetwork modify --netname natnet1 --port-forward-4 "ssh:tcp:[]:1022:[192.168.15.5]:22"

将主机TCP/1022端口转发到IP地址192.168.15.5的来宾主机22端口上。主机端口、来宾端口和来宾IP是必填项。删除使用以下命令:

VBoxManage natnetwork modify --netname natnet1 --port-forward-4 delete ssh

将NAT服务绑定到指定的接口。如:

VBoxManage setextradata global "NAT/win-nat-test-0/SourceIp4" 192.168.1.185

要查看已注册NAT网络的列表,使用以下命令:

VBoxManage list natnetworks

桥接网络(Bridged Networking)

VirtualBox在主机系统上运行一个设备驱动程序,来过滤物理网络适配器上的数据。从而使VirtualBox可以拦截来自物理网络的数据,在软件层面创建新的网络接口。来宾系统使用这种接口时,看起来就像与主机系统产生了物理连接。

主机可以通过该接口将数据发送给来宾,并从中接收数据。 这意味着可以在来宾系统与网络之间设置路由或桥接。

要启用桥接网络,打开虚拟机的“设置”对话框,转到“网络”页面,在下拉列表中选择“桥接网络”。 从底部列表中选择一个主机接口,其中包含物理网络系统的接口。 

注:桥接到无线接口与桥接到有线接口方法有所不同,大多数无线适配器不支持混杂模式。 所有流量都必须使用主机的无线适配器的MAC地址,因此,VirtualBox需要替换传出数据包的以太网报头中的源MAC地址,确保答复能被发送到主机接口。 当VirtualBox看到带有目标IP地址的传入数据包属于虚拟机适配器时,它将用VM适配器的MAC地址,替换以太网报头中的目标MAC地址并继续传递。 VirtualBox会检查ARP和DHCP数据包,确认虚拟机的IP地址。

内部网络(Internal Networking)

内部网络类似于桥接网络,因为,VM可以直接与外界通信。 然而,这里所说的外界,仅限于同一主机上相同内部网络的其他VM。尽管从技术上讲,内部网络所做的工作,桥接网络也能完成,但内部网络在安全性上有先天优势。

桥接模式下,所有流量都通过主机系统的物理接口,因此,诸如Wireshark这类的嗅探器,通过附加到主机接口,能够记录所有经过的流量。 如果希望同一台主机上的多个VM间通信是隐蔽的,则桥接网络不在选择之列。内部网络根据需要自动创建。没有中心配置。

每个内部网络都简单地通过名称进行标识。 一旦有多个活动的虚拟网卡使用相同的内部网络ID,VirtualBox驱动程序将自动连接这些网卡,并充当网络交换机。 VirtualBox驱动程序实现了完整的以太网交换机,支持广播/多播帧和混杂模式。

内部网络设置

在Virtual albox图形界面“设置”对话框的“网络”选项中,从下拉列表中选择“内部网络”。然后选择现有内部网络的名称,或者在name字段中输入一个新名称。

或使用如下命令:

VBoxManage modifyvm "VM name" --nic<x> intnet

此外,还可以使用如下命令指定网络名称:

VBoxManage modifyvm "VM name" --intnet<x> "network name"

如果未指定网络名称,则默认将网卡连接到名为intnet的网络上。除非在加入内部网络的来宾系统中,为虚拟网卡配置了静态IP地址,否则,使用VirtualBox内置中的DHCP服务器管理内部网络的IP地址。

出于安全措施,Linux下的内部网络,默认仅允许以相同用户ID运行的VMs组立内部网络,但是,可通过创建共享的内部网络接口来实现。

主机专用网络(Host-Only Networking)

主机专用网络是VirtualBox 2.2版中新加的一种网络模式。可认为是桥接模式和内部网络模式的混合体。与桥接网络一样,虚拟机可以在主机及彼此间通信,就像通过物理以太网交换机连接一样。与内部网络一样,不需要物理网络接口,而且,虚拟机不能与主机以外的世界通信,因为,它们没有连接到物理网络接口。

VirtualBox会在主机现有网络接口旁边,创建一个新的软接口,使用桥接网络时,从现有的物理接口连接虚拟机,而使用主机专用网络时,则在主机上创建一个新的环回接口。此模式既可以拦截主机上环回接口的流量,又可以保证虚拟机之间的流量不被看到。

主机专用网络对于预配置的虚拟设备特别有用,在预配置的虚拟设备中,多个虚拟机一起发布并协作运行。 如,一个虚拟机包含Web服务器,另一个虚拟机包含数据库,由于它们需要互相通信,因此,可以指示VirtualBox为这两个虚拟机建立主机专用网络。 然后,通过第二个桥接网络将Web服务器连接到外部。

主机专用网络设置

转到虚拟机的“设置”对话框中的“网络”页面,选择“Host-Only”模式。或执行如下命令:

VBoxManage modifyvm "VM name" --nic<x> hostonly

在将VM添加到主机专用网络前,须存在一个主机专用网络,可使用GUI或如下命令行:

VBoxManage hostonlyif create

VirtualBox中的DHCP服务器,对主机专用网络非常有用。可以在主机网络中管理IP地址,如果没有DHCP就得配置所有IP地址。

UDP Tunnel Networking

这种网络模式允许将不同主机上的虚拟机进行互连。从技术上讲,通过将来宾网卡发送或接收的以太网帧封装到UDP/IP数据报中,然后,通过主机网络发送来实现通信。

UDP隧道模式具有以下参数:

UDP源端口:主机侦听的端口。任何来源的数据到过此端口,都将被转发到来宾网卡。

目标地址:数据目标主机的IP地址。

UDP目标端口:数据目标端口号。

在两台主机上互连的虚拟机时,必须交换它们的IP地址。在单个主机上,必须交换源和目标的UDP端口。

VBoxManage modifyvm "VM 01 on host 1" --nic<x> generic
VBoxManage modifyvm "VM 01 on host 1" --nicgenericdrv<x> UDPTunnel
VBoxManage modifyvm "VM 01 on host 1" --nicproperty<x> dest=10.0.0.2
VBoxManage modifyvm "VM 01 on host 1" --nicproperty<x> sport=10001
VBoxManage modifyvm "VM 01 on host 1" --nicproperty<x> dport=10002

VBoxManage modifyvm "VM 02 on host 2" --nic<y> generic
VBoxManage modifyvm "VM 02 on host 2" --nicgenericdrv<y> UDPTunnel
VBoxManage modifyvm "VM 02 on host 2" --nicproperty<y> dest=10.0.0.1
VBoxManage modifyvm "VM 02 on host 2" --nicproperty<y> sport=10002
VBoxManage modifyvm "VM 02 on host 2" --nicproperty<y> dport=10001

示例中,主机1使用IP地址10.0.0.1,主机2使用IP地址10.0.0.2。通过将目标地址参数设置为127.0.0.1,可以将同一主机上的两台虚拟机互连。它的作用类似于内部网络。但主机可以看到内部网络下无法看到的网络流量。

注:在基于UNIX的主机(如Linux,Oracle Solaris和Mac OS X)上,无法将非root用户运行的应用程序,绑定到1024以下的端口。 因此,如果源UDP端口出现这种配置,VM将拒绝启动。

VDE Networking

虚拟分布式以太网(VDE)是一个灵活的虚拟网络基础设施系统,以一种安全的方式跨越多个主机。它支持L2/L3交换,包括扩展树协议、vlan和WAN仿真。它是Oracle VM VirtualBox的一个可选部分,只包含在源代码中。

详情参考用户手册中的VDE网络

限制网络带宽

VirtualBox支持网络带宽限制。一个虚拟机的多个网络适配器可共享带宽限制。

VBoxManage bandwidthctl "VM name" add Limit --type network --limit 20m
VBoxManage modifyvm "VM name" --nicbandwidthgroup1 Limit
VBoxManage modifyvm "VM name" --nicbandwidthgroup2 Limit

同一个组中的所有适配器共享带宽限制,示例中,两个适配器的带宽总和不能超过20 Mbps。

VBoxManage bandwidthctl "VM name" set Limit --limit 100k

VM运行时也可以调整限制并立即生效。示例中将限制调整为100kbps。

VBoxManage modifyvm "VM name" --nicbandwidthgroup1 none

禁用VM的第一个适配器如上所示。

VBoxManage bandwidthctl "VM name" set Limit --limit 0

当VM运行时,还可以为组指定零限制,如上所示。

注:VirtualBox仅在发送方向上调整VM流量,从而延迟虚拟机发送的数据包,它不限制虚拟机接收的流量。

网络性能优化

VirtualBox提供了各种虚拟网络适配器,根据适配器和附件的类型,网络性能将有所不同。 在性能方面,virtio网络适配器优于Intel PRO/1000仿真适配器,后者优于PCNet适配器系列。 virtio和Intel PRO/1000适配器都享有分段和校验和卸载的优势。 分段卸载对于实现高性能至关重要,因为分段卸载只需要较少的上下文切换,从而大大增加了跨VM/主机边界的数据包大小。

内部、桥接和主机专用模式,性能几乎相同。内部模式要快一点,且使用较少的CPU周期,数据包永远不会到达主机的网络堆栈。NAT类型是所有类型中最慢且最安全的,它提供了网络地址转换功能。通用模式比较特殊,不能将其视为其他类型的替代。

给VM增加CPU数量并不能改善网络性能,在某些情况下,由于来宾系统中的并发性增加,可能会损害网络性能。提高网络性能需要检查的内容的如下:

1.优先使用virtio网络适配器。 否则,使用Intel PRO/1000适配器之一。

2.使用桥接模式而不非NAT。

3.确保在来宾操作系统中启用了分段卸载, 默认启用。

使用工具(如Wireshark)对VM网络适配器上的流量进行分析。为此,需要在VM的网络适配器上使用混杂模式。此模式只能在以下网络上使用:NAT、桥接、内部网络和主机专用。

混杂模式策略如下:

- deny,隐藏了不打算用于VM网络适配器的任何流量。默认设置。

- allow-vms,从VM的网络适配器中隐藏所有主机流量。

- allow-all,删除所有限制。VM的网络适配器可以查看所有流量。

DHCP服务器设置

dhcpserver命令用于控制VirtualBox内置的DHCP服务器。在使用内部网络、主机专用网络、桥接网络时都有可能与DHCP服务器打交道。

通过命令行添加、修改、删除DHCP服务器和设置相关选项的操作如下所示:

内部网络

VBoxManage dhcpserver add --netname <network_name>
VBoxManage dhcpserver modify --netname <network_name>
VBoxManage dhcpserver remove --netname <network_name>

主机专用网络

VBoxManage dhcpserver add  --netname <network_name>
VBoxManage dhcpserver modify --ifname <hostonly_if_name>
VBoxManage dhcpserver remove --ifname <hostonly_if_name>

--netname针对内部网络,--ifname针对主机专用网络。

注:可VBoxManage vms列出相关命令,从中查找相关参数。如:VBoxManage showvminfo "Windows XP"。

DHCP服务器选项

--enable:启用DHCP服务器

 --ip:指定DHCP服务器的ip地址。

--netmask:指定网络的netmask。

--lowerip和--upperip:指定DHCP服务器将分配给IP地址范围。

--options:指定DHCP其他选项。

--id:数字类型的值。

--value:字符类型的值

 --remove:删除DHCP选项。

--vm和--nic为指定VM网络适配器设置DHCP选项。

一旦网络中有一个虚拟机启动,VirtualBox将自动启动DHCP服务器。

注:通常能用到DHCP的网络是:内部网络或主机专用网络。