源码分析openvswitch vxlan

ovs对于vxlan的支持依赖datapath的类型,对于kernel space datapath来说,创建vxlan端口后,在将此端口添加到datapath时,会调用kernel自身提供的vxlan.ko模块创建出vxlan_sys_port来,ovs只需要将流表action指向vxlan_sys_port即可,vxlan报文的封装,封装后路由查找和邻居查找都由vxlan模块/kernel来实现;而对于userspace datapath来说,vxlan报文的封装,封装后路由查找和邻居查找都由ovs本身实现。

实验

下面分别实验两种datapath下的vxlan。
kernel space vxlan
拓扑图如下所示

image.png

对应的命令如下

//在vm1上操作,创建一个bridge,添加一个vxlan端口
ovs-vsctl add-br br0
ovs-vsctl add-port br0 vxlan1 -- set interface vxlan1 type=vxlan options:remote_ip=10.10.10.2 options:key=flow options:dst_port=8472
ifconfig br0 1.1.1.1/24
ifconfig ens8 10.10.10.1/24
//在vm2上操作
ovs-vsctl add-br br0
ovs-vsctl add-port br0 vxlan1 -- set interface vxlan1 type=vxlan options:remote_ip=10.10.10.1 options:key=flow options:dst_port=8472
ifconfig br0 1.1.1.2/24
ifconfig ens8 10.10.10.2/24

命令执行成功后,查看基本情况

//创建vlxna端口后会监听端口8472,用来接收vxlan报文
root@master:~# netstat -nap | grep 8472
udp        0      0 0.0.0.0:8472            0.0.0.0:*                           -
udp6       0      0 :::8472                 :::*                                -

//查看vxlan端口驱动类型为vxlan
root@master:~# ethtool -i vxlan_sys_8472
driver: vxlan
version: 0.1
firmware-version:
expansion-rom-version:
bus-info:
supports-statistics: no
supports-test: no
supports-eeprom-access: no
supports-register-dump: no
supports-priv-flags: no

//查看ovs当前配置
root@master:~# ovs-vsctl show
1e633d2b-7a9e-44ba-9c16-89e12912c2d6
    Bridge "br0"
        Port "br0"
            Interface "br0"
                type: internal
        Port "vxlan1"
            Interface "vxlan1"
                type: vxlan
                options: {dst_port="8472", key=flow, remote_ip="10.10.10.2"}

//查看datapath端口
root@master:~# ovs-appctl dpctl/show
system@ovs-system:
        lookups: hit:147 missed:23 lost:0
        flows: 4
        masks: hit:457 total:5 hit/pkt:2.69
        port 0: ovs-system (internal)
        port 1: br0 (internal)
        port 2: vxlan_sys_8472 (vxlan: packet_type=ptap)

在vm1上ping 1.1.1.2,可以ping通,查看流表及抓包情况

root@master:~# ping 1.1.1.2
PING 1.1.1.2 (1.1.1.2) 56(84) bytes of data.
64 bytes from 1.1.1.2: icmp_seq=1 ttl=64 time=4.58 ms
64 bytes from 1.1.1.2: icmp_seq=2 ttl=64 time=0.643 ms
^C
--- 1.1.1.2 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1002ms
rtt min/avg/max/mdev = 0.643/2.610/4.578/1.967 ms

//datapath流表信息,有4条流表,两条arp相关的,两条icmp相关的,从1口收到的报文转发给2口,从2口收到的报文转发给1口
root@master:~# ovs-appctl dpctl/dump-flows
recirc_id(0),tunnel(tun_id=0x0,src=10.10.10.2,dst=10.10.10.1,flags(-df-csum+key)),in_port(2),eth(src=d6:5a:9e:97:39:4f,dst=b6:7b:1a:1e:79:44),eth_type(0x0806), packets:1, bytes:42, used:8.528s, actions:1
recirc_id(0),in_port(1),eth(src=b6:7b:1a:1e:79:44,dst=d6:5a:9e:97:39:4f),eth_type(0x0800),ipv4(tos=0/0x3,frag=no), packets:13, bytes:1274, used:0.384s, actions:set(tunnel(tun_id=0x0,dst=10.10.10.2,ttl=64,tp_dst=8472,flags(df|key))),2
recirc_id(0),in_port(1),eth(src=b6:7b:1a:1e:79:44,dst=d6:5a:9e:97:39:4f),eth_type(0x0806), packets:0, bytes:0, used:never, actions:set(tunnel(tun_id=0x0,dst=10.10.10.2,ttl=64,tp_dst=8472,flags(df|key))),2
recirc_id(0),tunnel(tun_id=0x0,src=10.10.10.2,dst=10.10.10.1,flags(-df-csum+key)),in_port(2),eth(src=d6:5a:9e:97:39:4f,dst=b6:7b:1a:1e:79:44),eth_type(0x0800),ipv4(frag=no), packets:13, bytes:1274, used:0.384s, actions:1

//在vxlan端口上抓包,此时只能抓到封装前的报文
root@master:~# tcpdump -vne -i vxlan_sys_8472
tcpdump: listening on vxlan_sys_8472, link-type EN10MB (Ethernet), capture size 262144 bytes
23:02:27.662008 0e:ed:bb:33:06:40 > 96:e5:e8:08:63:44, ethertype IPv4 (0x0800), length 98: (tos 0x0, ttl 64, id 23800, offset 0, flags [DF], proto ICMP (1), length 84)
    1.1.1.2 > 1.1.1.1: ICMP echo request, id 9663, seq 89, length 64
23:02:27.662095 96:e5:e8:08:63:44 > 0e:ed:bb:33:06:40, ethertype IPv4 (0x0800), length 98: (tos 0x0, ttl 64, id 64219, offset 0, flags [none], proto ICMP (1), length 84)
    1.1.1.1 > 1.1.1.2: ICMP echo reply, id 9663, seq 89, length 64

//在最终出端口上抓包,可以抓到封装vxlan后的报文
root&
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值