[NFV] 虚拟网络
承接上篇,本篇中将利用上篇构建的虚拟路由器实现几个简单的网络结构,并将测试不同路由协议。
注意本文中,在主机中的指令以 $
开头,在容器中的指令以 root@R1:~#
开头。
创建网络 1
以图为例,创建如图所示网络结构,操作如下。
配置主机与网桥
以前文构建路由器作为 R1,另外需要启动两台容器作为主机 C1 C2
1 | $ sudo lxc init ubuntu C1 -p default |
通过 lxc
命令创建网络并绑定端口
1 | $ sudo lxc network create C1R1 ipv6.address=none ipv4.address=12.12.12.1/24 |
进入R1 (类似 docker 进入容器),分配地址并启动网卡
1 | $ sudo lxc exec R1 bash |
方便起见,也可以直接在
exec
后面附带需要执行的命令
1 $ sudo lxc exec R1 ip addr add 11.11.11.1/24 dev eth0
查看网卡配置
1 | root@R1:~# ip addr |
进入 C1,类似 R1 中的操作,就不分步说明了:
1 | $ sudo lxc exec c1 bash |
这里有些区别,我们需要为 C1 替换默认网关,以使流量能正确地传输到 R1 中:
1 | root@c1:~# route delete default |
测试能否ping通
1 | root@c1:~# ping 11.11.11.1 |
退出容器
1 | root@c1:~# exit |
接下来按照上面方法连接主机 C2 及 eth0
网卡、路由器R1 及网卡 eth1
进行配置并测试,地址分别为 11.11.10.1/24
与 11.11.10.2/24
。
此时通过 C1 ping C2 会发现暂时无法 ping 通,这是由于路由器暂时还没配置使用路由协议,这里我们将采用 rip
协议。
配置协议
开启RIP路由协议
进入R1
1 | sudo lxc exec R1 bash |
复制RIP协议的配置文件,以便自动配置
1 | root@R1:~#cp /usr/local/etc/ripd.conf.sample /usr/local/etc/ripd.conf |
加入如下内容
1 | router rip |
:wq
保存退出,rip配置完成,执行
1 | root@R1:~#zebra –d |
正常启动后,可以用 ip route show
查看路由是否已经建立
退出 root@R1:~#exit
创建网络 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 | router ospf |
!
注释部分为实验之后部分中需要添加的内容。
启用 ospf
(以 router1 为例) :
1 | root@router1:~# cd /usr/local/etc |
测试连通性
1、测试任意两两主机间是否能够通信。
(1)H1与H2、H3通信
1 | root@lxc:~# lxc exec H1 ping 10.10.11.2 |
(2)H2与H1、H3通信
不作赘述。
(3)H3与H1、H2通信
不作赘述。
查看路由表
通过检查连通性,确认虚拟路由器已经能正常地发挥功能了,查看路由表来观察它们是如何运作的:
1 | root@lxc:~# lxc exec router1 route -n |
由于从 router1 到 router2 的链路从路由配置 (逻辑) 上还未连通,因此 router1 上所有到 router2 的流量都需要转发到 router3 。
修改路由配置
接下来需要对 router1 router2 中的 ospfd
配置进行修改,通过 $ ps aux
查看 ospfd
进程的 PID,使用 $ kill -9 <PID>
终止进程,修改 /usr/local/etc/
中的配置文件
1 | router ospf |
此时在协议配置中,我们加入了对应 router1 与 router2 之间的路径,重新执行 $ ospfd -u root -g root -d
,重复上述“测试连通性”、“查看路由表”的操作,你会发现,路由表现在为:
1 | root@lxc:~# lxc exec router1 route -n |
注意事项
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中。此处不再一一赘述。