摘要:通過不同的子接口,也能做到流量的隔離。會根據收到包的目的地址判斷這個包需要交給哪個虛擬網卡,虛擬網卡再把包交給上層的協議棧處理。總結是一種網卡虛擬化技術,能夠將一張網卡虛擬出多張網卡。
本文首發于我的公眾號 cloud_dev,專注于干貨分享,號內有大量書籍和視頻資源,后臺回復「1024」即可領取,歡迎大家關注,二維碼文末可以掃。01 macvlan 簡介
前面的文章講過了幾種 Linux 虛擬網絡設備:tap/tun、veth-pair、bridge,它們本質上是 Linux 系統 提供的網絡虛擬化解決方案,今天要講的 macvlan 也是其中的一種,準確說這是一種網卡虛擬化的解決方案。因為 macvlan 這種技術能將 一塊物理網卡虛擬成多塊虛擬網卡 ,相當于物理網卡施展了 多重影分身之術 ,由一個變多個。
02 macvlan 的工作原理macvlan 是 Linux kernel 支持的新特性,支持的版本有 v3.9-3.19 和 4.0+,比較穩定的版本推薦 4.0+。它一般是以內核模塊的形式存在,我們可以通過以下方法判斷當前系統是否支持:
# modprobe macvlan # lsmod | grep macvlan macvlan 24576 0
如果第一個命令報錯,或者第二個命令沒有返回,說明當前系統不支持 macvlan,需要升級內核。
macvlan 這種技術聽起來有點像 VLAN,但它們的實現機制是完全不一樣的。macvlan 子接口和原來的主接口是完全獨立的,可以多帶帶配置 MAC 地址和 IP 地址,而 VLAN 子接口和主接口共用相同的 MAC 地址。VLAN 用來劃分廣播域,而 macvlan 共享同一個廣播域。
通過不同的子接口,macvlan 也能做到流量的隔離。macvlan 會根據收到包的目的 MAC 地址判斷這個包需要交給哪個虛擬網卡,虛擬網卡再把包交給上層的協議棧處理。
03 四種模式根據 macvlan 子接口之間的通信模式,macvlan 有四種網絡模式:
private 模式
vepa(virtual ethernet port aggregator) 模式
bridge 模式
passthru 模式
默認使用的是 vepa 模式。
3.1 private這種模式下,同一主接口下的子接口之間彼此隔離,不能通信。即使從外部的物理交換機導流,也會被無情地丟掉。
3.2 vepa這種模式下,子接口之間的通信流量需要導到外部支持 802.1Qbg/VPEA 功能的交換機上(可以是物理的或者虛擬的),經由外部交換機轉發,再繞回來。
注:802.1Qbg/VPEA 功能簡單說就是交換機要支持 發夾(hairpin) 功能,也就是數據包從一個接口上收上來之后還能再扔回去。
3.3 bridge這種模式下,模擬的是 Linux bridge 的功能,但比 bridge 要好的一點是每個接口的 MAC 地址是已知的,不用學習。所以,這種模式下,子接口之間就是直接可以通信的。
3.4 passthru這種模式,只允許單個子接口連接主接口,且必須設置成混雜模式,一般用于子接口橋接和創建 VLAN 子接口的場景。
3.5 mactap和 macvlan 相似的技術還有一種是 mactap。和 macvlan 不同的是,mactap 收到包之后不是交給協議棧,而是交給一個 tapX 文件,然后通過這個文件,完成和用戶態的直接通信。
04 實踐在 Linux 系統下,創建 macvlan 的命令形式如下:
ip link add link DEVICE name NAME type { macvlan | macvtap } mode { private | vepa | bridge | passthru [ nopromisc ] }
通常,多帶帶使用 macvlan 毫無意義,一般都是結合 VM 和容器來構建網絡。下面我們就簡單使用 namespace 來看看 Linux 是怎么使用 macvlan 的。
實驗拓撲如下:
在我的系統中,以接口 enp0s8 為例創建兩個 macvlan 子接口(使用 bridge 模式),配置 IP 并將其掛到兩個 namespace 中,測試連通性。
# 創建兩個 macvlan 子接口 ip link add link enp0s8 dev mac1 type macvlan mode bridge ip link add link enp0s8 dev mac2 type macvlan mode bridge # 創建兩個 namespace ip netns add ns1 ip netns add ns2 # 將兩個子接口分別掛到兩個 namespace 中 ip link set mac1 netns ns1 ip link set mac2 netns ns2 # 配置 IP 并啟用 ip netns exec ns1 ip a a 192.168.56.122/24 dev mac1 ip netns exec ns1 ip l s mac1 up ip netns exec ns1 ip a a 192.168.56.123/24 dev mac2 ip netns exec ns2 ip l s mac2 up
注:enp0s8 的 IP 是 192.168.56.110/24,配置的子接口 IP 也必須是同一網段的。
完了兩個子接口 ping 一下:
root@ubuntu:~# ip netns exec ns1 ip a show mac1 9: mac1@if3:mtu 1500 qdisc noqueue state UNKNOWN group default qlen 1 link/ether 2e:6e:d9:08:c5:05 brd ff:ff:ff:ff:ff:ff link-netnsid 0 inet 192.168.56.122/24 scope global mac1 valid_lft forever preferred_lft forever inet6 fe80::2c6e:d9ff:fe08:c505/64 scope link valid_lft forever preferred_lft forever root@ubuntu:~# ip netns exec ns1 ping 192.168.56.123 PING 192.168.56.123 (192.168.56.123) 56(84) bytes of data. 64 bytes from 192.168.56.123: icmp_seq=1 ttl=64 time=0.052 ms 64 bytes from 192.168.56.123: icmp_seq=2 ttl=64 time=0.028 ms ^C --- 192.168.56.123 ping statistics --- 2 packets transmitted, 2 received, 0% packet loss, time 1000ms rtt min/avg/max/mdev = 0.028/0.040/0.052/0.012 ms
可以看到,能夠 ping 通,如果把上面的 mode 換成其他模式就行不通了,這個就留給大家去實驗了(默認是 vepa 模式)。
另外,在 docker 中,macvlan 是一種較為重要的跨主機網絡模型,這塊的內容就留作下篇文章再做講解了。
05 總結macvlan 是一種網卡虛擬化技術,能夠將一張網卡虛擬出多張網卡。
macvlan 的四種通信模式,常用模式是 bridge。
思考一下:
macvlan bridge 和 bridge 的異同點
還有一種類似的技術,多張虛擬網卡共享相同 MAC 地址,但有獨立的 IP 地址,這是什么技術?
這兩個問題大家可以留言互動一下。
我的公眾號 cloud_dev,號內有大量書籍和視頻資源,后臺回復「1024」即可領取,分享的內容包括但不限于云計算虛擬化、容器、OpenStack、K8S、霧計算、網絡、工具、SDN、OVS、DPDK、Linux、Go、Python、C/C++編程技術等內容,歡迎大家關注。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/11503.html
摘要:首先分別在兩臺主機上將物理網口創建出兩個子接口。然后創建兩個子接口,一個作為網絡的網關,一個作為的網關。對子接口配置網關并啟用這樣之后再從和,就可以通了。 本文首發于我的公眾號 Linux云計算網絡(id: cloud_dev),專注于干貨分享,號內有 10T 書籍和視頻資源,后臺回復「1024」即可領取,歡迎大家關注,二維碼文末可以掃。 上一篇文章我們詳細介紹了 macvlan 這種...
摘要:首先分別在兩臺主機上將物理網口創建出兩個子接口。然后創建兩個子接口,一個作為網絡的網關,一個作為的網關。對子接口配置網關并啟用這樣之后再從和,就可以通了。 本文首發于我的公眾號 Linux云計算網絡(id: cloud_dev),專注于干貨分享,號內有 10T 書籍和視頻資源,后臺回復「1024」即可領取,歡迎大家關注,二維碼文末可以掃。 上一篇文章我們詳細介紹了 macvlan 這種...
閱讀 2303·2023-04-25 14:22
閱讀 3741·2021-11-15 18:12
閱讀 1298·2019-08-30 15:44
閱讀 3220·2019-08-29 15:37
閱讀 647·2019-08-29 13:49
閱讀 3462·2019-08-26 12:11
閱讀 879·2019-08-23 18:28
閱讀 1587·2019-08-23 14:55