這篇文章主要為大家展示了“如何在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)建站。
先來看看最簡單的點對點 VXLAN
網(wǎng)絡(luò),點對點 VXLAN
即兩臺主機構(gòu)建的 VXLAN
網(wǎng)絡(luò),每臺主機上有一個 VTEP
,VTEP
之間通過它們的 IP 地址進(jìn)行通信。點對點 VXLAN 網(wǎng)絡(luò)拓?fù)鋱D如圖所示:
為了不影響主機的網(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 示例教程。
可以看到 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 通信的過程:
發(fā)送 ping 報文到 172.18.1.3
,查看路由表,報文會從 vxlan0
發(fā)出去。
內(nèi)核發(fā)現(xiàn) vxlan0
的 IP 是 172.18.1.2/24
,和目的 IP 在同一個網(wǎng)段,所以在同一個局域網(wǎng),需要知道對方的 MAC 地址,因此會發(fā)送 ARP
報文查詢。
ARP
報文源 MAC 地址為 vxlan0
的 MAC 地址,目的 MAC 地址為全 1 的廣播地址(ff:ff:ff:ff:ff:ff)。
VXLAN
根據(jù)配置(VNI 42)添加上頭部。
對端的 VTEP
地址為 192.168.57.54,將報文發(fā)送到該地址。
對端主機接收到這個報文,內(nèi)核發(fā)現(xiàn)是 VXLAN 報文,會根據(jù) VNI
發(fā)送給對應(yīng)的 VTEP
。
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
應(yīng)答報文目的 MAC 地址是發(fā)送方 VTEP
的 MAC 地址,目的 IP 是發(fā)送方 VTEP
的 IP 地址,直接發(fā)送給目的 VTEP。
應(yīng)答報文通過 underlay 網(wǎng)絡(luò)直接返回給發(fā)送方主機,發(fā)送方主機根據(jù) VNI
把報文轉(zhuǎn)發(fā)給 VTEP,VTEP 解包取出 ARP 應(yīng)答報文,添加 ARP
緩存到內(nèi)核,并根據(jù)報文學(xué)習(xí)到目的 VTEP
的 IP
地址和目的 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
至此 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
尋址的過程。
上述的點對點 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如圖所示:
和上面的模式相比,這里只是多了一個 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ò)下的多個容器,并相互通信了。
上面兩種模式只能點對點連接,也就是說同一個 VXLAN 網(wǎng)絡(luò)中只能有兩個節(jié)點,這怎么能忍。。。有沒有辦法讓同一個 VXLAN 網(wǎng)絡(luò)中容納多個節(jié)點呢?我們先來回顧一下 VXLAN 通信的兩個關(guān)鍵信息:
對方虛擬機(或容器)的 MAC
地址
對方所在主機的 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é)點,為了解決這個問題,大概有兩種思路:
使用多播,把網(wǎng)絡(luò)中的某些節(jié)點組成一個虛擬的整體。
事先知道 MAC
地址和 VTEP IP
信息,直接把 ARP
和 FDB
信息告訴發(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
通信的全過程:
發(fā)送 ping 報文到 172.18.1.3
,查看路由表,報文會從 vxlan0
發(fā)出去。
內(nèi)核發(fā)現(xiàn) vxlan0
的 IP 是 172.18.1.2/24
,和目的 IP 在同一個網(wǎng)段,所以在同一個局域網(wǎng),需要知道對方的 MAC 地址,因此會發(fā)送 ARP
報文查詢。
ARP
報文源 MAC 地址為 vxlan0
的 MAC 地址,目的 MAC 地址為全 1 的廣播地址(ff:ff:ff:ff:ff:ff)。
VXLAN
根據(jù)配置(VNI 42)添加上頭部。
到這一步就和之前不一樣了,由于不知道對端 VTEP
在哪臺主機,根據(jù)多播配置,VTEP
會往多播地址 224.1.1.1
發(fā)送多播報文。
多播組中的所有主機都會收到這個報文,內(nèi)核發(fā)現(xiàn)是 VXLAN
報文,就會根據(jù) VNI
發(fā)送給相應(yīng)的 VTEP
。
收到報文的所有主機的 VTEP
會去掉 VXLAN
的頭部,取出真正的 ARP
請求報文。同時,VTEP
會記錄源 MAC
地址和 IP 地址信息到 FDB
表中,這便是一次學(xué)習(xí)過程。如果發(fā)現(xiàn) ARP
不是發(fā)送給自己的,就直接丟棄;如果是發(fā)送給自己的,則生成 ARP
應(yīng)答報文。
后面的步驟就和上面的實驗相同了。
整個通信過程和之前比較類似,只是 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è)資訊頻道!