VxLAN 數據面封裝協議
? 2011 年 8 月,主要由 VMware 與 Cisco 公司草擬并由 IETF 發布了 RFC 7348 草案《Virtual eXtensible Local Area Network (VXLAN): A Framework for Overlaying Virtualized Layer 2 Networks over Layer 3 Networks》。 ? VxLAN(Virtual Extensible Local Area Network,虛擬擴展本地局域網)是 IETF 定義的 NVO3(Network Virtualization over Layer 3)標準技術之一,從名字可以看出,VxLAN 最初定位于對傳統 VLAN 協議的一種增強替代方案。本質是一種 Tunneling(隧道)網絡傳輸技術,又稱為 Overlay 網絡,特點是將 L2 Frame 封裝到 UDPVxLAN Header 中,并在 L3 IP 網絡中進行傳輸(L2 over L3)。 ? 通過 VxLAN 技術可以將處于不同 L3 Subnets 的 Underlay 網絡設備整合到一個邏輯上的 Overlay 網絡中。對于 Overlay 網絡的終端用戶而言,這些網絡設備似乎 “真實” 地部署在了同一個 L2 數據鏈路層網絡中,以此來適應大規模云計算多租戶隔離網絡的需求。
?
?VxLAN 組網拓撲介紹
? 如上圖所示,首先介紹構建一個 VxLAN 網絡所需要的組成部分,包括以下 3 組核心元素: ?
NVE / VTEP / VxLAN Tunnel
VxLAN L2 Gateway / L2 VNI / BD
VxLAN L3 Gateway / L3 VNI / VRF
NVE / VTEP / VxLAN Tunnel
在抽象的 Overlay 網絡中,NVE(Network Virtualization Edge,網絡虛擬邊緣節點)是一個處于 Underlay 網絡和 Overlay 網絡交界處的邊緣設備,提供網絡虛擬化功能,用于銜接 2 個不同的網絡類型。 ? 根據具體的組網環境,NVE 可以是主機中運行的一個虛擬網元,也可以是一個物理網元(e.g. Spine/Leaf 交換機)。在本文中主要討論硬件 NVE 的情況。
? ??軟件 NVE 常見的有 OvS Tun Bridge 和 Linux Bridge + Tun 虛擬隧道網卡設備。 ?
??硬件 NVE 常見的有 Spine-Leaf 交換機設備。 ? 在具體的 VxLAN Overlay 網絡中,NVE 需要具備 VTEP(VxLAN Tunnel Endpoints,隧道端點)功能,用于完成 VxLAN 協議棧的封裝/解封裝。兩個 VTEP(local-VTEP 和 remote-VTEP)之間具有 Underlay IP 路由可達性,繼而可以構造一個 L3 之上的 VxLAN Tunnel。 ? 區別于 VLAN 使用 VLAN ID 來隔離二層網絡,VxLAN 使用了 VNI(VXLAN Network Identifier,VXLAN 網絡標識符)來作為隔離標記。在一個 VxLAN Tunnel 中,可用于傳輸若干個由 VNI 進行隔離的 VxLAN 虛擬網絡。 ? 另外,與 VLAN 網絡隔離需要通過 L3 Gateway 來互聯互通類似,在 VxLAN 網絡隔離中同樣需要 VxLAN Gateway 來實現 VxLAN 虛擬網絡與其他類型網絡之間的互聯互通,而且情況會更加復雜。根據用途的區別,VxLAN Gateway 大體上可以分為 VxLAN L2 Gateway 和 VxLAN L3 Gateway 這 2 種類型,對應的 VNI 也根據用途被細分為 L2 VNI 和 L3 VNI 這 2 種類型。 ?
VxLAN L2 Gateway / L2 VNI / BD
VxLAN L2 Gateway 用于實現 VxLAN 和 VLAN 之間的互聯。 ? 在 Leaf NVE 中,為了實現 VxLAN L2 Gateway 的 L2 隔離和轉發而引入了 BD(Bridge Domain)的概念,它是一個可配置的二層廣播域,類似于一個虛擬網橋設備。在新建一個 BD Instance 時,通常會將 BD Instance、L2 VNI、Local VLAN ID 配置為一一對應,并且在一個 BD Instance 中會同時存在 2 種類型的接口: ?
Overlay 側接口
是一個對內的二層接口設備,更準確的說是一個 Host 上聯 Leaf Port 的二層子接口設備(e.g. CloudEngine VAP),具有同一個 VLAN ID 的下掛終端(VM/Host)的 Original L2 Frame 會從此接口進入到 VTEP 中進行后續的封裝。 ?
Underlay 側接口
是一個對外的三層接口設備,會被分配一個 Underlay IP,與物理網絡相連。在 Underlay 網絡中的多個 VTEP 之間具備 IP 路由可達性,用于構建 VxLAN Tunnel。被 VTEP 封裝之后的 VxLAN 封裝包會從此接口流出進入 VxLAN Tunnel 傳輸。 ? 另外,BD Instance 為了能夠 “縫合“ Local VLAN 和 VxLAN Tunnel 這兩段網絡,維護了 VID-VNID 映射關系。通過這樣的方式,VxLAN L2 Gateway 就將 Local VLAN 作為了 VxLAN Tunnel 的接入點,所有加入到 Local VLAN 中的終端(VM/Host)L2 流量,就會進入到對應的 VxLAN Tunnel 中。
VxLAN L3 Gateway / L3 VNI / VRF
VxLAN L3 Gateway 用于實現下列 2 種互聯場景: ?
兩個 VNI 不同的 VxLAN 虛擬網絡之間的互聯互通。
VxLAN 虛擬網絡和外部 IP 網絡之間的互聯互通。
可見,VxLAN L3 Gateway 主要提供了 L3 隔離和轉發功能,具體沿用了 L3 VPN Instance 中的 VRF 技術。每個 VRF 都具有自己的 Route Tables,類似于 Linux Network Namespace,同時維護了 VRF 和 L3 VNI 的映射關系,以此在 VxLAN L3 Gateway 層面實現了對不同租戶之間的 L3 隔離。 ? 另外,在常見的 Spine-Leaf 數據中心網絡架構中,根據將 VxLAN L3 Gateway 部署在 Spine 或者部署在 Leaf 上的不同,又可以再細分為 2 種不同的 VxLAN 組網方案: ?
集中式 VxLAN L3 Gateway 組網方案
分布式 VxLAN L3 Gateway 組網方案
下圖中概述性的列舉了這 2 種組網方案的異同。
集中式 VxLAN L3 Gateway 組網方案
在分布的 Leaf 上部署 VxLAN L2 Gateway 功能,在集中的 Spine 上部署 VxLAN L3 Gateway 功能。這意味著所有跨網絡之間的流量都需要經過 Spine 進行轉發,包括:VxLAN 虛擬網絡之間,以及 VxLAN 虛擬網絡與外部 IP 網絡之間的流量。 ? 該方案的優點是跨網絡流量集中管理,簡化網關部署和管理。而缺點是: ?
轉發路徑并非最優
跨網絡之間的流量都需要在 Spine 上進行 L3 繞行,這樣就導致了 Leaf 與 Spine 之間的鏈路上存在冗余的報文,額外占用了大量的帶寬。 ?
Spine 的 ARP 表項壓力大
所有通過 L3 轉發的 ARP 表項(MAC-IP)都存儲在 Spine 上,當終端的數量越來越多時,Spine 就容易成為網絡瓶頸。 ? 所以該方案適用于小型組網環境。
分布式 VxLAN L3 Gateway 組網方案
在分布的 Leaf 上同時部署了 VxLAN L2 和 L3 Gateway,而 Spine 只作為常規 L3 轉發節點并不需要感知 VxLAN 隧道的存在。具有以下特性: ?
相同 VTEP 下跨網絡之間的流量在 Leaf 上完成 L3 轉發。
只有不同 VTEP 下跨網絡之間的流量需要經過 Spine 完成 L3 轉發。
另外,只要求 Leaf 學習下掛終端的 ARP 表項,從而解決了 Spine 規格帶來的容量瓶頸問題。所以該方案適用于中大規模(5000 臺服務器及以上)的高性能網絡。 ? 而缺點是網關部署、故障定位及網絡運維相對復雜,通常需要結合 EVPN Control Plane 來完成一系列的自動化配置工作,例如:基于 BGP Peer 的 VTEP 自動發現、VxLAN Tunnel 自動建立,ARP 表項自動生成等等。 ?
? VxLAN 協議棧解析
? VxLAN 的協議棧比較簡單,定義了一種 MAC-in-IP 的報文封裝格式。 ?
Original L2 Frame
一個原始且完整的 L2 數據幀,是業務層發出(通常是 VM)的實際 Payload 數據。 ?
VxLAN Header(8Bytes)
將 Original L2 Frame 封裝到 VxLAN Header(8Bytes)成為 Overlay Segment。 ?
VxLAN Flags(8bits):標記字段,如果 VNI 有效,則固定取值為 00001000。
Reserved(24bits):保留字段,固定取值為全 0。
VNI(VxLAN Network Identifier,24bits):最多支持 16777216(1600 萬)個二層隔離網絡。根據用途的不同可分為 L2 VNI 和 L3 VNI。
Reserved(8bits):保留字段,固定取值為全 0。
UDP Header(8Bytes)
是 Overlay 和 Underlay 的分界線。UDP 協議由于其高效率、低占用的特性常被用作隧道封裝協議的傳輸層。 ?
UDP srcPort(16bits):由 local-VTEP 通過對 Original L2 Frame 進行 HASH 計算后得出,該特性使得 VxLAN 封裝包在 Receive Site 具備了可行的 HASH-base 負載均衡處理能力(e.g. ECMP 等價路由)。
UDP dstPort / VxLAN Port(16bits):缺省取值為 UDP 4789,根據具體設備型號可能支持配置更改。
UDP Length(16bits):指示一個 UDP 數據報的總長度。
Checksum(16bits):檢驗字段。
Outer IP Header(20Bytes)
是 Underlay 的 L3 IP Header 封裝。 ?
srcIP 是 local-VTEP 的 IP 地址。
dstIP 可能是 remote-VTEP 的 IP 單播地址,也可能是用于 BUM 流量的多播/組播地址。
Outer MAC Header
是 Underlay 的 L2 Frame 封裝。dstMAC 和 srcMAC 地址視乎于具體的 Underlay 網絡拓撲。 ?
srcMAC 是 local-VTEP 的 MAC 地址;
dstMAC 視乎于具體的 Underlay 以太網絡拓撲。
VxLAN 數據面轉發原理
同 VNI 的 BUM 報文轉發場景
BUM(Broadcast,Unknown-unicast,Multicast)是網絡中常見的 3 種流量類型,分別表示: ?
廣播流量(Broadcast)
指發送到網絡中所有設備的流量,例如:ARP 報文、DHCP 報文等。 ?
未知單播流量(Unknown-unicast)
指發送給網絡中不存在的設備的流量,例如:發往一個錯誤的 MAC 地址的報文等。當交換機收到一個未知目的 MAC 地址的報文時,它需要向除了源端口外的所有端口轉發該報文,以便讓目的主機能夠收到該報文并發送響應。因此,未知單播報文也是廣播報文的一種,也會對網絡帶寬造成浪費。 ?
組播流量(Multicast)
指發送給一組目標設備的流量,這些設備加入到了一個組播組,組播流量的目的地址也是特定的組播地址,因此對網絡帶寬的占用相較于廣播更少一些。 ? 在網絡中,對于不同類型的 BUM 報文,交換機的處理方式也不同,例如,對于 Broadcast 和 Multicast 報文,交換機會將它們轉發到所有的端口,而對于 Unknown-unicast 報文,則只會將它們轉發到除源端口外的所有端口。基于這樣的特性,為了簡單理解,我們可以將 BUM 報文統稱為 Flooding 流量。 ? 在大規模的 VxLAN 場景中,由于多個 Overlay 虛擬網絡共享 Underlay 物理網絡,多租戶情況下,這些 Flooding(洪泛)流量對物理帶寬資源的占用尤為突出,需要特別的注意。 ? 物理網絡設備對 BUM 的處理方式(數據包復制)大體上有 2 種: ?
頭端復制(Head-End Replication,HER)
在源頭(即發送端所在的端口)將 BUM 流量復制到多個目的地,每個目的地對應著一個收件人(e.g. 一個接收組播流的客戶端)。這種方式需要在源端口上復制和轉發每個數據包,因此可能會導致性能問題和鏈路擁塞。頭端復制適用于小規模網絡,常用于數據中心的二層網絡中。 ?
核心復制(Core Replication,CR)
將 BUM 流量復制到一組專用的核心設備,這些設備負責將流量復制到所有需要它的接收方(e.g. 接收組播流的客戶端)。這種方式通過在核心層進行復制,避免了在源端口上進行大量的復制和轉發,因此對網絡性能的影響更小。核心復制適用于大規模網絡,常用于廣域網環境中。 ? 對應的 VxLAN 硬件 NVE 同樣有 2 種 BUM 報文處理方式: ?
VxLAN 頭端復制 + Underlay 單播路由
由 local-VTEP(源頭設備)負責對終端(VM/Host)發出的 BUM 報文進行復制,并采用 Underlay 單播路由的方式,經過 VxLAN Tunnels 將 BUM 傳遞到其他多個 remote-VTEPs 接收。remote-VTEP 接收到 BUM 報文之后,就不再 Flooding,避免了環路。
再展開一下 Local LAN 流量接入 VxLAN Tunnel 的流程細節。如下圖所示,當 VTEP 接收到終端的攜帶 VLAN 的 BUM 之后,首先會通過 VLAN ID 匹配到對應的 BD,然后在該 BD 內查找 VNI-Tunnel List,最后為 BUM 封裝上不同的 OverlayUnderlay Header 之后向 VNI-Tunnel List 指定的所有 VxLAN Tunnels 發出。
VxLAN 核心復制 + Underlay 組播路由
首先將網絡中所有的 VTEPs 設備都加入到同一個組播組中,部署專門的核心層設備并通過組播路由協議(e.g. PIM)或 IPv6 多播路由協議(e.g. IGMP )與 VTEPs 建立一個組播信道和相應的組播轉發表項。當終端發出 BUM 報文后,local-VTEP 會為其封裝好組播目的 IP 地址,然后進入核心層設備進行數據復制,并采用 Underlay 組播的方式,將 BUM 傳遞到同一個組播組內的其他 remote-VTEPs 接收。
同 VNI 的單播報文轉發場景
同 VNI 的單播報文轉發場景中,一個 IP 單播報文的發送實際上可以拆分為 3 次轉發流程,分別是: ?
ARP Request 廣播轉發;
ARP Reply 單播轉發;
IP 單播轉發。
下面以較為簡單的 “VxLAN 頭端復制 + Underlay 單播路由“ 方式為例進行介紹:VM_A、VM_B、VM_C 同屬于 VNI 5000,也同屬于 10.1.1.0/24 子網。此時,VM_A 想與 VM_C 進行首次通信。
ARP Request 廣播轉發流程
首次通信,VM_A 沒有 VM_C 的 MAC 地址,所以首先進行 ARP Request 廣播轉發流程,請求獲取 VM_C 的 MAC 地址。 ?
VM_A 發送 srcMAC 為 MAC_A、dstMAC 為 “全 F(廣播)”、srcIP 為 IP_A、dstIP 為 IP_C 的 ARP Request 廣播報文,請求獲取 VM_C 的 MAC 地址。
VTEP_1 收到 ARP Request 后,根據二層子接口上的 VLAN 和 DB 配置判斷報文需要進入 VxLAN Tunnel。確定報文所屬 VNID 后,VTEP_1 首先會自學習 MAC_A、VNID 和 Port_1(二層子接口對應的物理接口)的映射關系,并記錄在本地 MAC Table 中。之后,VTEP_1 會根據頭端復制列表對報文進行復制,并分別進行 OverlayUnderlay Header 封裝。
封裝的 Outer srcIP 地址為 VTEP_1 的 IP 地址,Outer dstIP 地址為 remote-VTEP(VTEP_2 或 VTEP_3)的 IP 地址;Outer srcMAC 地址為 VTEP_1 的 MAC 地址,而 Outer dstMAC 地址為去往目的 IP 的網絡中下一跳設備的 MAC 地址。
根據 Outer MAC/IP 信息,在 Underlay IP 網絡中進行傳輸,直至到達 remote-VTEP。
報文到達 remote-VTEP 后,對報文進行解封裝,得到 VM_A 發送的 Original L2 Frame。同時,remote-VTEP 學習 VM_A 的 MAC 地址、VNID 和 VTEP_1 的 IP 地址的映射關系,并記錄在本地 MAC Table 中。之后,remote-VTEP 根據二層子接口上 BD 和 VLAN 配置對報文在 Local LAN 二層域內進行廣播。
VM_B 或 VM_C 接收到 ARP Request 后,比較報文中的 dstIP 地址是否為本機的 IP 地址。VM_B 發現 dstIP 不是本機 IP,故將報文丟棄;VM_C 發現 dstIP 是本機 IP,則對 ARP Request 做出應答。
ARP Reply 單播轉發流程
VM_C 應答 ARP Reply 時,由于 VM_C 已經知道了 VM_A 的 MAC 地址,所以 ARP Reply 報文為單播報文。報文的 srcMAC 為 MAC_C,dstMAC 為 MAC_A, srcIP 為 IP_C、dstIP 為 IP_A。 ?
VTEP_3 接收到 VM_C 發送的 ARP Reply 報文后,同樣先自學習 MAC_C、VNI 和 Port_3 的映射關系,并記錄在本地 MAC Table 中。然后 VTEP_3 對報文進行封裝。
封裝的 Outer srcIP 地址為 VTEP_3 的 IP 地址,Outer dstIP 地址為 VTEP_1 的 IP 地址;Outer srcMAC 地址為 VTEP_3 的 MAC 地址,而 Outer dstMAC 地址為去往目的 IP 的網絡中下一跳設備的 MAC 地址。
根據 Outer MAC/IP 信息,在 Underlay IP 網絡中進行傳輸,直至到達 remote-VTEP。
報文到達 VTEP_1 后,VTEP_1 對報文進行解封裝,得到 VM_C 發送的 Original L2 Frame。同時,VTEP_1 學習 VM_C 的 MAC 地址、VNI 和 VTEP_3 的 IP 地址的映射關系,并記錄在本地 MAC Table 中。然后 VTEP_1 將解封裝后的報文發送給 VM_A。
至此,VM_A 和 VM_C 均已學習到了對方的 MAC 地址。之后,VM_A 和 VM_C 將采用 IP 單播方式進行轉發。轉發流程類似,這里不再贅述。
不同 VNI 的單播報文轉發場景
不同 VNI 的單播報文轉發場景,又稱為 “跨 VxLAN 子網的單播報文轉發場景“,需要結合上文中提到的 VxlAN L3 Gateway 來共同完成。 ? 這里以較為簡單的 “集中式 VxLAN L3 Gateway 組網方案“ 來進行介紹:Spine 提供 L3 Forwarding 功能,VM1 和 VM4 處于不同的 VxLAN 子網,VM1 的網關是 VSI-Interface10,VM4 的網關是 VSI-Interface20,并分別接入到不同的 VSI(Virtual Switching Instance,虛擬交換實例)中,VSI 具有傳統以太網交換機的所有功能。 ? 假設現在已經不是首次通信,VM1、VM4、VSI-Interface10、VSI-Interface20 之間的 MAC 地址都已經互相學習到了。此時 VM1 向 VM4 發出跨子王的 IP 單播報文。 ?
VM1 先將報文發送給 VSI-Interface10。
Leaf-A 收到 VM1 發來的報文,識別此報文屬于 VxLAN 10,查找 dstMAC G10 的表項,然后對報文進行 VxLAN 封裝后從 Tunnel2 發送出去。
Spine-C 收到 Leaf-A 發來的報文,進行 L3 Forwarding 處理:
發現 Outer dstIP 是自己,于是對報文進行解封裝。
解完封裝后,Spine-C 發現 Original L2 Frame 的 dstMAC 是本機 VSI-interface10 的 MAC、dstIP 是 IP4,于是根據路由表查找 IP4 的下一跳;
發現一下跳為 Leaf-B、出接口為 VSI-Interface20,再查詢 ARP 表項,并將 Original L2 Frame 的 srcMAC 修改為 VSI-interface20 的 MAC 地址,將 dstMAC 修改為 VM4 的 MAC 地址。
報文到達 VSI-interface20 接口時,識別到需要進入 VxLAN 20,所以根據 MAC 表對報文進行封裝。
封裝的 VNI 為 20,Outer srcIP 為 Spine-C 的 IP 地址,Outer dstIP 為 Leaf-B 的 IP 地址;Outer srcMAC 為 Spine-C 的 MAC 地址,Outer dstMAC 為去往目的 IP 的網絡中下一跳設備的 MAC 地址。
封裝后的報文,根據 Outer dstMAC/dstIP 信息,在 Underlay IP 網絡中進行傳輸,直至到達 remote-VTEP。
Leaf-B 收到 Spine-C 發來的報文后,解封裝,得到 Original L2 Frame。在 VxLAN 20 內找到 dstMAC 為 MAC4 的表項,并將報文從對應的接口和 VLAN 中發送出去。
最終 VM4 收到了來自 VM1 的報文。 ?
? VxLAN/UDP 的 MTU 問題 ? UDP(User Datagram Protocol,用戶數據報協議),是一種無連接的、非可靠的傳輸層協議,常被應用于 Tunnel 協議的傳輸層。主要原因有以下幾點: ?
速度快
只要應用進程將 Payload 傳給 UDP,UDP 將此數據打包后就立刻傳遞給 IP 層,而無需作其他額外的機制處理。 ?
首部開銷小
相較于 TCP Header 都有 20Bytes 的首部開銷,UDP Header 只有 8Bytes。 ?
負載均衡特性
因為無連接,所以 UDP srcPort 可以使用 HASH 計算值,該特性能夠在各個網絡環節中進行負載均衡優化,例如:ECMP 傳輸環節,CPU 隊列綁定收包環節等。 ? 但相對的,UDP 也存在一個關鍵的 MTU 分片問題,即:假如 UDP Datagram 進行分片,那么只有 First Fragment 是包含 UDP Header 的,一旦丟包就會導致 Receiver 無法重組出一個完整的 Datagram。如下圖所示。
? 所以,當采用 UDP 作為傳輸層時,需要十分注意 MTU 的設置,才能帶來更好的傳輸性能以及可靠性。根據 VXLAN RFC7348 中的建議,VxLAN 封裝包不應該分片,否則在接收端 VTEP 上會丟棄分片的報文,導致無法正確解封裝。
通常的,VM/Host 的默認 MTU 是 1500Bytes,即 Original L2 Frame 最大為 1500Bytes。在 VTEP 封裝上 VxLAN Overhead 的 50Bytes(VxLAN header + UDP Header + Outer IP/MAC Header)之后,VxLAN 封裝包的總長度就達到了 1550Bytes。 ? 如果希望不對 VxLAN 封裝包進行分片,可以通過 2 種常規手段來實現: ?
減小 VM/Host 的 MTU。
加大 Underlay 網絡的 MTU。
根據實際的場景,需要考慮采用不同的實現方式。
DCN 場景中的 VxLAN MTU
在 DCN 場景中,由于運營商對整網環境具有把控能力,所以通常會采用從 “業務需求出發“ 的原則,即:調整 Underlay MTU 以適應 VM/Host MTU 的需求。所以,極端情況下,Underlay MTU 可能被設置為 9000Bytes。
DCI 場景中的 VxLAN MTU
并跨越兩個地理位置分離的 DC(數據中心),通過 L3 路由廣域網(WAN)或其他數據中心互連(DCI)傳輸連接的場景中。因為 VxLAN 封裝包需要經過并非完全可控的第三方承載網絡,所以對 MTU 的規劃需要更加嚴謹。所以通常采用 “從適配性出發“ 的原則,即:對 VM/Host MTU 進行控制,確保在整個端到端的承載網中均小于 Underlay MTU。 ? 以一個內層 ping 包(長度為 1422Bytes)為例,計算各層封裝的長度如下表,發現最終的 VxLAN 封裝包大于 1500Bytes,此時就需要修改 Inner MTU 以及 Inner App 的長度值,使其小于等于 1500Bytes。
?
? EVPN MP-BGP 控制面協議
? EVPN (Ethernet VPN)是一個 L2 VPN(L2-in-L3)協議,最初的設計目的是為了替換落后的 VPLS(Virtual Private LAN Service),號稱為 Next Generation L2 VPN(下一代的 L2 VPN)。 ? 后來,EVPN 逐漸演進為一套通用的 Control Plane 協議,而不是具體為了承載業務的 Data Plane 協議。EVPN Control Plane 可以與多種不同的 Data Plane 技術(包括:MPLS、SRv6、VxLAN 等)結合使用實現一套完整的數控分離 SDN 方案。 ? EVPN Control Plane 的全稱為 EVPN MP-BGP(Ethernet VPN base on Multi-Protocols BGP),是一種基于 MP-BGP 協議可擴展性的實現方式,增加新的協議類型和路由類型,包括: ?
L2 VPN AFI(Address Family Identifier,地址族標識)
EVPN SAFI(Subsequent Address Family Identifier,子地址族標識)
EVPN NLRI(Network Layer Reachability Information,網絡層可達性信息)
??EVPN VxLAN SDN 方案
? 在引入 EVPN 作為 VxLAN 的 Control Plane 之前,需要通過手工的方式建立靜態 VxLAN 隧道,即:手動指定 VxLAN Tunnel 的 local-VTEP 和remote-VTEP 的 IP 地址對,并構建 Tunnel。手工靜態配置的方式在集中式 VxLAN L3 Gateway 組網方案中或許還能夠勉強接受,但在大規模的分布式 VxLAN L3 Gateway 組網方案中會出現較為嚴峻的挑戰,主要有 2 個方面: ?
網絡擴展困難:網絡變更需要手動修改集群配置,容易出現 “雪花設備“ 故障。
BUM 洪泛流量占比大:所有 VTEP 都需要通過 Flood and Learn(洪泛和自學習)來完成數據轉發之前的 ARP 表項和主機路由表項學習。
為了解決這個問題,需要在 VxLAN 網絡中引入 Control Plane 方案來提供靈活的運維管理支撐。目前最為流行和成熟的組合就是 EVPN VxLAN(RFC6624),依托于 BGP 在 E-BGP 和 I-BGP 場景中的適配性,也使得 VxLAN 不僅局限于 DCN(數據中心網絡)場景,還能應用于 DCI(數據中心互聯)場景。
? 相應的,采用 EVPN 作為 VxLAN 的 Control Plane 帶來了 2 個核心優勢: ?
EVPN 可實現 VTEP 自動發現、VxLAN Tunnel 的自動建立,從而降低網絡運維的復雜度和提升了網絡可擴展性。
EVPN 可實現 IP、MAC、VNI 等 ARP 和主機路由信息的自動宣告,從而有效減少了 BUM 泛洪流量。
? EVPN VxLAN 的路由類型
? EVPN 基于 MP-BGP NLRI 擴展引入了 5 種新的路由類型(Route Type),如下: ?
Type1. Ethernet Auto-Discovery Route(Ethernet 自動發現路由)
Type2. MAC/IP Advertisement Route(MAC/IP 通告路由)
Type3. Inclusive Multicast Ethernet Tag Route(集成多播 Ethernet Tag 路由)
Type4. Ethernet Segment Route(Ethernet 段路由)
Type5. IP Prefix Route(IP 前綴路由)
在 EVPN VxLAN 場景中,NVE(交換機)充當 PE 的角色,同時具備了 BGP Peer 和 VTEP 的功能,下文中統稱為 VTEP Peer。其主要應用了 Type2、Type3、Type5 這 3 種路由類型,下面重點介紹這些路由類型的定義和作用。 ?
Type2:MAC/IP Advertisement Route(MAC/IP 通告路由)
Type2 Route 的 EVPN NLRI 字段如下: ? ??Route Distinguisher: 指示一個 EVPN Instance 的 RD 值,用于區分不同的 EVPN Instances。每個 EVPN Instance 都具有一個對應的 BD(二層廣播域)。
? ??Ethernet Segment Identifier: EVPN 允許在同一物理網絡上創建多個虛擬網絡,這些虛擬網絡被稱為 Ethernet Segment。而 Ethernet Segment Identifier 就是該虛擬網絡的唯一標識。在 VxLAN 場景中,ES 就是 VxLAN Tunnel,ESI 用于唯一標識一個 VxLAN Tunnel 的連接。
? ??Ethernet Tag ID 指示當前設備配置的以太網 VLAN ID。
? ??MAC Address Length 指示該 Route 攜帶的 host-MAC 地址的長度。
? ??MAC Address 指示該 Route 攜帶的 host-MAC 地址。 ?
??IP Address Length 指示該 Route 攜帶的 host-IP 地址的掩碼長度,為 32bits(IPv4)或 128bits(IPv6)。
? ??IP Address 指示該 Route 攜帶的 host-IP 地址。 ?
??MPLS Label1 指示該 Route 攜帶的 L2 VNI,用于標識不同的 BD。 ?
??MPLS Label2 指示該 Route 攜帶的 L3 VNI,用于標識不同的 VRF(L3 VPN)。VxLAN 網絡中為了實現不同租戶之間的隔離,需要通過不同的 VRF 來隔離租戶的路由表。 ? 從上述字段可見,Type2 Route 的關鍵特性就是支持對稱 IRB(Integrated Bridging and Routing,集成的橋接和路由),能夠同時發布 L2 MAC Switching 和 L3 IP Routing 信息,以此來支撐 VxLAN L2 和 L3 Gateway 應用場景。
? 基于這樣的特性,Type2 Route 非常適用于云計算虛擬機遷移的場景(MAC Mobility,MAC 移動性),可以有效避免了虛擬機遷移期間所帶來的 IP 地址更改,以及重新配置網絡的問題。例如:當一臺 VM 從 VTEP1 遷移到 VTEP2 時,VTEP2 會學習到該 VM 的 ARP 信息(通過 VM 發出的 gARP 實現),并生成 VM 對應的 Type2 Route,然后傳遞給 VTEP1。VTEP1 收到后,感知到 VM 的位置發生變化,觸發 ARP 探測,當探測不到 VM 時,則會撤銷 VM 在本地的 ARP 和主機路由信息。
VTEP 應用 Type2 通告 host-MAC 地址
當 VTEP 是 VxLAN L2 Gateway 時,VTEP Peer 之間可以通過 Type2 Route 來互相學習對方的 host-MAC Table,包括:host-MAC、BD、Interface 等信息。 ? 如下圖所示,Leaf1、Leaf2 是 VxLAN L2 Gateway,Host1、Host2 屬于同一個 VxLAN 子網,Leaf1 向 Leaf2 通告它的 host-MAC Table。 ?
Host1 通過特定的 Interface 和 BD 接入到 Leaf1 時,通常會觸發 ARP、DHCP 等廣播流量。Leaf1 以此來學習到 Host1 對應的 Host1-MAC 并記錄在 BD 的 host-MAC Table 中。
隨后 Leaf1 向 Leaf2 發送 Type2 Route,攜帶了 EVPN Instance RD、Host1-MAC、L2 VNI、VTEP IP 等信息。
Leaf2 收到 Type2 Route 后,根據 L2 VNI 匹配到相應的 BD,并將 Host1-MAC 保存在 BD 的 host-MAC Table 中。
VTEP 應用 Type2 通告 host-IP 精確路由
在 VxLAN 網絡中,要想實現跨網絡之間的三層互訪,就需要在 VxLAN L3 Gateway 中應用 L3 VPN Instance 和隔離的 Route Table 來完成 IP Routing。 ? 當 VTEP 是 VxLAN L3 Gateway 時,VTEP Peer 之間可以通過 Type2 Route 來互相學習對方的 host-IP Table,包括:host-IPv4 /32 或 host-IPv6 /128 精確路由、Interface、L3 VNI 等信息。 ? 以較為復雜的 “分布式 VxLAN L3 Gateway 組網” 場景為例。如下圖所示,Leaf1、Leaf2 同時作為 VxLAN L2/L3 Gateway,Host1、Host2 屬于不同的 VxLAN 子網,Leaf1 向 Leaf2 通告它的 host-IP Table。 ? Host1 通過特定的 Interface 和 BD 接入到 Leaf1 時,通常會觸發 ARP、DHCP 等廣播流量。
L2 Gateway 特性:學習到 Host1 對應的 Host1-MAC 并記錄在 BD 的 host-MAC Table 中。
L3 Gateway 特性:學習到 Host1 對應的 Host1-IP 并記錄在 L3 VNI 對應的 VRF 的 host-IP Table 中。
隨后 Leaf1 向 Leaf2 發送 Type2 Route,攜帶了 EVPN Instance RD、Host1-MAC、Host1-IP、L2 VNI、L3 VNI、VTEP IP 等信息。 ? Leaf2 收到 Type2 Route 后,根據 L2 VNI 匹配到相應的 BD,并將 Host1-MAC 保存在 BD 的 host-MAC Table 中。
L2 Gateway 特性:根據 L2 VNI 匹配到相應的 BD,并將 Host1-MAC 保存在 BD 的 host-MAC Table 中。
L3 Gateway 特性:根據 L3 VNI 匹配到相應的 VRF,并將 Host1-IP 保存在 VRF 的 host-IP Table 中。
VTEP 應用 Type2 實現 ARP 廣播抑制
同一個 VxLAN 子網屬于一個 “大二層“ 虛擬網絡,子網內的主機要互相通信就需要知道對方的 MAC 地址,傳統的方式是發出 ARP Request 廣播報文。而在 EVPN 場景中,則可以應用 Type2 實現 ARP 廣播抑制,能夠有效減少 ARP 洪泛的流量。 ?
首先,VxLAN L3 Gateway 之間通過 Type2 Route 互相宣告 ARP 表項信息(host-MAC/IP)。
然后,VxLAN L3 Gateway 通過傳遞 ARP 類型路由,將 ARP 表項信息傳遞給 VxLAN L2 Gateway。
最后,VxLAN L2 Gateway 開啟 ARP 代答功能后,就會根據 ARP 表項信息生成 ARP 廣播抑制表,包括:host-IP、host-MAC、VTEP、VNI 等信息。
完成控制面的配置后,當 VxLAN L2 Gateway(e.g. Leaf1)再收到從 Host1 向 Host2 發出的 ARP Request 時,就會先查看自己的 ARP 廣播抑制表,發現有 Host2 的 MAC-IP 記錄,則直接將 ARP Request 報文中的廣播 MAC 地址替換為目的單播 MAC 地址(廣播變單播),然后原路 Reply,從而達到 ARP 廣播抑制的目的。
但需要注意的是,Type2 Route 和 ARP 廣播抑制只是減少了 ARP 洪泛流量,但不能完全避免,例如下面場景: ?
新上線的可能是 “靜默主機“,它不會自動觸發 ARP、DHCP 等廣播流量,所以上掛 VTEP 不能被動學習其 MAC 地址。首次訪問 “靜默主機” 時,還是需要在 VxLAN 子網中廣播 ARP Request 報文來獲得對方的 MAC 地址。
在 VTEP 沒來及的學習到 ARP 廣播抑制表項的時候,也會按照正常的流程進行廣播。
Type3:Inclusive Multicast Ethernet Tag Route(集成多播 Ethernet Tag 路由)
通過應用 Type3 Route 可以實現 VTEP Peers 的自動發現和認證,并在 VTEP Peer 之間互相傳遞 L2 VNI 和 VTEP IP 地址信息。 ? Type3 Route 的 EVPN NLRI 字段如下: ?
Route Distinguisher:指示 EVPN Instance 的 RD 值。
Ethernet Tag ID:指示當前設備配置的以太網 VLAN ID。在 Type3 Route 中為全 0。
IP Address Length:指示該 Route 攜帶的 local-VTEP IP 地址的掩碼長度。
Originating Router's IP Address:指示該 Route 攜帶的 local-VTEP IP 地址。
Flags:在 VxLAN 場景中,該字段沒有實際意義。
MPLS Label:指示該 Route 攜帶的 L2 VNI,用于標識不同的 BD。
Tunnel Type:指示該 Route 攜帶的隧道類型。在 VxLAN 場景中,該字段為 “6: Ingress Replication”,即頭端復制類型。
Tunnel Identifier:指示該 Route 攜帶的隧道信息。在 VxLAN 場景中,該字段也是 local-VTEP IP 地址。
VTEP 應用 Type3 建立頭端復制列表
前面提到 Type2 Route 只能 “抑制“ ARP 洪泛流量,但不能完全避免。這些不能避免的 BUM 流量,還是需要通過頭端復制或核心復制方式來進行廣播或組播。 ? 以頭端復制為例,VTEP Peer 之間可以通過 Type3 Route 宣告來實現自動創建頭端復制列表,包括:L2 VNI、src-VTEP IP、dst-VTEP IP 等信息。如下圖所示,Leaf1、Leaf2、Leaf3 作為 VTEP,Leaf1 向 Leaf2、Leaf3 發送 Type3 Route。 ?
在 Leaf1 上完成 VTEP IP、L2 VNI、EVPN Instance 等相關配置后,Leaf1 會向 Leaf2、Leaf3 分別發送 Type3 Route,攜帶了 L2 VNI、local-VTEP IP、EVPN Instance RD 等信息。
Leaf2、Leaf3 收到來自 Leaf1 的 Type3 Route 后:
如果 Leaf1 VTEP IP 三層路由可達,則建立一條 VxLAN Tunnel。
如果如果 remote-VNI 與 local-VNI 相同,則新建一個頭端復制表,用于后續 BUM 報文廣播。
Type5:IP Prefix Route(IP 前綴路由)
Type3 Route 的 EVPN NLRI 字段如下: ?
Route Distinguisher
指示 EVPN Instance 的 RD 值。 ?
Ethernet Segment Identifier
用于唯一標識一個 VxLAN Tunnel 的連接。 ?
Ethernet Tag ID
指示當前設備配置的以太網 VLAN ID。 ?
IP Prefix Length
指示該 Route 攜帶的 IP Prefix 的掩碼長度。 ?
IP Prefix
指示該 Route 攜帶的 IP Prefix,可以是精確路由(/32 或 /128),也可以網段地址(/0-32 或 /0-128),主要是傳遞網段路由。 ?
GW IP Address
指示默認網關地址。該字段在 VxLAN 場景中沒有實際意義。 ?
MPLS Label
指示該 Route 攜帶的 L3 VNI,用于標識不同的 VRF。 ?
VTEP 應用 Type5 通告 host-IP 網段路由
Type5 Route 有 2 個主要的應用場景: ?
在沒有 IP 地址重疊的網絡規劃中,可以配置 VTEP 通過 Type5 Route 宣告 host-IP 網段路由,而不是 host-IP 精確路由,以此來有效減少 VxLAN L3 Gateway 設備的路由表項。
在 VxLAN 網絡和外部 IP 網絡之間需要互聯互通時,可以通過 Type5 Route 將外部 IP 網段宣告到 VxLAN L3 Gateway,繼而實現 VxLAN 網絡中的主機能夠與外部網絡之間進行 IP 訪問。
如下圖所示,Leaf1、Leaf2 作為 VxLAN L3 Gateway,其中 Leaf1 連接了一個外部網絡的 192.168.1.0/24 網段。 ?
Leaf1 探測到 192.168.1.0/24 網段路由后,向 Leaf2 宣告 Type5 Route,包括:EVPN Instance RD、IP Prefix、L3 VNI、Leaf1 VTEP IP 地址等信息。
Leaf2 收到 Type5 Route 后,學習到 192.168.1.0/24 網段信息,并將其保存在相應的 Route Table 中,其下一跳為 Leaf1 VTEP IP 地址。
后續,Leaf2 就可以直接轉發 dstIP 為 192.168.1.0/24 網段的 IP 報文了。
? ?
編輯:黃飛
?
評論
查看更多