shan

ovs利用流表连接不同网段的子网

2020-12-01

目的

本文的主要目的是验证用ovs中的internal port作为网关,通过配置流表项从而可以直接打通不同网段下的虚拟机或namespace

拓扑结构

image-20201130112814134

实验用的拓扑由两个namespace和两个ovs br组成,其中namespacevns110vns210ip分别为192.168.1.10/24, 192.168.2.10/24,两个ovs br分别为br1br2,他们通过patch port相连;

搭建拓扑

执行如下的步骤搭建上面描述实验拓扑:

创建各类虚拟资源:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# 添加br1和br2
$ ovs-vsctl add-br br1
$ ovs-vsctl add-br br2

# 创建veth pair
$ ip link add veth110 type veth peer name ovs-veth110
$ ip link add veth210 type veth peer name ovs-veth210

# 创建namespace vns110和vns210
$ ip netns add vns110
$ ip netns add vns210

# 将veth110加入vns110,veth210加入vns210
$ ip link set dev veth110 netns vns110
$ ip link set dev veth210 netns vns210

# 将ovs-veth110加入br1上,ovs-veth210加入br2上
$ ovs-vsctl add-port br1 ovs-veth110
$ ovs-vsctl add-port br2 ovs-veth210

# 将ovs-veth110,ovs-veth210 up
$ ip link set ovs-veth110 up
$ ip link set ovs-veth210 up

# 为veth110 和 veth210设置ip并up
$ ip netns exec vns110 ip link set veth110 up
$ ip netns exec vns210 ip link set veth210 up
$ ip netns exec vns110 ip addr add 192.168.1.10/24 dev veth110
$ ip netns exec vns210 ip addr add 192.168.2.10/24 dev veth210

image-20201130133912263

br1br2中默认的internal port 的地址配置为192.168.1.20/24192.168.2.20/24

1
2
3
# 配置internal port的ip地址
$ ifconfig br1 192.168.1.20/24
$ ifconfig br2 192.168.2.20/24

![image-20201130133717826](./ovs利用流表连接不同网段的子网/配置internal port地址.png)

vns110vns210添加路由规则,并将网关地址设置为192.168.1.20/24, 192.168.2.20/24

1
2
3
# 设置br1为vns110的网关,br2为vns210的网关,并在通向对方网段时,设置为网关地址
$ ip netns exec vns110 route add -net 192.168.2.0/24 gw 192.168.1.20 dev veth110
$ ip netns exec vns210 route add -net 192.168.1.0/24 gw 192.168.2.20 dev veth210

image-20201130133505967

使用patch方式连接br1br2

1
2
3
# 使用patch互联br1和br2
$ ovs-vsctl add-port br1 trunk_br1 trunks=10,20 -- set Interface trunk_br1 type=patch options:peer=trunk_br2
$ ovs-vsctl add-port br2 trunk_br2 trunks=10,20 -- set Interface trunk_br2 type=patch options:peer=trunk_br1

![image-20201130093002758](./ovs利用流表连接不同网段的子网/patch port互联不同br.png)

配置流表项

清空已有的流表项;

1
2
3
# 删除默认流表项
$ ovs-ofctl del-flows br1
$ ovs-ofctl del-flows br2

image-20201130133328967

添加流表项;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 对于交换机br1将ip为192.168.1.10的包,修改mac地址后转到port1
$ ovs-ofctl add-flow br1 "priority=1,arp,arp_tpa=192.168.1.10,action=mod_dl_dst:42:4f:89:8c:ae:77,output:1"
$ ovs-ofctl add-flow br1 "ip,nw_dst=192.168.1.10,action=mod_dl_dst:42:4f:89:8c:ae:77,output:1"

# 将目的ip为192.168.2.0/24的包转向port2
$ ovs-ofctl add-flow br1 "ip,nw_dst=192.168.2.0/24,action=output:2"
$ ovs-ofctl add-flow br1 "priority=100,arp,arp_tpa=192.168.2.0/24,action=output:2"

# 将地址为网关的包设置为正常转发
$ ovs-ofctl add-flow br1 "ip,nw_dst=192.168.1.20 actions=NORMAL"
$ ovs-ofctl add-flow br1 "arp,arp_tpa=192.168.1.20 actions=NORMAL"

# 对于br2 进行相同的设置
$ ovs-ofctl add-flow br2 "priority=1,arp,arp_tpa=192.168.2.10,action=mod_dl_dst:e2:be:c0:66:02:62,output:1"
$ ovs-ofctl add-flow br2 "ip,nw_dst=192.168.2.10,action=mod_dl_dst:e2:be:c0:66:02:62,output:1"

$ ovs-ofctl add-flow br2 "ip,nw_dst=192.168.1.0/24,action=output:2"
$ ovs-ofctl add-flow br2 "priority=100,arp,arp_tpa=192.168.1.0/24,action=output:2"

$ ovs-ofctl add-flow br2 "ip,nw_dst=192.168.2.20 actions=NORMAL"
$ ovs-ofctl add-flow br2 "arp,arp_tpa=192.168.2.20 actions=NORMAL"

image-20201130101046231

当前br1br2的流表项如图所示:

image-20201130115016861

结果

vns110192.168.1.10成功ping192.168.2.10,从vns210192.168.2.10也成功ping192.168.1.10,成功打通了不同网段下的namespace

image-20201130134035607

使用支付宝打赏
使用微信打赏

若你觉得我的文章对你有帮助,欢迎点击上方按钮对我打赏

扫描二维码,分享此文章