1. 程式人生 > >VXLAN 基礎教程:在 Linux 上配置 VXLAN 網路

VXLAN 基礎教程:在 Linux 上配置 VXLAN 網路

上篇文章結尾提到 Linux 是支援 VXLAN 的,我們可以使用 Linux 搭建基於 VXLAN 的 overlay 網路,以此來加深對 VXLAN 的理解,畢竟光說不練假把式。

1. 點對點的 VXLAN

先來看看最簡單的點對點 VXLAN 網路,點對點 VXLAN 即兩臺主機構建的 VXLAN 網路,每臺主機上有一個 VTEPVTEP 之間通過它們的 IP 地址進行通訊。點對點 VXLAN 網路拓撲圖如圖所示:

為了不影響主機的網路環境,我們可以使用 Linux VRF 來隔離 root network namespace 的路由。VRF(Virtual Routing and Forwarding)是由路由表和一組網路裝置組成的路由例項,你可以理解為輕量級的 network namespace

,只虛擬了三層的網路協議棧,而 network namespace 虛擬了整個網路協議棧。詳情參看 Linux VRF(Virtual Routing Forwarding)的原理和實現。

Linux Kernel 版本大於 4.3 才支援 VRF,建議做本文實驗的同學先升級核心。

當然了,如果你有專門用來做實驗的乾淨主機,可以不用 VRF 來隔離。

下面結合 VRF 來建立一個點對點 VXLAN 網路。

首先在 192.168.57.50 上建立 VXLAN 介面:

$ ip link add vxlan0 type vxlan \
  id 42 \
  dstport 4789 \
  remote 192.168.57.54 \
  local 192.168.57.50 \
  dev eth0

重要引數解釋:

  • id 42 : 指定 VNI 的值,有效值在 1 到 \(2^{24}\) 之間。
  • dstport : VTEP 通訊的埠,IANA 分配的埠是 4789。如果不指定,Linux 預設使用 8472
  • remote : 對端 VTEP 的地址。
  • local : 當前節點 VTEP 要使用的 IP 地址,即當前節點隧道口的 IP 地址。
  • dev eth0 : 當前節點用於 VTEP 通訊的裝置,用來獲取 VTEP IP 地址。這個引數與 local 引數目的相同,二選一即可。

檢視 vxlan0 的詳細資訊:

$ ip -d link show vxlan0

11: vxlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master vrf-test state UNKNOWN mode DEFAULT group default qlen 1000
    link/ether 82:f3:76:95:ab:e1 brd ff:ff:ff:ff:ff:ff promiscuity 0
    vxlan id 42 remote 192.168.57.54 local 192.168.57.50 srcport 0 0 dstport 4789 ageing 300 udpcsum noudp6zerocsumtx noudp6zerocsumrx

接下來建立一個 VRF,並將 vxlan0 繫結到該 VRF 中:

$ ip link add vrf0 type vrf table 10
$ ip link set vrf0 up
$ ip link set vxlan0 master vrf0

再次檢視 vxlan0 的資訊:

$ ip -d link show vxlan0

13: vxlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master vrf0 state UNKNOWN mode DEFAULT group default qlen 1000
    link/ether aa:4d:80:e3:75:e0 brd ff:ff:ff:ff:ff:ff promiscuity 0
    vxlan id 42 remote 192.168.57.54 local 192.168.57.50 srcport 0 0 dstport 4789 ageing 300 udpcsum noudp6zerocsumtx noudp6zerocsumrx
    vrf_slave table 10 addrgenmode eui64 numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535

你會發現多了 VRF 的資訊。

接下來為 vxlan0 配置 IP 地址並啟用它:

$ ip addr add 172.18.1.2/24 dev vxlan0
$ ip link set vxlan0 up

執行成功後會發現 VRF 路由表項多了下面的內容,所有目的地址是 172.18.1.0/24 網路包要通過 vxlan0 轉發:

$ ip route show vrf vrf0

172.18.1.0/24 dev vxlan0 proto kernel scope link src 172.18.1.2

同時也會增加一條 FDB 轉發表:

$ bridge fdb show

00:00:00:00:00:00 dev vxlan0 dst 192.168.57.54 self permanent

這個表項的意思是,預設的 VTEP 對端地址為 192.168.57.54。換句話說,原始報文經過 vxlan0 後會被核心新增上 VXLAN 頭部,而外部 UDP 頭的目的 IP 地址會被冠上 192.168.57.54

在另一臺主機(192.168.57.54)上也進行相同的配置:

$ ip link add vxlan0 type vxlan id 42 dstport 4789 remote 192.168.57.50
$ ip link add vrf0 type vrf table 10
$ ip link set vrf0 up
$ ip link set vxlan0 master vrf0
$ ip addr add 172.18.1.3/24 dev vxlan0
$ ip link set vxlan0 up

一切大功告成之後,就可以相互通訊了,在 192.168.57.50 上 ping 172.18.1.3

$ ping 172.18.1.3 -I vrf0

同時使用 wireshark 遠端抓包:

$ ssh [email protected] 'tcpdump -i any -s0 -c 10 -nn -w - port 4789' | /Applications/Wireshark.app/Contents/MacOS/Wireshark -k -i -

具體含義我就不解釋了,參考 Tcpdump 示例教程。

可以看到 VXLAN 報文可以分為三塊:

  • 最內層是 overlay 網路中實際通訊的實體看到的報文(比如這裡的 ARP 請求),它們和經典網路的通訊報文沒有任何區別,除了因為 MTU 導致有些報文比較小。
  • 中間一層是 VXLAN 頭部,我們最關心的欄位 VNI 確實是 42
  • 最外層是 VTEP 所在主機的通訊報文頭部,目的 IP 地址為對端 192.168.57.54

下面來分析這個最簡單的模式下 vxlan 通訊的過程:

  1. 傳送 ping 報文到 172.18.1.3,檢視路由表,報文會從 vxlan0 發出去。

  2. 核心發現 vxlan0 的 IP 是 172.18.1.2/24,和目的 IP 在同一個網段,所以在同一個區域網,需要知道對方的 MAC 地址,因此會發送 ARP 報文查詢。

  3. ARP 報文源 MAC 地址為 vxlan0 的 MAC 地址,目的 MAC 地址為全 1 的廣播地址(ff:ff:ff:ff:ff:ff)。

  4. VXLAN 根據配置(VNI 42)新增上頭部。

  5. 對端的 VTEP 地址為 192.168.57.54,將報文傳送到該地址。

  6. 對端主機接收到這個報文,核心發現是 VXLAN 報文,會根據 VNI 傳送給對應的 VTEP

  7. VTEP 去掉 VXLAN 頭部,取出真正的 ARP 請求報文,同時,VTEP 會記錄源 MAC 地址和 IP 地址資訊到 FDB 表中,這便是一次學習過程。然後生成 ARP 應答報文。

$ bridge fdb show
 
00:00:00:00:00:00 dev vxlan0 dst 192.168.57.50 self permanent
aa:4d:80:e3:75:e0 dev vxlan0 dst 192.168.57.50 self
  1. 應答報文目的 MAC 地址是傳送方 VTEP 的 MAC 地址,目的 IP 是傳送方 VTEP 的 IP 地址,直接傳送給目的 VTEP。

  2. 應答報文通過 underlay 網路直接返回給傳送方主機,傳送方主機根據 VNI 把報文轉發給 VTEP,VTEP 解包取出 ARP 應答報文,新增 ARP 快取到核心,並根據報文學習到目的 VTEPIP 地址和目的 MAC 地址,新增到 FDB 表中。

$ ip neigh show vrf vrf0
 
172.18.1.3 dev vxlan0 lladdr 76:06:5c:15:d9:78 STALE
 
$ bridge fdb show
 
00:00:00:00:00:00 dev vxlan0 dst 192.168.57.54 self permanent
fe:4a:7e:a2:b5:5d dev vxlan0 dst 192.168.57.54 self
  1. 至此 VTEP 已經知道了通訊需要的所有資訊,後續 ICMP 的 ping 報文都是在這條邏輯隧道中單播進行的,不再需要傳送 ARP 報文查詢。

總結以上過程:一個 VXLAN 網路的 ping 報文要經歷 ARP 定址 + ICMP 響應 兩個過程,一旦 VTEP 裝置學習到了對方 ARP 地址,後續通訊就可以免去 ARP 定址的過程。

2. VXLAN + Bridge

上述的點對點 VXLAN 網路通訊雙方只有一個 VTEP,且只有一個通訊實體,而在實際生產中,每臺主機上都有幾十臺甚至上百臺虛擬機器或容器需要通訊,因此需要一種機制將這些通訊實體組織起來,再通過隧道口 VTEP 轉發出去。

方案其實也很常見,Linux Bridge 就可以將多塊虛擬網絡卡連線起來,因此可以選擇使用 Bridge 將多個虛擬機器或容器放到同一個 VXLAN 網路中,網路拓撲圖如圖所示:

和上面的模式相比,這裡只是多了一個 Bridge,用來連線不同 network namespace 中的 veth pair,同時 VXLAN 網絡卡也需要連線到該 Bridge

首先在 192.168.57.50 上建立 VXLAN 介面:

$ ip link add vxlan0 type vxlan \
  id 42 \
  dstport 4789 \
  local 192.168.57.50 \
  remote 192.168.57.54

然後建立網橋 bridge0,把 VXLAN 網絡卡 vxlan0 繫結到上面,然後將 bridge0 繫結到 VRF 中,並啟動它們:

$ ip link add br0 type bridge
$ ip link set vxlan0 master br0
$ ip link add vrf0 type vrf table 10
$ ip link set br0 master vrf0
$ ip link set vxlan0 up
$ ip link set br0 up
$ ip link set vrf0 up

下面建立 network namespace 和一對 veth pair,並把 veth pair 的其中一端繫結到網橋,然後把另一端放到 network namespace 並繫結 IP 地址 172.18.1.2

$ ip netns add ns0

$ ip link add veth0 type veth peer name eth0 netns ns0
$ ip link set veth0 master br0
$ ip link set veth0 up

$ ip -n ns0 link set lo up
$ ip -n ns0 addr add 172.18.1.2/24 dev eth0
$ ip -n ns0 link set eth0 up

用同樣的方法在另一臺主機上配置 VXLAN 網路,繫結 172.18.1.3 到另外一個 network namespace 中的 eth0:

$ ip link add vxlan0 type vxlan \
  id 42 \
  dstport 4789 \
  local 192.168.57.54 \
  remote 192.168.57.50
  
$ ip link add br0 type bridge
$ ip link set vxlan0 master br0
$ ip link add vrf0 type vrf table 10
$ ip link set br0 master vrf0
$ ip link set vxlan0 up
$ ip link set br0 up
$ ip link set vrf0 up

$ ip netns add ns0

$ ip link add veth0 type veth peer name eth0 netns ns0
$ ip link set veth0 master br0
$ ip link set veth0 up

$ ip -n ns0 link set lo up
$ ip -n ns0 addr add 172.18.1.3/24 dev eth0
$ ip -n ns0 link set eth0 up

172.18.1.2 ping 172.18.1.3 發現整個通訊過程和前面的實驗類似,只不過容器發出的 ARP 報文會先經過網橋,再轉發給 vxlan0,然後在 vxlan0 處由 Linux 核心新增 VXLAN 頭部,最後傳送給對端。

邏輯上,VXLAN 網路下不同主機上的 network namespace 中的網絡卡都被連線到了同一個網橋上,這樣就可以在同一個主機上建立同一 VXLAN 網路下的多個容器,並相互通訊了。

3. 多播模式的 VXLAN

上面兩種模式只能點對點連線,也就是說同一個 VXLAN 網路中只能有兩個節點,這怎麼能忍。。。有沒有辦法讓同一個 VXLAN 網路中容納多個節點呢?我們先來回顧一下 VXLAN 通訊的兩個關鍵資訊:

  1. 對方虛擬機器(或容器)的 MAC 地址
  2. 對方所在主機的 IP 地址(即對端 VTEP 的 IP 地址)

跨主機的容器之間首次通訊時需要知道對方的 MAC 地址,因此會發送 ARP 報文查詢。如果有多個節點,就要把 ARP 查詢報文傳送到所有節點,但傳統的 ARP 報文廣播是做不到的,因為 Underlay 和 Overlay 不在同一個二層網路,預設情況下 ARP 廣播是逃不出主機的。要想實現 Overlay 網路的廣播,必須要把報文傳送到所有 VTEP 所在的節點,為了解決這個問題,大概有兩種思路:

  1. 使用多播,把網路中的某些節點組成一個虛擬的整體。
  2. 事先知道 MAC 地址和 VTEP IP 資訊,直接把 ARPFDB 資訊告訴傳送方 VTEP。一般是通過外部的分散式控制中心來收集這些資訊,收集到的資訊會分發給同一個 VXLAN 網路的所有節點。

我們先來看看多播是怎麼實現的,分散式控制中心留到下一篇再講。

如果 VXLAN 要使用多播模式,需要底層的網路支援多播功能,多播地址範圍為 224.0.0.0~239.255.255.255

和上面的 點對點 VXLAN + Bridge 模式相比,這裡只是將對端的引數改成 group 引數,其他不變,命令如下:

# 在主機 192.168.57.50 上執行
$ ip link add vxlan0 type vxlan \
  id 42 \
  dstport 4789 \
  local 192.168.57.50 \
  group 224.1.1.1
  
$ ip link add br0 type bridge
$ ip link set vxlan0 master br0
$ ip link add vrf0 type vrf table 10
$ ip link set br0 master vrf0
$ ip link set vxlan0 up
$ ip link set br0 up
$ ip link set vrf0 up

$ ip netns add ns0

$ ip link add veth0 type veth peer name eth0 netns ns0
$ ip link set veth0 master br0
$ ip link set veth0 up

$ ip -n ns0 link set lo up
$ ip -n ns0 addr add 172.18.1.2/24 dev eth0
$ ip -n ns0 link set eth0 up
# 在主機 192.168.57.54 上執行
$ ip link add vxlan0 type vxlan \
  id 42 \
  dstport 4789 \
  local 192.168.57.54 \
  group 224.1.1.1
  
$ ip link add br0 type bridge
$ ip link set vxlan0 master br0
$ ip link add vrf0 type vrf table 10
$ ip link set br0 master vrf0
$ ip link set vxlan0 up
$ ip link set br0 up
$ ip link set vrf0 up

$ ip netns add ns0

$ ip link add veth0 type veth peer name eth0 netns ns0
$ ip link set veth0 master br0
$ ip link set veth0 up

$ ip -n ns0 link set lo up
$ ip -n ns0 addr add 172.18.1.3/24 dev eth0
$ ip -n ns0 link set eth0 up

和上面的實驗明顯有區別的是 FDB 表項的內容:

$ bridge fdb show

00:00:00:00:00:00 dev vxlan0 dst 224.1.1.1 self permanent

dst 欄位的值變成了多播地址 224.1.1.1,而不是之前對方的 VTEP 地址,VTEP 會通過 IGMP(Internet Group Management Protocol) 加入同一個多播組 224.1.1.1

我們來分析下多播模式下 VXLAN 通訊的全過程:

  1. 傳送 ping 報文到 172.18.1.3,檢視路由表,報文會從 vxlan0 發出去。
  2. 核心發現 vxlan0 的 IP 是 172.18.1.2/24,和目的 IP 在同一個網段,所以在同一個區域網,需要知道對方的 MAC 地址,因此會發送 ARP 報文查詢。
  3. ARP 報文源 MAC 地址為 vxlan0 的 MAC 地址,目的 MAC 地址為全 1 的廣播地址(ff:ff:ff:ff:ff:ff)。
  4. VXLAN 根據配置(VNI 42)新增上頭部。
  5. 到這一步就和之前不一樣了,由於不知道對端 VTEP 在哪臺主機,根據多播配置,VTEP 會往多播地址 224.1.1.1 傳送多播報文。
  6. 多播組中的所有主機都會收到這個報文,核心發現是 VXLAN 報文,就會根據 VNI 傳送給相應的 VTEP
  7. 收到報文的所有主機的 VTEP 會去掉 VXLAN 的頭部,取出真正的 ARP 請求報文。同時,VTEP 會記錄源 MAC 地址和 IP 地址資訊到 FDB 表中,這便是一次學習過程。如果發現 ARP 不是傳送給自己的,就直接丟棄;如果是傳送給自己的,則生成 ARP 應答報文。
  8. 後面的步驟就和上面的實驗相同了。

整個通訊過程和之前比較類似,只是 Underlay 採用組播的方式傳送報文,對於多節點的 VXLAN 網路來說比較簡單高效。但多播也是有它的問題的,並不是所有網路裝置都支援多播(比如公有云),再加上多播方式帶來的報文浪費,在實際生成中很少被採用。下篇文章就著重介紹如何通過分散式控制中心來自動發現 VTEPMAC 地址等資訊。

4. 參考資料

  • linux 上實現 vxlan 網路

微信公眾號

掃一掃下面的二維碼關注微信公眾號,在公眾號中回覆◉加群◉即可加入我們的雲原生交流群,和孫巨集亮、張館長、陽明等大佬一起探討雲原生技術

相關推薦

VXLAN 基礎教程Linux 配置 VXLAN 網路

上篇文章結尾提到 Linux 是支援 VXLAN 的,我們可以使用 Linux 搭建基於 VXLAN 的 overlay 網路,以此來加深對 VXLAN 的理解,畢竟光說不練假把式。 1. 點對點的 VXLAN 先來看看最簡單的點對點 VXLAN 網路,點對點 VXLAN 即兩臺主機構建的 VXLAN 網路,

VXLAN 基礎教程VXLAN 協議原理介紹

VXLAN(Virtual eXtensible Local Area Network,虛擬可擴充套件區域網),是一種虛擬化隧道通訊技術。它是一種 Overlay(覆蓋網路)技術,通過三層的網路來搭建虛擬的二層網路。 簡單來講,VXLAN 是在底層物理網路(underlay)之上使用隧道技術,藉助 UDP 層

一. Mysql讀寫分離 Linux配置,通過binlog進行主從同步

mysql主從複製,讀寫分離配置   1.主資料庫:       a.在主資料庫裡建立一個同步賬號      #每個從資料庫會使用一個MySQL賬號來連線主資料庫,所以我們要在主資料庫裡建立一個賬號,並且該賬號要授予

Linux配置無線網路

wpa_cli status 導讀 iwconfig是Linux Wireless Extensions(LWE)的使用者層配置工具之一。LWE是Linux下對無線網路配置的工具,包括核心的支援、使用者層配置工具和驅動介面的支援三部分。目前很多無線網絡卡都支援LWE,

基礎教程5、圖解Linux下JDK安裝與環境變數配置

5.1 下載JDK8 (1)百度搜索“jdk8”第一條結果就是JDK下載地址 (2)接受協議,單擊下載 (3)JDK的上傳到Linux伺服器 首先,通過XShell連線遠端伺服器; 然後,單擊工具欄中的xftp圖示,如下圖所示; 最後,將已經下載的Linux版的JDK8軟體包檔案

Linux 基礎教程 26-基礎網絡配置

如果 普通用戶 任務 名稱 需要 str vim編輯器 兩種 ade 基本配置 ? ? 要想上網,計算機需要有專門的網絡連接設備,即網絡接口卡或者網卡。網卡按照與計算機主機的連接方式可以分為PCI網卡、ISA網卡及無線網卡(USB網卡)等。在Linux中可以使用命令lspc

基礎教程8、圖解Windows平臺下Intellij IDEA安裝與配置

8.1 下載與安裝 (1)開啟官方下載地址 http://www.jetbrains.com/idea/download • 旗艦版(Ultimate) • 社群版(Community) 其中,旗艦版是收費的,社群版則是免費的。兩者的區別就是旗艦版比社群版的功能更為齊全! (2)單

基礎教程6、圖解快速搭建Linux叢集

6 、圖解快速搭建Linux叢集 6.1 叢集概念 根據百度的解釋: 叢集是一組相互獨立的、通過高速網路互聯的計算機,它們構成了一個組,並以單一系統的模式加以管理。一個客戶與叢集相互作用時,叢集像是一個獨立的伺服器。叢集配置是用於提高可用性和可縮放性。 伺服器叢集是一種提升伺

基礎教程2、Linux伺服器安裝圖解

2.1 Linux發行版選擇 Linux是一類開放原始碼和自由的類似Unix的作業系統,有眾多發行版本。在伺服器市場,Linux作業系統佔有絕對的優勢。Linux作業系統大致可以分為Redhat系列和Debian系列。 Redhat系列中典型代表是RHEL(Redhat

Flask 教程 第十七章Linux的部署

這是Flask Mega-Tutorial系列的第十七部分,我將把Microblog部署到Linux伺服器。 在本章中,我將談到Microblog應用生命週期中的一個里程碑,因為我將討論如何將應用部署到生產伺服器上,以便真實使用者可以訪問它。 部署的主題

Spring Cloud Alibaba基礎教程Nacos配置的加載規則詳解

方案 用戶 per 回顧 應用名 增加 我們 pla 基礎 前情回顧: 《Spring Cloud Alibaba基礎教程:使用Nacos實現服務註冊與發現》 《Spring Cloud Alibaba基礎教程:支持的幾種服務消費方式(RestTemplate、WebCl

Spring Cloud Alibaba基礎教程Nacos配置的多文件加載與共享配置

space info master 分享 fresh 覆蓋 aid hle 過程 前情回顧: 《Spring Cloud Alibaba基礎教程:使用Nacos實現服務註冊與發現》 《Spring Cloud Alibaba基礎教程:支持的幾種服務消費方式》 《Sprin

Linux入門基礎 #12Linux網路基礎配置

--------------------------------------------------------------------------------- 乙太網連線 在Linux中,乙太網介面被命名為:eth0,eth1等,0,1代表網絡卡編號

SpringCloud Finchley基礎教程2,註冊中心eureka和配置中心config

1. 註冊中心eureka 1.1 eureka server 1,引入pom依賴 <dependency> <groupId>org.springframework.cloud</groupId>

Spring Cloud Alibaba基礎教程Nacos服務發現與配置管理

隨著微服務概念的流行,越來越多的公司採用Spring Cloud全家桶構建微服務系統,實現業務的快速迭代。Spring Cloud提供了快速構建分散式微服務常用元件,包括Spring Cloud Eureka、Spring Cloud Ribbon、Spring Cloud Hystrix、Spring Cl

Spring Boot 2.x基礎教程預設資料來源Hikari的配置詳解

通過上一節的學習,我們已經學會如何應用Spring中的JdbcTemplate來完成對MySQL的資料庫讀寫操作。接下來通過本篇文章,重點說說在訪問資料庫過程中的一個重要概念:資料來源(Data Source),以及Spring Boot中對資料來源的建立與配置。 基本概念 在開始說明Spring Boot中

Spring Boot 2.x基礎教程Spring Data JPA的多資料來源配置

[上一篇](http://blog.didispace.com/spring-boot-learning-21-3-7/)我們介紹了在使用JdbcTemplate來做資料訪問時候的多資料來源配置實現。接下來我們繼續學習如何在使用Spring Data JPA的時候,完成多資料來源的配置和使用。 ## 新增多

Spring Boot 2.x基礎教程實現檔案

檔案上傳的功能實現是我們做Web應用時候最為常見的應用場景,比如:實現頭像的上傳,Excel檔案資料的匯入等功能,都需要我們先實現檔案的上傳,然後再做圖片的裁剪,excel資料的解析入庫等後續操作。 今天通過這篇文章,我們就來一起學習一下如何在Spring Boot中實現檔案的上傳。 ## 動手試試 *

Spring Boot 2.x基礎教程配置元資料的應用

在使用Spring Boot開發應用的時候,你是否有發現這樣的情況:自定義屬性是有高量背景的,滑鼠放上去,有一個`Cannot resolve configuration property`的配置警告。 ![](https://img2020.cnblogs.com/other/626506/202101/

Linux配置DRBD部署

start build 分區 出現 ack sector ice sbin bytes drbd 工作原理DRBD是一種塊設備,能夠被用於高可用(HA)之中.它相似於一個網絡RAID-1功能.當你將數據寫入本地 文件系統時,數據還將會被發送到網絡中還有一臺主機上.以同樣的