具体需求
本文描述的主要需求是在特殊情况下,没有交换机设备,需要多台(大于两台)服务器之间实现连通;而且就算断一根网线,可以自动通过另外一条路绕行,网络不受影响。
实现原理
采用在lo网卡上配置主机IP,链路上配置接口IP的思路。如果程序能够配置自己和外部通信采用的IP地址,接口IP只在端到端有效,否则接口IP可能需要全局能互通。程序采用指定IP通信,比如Ping程序,命令如下:ping 2.2.2.2 -I 1.1.1.1。 这样,链路的IP所形成的通路就是underlay通路。Lo上的IP形成的网络就是overlay网络。在严格的情况下,程序只运行在overlay网络上。
综上所述,有下面两种方案:
a) 全局的underlay网络,underlay网络的地址和overlay网络的地址全局互通。
b) 纯粹的overlay网络,underlay网络的地址只在单条链路上互通,overlay网络地址全局互通。
本文中主要介绍全局的underlay网络方案,主要实现原理为:
a) 每台服务器需两个网口,服务器之间用网线直线,连接为一个环路
b) 在各自服务器的lo interface上配置一个接口IP
c) 使用quagga配置动态路由
测试环境
三台服务器(网卡为两千兆两万兆,本文中实现万兆之间互连)
操作系统CentOS 7.4
大致环境信息:
基础架构
配置实现
d) 在lo interface上配置独立IP
在三台主机上分别使用下面命令来配置接口IP
#ip addr add 1.1.1.1/24 dev lo // node1
#ip addr add 2.2.2.2/24 dev lo // node2
#ip addr add 3.3.3.3/24 dev lo // node3
e) 在三台主机上分别安装配置quagga
#yum install quagga
#cp /usr/share/doc/quagga-0.99.22.4/zebra.conf.sample /etc/quagga/zebra.conf
#cp /usr/share/doc/quagga-0.99.22.4/ospfd.conf.sample /etc/quagga/ospfd.conf
#chown quagga:quaggavt /etc/quagga/.conf
#chown 640 /etc/quagga/.conf
f) 在三台主机上分别配置zebra
编辑/etc/quagga/zebra.conf配置文件
hostname control03 // 配置本机hostname
password zebra
enable password zebra
debug zebra events
debug zebra packet
interface enp129s0d1 // 配置万兆网卡名
ip address 22.1.1.171/24 // 配置网卡对应的IP地址
ipv6 nd suppress-ra
interface enp129s0 // 配置万兆网卡名
ip address 44.1.1.171/24 // 配置网卡对应的IP地址
ipv6 nd suppress-ra
interface lo
ip forwarding
line vty
log file /var/log/quagga/zebra.log
g) 在三台主机上分别配置ospfd
编辑/etc/quagga/ospfd.conf配置文件
hostname control03 // 配置本机hostname
password zebra
interface enp129s0d1 // 配置万兆网卡名
interface enp129s0 // 配置万兆网卡名
interface lo
router ospf
network 22.1.1.0/24 area 0.0.0.0 // 配置万兆网卡网段
network 44.1.1.0/24 area 0.0.0.0 // 配置万兆网卡网段
network 1.1.1.0/24 area 0.0.0.0 // 配置定义的IP所属网段
line vty
log file /var/log/quagga/ospfd.log
h) 在三台主机上分别启动服务
#systemctl start zebra
#systemctl start ospfd
路由结果
i) node1路由结果
缺省情况下,quagga的路由的直连metric是10,forward一次添加10。所以有上面的标记了proto zebra的路由的metric。从node1 到3.3.3.3,metric是20,那是因为在node3中内部做了一次forward,从enp3s0f1转到了lo设备。
从node1访问33.1.1.0/24有两条链路:
1) 通过node1节点上的enp129s0(44.1.1.171)访问到node3节点上的enp3s0f1(44.1.1.233), 然后再forward到node3节点上的enp3s0f0(33.1.1.233),连通。
2) 通过node1节点上的enp129s0d1(22.1.1.171)访问到node2节点上的enp129s0d1(22.1.1.172),然后再通过node2节点上的enp129s0(33.1.1.172)来forward到node3节点上的enp3s0f0(33.1.1.233),连通。
j) node2路由结果
k) node3路由结果
连通测试
l) overlay互通
Case1: 在node1上通过1.1.1.1测试是否连通2.2.2.2和3.3.3.3
测试结果: 测试通过
Case2: 在node2上通过2.2.2.2测试是否连通1.1.1.1和3.3.3.3
测试结果: 测试通过
Case3: 在node3上通过3.3.3.3测试是否连通1.1.1.1和2.2.2.2
测试结果: 测试通过
m) underlay到overlay互通
Case4: 在node1上直接测试是否连通2.2.2.2和3.3.3.3
测试结果: 测试通过
Case5: 在node2上直接测试是否连通1.1.1.1和3.3.3.3
测试结果: 测试通过
Case6: 在node3上直接测试是否连通1.1.1.1和2.2.2.2
测试结果: 测试通过
n) 断网测试
拔掉node1连接node3的网线,即node1上enp129s0和node3上enp3s0f1的连接线
可以看到路由发生变化。
在node1上,访问3.3.3.3的metric变为30,而且到33.1.1.0/24的路径也只剩一条
在node3上,访问1.1.1.1的metric变为30,而且到22.1.1.0/24的路径也只剩一条
具体访问路径如下图:
Case7:在node1上测试是否连通3.3.3.3,在node3上测试是否连通1.1.1.1
测试结果: 测试通过
后记
设计方案时也考虑了bridge 把各个节点的两个口串起来,但是由于生成树对链路进行裁剪,会造成正常情况下,不能实现两两直接通信。另外还有一个方案就是,手动配置一个IP在一个网口上,用静态路由的办法指定到旁边的节点使用无IP的网口出去,这个方法可以保证正常通信两两互通,但是断线测试不能做到自动切换链路。本文讲述了三台机器的配置,其实可以扩展到4台或者更多的环路互联,但是不能做到两两直通。