真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

如何在Linux上配置VXLAN網(wǎng)絡(luò)

這篇文章主要為大家展示了“如何在Linux上配置VXLAN網(wǎng)絡(luò)”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“如何在Linux上配置VXLAN網(wǎng)絡(luò)”這篇文章吧。

奉新網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)建站!從網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、成都響應(yīng)式網(wǎng)站建設(shè)公司等網(wǎng)站項目制作,到程序開發(fā),運營維護。創(chuàng)新互聯(lián)建站2013年至今到現(xiàn)在10年的時間,我們擁有了豐富的建站經(jīng)驗和運維經(jīng)驗,來保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)建站。

1. 點對點的 VXLAN

先來看看最簡單的點對點 VXLAN 網(wǎng)絡(luò),點對點 VXLAN 即兩臺主機構(gòu)建的 VXLAN 網(wǎng)絡(luò),每臺主機上有一個 VTEP,VTEP 之間通過它們的 IP 地址進(jìn)行通信。點對點 VXLAN 網(wǎng)絡(luò)拓?fù)鋱D如圖所示:

如何在Linux上配置VXLAN網(wǎng)絡(luò)

為了不影響主機的網(wǎng)絡(luò)環(huán)境,我們可以使用 Linux VRF 來隔離 root network namespace 的路由。VRF(Virtual Routing and Forwarding)是由路由表和一組網(wǎng)絡(luò)設(shè)備組成的路由實例,你可以理解為輕量級的 network namespace,只虛擬了三層的網(wǎng)絡(luò)協(xié)議棧,而 network namespace 虛擬了整個網(wǎng)絡(luò)協(xié)議棧。詳情參看 Linux VRF(Virtual Routing Forwarding)的原理和實現(xiàn)。

Linux Kernel 版本大于 4.3 才支持 VRF,建議做本文實驗的同學(xué)先升級內(nèi)核。

當(dāng)然了,如果你有專門用來做實驗的干凈主機,可以不用 VRF 來隔離。

下面結(jié)合 VRF 來創(chuàng)建一個點對點 VXLAN 網(wǎng)絡(luò)。

首先在 192.168.57.50 上創(chuàng)建 VXLAN 接口:

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

重要參數(shù)解釋:

  • id 42: 指定 VNI 的值,有效值在 1 到 $2^{24}$ 之間。

  • dstport: VTEP 通信的端口,IANA 分配的端口是 4789。如果不指定,Linux 默認(rèn)使用 8472。

  • remote: 對端 VTEP 的地址。

  • local: 當(dāng)前節(jié)點 VTEP 要使用的 IP 地址,即當(dāng)前節(jié)點隧道口的 IP 地址。

  • dev eth0: 當(dāng)前節(jié)點用于 VTEP 通信的設(shè)備,用來獲取 VTEP IP 地址。這個參數(shù)與 local 參數(shù)目的相同,二選一即可

查看 vxlan0 的詳細(xì)信息:

$ ip -d link show vxlan0

11: vxlan0:  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

接下來創(chuàng)建一個 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:  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

你會發(fā)現(xiàn)多了 VRF 的信息。

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

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

執(zhí)行成功后會發(fā)現(xiàn) VRF 路由表項多了下面的內(nèi)容,所有目的地址是 172.18.1.0/24 網(wǎng)絡(luò)包要通過 vxlan0 轉(zhuǎn)發(fā):

$ ip route show vrf vrf0

172.18.1.0/24 dev vxlan0 proto kernel scope link src 172.18.1.2

同時也會增加一條 FDB 轉(zhuǎn)發(fā)表:

$ bridge fdb show

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

這個表項的意思是,默認(rèn)的 VTEP 對端地址為 192.168.57.54。換句話說,原始報文經(jīng)過 vxlan0 后會被內(nèi)核添加上 VXLAN 頭部,而外部 UDP 頭的目的 IP 地址會被冠上 192.168.57.54。

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

$ 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 遠(yuǎn)程抓包:

$ ssh root@192.168.57.54 'tcpdump -i any -s0 -c 10 -nn -w - port 4789' | /Applications/Wireshark.app/Contents/MacOS/Wireshark -k -i -

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

如何在Linux上配置VXLAN網(wǎng)絡(luò)

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

  • 最內(nèi)層是 overlay 網(wǎng)絡(luò)中實際通信的實體看到的報文(比如這里的 ARP 請求),它們和經(jīng)典網(wǎng)絡(luò)的通信報文沒有任何區(qū)別,除了因為 MTU 導(dǎo)致有些報文比較小。

  • 中間一層是 VXLAN 頭部,我們最關(guān)心的字段 VNI 確實是 42。

  • 最外層是 VTEP 所在主機的通信報文頭部,目的 IP 地址為對端 192.168.57.54。

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

  1. 發(fā)送 ping 報文到 172.18.1.3,查看路由表,報文會從 vxlan0 發(fā)出去。

  2. 內(nèi)核發(fā)現(xiàn) vxlan0 的 IP 是 172.18.1.2/24,和目的 IP 在同一個網(wǎng)段,所以在同一個局域網(wǎng),需要知道對方的 MAC 地址,因此會發(fā)送 ARP 報文查詢。

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

  4. VXLAN 根據(jù)配置(VNI 42)添加上頭部。

  5. 對端的 VTEP 地址為 192.168.57.54,將報文發(fā)送到該地址。

  6. 對端主機接收到這個報文,內(nèi)核發(fā)現(xiàn)是 VXLAN 報文,會根據(jù) VNI 發(fā)送給對應(yīng)的 VTEP。

  7. VTEP 去掉 VXLAN 頭部,取出真正的 ARP 請求報文,同時,VTEP 會記錄源 MAC 地址和 IP 地址信息到 FDB 表中,這便是一次學(xué)習(xí)過程。然后生成 ARP 應(yīng)答報文。

$ 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. 應(yīng)答報文目的 MAC 地址是發(fā)送方 VTEP 的 MAC 地址,目的 IP 是發(fā)送方 VTEP 的 IP 地址,直接發(fā)送給目的 VTEP。

  2. 應(yīng)答報文通過 underlay 網(wǎng)絡(luò)直接返回給發(fā)送方主機,發(fā)送方主機根據(jù) VNI 把報文轉(zhuǎn)發(fā)給 VTEP,VTEP 解包取出 ARP 應(yīng)答報文,添加 ARP 緩存到內(nèi)核,并根據(jù)報文學(xué)習(xí)到目的 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 已經(jīng)知道了通信需要的所有信息,后續(xù) ICMP 的 ping 報文都是在這條邏輯隧道中單播進(jìn)行的,不再需要發(fā)送 ARP 報文查詢。

總結(jié)以上過程:一個 VXLAN 網(wǎng)絡(luò)的 ping 報文要經(jīng)歷 ARP 尋址 + ICMP 響應(yīng)兩個過程,一旦 VTEP 設(shè)備學(xué)習(xí)到了對方 ARP 地址,后續(xù)通信就可以免去 ARP 尋址的過程。

2. VXLAN + Bridge

上述的點對點 VXLAN 網(wǎng)絡(luò)通信雙方只有一個 VTEP,且只有一個通信實體,而在實際生產(chǎn)中,每臺主機上都有幾十臺甚至上百臺虛擬機或容器需要通信,因此需要一種機制將這些通信實體組織起來,再通過隧道口 VTEP 轉(zhuǎn)發(fā)出去。

方案其實也很常見,Linux Bridge 就可以將多塊虛擬網(wǎng)卡連接起來,因此可以選擇使用 Bridge 將多個虛擬機或容器放到同一個 VXLAN 網(wǎng)絡(luò)中,網(wǎng)絡(luò)拓?fù)鋱D如圖所示:

如何在Linux上配置VXLAN網(wǎng)絡(luò)

和上面的模式相比,這里只是多了一個 Bridge,用來連接不同 network namespace 中的 veth pair,同時 VXLAN 網(wǎng)卡也需要連接到該 Bridge。

首先在 192.168.57.50 上創(chuàng)建 VXLAN 接口:

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

然后創(chuàng)建網(wǎng)橋 bridge0,把 VXLAN 網(wǎng)卡 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

下面創(chuàng)建 network namespace 和一對 veth pair,并把 veth pair 的其中一端綁定到網(wǎng)橋,然后把另一端放到 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 網(wǎng)絡(luò),綁定 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 發(fā)現(xiàn)整個通信過程和前面的實驗類似,只不過容器發(fā)出的 ARP 報文會先經(jīng)過網(wǎng)橋,再轉(zhuǎn)發(fā)給 vxlan0,然后在 vxlan0 處由 Linux 內(nèi)核添加 VXLAN 頭部,最后發(fā)送給對端。

邏輯上,VXLAN 網(wǎng)絡(luò)下不同主機上的 network namespace 中的網(wǎng)卡都被連接到了同一個網(wǎng)橋上,這樣就可以在同一個主機上創(chuàng)建同一 VXLAN 網(wǎng)絡(luò)下的多個容器,并相互通信了。

3. 多播模式的 VXLAN

上面兩種模式只能點對點連接,也就是說同一個 VXLAN 網(wǎng)絡(luò)中只能有兩個節(jié)點,這怎么能忍。。。有沒有辦法讓同一個 VXLAN 網(wǎng)絡(luò)中容納多個節(jié)點呢?我們先來回顧一下 VXLAN 通信的兩個關(guān)鍵信息:

  1. 對方虛擬機(或容器)的 MAC 地址

  2. 對方所在主機的 IP 地址(即對端 VTEP 的 IP 地址)

跨主機的容器之間首次通信時需要知道對方的 MAC 地址,因此會發(fā)送 ARP 報文查詢。如果有多個節(jié)點,就要把 ARP 查詢報文發(fā)送到所有節(jié)點,但傳統(tǒng)的 ARP 報文廣播是做不到的,因為 Underlay 和 Overlay 不在同一個二層網(wǎng)絡(luò),默認(rèn)情況下 ARP 廣播是逃不出主機的。要想實現(xiàn) Overlay 網(wǎng)絡(luò)的廣播,必須要把報文發(fā)送到所有 VTEP 所在的節(jié)點,為了解決這個問題,大概有兩種思路:

  1. 使用多播,把網(wǎng)絡(luò)中的某些節(jié)點組成一個虛擬的整體。

  2. 事先知道 MAC 地址和 VTEP IP 信息,直接把 ARPFDB 信息告訴發(fā)送方 VTEP。一般是通過外部的分布式控制中心來收集這些信息,收集到的信息會分發(fā)給同一個 VXLAN 網(wǎng)絡(luò)的所有節(jié)點。

我們先來看看多播是怎么實現(xiàn)的,分布式控制中心留到下一篇再講。

如果 VXLAN 要使用多播模式,需要底層的網(wǎng)絡(luò)支持多播功能,多播地址范圍為 224.0.0.0~239.255.255.255。

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

# 在主機 192.168.57.50 上執(zhí)行
$ 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 上執(zhí)行
$ 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

和上面的實驗明顯有區(qū)別的是 FDB 表項的內(nèi)容:

$ 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. 發(fā)送 ping 報文到 172.18.1.3,查看路由表,報文會從 vxlan0 發(fā)出去。

  2. 內(nèi)核發(fā)現(xiàn) vxlan0 的 IP 是 172.18.1.2/24,和目的 IP 在同一個網(wǎng)段,所以在同一個局域網(wǎng),需要知道對方的 MAC 地址,因此會發(fā)送 ARP 報文查詢。

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

  4. VXLAN 根據(jù)配置(VNI 42)添加上頭部。

  5. 到這一步就和之前不一樣了,由于不知道對端 VTEP 在哪臺主機,根據(jù)多播配置,VTEP 會往多播地址 224.1.1.1 發(fā)送多播報文。

  6. 多播組中的所有主機都會收到這個報文,內(nèi)核發(fā)現(xiàn)是 VXLAN 報文,就會根據(jù) VNI 發(fā)送給相應(yīng)的 VTEP。

  7. 收到報文的所有主機的 VTEP 會去掉 VXLAN 的頭部,取出真正的 ARP 請求報文。同時,VTEP 會記錄源 MAC 地址和 IP 地址信息到 FDB 表中,這便是一次學(xué)習(xí)過程。如果發(fā)現(xiàn) ARP 不是發(fā)送給自己的,就直接丟棄;如果是發(fā)送給自己的,則生成 ARP 應(yīng)答報文。

  8. 后面的步驟就和上面的實驗相同了。

整個通信過程和之前比較類似,只是 Underlay 采用組播的方式發(fā)送報文,對于多節(jié)點的 VXLAN 網(wǎng)絡(luò)來說比較簡單高效。但多播也是有它的問題的,并不是所有網(wǎng)絡(luò)設(shè)備都支持多播(比如公有云),再加上多播方式帶來的報文浪費,在實際生成中很少被采用。

以上是“如何在Linux上配置VXLAN網(wǎng)絡(luò)”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!


本文標(biāo)題:如何在Linux上配置VXLAN網(wǎng)絡(luò)
URL地址:http://weahome.cn/article/gogdpd.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部