文章目录
  1. 1. 前提条件
  2. 2. 环境要求
  3. 3. 基本思路
  4. 4. 配置主机的内网静态IP
    1. 4.1. 配置虚拟机的网卡
    2. 4.2. 在虚拟机内部配置网卡
  5. 5. 验证
    1. 5.1. 对需求1的验证
    2. 5.2. 需求2的验证
    3. 5.3. 需求3的验证
  6. 6. 总结

本文给出了在VirtualBox下搭建一个

  • 虚拟机之间,以及虚拟机和主机之间内网互通
  • 主机和虚拟机都有静态IP
  • 主机和虚拟机都可以访问外网(internet)

的网络配置方案。

前提条件

先定义一下名词:

  • 主机: 也叫做host,也就是安装了VirtualBox的环境,物理上存在的实体机
  • 虚拟机:也叫做guest,也就是安装在VirtualBox里面的各个操作系统,不需要硬件,虚拟的系统

环境要求

最近在使用VirtualBox搭建一个实验环境,由于公司规定了所有的机器都不能使用固定IP,都必须由DHCP自动获取。

为了不影响公司整理的网络环境,只能把实验用的网络环境限制在使用内部IP上。因此,这个实验环境必须满足如下的需求(注意这三个需求是AND的关系,必须同时满足):

  • 需求1:从主机可以通过静态IP访问到每一个虚拟机,从虚拟机中可以访问主机(主机也有一个固定的静态IP)
  • 需求2:虚拟机之间组成一个由静态IP构成的网络,而且虚拟机之间可以互相访问
  • 需求3:从主机,从虚拟机都可以访问internet

类似于这样:

网络配置图

为了满足以上需求,我在网上找了很多教程,终于有一个叫做 JOB OPEREL 的老哥,给出了一个比较靠谱的解决方法,你可以在 这里 找到他的文章。

我借鉴了他的方法,但是在连接外网的时候,和他的做法(他用的是桥接连接外网,最终还是需要影响外部网络的;而我用的是NAT地址转换来连接外网,不需要外部网络的,如果你不知道我在这里碎碎念什么,那么,无视吧……)不一样。
废话少说,开始干活!

基本思路

为了满足上面的三个需求,我准备在虚拟机里面加三个网卡来完成,思路如下:

  • eth0: 网卡1,使用 仅主机(Host-Only)适配器 的连接方式,完成 需求1,即:从主机可以通过一个静态IP访问到每一个虚拟机,从虚拟机中可以访问主机(主机也有一个固定的静态IP)
  • eth1: 网卡2,使用 内部网络 的连接方式,完成 需求2,即:虚拟机之间组成一个由静态IP构成的网络,而且虚拟机之间可以互相访问
  • eth2: 网卡3,使用 网络地址转换(NAT) 的连接方式,完成 需求3,即:从主机,从虚拟机都可以访问internet

说了这么多,其实还差一块,那么到底主机与虚拟机之间是怎么连接的呢?

细心的人可能会发现,在我们安装好VirtualBox之后,主机的系统里面会多出一个连接,VirtualBox Host-Only Network,这个是VirtualBox自动生成的一个连接;而另外一个 本地连接 就是实际的网卡的连接:

VirtualBox Host-Only Network

上图的两个连接,以及虚拟机里面的三块网卡互相配合,组成了下面的网络结构图:

网络结构图

配置主机的内网静态IP

打开 Orcale VM VirtualBox管理器,从菜单中选择 管理全局设定;在弹出的窗口中选择 网络,然后再选择 仅主机(Host-Only)网络(H) 标签页,双击 VirtualBox Host-Only Ethernet Adapter, 修改里面的IP地址,为了尊重传统,我选择192.168.1.1,如下图所示;

修改里面的IP地址

接着,关闭DHCP服务器,如下图所示:

关闭DHCP服务器

也就是说,现在主机由一个静态IP:192.168.1.1。之后,虚拟机就可以通过这个IP地址来访问主机了。

上述设定完成后,查看主机的地址,可以看到如下的信息;

主机的地址

配置虚拟机的网卡

加入第一块网卡 eth0,将 eth0 配置成如下图的方式:

eth0配置

接着加入第二块网卡 eth1,将 eth1 配置成如下图的方式:

eth1配置

注意,虚拟机之间的内网名字可以随便起,这里叫做 neta。如果在配置在第二个虚拟机的时候,也要记得选择 netca 这个内网名字,这样虚拟机之间才可以互相通信。

最后,加入第三块网卡 eth2,配置如下:

eth2配置

保存,启动虚拟机,安装系统。

在虚拟机内部配置网卡

在这里我使用了Oracle Linux(其实和CentOS,RHEL是一毛一样的)。在配置IP的时候,用命令行来配置各个网卡的IP信息,如果你喜欢,也可以使用GUI(NetworkManager)。

首先 eth0,这里要与主机保持的一个网段(192.168.1.),把 eth0 的IP地址配置为 192.168.1.2:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$ vim /etc/sysconfig/network-scripts/ifcfg-eth0 
DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=none
IPADDR=192.168.1.2 #这里要与主机保持的一个网段:192.168.1.
PREFIX=24
DEFROUTE=no
IPV4_FAILURE_FATAL=yes
IPV6INIT=no
NAME="System eth0"
NETWORK=192.168.1.0
BROADCAST=192.168.1.255
HWADDR=08:00:27:86:D8:01
MTU=1500
UUID=5fb06bd0-0bb0-7ffb-45f1-d6edd65f3e03
LAST_CONNECT=1409908253

其次,配置 eth1,要注意内网我们选择 192.168.0. 这个网段,eth1 的IP地址配置为 192.168.0.2:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$ vim /etc/sysconfig/network-scripts/ifcfg-eth1
DEVICE=eth1
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=none
IPADDR=192.168.0.2 #内网我们选择 192.168.0\. 这个网段
NETMASK=255.255.255.0
PREFIX=24
DEFROUTE=no
IPV4_FAILURE_FATAL=yes
IPV6INIT=no
NAME="System eth1"
HWADDR=08:00:27:C6:79:2B
MTU=1500
UUID=9c92fad9-6ecb-3e6c-eb4d-8a47c6f50c04
LAST_CONNECT=1409908255

再次,配置 eth2, 因为是NAT地址转换的,这块网卡使用DHCP来自动获取IP,具体如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ vim /etc/sysconfig/network-scripts/ifcfg-eth2
DEVICE=eth2
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=dhcp #注意这里是DHCP
NAME="System eth2"
HWADDR=08:00:27:E9:19:A5
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=yes
IPV6INIT=no
UUID=3a73717e-65ab-93e8-b518-24f5af32dc0d
LAST_CONNECT=1409908256

最后,重新启动一下网络服务:

# service network restart

查看一下我们配置后的结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
    $ ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 08:00:27:86:d8:01 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.2/24 brd 192.168.1.255 scope global eth0
inet6 fe80::a00:27ff:fe86:d801/64 scope link
valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 08:00:27:c6:79:2b brd ff:ff:ff:ff:ff:ff
inet 192.168.0.2/24 brd 192.168.0.255 scope global eth1
inet6 fe80::a00:27ff:fec6:792b/64 scope link
valid_lft forever preferred_lft forever
4: eth2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 08:00:27:e9:19:a5 brd ff:ff:ff:ff:ff:ff
inet 10.0.4.15/24 brd 10.0.4.255 scope global eth2
inet6 fe80::a00:27ff:fee9:19a5/64 scope link
valid_lft forever preferred_lft forever
```language

也就是说,现在这台虚拟机有三个IP:

  • 192.168.1.2: 和主机通信使用
  • 192.168.0.2: 和其他的虚拟机通信使用
  • 10.0.4.15: 是自动获取的,通过VirtualBox的地址转换功能,用来访问外网internet

如果再新建一台虚拟机,还是需要参考上面的步骤,为每个虚拟机都设置三块网卡。

验证

对需求1的验证

通过主机来 ping 虚拟机,结果如图,成功!

主机来ping虚拟机

反过来,从虚拟机中ping主机,结果如图,成功!

从虚拟机中ping主机

需求2的验证

虚拟机之间互 ping,结果如图,成功!

虚拟机之间互ping

需求3的验证

从虚拟机直接上外网,如图,成功!(注意:请确认你的主机和虚拟机都使用了相同的代理服务器设置)

虚拟机直接上外网

总结

通过把 VirtualBox 的几种联网方式的混合运用,就能满足我们大多场合的需求。其实回过头想想,如果一种解决方法解决不了问题,可以尝试一下混合几种解决方案,取长补短,这样带来的加乘效果,往往会让你吃惊。

(END)

文章目录
  1. 1. 前提条件
  2. 2. 环境要求
  3. 3. 基本思路
  4. 4. 配置主机的内网静态IP
    1. 4.1. 配置虚拟机的网卡
    2. 4.2. 在虚拟机内部配置网卡
  5. 5. 验证
    1. 5.1. 对需求1的验证
    2. 5.2. 需求2的验证
    3. 5.3. 需求3的验证
  6. 6. 总结