Linux虛擬網絡原理小結

隨着網絡技術,虛擬化技術的發展,更多的高級網絡設備被加入了到了 Linux 中,使得狀況變得愈來愈複雜。在下面的內容中,將一一分析在虛擬化技術中常用的幾種 Linux 網絡設備抽象類型:Bridge、802.1.q VLAN device、VETH、TAP,詳細解釋如何用它們配合 Linux 中的 Route table、IP table 簡單的建立出本地虛擬網絡。網絡


Bridge工做原理

Bridge(橋)是 Linux 上用來作 TCP/IP 二層協議交換的設備,與現實世界中的交換機功能類似。Bridge 設備實例能夠和 Linux 上其餘網絡設備實例鏈接,既 attach 一個從設備,相似於在現實世界中的交換機和一個用戶終端之間鏈接一根網線。當有數據到達時,Bridge 會根據報文中的 MAC 信息進行廣播、轉發、丟棄處理。ide

Bridge是這樣工做的: 函數

當一個設備連接到Bridge時,就至關於物理網絡中從交換機截圖了一條網先到物理設備,此時在內核會調用一個netdev_rx_handler_register()的函數,當數據從設備流入時,系統會調用這個函數將數據轉發到Bridge上。當 Bridge 接收到此數據時,br_handle_frame()被調用,進行一個和現實世界中的交換機相似的處理過程:判斷包的類別(廣播/單點),查找內部 MAC 端口映射表,定位目標端口號,將數據轉發到目標端口或丟棄,自動更新內部 MAC 端口映射表以自我學習。學習

Bridge 和現實世界中的二層交換機有一個區別,從設備過來的數據會直接發到 Bridge 上,而不是從一個端口接受。這和現實的物理網絡有區別 。spa

Linux 裏 Bridge 是能夠設置IP地址的,Bridge是通用網絡設備抽象的一種,只要是網絡設備就可以設定 IP 地址。當一個 bridge0 擁有 IP 後,Linux 即可以經過路由表或者 IP 表規則在三層定位 bridge0,當有符合此 IP 的數據到達 bridge0 時,內核協議棧認爲收到了目標爲本機的數據,此時應用程序能夠經過 Socket 接收到它。orm

Bridge 的實現當前有一個限制:當一個設備被 attach 到 Bridge 上時,那個設備的 IP 會變的無效,Linux 再也不使用那個 IP 在三層接受數據。舉例以下:若是 eth0 原本的 IP 是 192.168.1.2,此時若是收到一個目標地址是 192.168.1.2 的數據,Linux 的應用程序能經過 Socket 操做接受到它。而當 eth0 被 attach 到一個 bridge0 時,儘管 eth0 的 IP 還在,但應用程序是沒法接受到上述數據的。此時應該把 IP 192.168.1.2 賦予 bridge0。而此時咱們經過ifconfig去查看網絡信息時,eth0上的IP地址是空的,被Bridge所取代。接口

另外須要注意的是數據流的方向。對於一個被 attach 到 Bridge 上的設備來講,只有它收到數據時,此包數據纔會被轉發到 Bridge 上,進而完成查表廣播等後續操做。當請求是發送類型時,數據是不會被轉發到 Bridge 上的,它會尋找下一個發送出口。用戶在配置網絡時常常忽略這一點從而形成網絡故障。路由


VLAN device for 802.1.q

VLAN 又稱虛擬網絡,是一個被普遍使用的概念,有些應用程序把本身的內部網絡也稱爲 VLAN。按照協議原理通常分爲:MACVLAN、802.1.q VLAN、802.1.qbg VLAN、802.1.qbh VLAN。其中出現較早,應用普遍而且比較成熟的是 802.1.q VLAN,其基本原理是在二層協議裏插入額外的 VLAN 協議數據(稱爲 802.1.q VLAN Tag),同時保持和傳統二層設備的兼容性。Linux 裏的 VLAN 設備是對 802.1.q 協議的一種內部軟件實現,模擬現實世界中的 802.1.q 交換機。it

Linux 裏 802.1.q VLAN 設備是以母子關係成對出現的,母設備至關於現實世界中的交換機 TRUNK 口,用於鏈接上級網絡,子設備至關於普通接口用於鏈接下級網絡。當數據在母子設備間傳遞時,內核將會根據 802.1.q VLAN Tag 進行對應操做。母子設備之間是一對多的關係,一個母設備能夠有多個子設備,一個子設備只有一個母設備。當一個子設備有一包數據須要發送時,數據將被加入 VLAN Tag 而後從母設備發送出去。當母設備收到一包數據時,它將會分析其中的 VLAN Tag,若是有對應的子設備存在,則把數據轉發到那個子設備上並根據設置移除 VLAN Tag,不然丟棄該數據。在某些設置下,VLAN Tag 能夠不被移除以知足某些監聽程序的須要,如 DHCP 服務程序。table

對於寄主 Linux 系統來講,母設備只能用來收數據,子設備只能用來發送數據。和 Bridge 同樣,母子設備的數據也是有方向的,子設備收到後的數據不會再進入母設備,一樣母設備上請求發送出去的數據不會被轉到子設備上。能夠把 VLAN 母子設備做爲一個總體想象爲現實世界中的 802.1.q 交換機,下級接口經過子設備鏈接到寄主 Linux 系統網絡裏,上級接口同過主設備鏈接到上級網絡,當母設備是物理網卡時上級網絡是外界真實網絡,當母設備是另一個 Linux 虛擬網絡設備時上級網絡仍然是寄主 Linux 系統網絡。

須要注意的是母子 VLAN 設備擁有相同的 MAC 地址,所以多個 VLAN 設備會共享一個 MAC。當一個母設備擁有多個 VLAN 子設備時,子設備之間是隔離的,不存在 Bridge 那樣的交換轉發關係,緣由以下:802.1.q VLAN 協議的主要目的是從邏輯上隔離子網。現實世界中的 802.1.q 交換機存在多個 VLAN,每一個 VLAN 擁有多個端口,同一 VLAN 端口之間能夠交換轉發,不一樣 VLAN 端口之間隔離,因此其包含兩層功能:交換與隔離。Linux VLAN device 實現的是隔離功能,沒有交換功能。一個 VLAN 母設備不可能擁有兩個相同 ID 的 VLAN 子設備,所以也就不可能出現數據交換狀況。若是想讓一個 VLAN 裏接多個設備,就須要交換功能。在 Linux 裏 Bridge 專門實現交換功能,所以將 VLAN 子設備 attach 到一個 Bridge 上就能完成後續的交換功能。總結起來,Bridge 加 VLAN device 能在功能層面完整模擬現實世界裏的 802.1.q 交換機。


TAP 設備與 VETH 設備

TUN/TAP 設備是一種讓用戶態程序向內核協議棧注入數據的設備,一個工做在三層,一個工做在二層,使用較多的是 TAP 設備。

VETH 設備出現較早,它的做用是反轉通信數據的方向,將須要發送的數據轉換成須要收到的數據從新送入內核網絡層進行處理,從而間接的完成數據的注入。

當一個 TAP 設備被建立時,在 Linux 設備文件目錄下將會生成一個對應 char 設備,用戶程序能夠像打開普通文件同樣打開這個文件進行讀寫。當執行 write()操做時,數據進入 TAP 設備,此時對於 Linux 網絡層來講,至關於 TAP 設備收到了一包數據,請求內核接受它,如同普通的物理網卡從外界收到一包數據同樣,不一樣的是其實數據來自 Linux 上的一個用戶程序。Linux 收到此數據後將根據網絡配置進行後續處理,從而完成了用戶程序向 Linux 內核網絡層注入數據的功能。當用戶程序執行 read()請求時,至關於向內核查詢 TAP 設備上是否有須要被髮送出去的數據,有的話取出到用戶程序裏,完成 TAP 設備的發送數據功能。TAP實現了用戶態和內核態的數據交換功能,應用程序經過 read()/write()操做,和本機網絡核心進行通信。

VETH 設備老是成對出現,送到一端請求發送的數據老是從另外一端以請求接受的形式出現。該設備不能被用戶程序直接操做,但使用起來比較簡單。建立並配置正確後,向其一端輸入數據,VETH 會改變數據的方向並將其送入內核網絡核心,完成數據的注入。在另外一端能讀到此數據。

相關文章
相關標籤/搜索