VxLAN協議詳解

版權聲明:本文為Heriam部落客原創文章,遵循CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
原文鏈接://jiang-hao.com/articles/2020/networking-vxlan-in-depth.html

VxLAN簡介

背景

任何技術的產生,都有其特定的時代背景與實際需求,VXLAN正是為了解決雲計算時代虛擬化中的一系列問題而產生的一項技術。那麼我們先看看 VXLAN 到底要解決哪些問題。

  • 虛擬機規模受網路設備表項規格的限制

對於同網段主機的通訊而言,報文通過查詢MAC表進行二層轉發。伺服器虛擬化後,數據中心中VM的數量比原有的物理機發生了數量級的增長,伴隨而來的便是虛擬機網卡MAC地址數量的空前增加。一般而言,接入側二層設備的規格較小,MAC地址表項規模已經無法滿足快速增長的VM數量。

  • 傳統網路的隔離能力有限

    虛擬化(虛擬機和容器)的興起使得一個數據中心會有動輒上萬的機器需要通訊,而傳統的 VLAN 技術在標準定義中只有12比特,也就只能支援 4096 個網路上限,已經顯然滿足不了不斷擴展的數據中心規模。

  • 虛擬機遷移範圍受限

    虛擬機遷移,顧名思義,就是將虛擬機從一個物理機遷移到另一個物理機,但是要求在遷移過程中業務不能中斷。要做到這一點,需要保證虛擬機遷移前後,其IP地址、MAC地址等參數維持不變。這就決定了,虛擬機遷移必須發生在一個二層域中。而傳統數據中心網路的二層域,將虛擬機遷移限制在了一個較小的局部範圍內。此外,解決這個問題同時還需保證二層的廣播域不會過分擴大,這也是雲計算網路的要求。

傳統「二層+三層」的網路在應對這些要求時變得力不從心,雖然通過很多改進型的技術比如堆疊、SVF、TRILL等可以構建物理上的大二層網路,可以將虛擬機遷移的範圍擴大。但是,構建物理上的大二層,難免需要對原來的網路做大的改動,並且大二層網路的範圍依然會受到種種條件的限制。

為了解決這些問題,有很多方案被提出來,VxLAN就是其中之一。VxLAN 是 VMware、Cisco 等一眾大型企業共同推出的,目前標準文檔在 RFC7348

定義

在介紹完VxLAN要解決的問題也就是技術背景之後,接下來正式闡述一下VxLAN的定義,也就是它到底是什麼。

VXLAN 全稱是 Virtual eXtensible Local Area Network,虛擬可擴展的區域網。它是一種 Overlay 技術,採用L2 over L4(MAC-in-UDP)封裝方式,是NVO3(Network Virtualization over Layer 3)中的一種網路虛擬化技術,將二層報文用三層協議進行封裝,可實現虛擬的二層網路在三層範圍內進行擴展,同時滿足數據中心大二層虛擬遷移和多租戶的需求。RFC7348上的介紹是這樣的:

A framework for overlaying virtualized layer 2 networks over lay 3 networks.

意義

針對大二層網路,VxLAN技術的出現很好的解決了雲計算時代背景下數據中心在物理網路基礎設施上實施伺服器虛擬化的隔離和可擴展性問題:

  • 通過24比特的VNI可以支援多達16M的VXLAN段的網路隔離,對用戶進行隔離和標識不再受到限制,可滿足海量租戶。
  • 除VXLAN網路邊緣設備,網路中的其他設備不需要識別虛擬機的MAC地址,減輕了設備的MAC地址學習壓力,提升了設備性能。
  • 通過採用MAC in UDP封裝來延伸二層網路,實現了物理網路和虛擬網路解耦,租戶可以規劃自己的虛擬網路,不需要考慮物理網路IP地址和廣播域的限制,大大降低了網路管理的難度。

VxLAN組網模型

VxLAN主要用於數據中心網路。VxLAN技術將已有的三層物理網路作為Underlay網路,在其上構建出虛擬的二層網路,即Overlay網路。Overlay網路通過Mac-in-UDP封裝技術、利用Underlay網路提供的三層轉發路徑,實現租戶二層報文跨越三層網路在不同的站點間傳遞。對於租戶來說,Underlay網路是透明的,同一租戶的不同站點就像是工作在一個區域網中。同時,在同一個物理網路上可以構建多個VxLAN網路,每個VxLAN網路由唯一的VNI標識,不同VxLAN之間互不影響,從而實現租戶網路之間的隔離。

如上圖所示,VxLAN的典型網路模型中主要包含以下幾個基本元素:

  • VM (Virtual Machine): 虛擬機。在一台伺服器上可以創建多台虛擬機,不同的虛擬機可以屬於不同的 VXLAN。處於相同VxLAN的虛擬機處於同一個邏輯二層網路,彼此之間二層互通;屬於不同VxLAN的虛擬機之間二層隔離。
  • VxLAN Tunnel: VxLAN隧道。「隧道」是一個邏輯上的概念,它並不新鮮,比如大家熟悉的GRE。說白了就是將原始報文「變身」下,加以「包裝」,好讓它可以在承載網路(比如IP網路)上傳輸。從主機的角度看,就好像原始報文的起點和終點之間,有一條直通的鏈路一樣。而這個看起來直通的鏈路,就是「隧道」。顧名思義,「VXLAN隧道」便是用來傳輸經過VXLAN封裝的報文的,它是建立在兩個VTEP之間的一條虛擬通道。Vxlan 通訊雙方(圖中的虛擬機)認為自己是通過二層VSI直接通訊,並不知道底層網路的存在。
  • VTEP (VxLAN Tunnel Endpoints): VXLAN隧道端點。VXLAN網路的邊緣設備,是VXLAN隧道的起點和終點,VXLAN報文的封裝和解封裝處理均在這上面進行。VTEP可以理解為Overlay網路立足於Underlay物理網路之上的支腳點,分配有物理網路的IP地址,該地址與虛擬網路無關。VXLAN報文中源IP地址為隧道一端節點的VTEP地址,目的IP地址為隧道另一端節點的VTEP地址,一對VTEP地址就對應著一個VXLAN隧道。VTEP 可以是一個獨立的網路設備(比如交換機),也可以是一台物理伺服器(比如虛擬機所在的宿主機)。
  • VNI (VXLAN Network Identifier): VXLAN 網路標識符。乙太網數據幀中VLAN只佔了12比特的空間,這使得VLAN的隔離能力在數據中心網路中力不從心。而VNI的出現,就是專門解決這個問題的。VNI是一種類似於VLAN ID的用戶標示,一個VNI代表了一個租戶,即使多個終端用戶屬於同一個VNI,也表示一個租戶。VNI
    由24比特組成,支援多達16M的租戶。屬於不同VNI的虛擬機之間不能直接進行二層通訊。VXLAN報文封裝時,給VNI分配了足夠的空間使其可以支援海量租戶的隔離。
  • IP核心設備/隧道中間設備: 網路中普通的路由/轉發設備,不參與VxLAN處理,僅需根據封裝後的VxLAN報文的目的VTEP IP地址沿著VxLAN隧道路徑進行普通的三層轉發。
  • VSI (Virtual Switch Instance): 虛擬交換實例。VTEP上為每個VxLAN提供二層交換服務的虛擬交換實例。VSI可以看做是VTEP上的一台針對某個VxLAN內的數據幀進行二層轉發的虛擬交換機,它具有傳統乙太網交換機的所有功能,包括源MAC地址學習、MAC地址老化、泛洪等。VSI與VxLAN一一對應。
  • VSI-Interface: VSI的虛擬三層介面。類似於Vlan-Interface,用來處理跨VNI即跨VXLAN的流量。VSI-Interface與VSI一一對應,在沒有跨VNI流量時可以沒有VSI-Interface。

VxLAN報文格式

VXLAN是MAC in UDP的網路虛擬化技術,所以其報文封裝是在原始以太報文之前添加了一個UDP頭及VXLAN頭封裝:VTEP會將VM發出的原始報文封裝成一個新的UDP報文,並使用物理網路的IP和MAC地址作為外層頭,對網路中的其他設備只表現為封裝後的參數。也就是說,網路中的其他設備看不到VM發送的原始報文。

如果伺服器作為VTEP,那從伺服器發送到接入設備的報文便是經過封裝後的報文,這樣,接入設備就不需要學習VM的MAC地址了,它只需要根據外層封裝的報文頭負責基本的三層轉發就可以了。因此,虛擬機規模就不會受網路設備表項規格的限制了。

當然,如果網路設備作為VTEP,它還是需要學習VM的MAC地址。但是,從對報文進行封裝的角度來說,網路設備的性能還是要比伺服器強很多。

下圖是 VxLAN 協議的報文,白色的部分是虛擬機發出的原始報文(二層幀,包含了 MAC 頭部、IP 頭部和傳輸層頭部的報文),前面加了VxLAN 頭部用來專門保存 VxLAN 相關的內容,再前面是標準的 UDP 協議頭部(UDP 頭部、IP 頭部和 MAC 頭部)用來在物理網路上傳輸報文。

從這個報文中可以看到三個部分:

  1. 最外層的 UDP 協議報文用來在底層物理網路上傳輸,也就是 VTEP 之間互相通訊的基礎;
  2. 中間是 VXLAN 頭部,VTEP 接受到報文之後,去除前面的 UDP 協議部分,根據這部分來處理 VxLAN 的邏輯,主要是根據 VNI 發送到最終的虛擬機;
  3. 最裡面是原始的二層幀,也就是虛擬機所見的報文內容。

VxLAN報文各個部分解釋如下:

  • Outer Ethernet/MAC Header: 外層以太頭。14位元組,如果有VLAN TAG則為18位元組。

    • SA:發送報文的虛擬機所屬VTEP的MAC地址。
    • DA:到達目的VTEP的路徑上下一跳設備的MAC地址。
    • VLAN Type:可選欄位,當報文中攜帶VLAN Tag時,該欄位取值為0x8100。
    • Ethernet Type:以太報文類型,IP協議報文該欄位取值為0x0800。
  • Outer IP Header: 外層IP頭。20位元組。其中,源IP地址(Outer Src. IP)為源VM所屬VTEP的IP地址,目的IP地址(Outer Dst. IP)為目的VM所屬VTEP的IP地址。IP協議號(Protocol)為17(0x11),指示內層封裝的是UDP報文。

  • Outer UDP Header: 外層UDP頭。8位元組。其中,UDP目的埠號(UDP Destination Port)固定為4789,指示內層封裝報文為VxLAN報文。UDP源埠號(UDP Source Port)為原始以太幀通過哈希演算法計算後的隨機任意值,可以用於VxLAN網路VTEP節點之間ECMP負載均衡。

  • VxLAN Header: VxLAN頭。8位元組。

    • Flags: 8比特,RRRRIRRR。「I」位為1時,表示VXLAN頭中的VXLAN ID有效;為0,表示VXLAN ID無效。「R」位保留未用,設置為0。
    • VxLAN ID (VNI): 24比特,用於標識一個單獨的VXLAN網路。這也是 VxLAN 能支援千萬租戶的地方。
    • Reserved: 兩個保留欄位,分別為24比特和8比特。
  • Original L2 Frame: 原始乙太網報文。

從報文的封裝可以看出,VXLAN頭和原始二層報文是作為UDP報文的載荷存在的。在VTEP之間的網路設備,只需要根據Outer MAC Header和Outer IP Header進行轉發,利用UDP Source Port進行負載分擔,這一過程,與轉發普通的IP報文完全相同。這樣,除了VTEP設備,現網的大量設備無需更換或升級即可支援VXLAN網路。

VxLAN協議比原始報文多出50位元組的內容,這會降低網路鏈路傳輸有效數據的比例。此外,新增加的VXLAN報文封裝也引入了一個問題,即MTU值的設置。一般來說,虛擬機的默認MTU為1500 Bytes,也就是說原始乙太網報文最大為1500位元組。這個報文在經過VTEP時,會封裝上50位元組的新報文頭(VXLAN頭8位元組+UDP頭8位元組+外部IP頭20位元組+外部MAC頭14位元組),這樣一來,整個報文長度達到了1550位元組。而現有的VTEP設備,一般在解封裝VXLAN報文時,要求VXLAN報文不能被分片,否則無法正確解封裝。這就要求VTEP之間的所有網路設備的MTU最小為 1550位元組。如果中間設備的MTU值不方便進行更改,那麼設置虛擬機的MTU值為1450,也可以暫時解決這個問題。

VxLAN頭部最重要的是VNID欄位,其他的保留欄位主要是為了未來的擴展,很多廠商都會加以運用來實現自己組網的一些特性。

VxLAN運行機制

隧道建立

網路中存在多個VTEP,那麼這其中哪些VTEP間需要建立VXLAN隧道呢?如前所述,通過VXLAN隧道,「二層域」可以突破物理上的界限,實現大二層網路中VM之間的通訊。所以,連接在不同VTEP上的VM之間如果有「大二層」互通的需求,這兩個VTEP之間就需要建立VXLAN隧道。換言之,同一大二層域內的VTEP之間都需要建立VXLAN隧道。

一般而言,隧道的建立不外乎手工方式和自動方式兩種。

手工方式

這種方式需要用戶手動指定VXLAN隧道的源和目的IP地址分別為本端和對端VTEP的IP地址,也就是人為的在本端VTEP和對端VTEP之間建立靜態VXLAN隧道。以華為CE系列交換機為例,以上配置是在NVE(Network Virtualization Edge)介面下完成的。配置過程如下:

#
interface Nve1   //創建邏輯介面NVE 1
 source 1.1.1.1   //配置源VTEP的IP地址(推薦使用Loopback介面的IP地址)
 vni 5000 head-end peer-list 2.2.2.2  
 vni 5000 head-end peer-list 2.2.2.3   
#

其中,vni 5000 head-end peer-list 2.2.2.2和vni 5000 head-end peer-list 2.2.2.3的配置,表示屬於VNI 5000的對端VTEP有兩個,IP地址分別為2.2.2.2和2.2.2.3。根據這兩條配置,VTEP上會生成如下所示的一張表:

<HUAWEI> display vxlan vni 5000 verbose
    BD ID                  : 10
    State                  : up
    NVE                     : 288
    Source                 : 1.1.1.1
    UDP Port               : 4789
    BUM Mode               : head-end
    Group Address         : - 
    Peer List              : 2.2.2.2 2.2.2.3 

根據上表中的Peer List,本端VTEP就可以知道屬於同一VNI的對端VTEP都有哪些,這也就決定了同一大二層廣播域的範圍。當VTEP收到BUM(Broadcast&Unknown-unicast&Multicast,廣播&未知單播&組播)報文時,會將報文複製並發送給Peer List中所列的所有對端VTEP(這就好比廣播報文在VLAN內廣播)。因此,這張表也被稱為「頭端複製列表」。當VTEP收到已知單播報文時,會根據VTEP上的MAC表來確定報文要從哪條VXLAN隧道走。而此時Peer List中所列的對端,則充當了MAC表中「出介面」的角色。在後面的報文轉發流程中,你將會看到頭端複製列表是如何在VXLAN網路中指導報文進行轉發的。

自動方式

自動方式下VXLAN隧道的建立需要藉助於其他的協議,例如通過BGP/EVPN(Ethernet Virtual Private Network)或ENDP(Enhanced Neighbor Discovery Protocol)發現遠端VTEP後,自動在本端和遠端VTEP之間建立VXLAN隧道。

二層MAC學習

通過上節的內容,我們大致了解 VxLAN 報文的發送過程。概括地說就是虛擬機的報文通過 VTEP 添加上 VxLAN 以及外部的UDP/IP報文頭,然後發送出去,對方 VTEP 收到之後拆除 VxLAN 頭部然後根據 VNI 把原始報文發送到目的虛擬機。

這個過程是雙方已經知道所有通訊所需資訊的情況下的轉發流程,但是在第一次通訊之前還有很多問題有解決:

  • VTEP是如何對報文進行封裝?
  • 發送方虛擬機怎麼知道對方的 MAC 地址?
  • VTEP怎麼知道目的虛擬機在哪一台宿主機上?

要回答這些問題,我們還是回到 VxLAN 協議報文上,看看一個完整的 VxLAN 報文需要哪些資訊。

  • 內層報文:通訊的虛擬機雙方要麼直接使用 IP 地址,要麼通過 DNS 等方式已經獲取了對方的 IP 地址。因此網路層的源和目的地址已經知道。同一個網路的虛擬機需要通訊,還需要知道對方虛擬機的 MAC 地址,VxLAN需要一個機制來實現類似傳統網路 ARP 的功能
  • VxLAN 頭部:只需要知道 VNI,這一般是直接配置在 VTEP 上的,要麼是提前規劃固定的,要麼是根據內部報文自動生成的,也不需要擔心。
  • UDP 頭部:最重要的是源埠和目的埠,源埠是系統生成並管理的,目的埠也是固定的,比如 IANA 規定的 4789 埠,這部分也不需要擔心。
  • 外層IP頭部:外層IP頭部關心的是隧道兩端VTEP的IP地址,源地址可以很簡單確定,目的地址是目的虛擬機所在宿主機關聯的VTEP IP 地址,這個也需要由某種方式來確定。
  • 外層MAC頭部:如果目的VTEP 的 IP 地址確定了,根據路由表查找到下一跳的MAC 地址可以通過經典的 ARP 方式來獲取,畢竟 VTEP 網路在同一個三層,經典網路架構那一套就能直接用了。

總結一下,一個 VxLAN 報文需要確定兩個地址資訊:目的虛擬機的 MAC 地址和目的 VTEP 的 IP 地址,如果 VNI 也是動態感知的,那麼 VTEP 就需要一個三元組:

(內層目的虛機MAC, VNI, 外層目的VTEP IP)

組成為控制平面的表來記錄對端地址可達情況。VXLAN有著與傳統乙太網非常相似的MAC學習機制,當VTEP接收到VXLAN報文後,會記錄源VTEP的IP、虛擬機MAC和VNI到本地MAC表中,這樣當VTEP接收到目的MAC為此虛擬機的MAC時,就可以進行VXLAN封裝並轉發。VXLAN學習地址的時候仍然保存著二層協議的特徵,節點之間不會周期性的交換各自的轉發表。對於不認識的MAC地址,VXLAN一般依靠組播或控制中心來獲取路徑資訊。組播的概念是同個 VxLAN 網路的 VTEP 加入到同一個組播網路,如果需要知道以上資訊,就在組內發送多播來查詢;控制中心的概念是在某個集中式的地方保存了所有虛擬機的上述資訊,自動化告知 VTEP 它需要的資訊。

組播方式

每個多播組對應一個多播IP地址,vtep 建立的時候會通過配置加入到多播組(具體做法取決於實現),往這個多播IP地址發送的報文會發給多播組的所有主機。為什麼要使用多播?因為vxlan的底層網路是三層的,廣播地址無法穿越三層網路,要給vxlan 網路所有vtep發送報文只能通過多播。 通過組播的方式承載ARP的廣播報文可以實現整個VxLAN網路下的地址解析以及VSI的MAC地址學習,在這個過程中,只需要有一次多播,因為VTEP有自動學習的能力,後續的報文都是通過單播直接發送的。也可以看到,多播報文非常浪費,每次的多播其實只有一個報文是有效的,如果某個多播組的 vtep 數量很多,這個浪費是非常大的。但是多播組也有它的實現起來比較簡單,不需要中心化的控制,只要底層網路支援多播,只需配置好多播組就能自動發現了。因為並不是所有的網路設備都支援多播,再加上多播方式帶來的報文浪費,在實際生產中這種方式很少用到。綜上,VXLAN和傳統VLAN網路數據平面一樣,數據經過未知單播泛洪->MAC表項及ARP表項建立->單播轉發的過程,我們稱之為自學習模式。但自學習方式過於簡單,其大量的泛洪報文以及無法智慧調整的缺點,使得這樣的控制平面構建方式不適合SDN網路。

控制器方式

VTEP發送報文最關鍵的就是知道對方虛擬機的 MAC 地址和虛擬機所在主機的 VTEP IP 地址,如果實現知道這兩個資訊,那麼就不需要多播了。SDN最大的特點就是轉控分離,集中控制。按照這個指導思想,將控制功能單獨剝離出來成為一個單獨的設備便是很自然的事了。這個設備就是 Controller。Controller可以是一個或者一組硬體設備,也可以是一套軟體。Controller與網路中所有設備建立連接,整個VXLAN網路的數據轉發都由Controller來管理。Controller與設備連接的介面稱為南向介面,可以使用OpenFlow、Netconf等協議;對用戶提供服務的介面稱為北向介面,也可以提供API以便與其他管理平台對接或進行深度開發。基於Controller的南向介面,可以通過OpenFlow或OVSDB協議的方式向VTEP設備下發遠端MAC地址表項。具體不在這裡進行展開講述。

BUM報文轉發

前面描述的報文轉發過程都是已知單播報文轉發,如果VTEP收到一個未知地址的BUM報文如何處理呢。與傳統乙太網BUM報文轉發類似,VTEP會通過泛洪的方式轉發流量。BUM(Broadcast, Unknown-unicast, Multicast)即廣播、未知單播、組播流量。根據對泛洪流量的複製方式不同可分為單播路由方式(頭端複製)和組播路由方式(核心複製)兩種。

單播路由方式泛洪(頭端複製)

在頭端複製方式下,VTEP負責複製報文,採用單播方式將複製後的報文通過本地介面發送給本地站點,並通過VXLAN隧道發送給VXLAN內的所有遠端VTEP。

如下圖所示,當VTEP 1上的VM 1發出BUM報文後,VTEP 1判斷數據所屬的VXLAN,通過該VXLAN內所有本地介面和VXLAN Tunnel轉發報文。通過VXLAN Tunnel轉發報文時,封裝VXLAN頭、UDP頭和IP頭,將泛洪報文封裝於單播報文中,發送到VXLAN內的所有遠端VTEP。

遠端VTEP收到VXLAN報文後,解封裝報文,將原始數據在本地站點的VXLAN內泛洪。為避免環路,遠端VTEP從VXLAN隧道上接收到報文後,不會再將其泛洪到其他的VXLAN隧道。

通過頭端複製完成BUM報文的廣播,不需要依賴組播路由協議。

組播路由方式泛洪(核心複製)

組播路由方式的組網中同一個VXLAN內的所有VTEP都加入同一個組播組,利用組播路由協議(如PIM)在IP網路上為該組播建立組播轉發表項,VTEP上相應生成一個組播隧道。

與頭端複製方式不同,當VTEP 1上的VM 1發出BUM報文後,VTEP 1不僅在本地站點內泛洪,還會為其封裝組播目的IP地址,封裝後的報文根據已建立的組播轉發表項轉發到IP網路。

在組播報文到達IP網路中的中間設備時,該設備根據已建立的組播表項對報文進行複製並轉發。

遠端VTEP(VTEP 2和VTEP 3)接收到報文後,解封裝報文,將原始的數據幀在本地站點的指定VXLAN泛洪。為了避免環路,遠端VTEP從VXLAN隧道上接收到報文後,不會再將其泛洪到其他的VXLAN隧道。

由於泛洪流量使用了組播技術,所以整個組網中的網路設備需要支援組播路由協議(如PIM等)來建立組播路徑以便組播報文轉發。

參考文獻

  1. vxlan 協議原理簡介
  2. 華為悅讀匯技術發燒友:認識VXLAN
  3. 華為VxLAN技術白皮書