手动配置ovs vxlan隧道实现公私网络互通
1 前言
学习了openstack一段时间,本人对于linux强大的网络功能充满兴趣,因为对于linux的网络功能包括nat、vxlan隧道配置等有了一定基础,希望通过测试配置两个私有网络,通过vxlan隧道配置实现私有网络在跨路由器实现二三层互通。另外也可以借助这个过程,通过抓包分析,对于网路的互通、vxlan、arp、icmp有一个更加清晰的认识。
2 环境描述
网络环境描述如下所示,其中host1和host2分别有一个wlp3s0和ens161接口,双方借助外部网络路由器实现互通(这里不限定个数,可以实现互通即可)。
-
host1外部网络环境
-
host2外部网络环境
-
互通示意图
如下图示意,host1和host2为两个不同网络内的虚机或者电脑,通过多个路由器和交换机组网实现互通,目前期望将host1上的br0和 host2上的br0配置到两个私有网段,通过vxlan隧道实现两台主机的私有网段能实现互通。此处要点有二:
- 在两个host的br0上配置vxlan隧道,使host1 br0和host2 br0构建成一个基于三层的underlay构建的overlay大二层网络。
- 由于正常情况下vxlan隧道的网络需要构建在一个网段内,但是两个br0网桥此次希望尝试两个不同网段,因此需要借助linux内核路由转发,为两个网络添加直连路由实现互通。
host1 host2
---------------- -------------
| host1 | | host2 |
---------------- -------------
| | | |
| |----------------routers---------------------| |
br0 wlp3s0(10.42.4.71) (10.190.49.211) ens160 br0
| |
接入内部网络1(192.168.11.10/24) 接入内部网络2 (192.168.22.1/24)
3 host1配置
host1上的配置可总结下所示:
#### 1-添加br0网桥
sudo ovs-vsctl add-br br0
#### 2-为br0网桥添加ip地址,并使能;
ifconfig br0 192.168.11.10/24 up
#### 3-配置vxlan接口;
##注意:此处remote_ip为host2公网ip
ovs-vsctl add-port br0 vx1 -- set interface vx1 type=vxlan options:remote_ip=10.190.49.126
##或者带上本端ip和key
ovs-vsctl add-port br0 vx1 -- set interface vx1 type=vxlan options:{local_ip=10.42.4.71,remote_ip=10.190.49.211,key=1}
#### 4-添加host2上私有网段的直连路由
sudo route add -net 192.168.2.0/24 dev br0
############
#所有配置完成#
############
配置完成后,host1上ovs查看如下所示:
配置完成后,host1上ifconfig查看如下所示:
-
br0
-
vxlan
host1静态路由配置:
4 host2配置
host2上的配置可总结下所示:
#### 1-添加br0网桥
sudo ovs-vsctl add-br br0
#### 2-为br0网桥添加ip地址,并使能;
ifconfig br0 192.168.11.10/24 up
#### 3-配置vxlan接口;
##注意:此处remote_ip为host2公网ip
ovs-vsctl add-port br0 vx1 -- set interface vx1 type=vxlan options:remote_ip=10.190.49.126
##或者带上本端ip和key
ovs-vsctl add-port br0 vx1 -- set interface vx1 type=vxlan options:{local_ip=10.190.49.211,remote_ip=10.42.4.71 ,key=1}
#### 4-添加host2上私有网段的直连路由
sudo route add -net 192.168.2.0/24 dev br0
############
#所有配置完成#
############
配置完成后,host2上ovs查看如下所示:
配置完成后,host1上ifconfig查看如下所示:
- br0
- vxlan
host2静态路由配置:
5 抓包分析
经过3、4两张配置成功后,就可以实现跨网络的两个内部网络访问,如下所示为通过wireshark抓包后的一些分析:
- 图1为host1 br0的抓包,我们可见两个内部网络可以实现包的互相ping,但是报文中没有vxlan隧道报文的底层细节,证明到达此处的icmp报文是已经剥离vxlan隧道的报文;
- 图2为host1 wlp3s0网口的抓包,此处也能抓到相关icmp报文,并且此时icmp报文承载udp报文内部,清晰课件vxlan隧道的踪影;
6 实验问题
实验中出现了vxlan隧道无法建立的问题,检查ovs配置文件和日志,发现了一些错误,但是无法解决。后来通过互相ping抓包发现,是两个host其中一测host1的ovs存在问题;具体现象是:
- 从host2 ping host1可以在host1上抓到host1传过来的vxlan报文,但是wireshark提示无法找到对应端口;
- 从host1 ping host2无法抓到任何出方向包;
- 命令行查看udp端口监听情况可以发现vxlan隧道端口4789在host1上未监听,而在host2上是正常的,具体命令如下所示:
原因分析:
通过现象分析,初步认为是host1的相关进程存在问题,因此停止了host1的ovs服务,清除其数据库,重新启动相关服务,重新按照步骤3操作,问题得到解决,具体命令行如下:
sudo -s
systemctl stop openvswitch-switch.service
rm -rf /var/log/openvswitch/*
rm -rf /etc/openvswitch/conf.db
systemctl start openvswitch
7 总结及备忘
- 通过vxlan隧道配置验证了相关vxlan功能原理,同时通过抓包大致明晰了vxlan报文的原理;
- 实验过程中刻意尝试使用ping 命令ping了一个未分配ip的192.168.22.8ping 包,刻意通过抓包看到相关arp报文查询此ip,也能见到arp报文通过vxlan隧道传至对端。
- 此处的实验尝试是出于一个私心,部分网段的权限更高,实现隧道网络的私有网段传播只是其中第一步,后续可尝试配置nat,实现通过私有网段实验外网访问,待后续验证;
- vxlan隧道的udp端口号为4789,当出现问题需要关注相关端口的监听状态,可辅助定位部分问题;
- 后续尝试gre隧道配置,进一步尝试分析;