vxlan简介
VXLAN(Virtual eXtensible Local Area Network,虚拟扩展局域网),是由IETF定义的NVO3(Network Virtualization over Layer 3)标准技术之一,是对传统VLAN协议的一种扩展。VXLAN的特点是将L2的以太帧封装到UDP报文(即L2 over L4)中,并在L3网络中传输.
1、Vxlan报文基本格式
1、VXLAN Header 增加VXLAN头(8字节),其中包含24比特的VNI字段,用来定义VXLAN网络中不同的租户。此外,还包含VXLAN Flags(8比特,取值为00001000)和两个保留字段(分别为24比特和8比特)。 2、UDP Header VXLAN头和原始以太帧一起作为UDP的数据。UDP头中,目的端口号(VXLAN Port)固定为4789,源端口号(UDP Src. Port)是原始以太帧通过哈希算法计算后的值。 3、Outer IP Header 封装外层IP头。其中,源IP地址(Outer Src. IP)为源VM所属VTEP的IP地址,目的IP地址(Outer Dst. IP)为目的VM所属VTEP的IP地址。 4、Outer MAC Header 封装外层以太头。其中,源MAC地址(Src. MAC Addr.)为源VM所属VTEP的MAC地址,目的MAC地址(Dst. MAC Addr.)为到达目的VTEP的路径中下一跳设备的MAC地址。
2、vxlan帧头格式
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|R|R|R|R|I|R|R|R| Reserved |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| VXLAN Network Identifier (VNI) | Reserved |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
VXLAN Header:VXLAN协议新定义的VXLAN头,8字节 (默认使用UDP Dport 4789):
注意:当接收到vxlan报文中I未置位时,报文直接丢弃。
组网环境如下,实现vm1和vm2通信:
#设置vtep1接口ip地址
set interface state GigabitEthernet13/0/0 up
set interface ip address GigabitEthernet13/0/0 192.168.1.2/31
#配置vxlan隧道接口,使用vni 13
create vxlan tunnel src 192.168.1.2 dst 192.168.1.3 vni 13 decap-next l2
#创建一个二层域BD 13
create bridge-domain 13 learn 1 forward 1 uu-flood 1 flood 1 arp-term 1
#vxlan隧道加入二层域
set interface l2 bridge vxlan_tunnel0 13 1
set interface state GigabitEthernetb/0/0 up
set interface l2 bridge GigabitEthernetb/0/0 13 1
#创建loopback接口
loopback create mac 1a:2b:3c:4d:5e:8f
#loopback接口加入二层域名,并设置为bvi接口
set interface l2 bridge loop0 13 bvi
#配置loopback接口ip地址
set interface ip table loop0 0
set interface state loop0 up
set interface ip addr loop0 192.168.3.1/24
#设置路由
ip route add 192.168.3.0/24 via loop0
#添加arp表,否则不通
set bridge-domain arp entry 13 192.168.2.2 1a:2b:3c:4d:5e:7f
#内核接口ens256 和GigabitEthernetb/0/0 同一个vlan下
ifconfig ens256 192.168.3.2/24
route add -net 192.168.2.0/24 gw 192.168.3.1
vpp2
set interface state GigabitEthernet13/0/0 up
set interface ip address GigabitEthernet13/0/0 192.168.1.3/31
create vxlan tunnel src 192.168.1.3 dst 192.168.1.2 vni 13 decap-next l2
create bridge-domain 13 learn 1 forward 1 uu-flood 1 flood 1 arp-term 1
set interface l2 bridge vxlan_tunnel0 13 1
loopback create mac 1a:2b:3c:4d:5e:7f
set interface state GigabitEthernet4/0/0 up
set interface l2 bridge GigabitEthernet4/0/0 13 1
set interface l2 bridge loop0 13 bvi
set interface ip table loop0 0
set interface state loop0 up
set interface ip addr loop0 192.168.2.1/24
ip route add 192.168.3.0/24 via loop0
set bridge-domain arp entry 13 192.168.3.2 1a:2b:3c:4d:5e:8f
#内核配置
ifconfig ens256 192.168.2.2/24
route add -net 192.168.3.0/24 gw 192.168.2.1
Vm2 ping vm1 ,分别在vpp和vpp2 抓trace流程
00:34:05:585797: dpdk-input
GigabitEthernet4/0/0 rx queue 0
buffer 0x84cf2: current data 0, length 98, buffer-pool 0, ref-count 1, totlen-nifb 0, trace handle 0x0
ext-hdr-valid
l4-cksum-computed l4-cksum-correct
PKT MBUF: port 0, nb_segs 1, pkt_len 98
buf_len 2176, data_len 98, ol_flags 0x80, data_off 128, phys_addr 0x26133d00
packet_type 0x91 l2_len 0 l3_len 0 outer_l2_len 0 outer_l3_len 0
rss 0x0 fdir.hi 0x0 fdir.lo 0x0
Packet Offload Flags
PKT_RX_IP_CKSUM_GOOD (0x0080) IP cksum of RX pkt. is valid
Packet Types
RTE_PTYPE_L2_ETHER (0x0001) Ethernet packet
RTE_PTYPE_L3_IPV4_EXT_UNKNOWN (0x0090) IPv4 packet with or without extension headers
IP4: 00:0c:29:63:94:3a -> 1a:2b:3c:4d:5e:7f
ICMP: 192.168.2.2 -> 192.168.3.2
tos 0x00, ttl 64, length 84, checksum 0x261b dscp CS0 ecn NON_ECN
fragment id 0x8e39, flags DONT_FRAGMENT
ICMP echo_request checksum 0x1e66
00:34:05:585809: ethernet-input
frame: flags 0x1, hw-if-index 1, sw-if-index 1
IP4: 00:0c:29:63:94:3a -> 1a:2b:3c:4d:5e:7f
00:34:05:585815: l2-input
l2-input: sw_if_index 1 dst 1a:2b:3c:4d:5e:7f src 00:0c:29:63:94:3a
00:34:05:585817: l2-learn
l2-learn: sw_if_index 1 dst 1a:2b:3c:4d:5e:7f src 00:0c:29:63:94:3a bd_index 1
00:34:05:585820: l2-fwd
l2-fwd: sw_if_index 1 dst 1a:2b:3c:4d:5e:7f src 00:0c:29:63:94:3a bd_index 1 result [0x700000005, 5] static age-not bvi
00:34:05:585822: ip4-input
ICMP: 192.168.2.2 -> 192.168.3.2
tos 0x00, ttl 64, length 84, checksum 0x261b dscp CS0 ecn NON_ECN
fragment id 0x8e39, flags DONT_FRAGMENT
ICMP echo_request checksum 0x1e66
00:34:05:585825: ip4-lookup
fib 0 dpo-idx 4 flow hash: 0x00000000
ICMP: 192.168.2.2 -> 192.168.3.2
tos 0x00, ttl 64, length 84, checksum 0x261b dscp CS0 ecn NON_ECN
fragment id 0x8e39, flags DONT_FRAGMENT
ICMP echo_request checksum 0x1e66
00:34:05:585827: ip4-rewrite
tx_sw_if_index 5 dpo-idx 4 : ipv4 via 192.168.3.2 loop0: mtu:9000 next:4 1a2b3c4d5e8f1a2b3c4d5e7f0800 flow hash: 0x000
00000
00000000: 1a2b3c4d5e8f1a2b3c4d5e7f0800450000548e3940003f01271bc0a80202c0a8
00000020: 030208001e6633f400159d154e6000000000f6470500000000001011
00:34:05:585830: loop0-output
loop0
IP4: 1a:2b:3c:4d:5e:7f -> 1a:2b:3c:4d:5e:8f
ICMP: 192.168.2.2 -> 192.168.3.2
tos 0x00, ttl 63, length 84, checksum 0x271b dscp CS0 ecn NON_ECN
fragment id 0x8e39, flags DONT_FRAGMENT
ICMP echo_request checksum 0x1e66
00:34:05:585833: l2-input
l2-input: sw_if_index 5 dst 1a:2b:3c:4d:5e:8f src 1a:2b:3c:4d:5e:7f
00:34:05:585833: l2-fwd
l2-fwd: sw_if_index 5 dst 1a:2b:3c:4d:5e:8f src 1a:2b:3c:4d:5e:7f bd_index 1 result [0x1000000000004, 4] none
00:34:05:585834: l2-output
l2-output: sw_if_index 4 dst 1a:2b:3c:4d:5e:8f src 1a:2b:3c:4d:5e:7f data 08 00 45 00 00 54 8e 39 40 00 3f 01
00:34:05:585835: vxlan4-encap
VXLAN encap to vxlan_tunnel0 vni 13
00:34:05:585838: ip4-rewrite
tx_sw_if_index 3 dpo-idx 1 : ipv4 via 192.168.1.2 GigabitEthernet13/0/0: mtu:9000 next:3 000c29170a44000c296394300800
flow hash: 0xda4d42ae
00000000: 000c29170a44000c2963943008004500008600000000fd113a11c0a80103c0a8
00000020: 0102ae4212b5007200000800000000000d001a2b3c4d5e8f1a2b3c4d
00:34:05:585838: GigabitEthernet13/0/0-output
GigabitEthernet13/0/0
IP4: 00:0c:29:63:94:30 -> 00:0c:29:17:0a:44
UDP: 192.168.1.3 -> 192.168.1.2
tos 0x00, ttl 253, length 134, checksum 0x3a11 dscp CS0 ecn NON_ECN
fragment id 0x0000
UDP: 44610 -> 4789
length 114, checksum 0x0000
00:34:05:585839: GigabitEthernet13/0/0-tx
GigabitEthernet13/0/0 tx queue 0
buffer 0x84cf2: current data -50, length 148, buffer-pool 0, ref-count 1, totlen-nifb 0, trace handle 0x0
ext-hdr-valid
l4-cksum-computed l4-cksum-correct l2-hdr-offset 0 l3-hdr-offset 14
PKT MBUF: port 0, nb_segs 1, pkt_len 148
buf_len 2176, data_len 148, ol_flags 0x80, data_off 78, phys_addr 0x26133d00
packet_type 0x91 l2_len 0 l3_len 0 outer_l2_len 0 outer_l3_len 0
rss 0x0 fdir.hi 0x0 fdir.lo 0x0
Packet Offload Flags
PKT_RX_IP_CKSUM_GOOD (0x0080) IP cksum of RX pkt. is valid
Packet Types
RTE_PTYPE_L2_ETHER (0x0001) Ethernet packet
RTE_PTYPE_L3_IPV4_EXT_UNKNOWN (0x0090) IPv4 packet with or without extension headers
IP4: 00:0c:29:63:94:30 -> 00:0c:29:17:0a:44
UDP: 192.168.1.3 -> 192.168.1.2
tos 0x00, ttl 253, length 134, checksum 0x3a11 dscp CS0 ecn NON_ECN
fragment id 0x0000
UDP: 44610 -> 4789
length 114, checksum 0x0000
vpp1 trace抓包,解封装流程
01:26:18:006400: dpdk-input
GigabitEthernet13/0/0 rx queue 0
buffer 0x84f89: current data 0, length 148, buffer-pool 0, ref-count 1, totlen-nifb 0, trace handle 0x0
ext-hdr-valid
l4-cksum-computed l4-cksum-correct
PKT MBUF: port 1, nb_segs 1, pkt_len 148
buf_len 2176, data_len 148, ol_flags 0x88, data_off 128, phys_addr 0x43b3e2c0
packet_type 0x291 l2_len 0 l3_len 0 outer_l2_len 0 outer_l3_len 0
rss 0x0 fdir.hi 0x0 fdir.lo 0x0
Packet Offload Flags
PKT_RX_L4_CKSUM_BAD (0x0008) L4 cksum of RX pkt. is not OK
PKT_RX_IP_CKSUM_GOOD (0x0080) IP cksum of RX pkt. is valid
Packet Types
RTE_PTYPE_L2_ETHER (0x0001) Ethernet packet
RTE_PTYPE_L3_IPV4_EXT_UNKNOWN (0x0090) IPv4 packet with or without extension headers
RTE_PTYPE_L4_UDP (0x0200) UDP packet
IP4: 00:0c:29:63:94:30 -> 00:0c:29:17:0a:44
UDP: 192.168.1.3 -> 192.168.1.2
tos 0x00, ttl 253, length 134, checksum 0x3a11 dscp CS0 ecn NON_ECN
fragment id 0x0000
UDP: 44610 -> 4789
length 114, checksum 0x0000
01:26:18:006413: ethernet-input
frame: flags 0x1, hw-if-index 2, sw-if-index 2
IP4: 00:0c:29:63:94:30 -> 00:0c:29:17:0a:44
01:26:18:006423: ip4-input
UDP: 192.168.1.3 -> 192.168.1.2
tos 0x00, ttl 253, length 134, checksum 0x3a11 dscp CS0 ecn NON_ECN
fragment id 0x0000
UDP: 44610 -> 4789
length 114, checksum 0x0000
01:26:18:006426: ip4-lookup
fib 0 dpo-idx 7 flow hash: 0x00000000
UDP: 192.168.1.3 -> 192.168.1.2
tos 0x00, ttl 253, length 134, checksum 0x3a11 dscp CS0 ecn NON_ECN
fragment id 0x0000
UDP: 44610 -> 4789
length 114, checksum 0x0000
01:26:18:006429: ip4-local
UDP: 192.168.1.3 -> 192.168.1.2
tos 0x00, ttl 253, length 134, checksum 0x3a11 dscp CS0 ecn NON_ECN
fragment id 0x0000
UDP: 44610 -> 4789
length 114, checksum 0x0000
01:26:18:006431: ip4-udp-lookup
UDP: src-port 44610 dst-port 4789
01:26:18:006433: vxlan4-input
VXLAN decap from vxlan_tunnel0 vni 13 next 1 error 0
01:26:18:006435: l2-input
l2-input: sw_if_index 3 dst 1a:2b:3c:4d:5e:8f src 1a:2b:3c:4d:5e:7f
01:26:18:006438: l2-learn
l2-learn: sw_if_index 3 dst 1a:2b:3c:4d:5e:8f src 1a:2b:3c:4d:5e:7f bd_index 1
01:26:18:006441: l2-fwd
l2-fwd: sw_if_index 3 dst 1a:2b:3c:4d:5e:8f src 1a:2b:3c:4d:5e:7f bd_index 1 result [0x700000004, 4] static
age-not bvi
01:26:18:006443: ip4-input
ICMP: 192.168.2.2 -> 192.168.3.2
tos 0x00, ttl 63, length 84, checksum 0xb27a dscp CS0 ecn NON_ECN
fragment id 0x02da, flags DONT_FRAGMENT
ICMP echo_request checksum 0xddf1
01:26:18:006444: ip4-lookup
fib 0 dpo-idx 3 flow hash: 0x00000000
ICMP: 192.168.2.2 -> 192.168.3.2
tos 0x00, ttl 63, length 84, checksum 0xb27a dscp CS0 ecn NON_ECN
fragment id 0x02da, flags DONT_FRAGMENT
ICMP echo_request checksum 0xddf1
01:26:18:006444: ip4-rewrite
tx_sw_if_index 4 dpo-idx 3 : ipv4 via 192.168.3.2 loop0: mtu:9000 next:4 000c29170a4e1a2b3c4d5e8f0800 flow ha
sh: 0x00000000
00000000: 000c29170a4e1a2b3c4d5e8f08004500005402da40003e01b37ac0a80202c0a8
00000020: 03020800ddf133f4004bd3154e600000000000860500000000001011
01:26:18:006445: loop0-output
loop0
IP4: 1a:2b:3c:4d:5e:8f -> 00:0c:29:17:0a:4e
ICMP: 192.168.2.2 -> 192.168.3.2
tos 0x00, ttl 62, length 84, checksum 0xb37a dscp CS0 ecn NON_ECN
fragment id 0x02da, flags DONT_FRAGMENT
ICMP echo_request checksum 0xddf1
01:26:18:006449: l2-input
l2-input: sw_if_index 4 dst 00:0c:29:17:0a:4e src 1a:2b:3c:4d:5e:8f
01:26:18:006449: l2-fwd
l2-fwd: sw_if_index 4 dst 00:0c:29:17:0a:4e src 1a:2b:3c:4d:5e:8f bd_index 1 result [0x1000000000001, 1] no
ne
01:26:18:006450: l2-output
l2-output: sw_if_index 1 dst 00:0c:29:17:0a:4e src 1a:2b:3c:4d:5e:8f data 08 00 45 00 00 54 02 da 40 00 3e 01
01:26:18:006452: GigabitEthernetb/0/0-output
GigabitEthernetb/0/0
IP4: 1a:2b:3c:4d:5e:8f -> 00:0c:29:17:0a:4e
ICMP: 192.168.2.2 -> 192.168.3.2
tos 0x00, ttl 62, length 84, checksum 0xb37a dscp CS0 ecn NON_ECN
fragment id 0x02da, flags DONT_FRAGMENT
ICMP echo_request checksum 0xddf1
01:26:18:006453: GigabitEthernetb/0/0-tx
GigabitEthernetb/0/0 tx queue 0
buffer 0x84f89: current data 50, length 98, buffer-pool 0, ref-count 1, totlen-nifb 0, trace handle 0x0
ext-hdr-valid
l4-cksum-computed l4-cksum-correct l2-hdr-offset 50 l3-hdr-offset 14
PKT MBUF: port 1, nb_segs 1, pkt_len 98
buf_len 2176, data_len 98, ol_flags 0x88, data_off 178, phys_addr 0x43b3e2c0
packet_type 0x291 l2_len 0 l3_len 0 outer_l2_len 0 outer_l3_len 0
rss 0x0 fdir.hi 0x0 fdir.lo 0x0
Packet Offload Flags
PKT_RX_L4_CKSUM_BAD (0x0008) L4 cksum of RX pkt. is not OK
PKT_RX_IP_CKSUM_GOOD (0x0080) IP cksum of RX pkt. is valid
Packet Types
RTE_PTYPE_L2_ETHER (0x0001) Ethernet packet
RTE_PTYPE_L3_IPV4_EXT_UNKNOWN (0x0090) IPv4 packet with or without extension headers
RTE_PTYPE_L4_UDP (0x0200) UDP packet
IP4: 1a:2b:3c:4d:5e:8f -> 00:0c:29:17:0a:4e
ICMP: 192.168.2.2 -> 192.168.3.2
tos 0x00, ttl 62, length 84, checksum 0xb37a dscp CS0 ecn NON_ECN
fragment id 0x02da, flags DONT_FRAGMENT
ICMP echo_request checksum 0xddf1
本文介绍介绍了vxlan的基本配置,利用VMware虚拟机搭建环境实现两台虚拟机器的网络通信。 1、在配置vm1和vm2同网段测试中,发现vpp1上arp请求报文被丢弃,并没有bd域中泛洪,导致同网段通过vxlan隧道互通测试失败。 2、当前只是配置了vm1和vm2不同网段的通信,但并符合H3c 文章解读vxlan组网模式,感觉只是当成了一个隧道,类似gre、ipsec一样。还需要再研究。
1、华为Vxlan最全介绍 https://support.huawei.com/enterprise/zh/doc/EDOC1100087027 2、Vpp vxlan功能介绍 https://wiki.fd.io/view/VPP/Using_VPP_as_a_VXLAN_Tunnel_Terminator 3、FD.IO-VPP研究及使用五 (隧道环境搭建) https://blog.csdn.net/weixin_40815457/article/details/8652641 4、evpn-vxlan 介绍 https://www.cnblogs.com/josie-xu/p/10511302.html https://www.cnblogs.com/josie-xu/p/10516863.html 5、H3c vxlan介绍 http://www.h3c.com/cn/d_201811/1131076_30005_0.htm
本文分享自 DPDK VPP源码分析 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!