1.vxlan内核态实现
1.1 测试环境
1.2 试验配置
host 172.16.0.100
brctl addbr br0
ip addr add 10.1.1.2/24 dev br0
ip link set dev br0 up
ip link add vxlan0 type vxlan id 1 group 239.1.1.1 dev eth1 dstport 4789
brctl addif br0 vxlan0
ip link set dev vxlan0 up
host 172.16.1.175
brctl addbr br0
ip addr add 10.1.1.3/24 dev br0
ip link set dev br0 up
ip link add vxlan0 type vxlan id 1 group 239.1.1.1 dev eth1 dstport 4789
brctl addif br0 vxlan0
ip link set dev vxlan0 up
1.3 试验验证
1.4 试验补充
查看fdb表项
bridge fdb show dev vxlan0
fe:38:17:75:3b:4e master br0
4e:fd:3c:3f:bc:60 master br0 permanent
4e:fd:3c:3f:bc:60 vlan 1 master br0 permanent
00:00:00:00:00:00 dst 239.1.1.1 via eth0 self permanent
fe:38:17:75:3b:4e dst 172.16.0.100 self
查看邻居表项
ip neigh show
172.16.0.100 dev eth0 lladdr fa:16:3e:ee:d2:a0 STALE
172.16.0.2 dev eth0 lladdr fa:16:3e:60:e5:8a STALE
10.1.1.2 dev br0 lladdr fe:38:17:75:3b:4e STALE
172.16.0.1 dev eth0 lladdr fa:16:3e:3d:b5:44 REACHABLE
确认学习到的mac fe:38:17:75:3b:4e 是否正确
br0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1400
inet 10.1.1.2 netmask 255.255.255.0 broadcast 0.0.0.0
inet6 fe80::645a:25ff:feca:dc67 prefixlen 64 scopeid 0x20<link>
ether fe:38:17:75:3b:4e txqueuelen 1000 (Ethernet)
RX packets 36 bytes 2672 (2.6 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 38 bytes 3260 (3.1 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
查询vxlan0端口信息,可以发现vni 为1 并且加入组播组239.1.1.1
ip -d link show dev vxlan0
4: vxlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1400 qdisc noqueue master br0 state UNKNOWN mode DEFAULT qlen 1000
link/ether fe:38:17:75:3b:4e brd ff:ff:ff:ff:ff:ff promiscuity 1
vxlan id 1 group 239.1.1.1 dev eth0 srcport 0 0 dstport 4789 ageing 300
bridge_slave state forwarding priority 32 cost 100 hairpin off guard off root_block off fastleave off learning on flood on port_id 0x8001 port_no 0x1 designated_port 32769 designated_cost 0 designated_bridge 8000.fe:38:17:75:3b:4e designated_root 8000.fe:38:17:75:3b:4e hold_timer 0.00 message_age_timer 0.00 forward_delay_timer 0.00 topology_change_ack 0 config_pending 0 proxy_arp off proxy_arp_wifi off mcast_router 1 mcast_fast_leave off mcast_flood on addrgenmode eui64
2.openvswitch实现
OVS不支持组播,需要为任意两个主机之间建立VXLAN单播隧道。与上边示例的拓朴结构相比,我们使用了两个OVS网桥,将虚拟逻辑网络的接口接入网桥br-int
,将所有VXLAN接口接入br-tun
。两个网桥使用PATCH类型接口进行连接。由于网桥br-tun
上有多个VTEP,当BUM数据包从其中某个VTEP流入时,数据包会从其他VTEP接口再流出,这会导致数据包在主机之间无限循环。因而我们需要添加流表使VTEP流入的数据包不再转发至其他VTEP。若逻辑网络接口与VTEP连接同一网桥,配置流表将比较繁琐。单独将逻辑网络接口放到独立的网桥上,可以使流表配置非常简单,只需要设置VTEP流入的数据包从PATCH接口流出。
2.1 试验环境
2.2 试验配置
host 172.16.0.100
ovs-vsctl add-br br-int
ovs-vsctl add-br br-tun
ovs-vsctl add-port br-int patch-int -- set interface patch-int type=patch options:peer=patch-tun
ovs-vsctl add-port br-tun patch-tun -- set interface patch-tun type=patch options:peer=patch-int
ovs-vsctl add-port br-tun vxlan0 -- set interface vxlan0 type=vxlan options:remote_ip=172.16.1.75 options:key=100
查看br-tun portid 和配置流表
ovs-ofctl show br-tun
OFPT_FEATURES_REPLY (xid=0x2): dpid:0000a604364a044d
n_tables:254, n_buffers:256
capabilities: FLOW_STATS TABLE_STATS PORT_STATS QUEUE_STATS ARP_MATCH_IP
actions: OUTPUT SET_VLAN_VID SET_VLAN_PCP STRIP_VLAN SET_DL_SRC SET_DL_DST SET_NW_SRC SET_NW_DST SET_NW_TOS SET_TP_SRC SET_TP_DST ENQUEUE
1(patch-tun): addr:b2:cf:ce:c5:4f:94
config: 0
state: 0
speed: 0 Mbps now, 0 Mbps max
3(vxlan0): addr:92:7f:4f:a2:cc:30
config: 0
state: 0
speed: 0 Mbps now, 0 Mbps max
LOCAL(br-tun): addr:a6:04:36:4a:04:4d
config: 0
state: 0
speed: 0 Mbps now, 0 Mbps max
OFPT_GET_CONFIG_REPLY (xid=0x4): frags=normal miss_send_len=0
ovs-ofctl add-flow br-tun 'table=0, priority=1, in_port=1 actions=resubmit(,1)'
ovs-ofctl add-flow br-tun 'table=0, priority=1, in_port=3 actions=resubmit(,2)'
ovs-ofctl add-flow br-tun 'table=0, priority=0 actions=drop'
ovs-ofctl add-flow br-tun 'table=1, priority=0,dl_dst=00:00:00:00:00:00/01:00:00:00:00:00 actions=resubmit(,20)'
ovs-ofctl add-flow br-tun 'table=1, priority=0,dl_dst=01:00:00:00:00:00/01:00:00:00:00:00 actions=resubmit(,21)'
ovs-ofctl add-flow br-tun 'table=2,priority=0,actions=learn(table=20,hard_timeout=300,priority=1,NXM_OF_ETH_DST[]=NXM_OF_ETH_SRC[],load:NXM_NX_TUN_ID[]->NXM_NX_TUN_ID[],output:NXM_OF_IN_PORT[]), output:1'
ovs-ofctl add-flow br-tun "table=20,priority=0,actions=resubmit(,21)"
ovs-ofctl add-flow br-tun 'table=21, priority=0, actions=output:3'
配置tap口
ovs-vsctl add-port br2 tap2 -- set Interface tap2 type=internal
ip netns add ns2
ip link set tap2 netns ns2
ip netns exec ns2 ip addr add 1.1.1.1/24 dev tap2
ip netns exec ns2 ip link set tap2 up
ip netns exec ns2 ip link set lo up
host 172.16.1.75 配置
ovs-vsctl add-br br-int
ovs-vsctl add-br br-tun
ovs-vsctl add-port br-int patch-int -- set interface patch-int type=patch options:peer=patch-tun
ovs-vsctl add-port br-tun patch-tun -- set interface patch-tun type=patch options:peer=patch-int
ovs-vsctl add-port br-tun vxlan0 -- set interface vxlan0 type=vxlan options:remote_ip=172.16.0.100 options:key=100
查看br-tun portid 和配置流表
ovs-ofctl show br-tun
OFPT_FEATURES_REPLY (xid=0x2): dpid:0000b2661fec0a4f
n_tables:254, n_buffers:256
capabilities: FLOW_STATS TABLE_STATS PORT_STATS QUEUE_STATS ARP_MATCH_IP
actions: OUTPUT SET_VLAN_VID SET_VLAN_PCP STRIP_VLAN SET_DL_SRC SET_DL_DST SET_NW_SRC SET_NW_DST SET_NW_TOS SET_TP_SRC SET_TP_DST ENQUEUE
1(patch-tun): addr:2a:53:4e:00:bc:d1
config: 0
state: 0
speed: 0 Mbps now, 0 Mbps max
2(vxlan0): addr:02:6e:52:34:e9:0b
config: 0
state: 0
speed: 0 Mbps now, 0 Mbps max
LOCAL(br-tun): addr:b2:66:1f:ec:0a:4f
config: 0
state: 0
speed: 0 Mbps now, 0 Mbps max
OFPT_GET_CONFIG_REPLY (xid=0x4): frags=normal miss_send_len=0
ovs-ofctl add-flow br-tun 'table=0, priority=1, in_port=1 actions=resubmit(,1)'
ovs-ofctl add-flow br-tun 'table=0, priority=1, in_port=2 actions=resubmit(,2)'
ovs-ofctl add-flow br-tun 'table=0, priority=0 actions=drop'
ovs-ofctl add-flow br-tun 'table=1, priority=0,dl_dst=00:00:00:00:00:00/01:00:00:00:00:00 actions=resubmit(,20)'
ovs-ofctl add-flow br-tun 'table=1, priority=0,dl_dst=01:00:00:00:00:00/01:00:00:00:00:00 actions=resubmit(,21)'
ovs-ofctl add-flow br-tun 'table=2,priority=0,actions=learn(table=20,hard_timeout=300,priority=1,NXM_OF_ETH_DST[]=NXM_OF_ETH_SRC[],load:NXM_NX_TUN_ID[]->NXM_NX_TUN_ID[],output:NXM_OF_IN_PORT[]), output:1'
ovs-ofctl add-flow br-tun "table=20,priority=0,actions=resubmit(,21)"
ovs-ofctl add-flow br-tun 'table=21, priority=0, actions=output:2'
配置tap口
ovs-vsctl add-port br2 tap2 -- set Interface tap2 type=internal
ip netns add ns2
ip link set tap2 netns ns2
ip netns exec ns2 ip addr add 1.1.1.2/24 dev tap2
ip netns exec ns2 ip link set tap2 up
ip netns exec ns2 ip link set lo up
2.3 试验验证
2.4 试验补充
1.ns2 namespace能学习到对端的mac地址
2.br-int 能学习到对端mac
3. 抓包
查看port 流量统计
在查看端口的流量统计也可以使用:ovs-ofctl dump-ports br-int