Linux 虛擬網(wǎng)卡技術(shù):Macvlan
1. Macvlan 簡(jiǎn)介
在 Macvlan 出現(xiàn)之前,我們只能為一塊以太網(wǎng)卡添加多個(gè) IP 地址,卻不能添加多個(gè) MAC 地址,因?yàn)?MAC 地址正是通過(guò)其全球唯一性來(lái)標(biāo)識(shí)一塊以太網(wǎng)卡的,即便你使用了創(chuàng)建 ethx:y 這樣的方式,你會(huì)發(fā)現(xiàn)所有這些“網(wǎng)卡”的 MAC 地址和 ethx 都是一樣的,本質(zhì)上,它們還是一塊網(wǎng)卡,這將限制你做很多二層的操作。有了 Macvlan 技術(shù),你可以這么做了。
Macvlan 允許你在主機(jī)的一個(gè)網(wǎng)絡(luò)接口上配置多個(gè)虛擬的網(wǎng)絡(luò)接口,這些網(wǎng)絡(luò) interface 有自己獨(dú)立的 MAC 地址,也可以配置上 IP 地址進(jìn)行通信。Macvlan 下的虛擬機(jī)或者容器網(wǎng)絡(luò)和主機(jī)在同一個(gè)網(wǎng)段中,共享同一個(gè)廣播域。Macvlan 和 Bridge 比較相似,但因?yàn)樗∪チ? Bridge 的存在,所以配置和調(diào)試起來(lái)比較簡(jiǎn)單,而且效率也相對(duì)高。除此之外,Macvlan 自身也能很好的支持 VLAN。
同一 VLAN 間數(shù)據(jù)傳輸是通過(guò)二層互訪,即 MAC 地址實(shí)現(xiàn)的,不需要使用路由。不同 VLAN 的用戶單播默認(rèn)不能直接通信,如果想要通信,還需要三層設(shè)備做路由,Macvlan 也是如此。用 Macvlan 技術(shù)虛擬出來(lái)的虛擬網(wǎng)卡,在邏輯上和物理網(wǎng)卡是對(duì)等的。物理網(wǎng)卡也就相當(dāng)于一個(gè)交換機(jī),記錄著對(duì)應(yīng)的虛擬網(wǎng)卡和 MAC 地址,當(dāng)物理網(wǎng)卡收到數(shù)據(jù)包后,會(huì)根據(jù)目的 MAC 地址判斷這個(gè)包屬于哪一個(gè)虛擬網(wǎng)卡。這也就意味著,只要是從 Macvlan 子接口發(fā)來(lái)的數(shù)據(jù)包(或者是發(fā)往 Macvlan 子接口的數(shù)據(jù)包),物理網(wǎng)卡只接收數(shù)據(jù)包,不處理數(shù)據(jù)包,所以這就引出了一個(gè)問(wèn)題:本機(jī) Macvlan 網(wǎng)卡上面的 IP 無(wú)法和物理網(wǎng)卡上面的 IP 通信!關(guān)于這個(gè)問(wèn)題的解決方案我們下一節(jié)再討論。
我們先來(lái)看一下 Macvlan 技術(shù)的流程示意圖:
簡(jiǎn)單來(lái)說(shuō),Macvlan 虛擬網(wǎng)卡設(shè)備是寄生在物理網(wǎng)卡設(shè)備上的。發(fā)包時(shí)調(diào)用自己的發(fā)包函數(shù),查找到寄生的物理設(shè)備,然后通過(guò)物理設(shè)備發(fā)包。收包時(shí),通過(guò)注冊(cè)寄生的物理設(shè)備的 rx_handler 回調(diào)函數(shù),處理數(shù)據(jù)包。
2. Macvlan vs Bridge
說(shuō)到 Macvlan,就不得不提 Bridge,因?yàn)槟憧梢园?Macvlan 看成一個(gè)簡(jiǎn)單的 Bridge。但他們之間還是有很大的區(qū)別的。
Bridge
Bridge 實(shí)際上就是一種舊式交換機(jī),他們之間并沒(méi)有很大的差別。Bridge 與交換機(jī)的區(qū)別在與市場(chǎng),而不在與技術(shù)。交換機(jī)對(duì)網(wǎng)絡(luò)進(jìn)行分段的方式與 Bridge 相同,交換機(jī)就是一個(gè)多端口的網(wǎng)橋。確切地說(shuō),高端口密度的 Bridge 就稱為局域網(wǎng)交換機(jī)。
Bridge 有以下特點(diǎn):
- Bridge 是二層設(shè)備,僅用來(lái)處理二層的通訊。
- Bridge 使用 MAC 地址表來(lái)決定怎么轉(zhuǎn)發(fā)幀(Frame)。
- Bridge 會(huì)從 host 之間的通訊數(shù)據(jù)包中學(xué)習(xí) MAC 地址。
- 可以是硬件設(shè)備,也可以是純軟件實(shí)現(xiàn)(例如:Linux Bridge)。
以下是一個(gè)在 Linux 主機(jī)上,多個(gè) VM 使用 bridge 相互通訊的狀況:
Linux 主機(jī)中可以通過(guò)命令行工具 brctl 來(lái)查看 Bridge 的配置,該工具可以通過(guò)安裝軟件包 bridge-utils 來(lái)獲得。
- $ brctl show
- bridge name bridge id STP enabled interfaces
- br0 8000.080006ad34d1 no eth0
- veth0
- br1 8000.080021d2a187 no veth1
- veth2
Bridge 有可能會(huì)遇到二層環(huán)路,如有需要,你可以開啟 STP 來(lái)防止出現(xiàn)環(huán)路。
Macvlan
Macvlan 有以下特點(diǎn):
- 可讓使用者在同一張實(shí)體網(wǎng)卡上設(shè)定多個(gè) MAC 地址。
- 承上,帶有上述設(shè)定的 MAC 地址的網(wǎng)卡稱為子接口(sub interface);而實(shí)體網(wǎng)卡則稱為父接口(parent interface)。
- parent interface 可以是一個(gè)物理接口(eth0),可以是一個(gè) 802.1q 的子接口(eth0.10),也可以是 bonding 接口。
- 可在 parent/sub interface 上設(shè)定的不只是 MAC 地址,IP 地址同樣也可以被設(shè)定。
- sub interface 無(wú)法直接與 parent interface 通訊 (帶有 sub interface 的 VM 或容器無(wú)法與 host 直接通訊)。
- 承上,若 VM 或容器需要與 host 通訊,那就必須額外建立一個(gè) sub interface 給 host 用。
- sub interface 通常以 mac0@eth0 的形式來(lái)命名以方便區(qū)別。
用張圖來(lái)解釋一下設(shè)定 Macvlan 后的樣子:
3. Macvlan 的工作模式
Macvlan 共支持四種模式,分別是:
VEPA(Virtual Ethernet Port Aggregator)
在 VEPA 模式下,所有從 Macvlan 接口發(fā)出的流量,不管目的地全部都發(fā)送給父接口,即使流量的目的地是共享同一個(gè)父接口的其它 Macvlan 接口。在二層網(wǎng)絡(luò)場(chǎng)景下,由于生成樹協(xié)議的原因,兩個(gè) Macvlan 接口之間的通訊會(huì)被阻塞,這時(shí)需要上層路由器上為其添加路由(需要外部交換機(jī)配置 Hairpin 支持,即需要兼容 802.1Qbg 的交換機(jī)支持,其可以把源和目的地址都是本地 Macvlan 接口地址的流量發(fā)回給相應(yīng)的接口)。此模式下從父接口收到的廣播包,會(huì)泛洪給 VEPA 模式的所有子接口。
現(xiàn)在大多數(shù)交換機(jī)都不支持 Hairpin 模式,但 Linux 主機(jī)中可以通過(guò)一種 Harpin 模式的 Bridge 來(lái)讓 VEPA 模式下的不同 Macvlan 接口通信(前文已經(jīng)提到,Bridge 其實(shí)就是一種舊式交換機(jī))。怎么配置呢?非常簡(jiǎn)單,通過(guò)一條命令就可以解決:
- $ brctl hairpin br0 eth1 on
或者使用 iproute2 來(lái)設(shè)置:
- $ bridge link set dev eth0 hairpin on
如果你的內(nèi)核是你手工編譯升級(jí)的,那么可能你的用戶態(tài)程序并不支持新內(nèi)核對(duì)應(yīng)的所有特性,也就是說(shuō)你的 brctl 可能版本過(guò)老不支持 hairpin 命令,那么可以 sysfs 來(lái)搞定:
- $ echo 1 >/sys/class/net/br0/brif/eth1/hairpin_mode
在 Linux 主機(jī)上配置了 Harpin 模式之后,源和目的地址都是本地 Macvlan 接口地址的流量,都會(huì)被 br0(假設(shè)你創(chuàng)建的 Bridge 是 br0)發(fā)回給相應(yīng)的接口。
如果想在物理交換機(jī)層面對(duì)虛擬機(jī)或容器之間的訪問(wèn)流量進(jìn)行優(yōu)化設(shè)定,VEPA 模式將是一種比較好的選擇。
VEPA 和 Passthru 模式下,兩個(gè) Macvlan 接口之間的通信會(huì)經(jīng)過(guò)主接口兩次:第一次是發(fā)出的時(shí)候,第二次是返回的時(shí)候。這樣會(huì)影響物理接口的寬帶,也限制了不同 Macvlan 接口之間通信的速度。如果多個(gè) Macvlan 接口之間通信比較頻繁,對(duì)于性能的影響會(huì)比較明顯。
Bridge
此種模式類似 Linux 的 Bridge,擁有相同父接口的兩塊 Macvlan 虛擬網(wǎng)卡是可以直接通訊的,不需要把流量通過(guò)父網(wǎng)卡發(fā)送到外部網(wǎng)絡(luò),廣播幀將會(huì)被泛洪到連接在"網(wǎng)橋"上的所有其他子接口和物理接口。這比較適用于讓共享同一個(gè)父接口的 Macvlan 網(wǎng)卡進(jìn)行直接通訊的場(chǎng)景。
這里所謂的 Bridge 指的是在這些網(wǎng)卡之間,數(shù)據(jù)流可以實(shí)現(xiàn)直接轉(zhuǎn)發(fā),不需要外部的協(xié)助,這有點(diǎn)類似于 Linux host 內(nèi)建了一個(gè) Bridge,即用 brctl 命令所做的那一切。但和 Linux bridge 絕不是一回事,它不需要學(xué)習(xí) MAC 地址,也不需要 STP,因此效能比起使用 Linux bridge 好上很多。
Bridge 模式有個(gè)缺點(diǎn):如果父接口 down 掉,所有的 Macvlan 子接口也會(huì)全部 down 掉,同時(shí)子接口之間也將無(wú)法進(jìn)行通訊。
Private
此種模式相當(dāng)于 VEPA 模式的增強(qiáng)模式,其完全阻止共享同一父接口的 Macvlan 虛擬網(wǎng)卡之間的通訊,即使配置了 Hairpin 讓從父接口發(fā)出的流量返回到宿主機(jī),相應(yīng)的通訊流量依然被丟棄。具體實(shí)現(xiàn)方式是丟棄廣播/多播數(shù)據(jù),這就意味著以太網(wǎng)地址解析 arp 將不可運(yùn)行,除非手工探測(cè) MAC 地址,否則通信將無(wú)法在同一宿主機(jī)下的多個(gè) Macvlan 網(wǎng)卡間展開。之所以隔離廣播流量,是因?yàn)橐蕴W(wǎng)是基于廣播的,隔離了廣播,以太網(wǎng)將失去了依托。
Passthru
此種模式會(huì)直接把父接口和相應(yīng)的MacVLAN接口捆綁在一起,這種模式每個(gè)父接口只能和一個(gè) Macvlan 虛擬網(wǎng)卡接口進(jìn)行捆綁,并且 Macvlan 虛擬網(wǎng)卡接口繼承父接口的 MAC 地址。
此種模式的優(yōu)點(diǎn)是虛擬機(jī)和容器可以更改 MAC 地址和其它一些接口參。
4. Macvlan 和 Bridge 的使用場(chǎng)景
最后我們?cè)賮?lái)討論一下 Macvlan 和 Bridge 的各自使用場(chǎng)景。
使用 Macvlan:
- 僅僅需要為虛擬機(jī)或容器提供訪問(wèn)外部物理網(wǎng)絡(luò)的連接。
- Macvlan 占用較少的 CPU,同時(shí)提供較高的吞吐量。
- 當(dāng)使用 Macvlan 時(shí),宿主機(jī)無(wú)法和 VM 或容器直接進(jìn)行通訊。
使用 Bridge:
- 當(dāng)在同一臺(tái)宿主機(jī)上需要連接多個(gè)虛擬機(jī)或容器時(shí)。
- 對(duì)于擁有多個(gè)網(wǎng)橋的混合環(huán)境。
- 需要應(yīng)用高級(jí)流量控制,F(xiàn)DB的維護(hù)。
5. Macvlan 的局限性
- Macvlan 是將 VM 或容器通過(guò)二層連接到物理網(wǎng)絡(luò)的近乎理想的方案,但它也有一些局限性:
- Linux 主機(jī)連接的交換機(jī)可能會(huì)限制同一個(gè)物理端口上的 MAC 地址數(shù)量。雖然你可以讓網(wǎng)絡(luò)管理員更改這些策略,但有時(shí)這種方法是無(wú)法實(shí)行的(比如你要去給客戶做一個(gè)快速的 PoC 演示)。
- 許多 NIC 也會(huì)對(duì)該物理網(wǎng)卡上的 MAC地址數(shù)量有限制。超過(guò)這個(gè)限制就會(huì)影響到系統(tǒng)的性能。
IEEE 802.11 不喜歡同一個(gè)客戶端上有多個(gè) MAC 地址,這意味著你的 Macvlan 子接口在無(wú)線網(wǎng)卡或 AP 中都無(wú)法通信??梢酝ㄟ^(guò)復(fù)雜的辦法來(lái)突破這種限制,但還有一種更簡(jiǎn)單的辦法,那就是使用 Ipvlan,感興趣可以自己查閱相關(guān)資料。
6. 總結(jié)
本文主要介紹了 Macvlan 的實(shí)現(xiàn)原理,比較了它和 Linux Bridge 模式之間的差異及其使用場(chǎng)景,還詳細(xì)剖析了 Macvlan 四種模式的工作原理和相關(guān)注意項(xiàng)。下一節(jié)我們將通過(guò)實(shí)際演練來(lái)模擬 Macvlan 的四種工作模式。
7. 參考資料
http://hicu.be/bridge-vs-macvlan
https://blog.csdn.net/ztguang/article/details/51854037
https://lists.linuxfoundation.org/pipermail/bridge/2009-November/006842.html
本文轉(zhuǎn)載自微信公眾號(hào)「 云原生實(shí)驗(yàn)室」,轉(zhuǎn)載本文請(qǐng)聯(lián)系 云原生實(shí)驗(yàn)室公眾號(hào)。