[NFV] 虚拟网络

承接上篇,本篇中将利用上篇构建的虚拟路由器实现几个简单的网络结构,并将测试不同路由协议。

注意本文中,在主机中的指令以 $ 开头,在容器中的指令以 root@R1:~# 开头。

创建网络 1

以图为例,创建如图所示网络结构,操作如下。

Topology 1

配置主机与网桥

以前文构建路由器作为 R1,另外需要启动两台容器作为主机 C1 C2

1
2
$ sudo lxc init ubuntu C1 -p default
$ sudo lxc start c1

通过 lxc 命令创建网络并绑定端口

1
2
3
4
5
$ sudo lxc network create C1R1 ipv6.address=none ipv4.address=12.12.12.1/24

$ sudo lxc network attach C1R1 c1 eth0

$ sudo lxc network attach C1R1 R1 eth0

进入R1 (类似 docker 进入容器),分配地址并启动网卡

1
2
3
4
$ sudo lxc exec R1 bash

root@R1:~# ip addr add 11.11.11.1/24 dev eth0
root@R1:~# ip link set eth0 up

方便起见,也可以直接在 exec 后面附带需要执行的命令

1
$ sudo lxc exec R1 ip addr add 11.11.11.1/24 dev eth0

查看网卡配置

1
2
3
4
root@R1:~# ip addr

# 退出容器
root@R1:~# exit

进入 C1,类似 R1 中的操作,就不分步说明了:

1
2
3
4
$ sudo lxc exec c1 bash

root@c1:~# ip addr add 11.11.11.2/24 dev eth0
root@c1:~# ip link set eth0 up

这里有些区别,我们需要为 C1 替换默认网关,以使流量能正确地传输到 R1 中:

1
2
3
root@c1:~# route delete default

root@c1:~# route add default gw 12.12.12.2

测试能否ping通

1
root@c1:~# ping 11.11.11.1

退出容器

1
root@c1:~# exit

接下来按照上面方法连接主机 C2 及 eth0 网卡、路由器R1 及网卡 eth1 进行配置并测试,地址分别为 11.11.10.1/2411.11.10.2/24

此时通过 C1 ping C2 会发现暂时无法 ping 通,这是由于路由器暂时还没配置使用路由协议,这里我们将采用 rip 协议。

配置协议

开启RIP路由协议

进入R1

1
sudo lxc exec R1 bash

复制RIP协议的配置文件,以便自动配置

1
2
3
root@R1:~#cp /usr/local/etc/ripd.conf.sample /usr/local/etc/ripd.conf

root@R1:~#vi /usr/local/etc/ripd.conf

加入如下内容

1
2
3
4
router rip
version 2
network eth0
network eth1

:wq 保存退出,rip配置完成,执行

1
2
3
root@R1:~#zebra –d

root@R1:~#ripd –drip

正常启动后,可以用 ip route show 查看路由是否已经建立

退出 root@R1:~#exit


创建网络 2

Topology 2

这个网络拓扑的结构相比上一个更为复杂,参照上文的经验,首先创建 H13,R13 的主机与路由器,并建立 H1R1、H2R2、H3R3、R1R3、R2R3 的虚拟网桥,为了展现路由协议 ospf 的功能,暂时不要建立 R1R2 的网桥。

配置完成六个容器的地址信息分别如下下所示:

NAME STATE IPV4 IPV6 TYPE SNAPSHOTS LOCATION
H1 RUNNING 10.10.10.2 (eth0) PERSISTENT 0 lxc
H2 RUNNING 10.10.11.2 (eth0) PERSISTENT 0 lxc
H3 RUNNING 10.10.12.2 (eth0) PERSISTENT 0 lxc
router1 RUNNING 10.10.14.1 (eth2) 10.10.13.1 (eth1) 10.10.10.1 (eth0) PERSISTENT 0 lxc
router2 RUNNING 10.10.15.1 (eth2) 10.10.13.2 (eth1) 10.10.11.1 (eth0) PERSISTENT 0 lxc
router3 RUNNING 10.10.15.2 (eth2) 10.10.14.2 (eth1) 10.10.12.1 (eth0) PERSISTENT 0 lxc

ospf 协议

接下来需要在 router1-3 中配置并启用 ospf 协议,配置过程与 rip 协议基本相同,主要差别在 /usr/local/etc/ospfd.conf ,根据网口的实际连接状况加入对应的网段,以 router1 为例:

1
2
3
4
5
router ospf
router-id 10.10.12.1
network 10.10.10.0/24 area 0
! network 10.10.13.0/24 area 1
network 10.10.14.0/24 area 2

! 注释部分为实验之后部分中需要添加的内容。

启用 ospf (以 router1 为例) :

1
2
root@router1:~# cd /usr/local/etc
root@router1:~# ospfd -u root -g root -d

测试连通性

1、测试任意两两主机间是否能够通信。

(1)H1与H2、H3通信

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
root@lxc:~# lxc exec H1 ping 10.10.11.2
PING 10.10.11.2 (10.10.11.2) 56(84) bytes of data.
64 bytes from 10.10.11.2: icmp_seq=1 ttl=63 time=0.105 ms
64 bytes from 10.10.11.2: icmp_seq=2 ttl=63 time=0.061 ms
64 bytes from 10.10.11.2: icmp_seq=3 ttl=63 time=0.059 ms
64 bytes from 10.10.11.2: icmp_seq=4 ttl=63 time=0.081 ms
--- 10.10.11.2 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3067ms
rtt min/avg/max/mdev = 0.059/0.076/0.105/0.020 ms

root@lxc:~# lxc exec H1 ping 10.10.12.2
PING 10.10.12.2 (10.10.12.2) 56(84) bytes of data.
64 bytes from 10.10.12.2: icmp_seq=1 ttl=63 time=0.084 ms
64 bytes from 10.10.12.2: icmp_seq=2 ttl=63 time=0.068 ms
64 bytes from 10.10.12.2: icmp_seq=3 ttl=63 time=0.061 ms
64 bytes from 10.10.12.2: icmp_seq=4 ttl=63 time=0.067 ms
--- 10.10.12.2 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3049ms
rtt min/avg/max/mdev = 0.061/0.070/0.084/0.008 ms

(2)H2与H1、H3通信

不作赘述。

(3)H3与H1、H2通信

不作赘述。

查看路由表

通过检查连通性,确认虚拟路由器已经能正常地发挥功能了,查看路由表来观察它们是如何运作的:

1
2
3
4
5
6
7
8
9
root@lxc:~# lxc exec router1 route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
10.10.10.0 * 255.255.255.0 U 0 0 0 eth0
10.10.11.0 10.10.14.2 255.255.255.0 UG 20 0 0 eth2
10.10.12.0 10.10.14.2 255.255.255.0 UG 0 0 0 eth2
10.10.13.0 * 255.255.255.0 U 0 0 0 eth2
10.10.14.0 * 255.255.255.0 U 0 0 0 eth2
10.10.15.0 10.10.14.2 255.255.255.0 UG 20 0 0 eth2

由于从 router1 到 router2 的链路从路由配置 (逻辑) 上还未连通,因此 router1 上所有到 router2 的流量都需要转发到 router3 。

修改路由配置

接下来需要对 router1 router2 中的 ospfd 配置进行修改,通过 $ ps aux 查看 ospfd 进程的 PID,使用 $ kill -9 <PID> 终止进程,修改 /usr/local/etc/ 中的配置文件

1
2
3
4
5
router ospf
router-id 10.10.12.1
network 10.10.10.0/24 area 0
network 10.10.13.0/24 area 1
network 10.10.14.0/24 area 2

此时在协议配置中,我们加入了对应 router1 与 router2 之间的路径,重新执行 $ ospfd -u root -g root -d,重复上述“测试连通性”、“查看路由表”的操作,你会发现,路由表现在为:

1
2
3
4
5
6
7
8
9
root@lxc:~# lxc exec router1 route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
10.10.10.0 * 255.255.255.0 U 0 0 0 eth0
10.10.11.0 10.10.13.2 255.255.255.0 UG 20 0 0 eth1
10.10.12.0 10.10.14.2 255.255.255.0 UG 0 0 0 eth2
10.10.13.0 * 255.255.255.0 U 0 0 0 eth1
10.10.14.0 * 255.255.255.0 U 0 0 0 eth2
10.10.15.0 10.10.13.2 255.255.255.0 UG 20 0 0 eth1

注意事项

1、创建网络时,ipv4.address可以不用添加,对此实验没有影响

2、绑定接口时,对每个容器而言,尽量从eth0开始创建,因为无论从0还是1开始创建,容器内部创建网卡时,一定是按照顺序从0开始创建,若我们在外部从1开始创建,则外部的eth1对对应内部网卡名eth0,容易混淆,因此建议取消网卡自动创建后,要从eth0开始。

3、执行命令vi /usr/local/etc/ripd.conf配置rip协议时,添加的语句结尾处务必要添加一个换行符,否则最后一行的设置系统容易读不到,导致路由交换失败。

4、配置网络添加路由器也可以通过telnet进入zebra进行配置。第6步中提及的Router启动密码便是用于此种方法登录进Router中。此处不再一一赘述。