本實驗拓樸如下,前提上一章節拓樸。

對於 Spine01 配置,只賦予 L3 路由功能。
- set:
system:
hostname: spine01
interface:
swp1:
description: to leaf01
ip:
address:
192.168.10.1/30: {}
swp2:
description: to leaf02
ip:
address:
192.168.20.1/30: {}
vrf:
default:
router:
static:
1.1.1.1/32:
via:
192.168.10.2: {}
2.2.2.2/32:
via:
192.168.20.2: {}
- set:
system:
hostname: leaf01
global:
anycast-mac: 44:38:39:FF:00:AA
bridge:
domain:
br_default:
vlan:
'10':
vni:
'10010': {}
'20':
vni:
'10020': {}
interface:
lo:
ip:
address:
1.1.1.1/32: {}
swp4:
description: to spine01
ip:
address:
192.168.10.2/30: {}
swp1:
description: to server01
bridge:
domain:
br_default:
access: 10
swp2:
description: to server02
bridge:
domain:
br_default:
access: 20
vlan10: # VLAN 10 的 L3 閘道 (Anycast)
ip:
address:
10.1.10.1/24: {}
vrf: red
vlan20: # VLAN 20 的 L3 閘道 (Anycast)
ip:
address:
10.1.20.1/24: {}
vrf: blue
nve:
vxlan:
enable: on
source:
address: 1.1.1.1
flooding:
enable: on
# Configures VXLAN head end replication, where the switch replicates BUM traffic and sends individual copies to remote destinations.
head-end-replication:
2.2.2.2: {}
vrf:
red: {}
blue: {}
default:
router:
static:
2.2.2.2/32:
via:
192.168.10.1: {}
建立 single VXLAN device (vxlan48)
映射 VLAN 10 至 VNI 10010;VLAN 20 至 VNI 10020
將 VXLAN 設備新增至預設網橋 br_default
bridge:
domain:
br_default:
vlan:
'10':
vni:
'10010': {}
'20':
vni:
'10020': {}
這樣配置當數量一多對管理也是不方便,可參閱官方的自動映射 VLAN 至 VXLAN
配置使用了 Head-end Replication (HER)。當 leaf01 收到 VLAN 10 的廣播包時,它會手動複製一份封裝成 VXLAN 丟給 2.2.2.2。
可用 nv show nve vxlan 確保 head-end-replication 列表包含對方的 Loopback IP。
在分散式閘道(Distributed Gateway)架構中,有一些細節需要學生注意:
Anycast MAC: leaf01 定義了 44:38:39:FF:00:AA,為了讓虛擬機在 Leaf 之間遷移時不需更新 ARP,兩台 Leaf 的 anycast-mac 必須相同。
這定義交換機在 VXLAN 隧道中身分證的地方。來源位址,leaf01 使用 1.1.1.1;leaf02 使用 2.2.2.2 作為隧道的起點與終點。透過 nve.vxlan.enable: on 開啟 VXLAN 數據平面轉送功能。
- set:
system:
hostname: leaf02
global:
anycast-mac: 44:38:39:FF:00:AA
bridge:
domain:
br_default:
vlan:
'10':
vni:
'10010': {}
'20':
vni:
'10020': {}
interface:
lo:
ip:
address:
2.2.2.2/32: {}
swp4:
description: to spine01
ip:
address:
192.168.20.2/30: {}
swp1:
description: to server01
bridge:
domain:
br_default:
access: 10
swp2:
description: to server02
bridge:
domain:
br_default:
access: 20
vlan10: # VLAN 10 的 L3 閘道 (Anycast)
ip:
address:
10.1.10.2/24: {}
vrf: red
vlan20: # VLAN 20 的 L3 閘道 (Anycast)
ip:
address:
10.1.20.2/24: {}
vrf: blue
nve:
vxlan:
enable: on
# Configures the local tunnel IP address for VXLAN tunnels.
source:
address: 2.2.2.2
flooding:
enable: on
head-end-replication:
1.1.1.1: {}
vrf:
red: {}
blue: {}
default:
router:
static:
1.1.1.1/32:
via:
192.168.20.1: {}
$ ip add
...
2: enp2s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 0c:65:f6:8c:00:00 brd ff:ff:ff:ff:ff:ff
inet 10.1.10.10/24 brd 10.1.10.255 scope global enp2s0
valid_lft forever preferred_lft forever
inet6 fe80::e65:f6ff:fe8c:0/64 scope link proto kernel_ll
valid_lft forever preferred_lft forever
$ ip add
...
2: enp2s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 0c:50:fd:79:00:00 brd ff:ff:ff:ff:ff:ff
inet 10.1.10.20/24 brd 10.1.10.255 scope global enp2s0
valid_lft forever preferred_lft forever
inet6 fe80::e50:fdff:fe79:0/64 scope link proto kernel_ll
valid_lft forever preferred_lft forever
VXLAN 仰賴 VTEP(Virtual Tunnel Endpoints)之間的 L3 連通。
leaf01 的 VTEP IP 為 1.1.1.1;leaf02 的 VTEP IP 為 2.2.2.2。Spine01 設定了靜態路由,將流量導向正確的 Leaf 介面(swp1/swp2)。
# 使用 Loopback IP 作為來源
$ ip vrf exec default ping 2.2.2.2 -I 1.1.1.1
PING 2.2.2.2 (2.2.2.2) from 1.1.1.1 : 56(84) bytes of data.
64 bytes from 2.2.2.2: icmp_seq=1 ttl=63 time=1.02 ms
64 bytes from 2.2.2.2: icmp_seq=2 ttl=63 time=1.13 ms
驗證 VLAN 如何映射到 VNI,以及如何處理廣播/未知單播流量。根據配置 VNI 映射表如下
| VLAN | VNI | 關聯 VRF | 目的 |
|---|---|---|---|
| 10 | 10010 | red | 延伸 Server01 與 Server03 的 L2 網路 |
| 20 | 10020 | blue | 延伸 Server02 與 Server04 的 L2 網路 |
# head-end-replication 列表包含對方的 Loopback IP
$ nv show nve vxlan
operational applied
------------------------ ----------- -------
enable on on
mac-learning off off
port 4789 4789
arp-nd-suppress on on
mtu 9216 9216
flooding
enable on on
[head-end-replication] 2.2.2.2 2.2.2.2
source
address 1.1.1.1 1.1.1.1
mlag
shared-address none none
encapsulation
dscp
action derive derive
decapsulation
dscp
action derive derive
因 VRF 隔離性,VLAN 10 被指派給 vrf red;VLAN 20 被指派給 vrf blue。Server01 (VLAN 10) 與 Server02 (VLAN 20) 即使接在同一台 Leaf 上,也絕對無法互通,因為它們在不同的路由表(VRF)中。
$ ping 10.1.20.10 -c2
PING 10.1.20.10 (10.1.20.10) 56(84) bytes of data.
From 10.1.10.1 icmp_seq=1 Destination Host Unreachable
From 10.1.10.1 icmp_seq=2 Destination Host Unreachable
--- 10.1.20.10 ping statistics ---
2 packets transmitted, 0 received, +2 errors, 100% packet loss, time 1010ms
vxlan48 裝置是預設系統建立的名稱,預設上所有 VXLAN 的相關映射都會關聯此 vxlan48
cumulus@leaf01:mgmt:~$ bridge fdb show | grep "00:00:00:00:00:00"
00:00:00:00:00:00 dev vxlan48 dst 2.2.2.2 src_vni 10010 self permanent
00:00:00:00:00:00 dev vxlan48 dst 2.2.2.2 src_vni 10020 self permanent

當封包經過 Spine01 時,學生會在 Wireshark 看到以下「洋蔥式」層級:
| 層級 | 關鍵欄位 | 預期數值(根據配置) |
|---|---|---|
| Outer Ethernet | MAC Address | source:leaf01-swp4/destination:spine01-swp1 |
| Outer IP | Source / Dest IP | 1.1.1.1 -> 2.2.2.2 (VTEP 點對點) |
| UDP Header | Dest Port | 4789 (IANA 標準 VXLAN 埠號) |
| VXLAN Header | VNI | 10010 (對應 VLAN 10) |
| Inner Ethernet | MAC Address | source:server01/destination:server03 |
| Inner IP | Source / Dest IP | 10.1.10.10 -> 10.1.10.20 |
以下是第二個封包內容:
Frame 2: Packet, 148 bytes on wire (1184 bits), 148 bytes captured (1184 bits) on interface -, id 0
Ethernet II, Src: 0c:2d:73:94:00:02 (0c:2d:73:94:00:02), Dst: 0c:31:30:f0:00:04 (0c:31:30:f0:00:04)
Internet Protocol Version 4, Src: 1.1.1.1, Dst: 2.2.2.2 # Outer IP
0100 .... = Version: 4
.... 0101 = Header Length: 20 bytes (5)
Differentiated Services Field: 0x00 (DSCP: CS0, ECN: Not-ECT)
Total Length: 134
Identification: 0xa542 (42306)
000. .... = Flags: 0x0
...0 0000 0000 0000 = Fragment Offset: 0
Time to Live: 63
Protocol: UDP (17)
Header Checksum: 0xd01f [validation disabled]
[Header checksum status: Unverified]
Source Address: 1.1.1.1
Destination Address: 2.2.2.2
[Stream index: 0]
User Datagram Protocol, Src Port: 34037, Dst Port: 4789 # UDP Header
Virtual eXtensible Local Area Network # VXLAN Header
Flags: 0x0800, VXLAN Network ID (VNI)
Group Policy ID: 0
VXLAN Network Identifier (VNI): 10010
Reserved: 0
Ethernet II, Src: 0c:65:f6:8c:00:00 (0c:65:f6:8c:00:00), Dst: 0c:50:fd:79:00:00 (0c:50:fd:79:00:00) # Inner Ethernet
Destination: 0c:50:fd:79:00:00 (0c:50:fd:79:00:00)
Source: 0c:65:f6:8c:00:00 (0c:65:f6:8c:00:00)
Type: IPv4 (0x0800)
[Stream index: 2]
Internet Protocol Version 4, Src: 10.1.10.10, Dst: 10.1.10.20 # Inner IP
0100 .... = Version: 4
.... 0101 = Header Length: 20 bytes (5)
Differentiated Services Field: 0x00 (DSCP: CS0, ECN: Not-ECT)
Total Length: 84
Identification: 0x324a (12874)
010. .... = Flags: 0x2, Don't fragment
...0 0000 0000 0000 = Fragment Offset: 0
Time to Live: 64
Protocol: ICMP (1)
Header Checksum: 0xe03f [validation disabled]
[Header checksum status: Unverified]
Source Address: 10.1.10.10
Destination Address: 10.1.10.20
[Stream index: 1]
Internet Control Message Protocol
雖然 Outer IP 都是 1.1.1.1 到 2.2.2.2,但 Leaf 如何區分這屬於哪個 VRF?是依靠 VNI (Virtual Network Identifier) 欄位。
配置開啟了 head-end-replication,可以觀察 ARP 請求(廣播流量)。會看到一個為 ARP Request (Broadcast) 的 VXLAN 封包。雖然是廣播,但在 Underlay 網路中,它被封裝成單播 (Unicast) 傳送給 2.2.2.2。這就是 HER 的運作原理,在進入隧道前由 Leaf 進行複製。

第14個封包 Protocol 欄位顯示為 ARP,且 Info 顯示 Who has 10.1.10.20? Tell 10.1.10.10。ARP Request 在二層網路(Layer 2)中屬於廣播 (Broadcast) 流量。在傳統交換機中,這類封包會從所有介面 Flood 出去。
HER 的定義是,由進入隧道的入口交換機 (Ingress VTEP) 負責將廣播封包複製成多份,並以單播 (Unicast) 的方式傳送給所有遠端 VTEP。封包結構可以看到