天天看點

VxLAN協定詳解

版權聲明:本文為Heriam部落客原創文章,遵循CC 4.0 BY-SA 版權協定,轉載請附上原文出處連結和本聲明。

原文連結:https://jiang-hao.com/articles/2020/networking-vxlan-in-depth.html

目錄

  • VxLAN簡介
    • 背景
    • 定義
    • 意義
  • VxLAN組網模型
  • VxLAN封包格式
  • VxLAN運作機制
    • 隧道建立
      • 手工方式
      • 自動方式
    • 二層MAC學習
      • 多點傳播方式
      • 控制器方式
    • BUM封包轉發
      • 單點傳播路由方式泛洪(頭端複制)
      • 多點傳播路由方式泛洪(核心複制)
  • 參考文獻

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協定詳解

如上圖所示,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協定詳解

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/E***(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網絡。

VxLAN協定詳解

控制器方式

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

VxLAN協定詳解

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隧道。

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技術白皮書