Linux网络虚拟化之内部网络

        Linux Bridge是Linux网络虚拟化中最重要的虚拟设备,而内部网络是其实现的最基本最简单的网络,同时也是最重要的、最根本的网络。

1.创建实验用虚拟机

        首先用VirtualBox创建ubuntu虚拟机ubuntu-01做为实验机。ubuntu-01一共启用三张网卡,功能如下表:

网卡编号 虚拟机内网卡名 类型 作用
网卡1 enp0s3 nat网络 主网卡,可连接外网,用于安装软件包
网卡2 enp0s8 仅主机(Host-Only)网络 用于与宿主机通信,如通过WinScp等互相传送文件
网卡3 enp0s9 未指定 空网卡,暂时不接入任何网络,备用。

启动虚拟机后,修改/etc/network/interfaces文件,添加如下几行语句并保存。

auto enp0s8

iface enp0s8 inet dhcp

然后重新启动网络服务,enp0s8会自动获得IP地址。

2.创建网桥及配置DHCP

        内部网络的意思是网络上的数据只在ubuntu-01虚拟机内部流转,不会通过ubuntu-01的网卡发送到外部网络,也不会接收外部网络的数据。

第一步:运行命令创建网桥,如下图所示。

运行的命令:

brctl addbr test-br-01

brctl sow test-br-01

ip link show test-br-01

 Linux网络虚拟化之内部网络_第1张图片

                                                                                 图1

上图中所使用的命令。test-br-01处于DOWN状态,已经分配了MAC地址,目前还没有任何端口挂接在网桥上。

第二步:用dnsmasq实现DHCP

        dnsmasq的DHCP服务监听在0.0.0.0:67这个SOCKET上,等同于监听在主机所有的IP地址上。如果只想让dnsmasq为与test-br-01相连的虚拟机提供DHCP服务,需要新创建网络名称空间,并创建veth pair用来将新创建的名称空间与系统空间连接起来。具体过程如下图:

运行的命令:

ip netns add test-ns-01

ip link add test-veth-01 type veth peer name test-veth-02

ip link set test-veth-02 netns test-ns-01

ip link show type veth

ip netns exec test-ns-01 ip link show type veth

Linux网络虚拟化之内部网络_第2张图片

                                                                                图2

在上图中新创建了命名空间"test-ns-01",创建了veth pair test-veth-01与test-veth-02,其中后者被加入到test-ns-01命名空间中。接下来为test-veth-02手动设备IP地址,如下图所示:

运行的命令:

ip netns exec test-ns-01 ip addr add 172.16.0.1/24 dev test-veth-02

ip netns exec test-ns-01 ip addr show

Linux网络虚拟化之内部网络_第3张图片

                                                                                  图3

上图中,首先选了一个内网网段172.16.0,并将中的IP地址172.16.0.1手动配置给test-veth-02设备,然后运行ip netns exec test-ns-01 ip link set test-veth-02 up启动。接下来,将test-veth-01挂接到test-br-01上,如下图:

运行的命令:

brctl show test-br-01

brctl addif test-br-01 test-veth-01

brctl show test-br-01

Linux网络虚拟化之内部网络_第4张图片

                                                                              图4

上图中红框部分,网桥test-br-01的MAC地址发生了变化,复制了test-veth-01的MAC地址,实际上Linux Bridge总是与第一个挂接其上的设备共享MAC地址。另外test-veth-01的状态中多了master test-br-01的内容,表明它变成了test-br-01的子设备。

    启动网桥相关设备。运行如下命令:

    ip link set test-br-01 up

    ip link set test-veth-01 up

 为dnsmasq编写配置文件,创建/etc/test-dnsmasq.conf,加入如下四项,其它项不用配置:

interface=test-veth-02                                                               # dnsmasq监听的网络设备名

bind-interfaces                                                                           # 默认是注释掉的

dhcp-range=172.16.0.2,172.16.0.50,255.255.255.0,12h             # DHCP管理的IP地址池

dhcp-leasefile=/var/lib/misc/test_dnsmasq.leases                    # DHCP分配IP地址的记录文件

在名称空间test-ns-01中启动dnsmasq,如下图:

运行的命令:

ip netns exec test-ns-01 /usr/sbin/dnsmasq --conf-file=/etc/test-dnsmasq.conf

ip netns exec test-ns-01 ip addr list

ip netns exec test-ns-01 netstat -anp | grep 67

Linux网络虚拟化之内部网络_第5张图片

                                                                                    图5

在上图中,因为网络名称空间中只有一个IP地址172.16.0.1,所以0.0.0.0:67就相当于是172.16.0.1:67,用网络命名空间实现了隔离。至此,一个基于Linux Bridge并用dnsmasq提供DHCP功能的虚拟本地内部网络就搭建完成了。

创建过程重要命令:

# 创建名称空间test-ns-01
ip netns add test-ns-01
# 创建VETH PAIR
ip link add test-veth-01 type veth peer name test-veth-02
# 将VETH PAIR的一端加入网络命名空间
ip link set test-veth-02 netns test-ns-01
# 在网络命名空间中为VETH设备设备IP
ip netns exec test-ns-01 ip addr add 172.16.0.1/24 dev test-veth-02
# 在网络命名空间中启动设备
ip netns exec test-ns-01 ip link set test-veth-02 up
# 在网络命名空间中启动dnsmasq
ip netns exec test-ns-01 /usr/sbin/dnsmasq --conf-file=/etc/test-dnsmasq.conf
# 创建网桥
brctl addbr test-br-01
# 为网桥增加接口
brctl addif test-br-01 test-veth-01
# 启动设备
ip link set test-br-01 up
ip link set test-veth-01 up

3.测试网络

        创建两台KVM虚拟机test01与test02,具体过程不详述,网上资料很多。唯一需要的就是在为虚拟机添加网卡时,手动选择由前文所创建的test-br-01网络,如下图所示:

Linux网络虚拟化之内部网络_第6张图片

                                        图6

启动虚拟机test01与test02。首先查看一下utuntu-01中网络设备的变化情况,如下图:

依次运行命令:

ip link list

ip tuntal list

ip tuntap list

Linux网络虚拟化之内部网络_第7张图片

                                             图7

从上图可以看出,多了两个虚拟网络设备vnet0与vnet1,这两个设备是KVM在启动虚拟机时创建的。并且它们是tap设备,相当于是虚拟的网卡,一头连着虚拟机,一头连着网桥test-veth-01。两个设备分别是虚拟机test01与test02的eth0网卡,通过MAC地址可以确认这一点。进入虚拟机test01命令行界面,确认自动分配的IP地址,如下图:

运行命令:

ip addr show

Linux网络虚拟化之内部网络_第8张图片

                                                        图8

上图中eth0分配到的IP地址是172.16.0.17,同样的步骤,test02中eth0的IP地址为172.16.0.17.

ping一下,是通的,如下图:

Linux网络虚拟化之内部网络_第9张图片

                                                          图9

整个内部网络示意图如下:

Linux网络虚拟化之内部网络_第10张图片

如图所示,整个内部网络的流量被限制在大的红色虚线框内,既不会将数据下发给ubuntu-01的网卡,也不会上交数据到网络栈的IP层。这种内部网络隔离性好,但是不能连接外部网络,也不能跨主机覆盖,一般都用于测试。

你可能感兴趣的:(Linux网络虚拟化)