您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關(guān)Linux 上的基礎(chǔ)網(wǎng)絡(luò)設(shè)備都有哪些,小編覺得挺實用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
Linux抽象網(wǎng)絡(luò)設(shè)備簡介
和磁盤設(shè)備類似,Linux用戶想要使用網(wǎng)絡(luò)功能,不能通過直接操作硬件完成,而需要直接或間接的操作一個Linux為我們抽象出來的設(shè)備,既通用的Linux網(wǎng)絡(luò)設(shè)備來完成。一個常見的情況是,系統(tǒng)里裝有一個硬件網(wǎng)卡,Linux會在系統(tǒng)里為其生成一個網(wǎng)絡(luò)設(shè)備實例,如eth0,用戶需要對eth0發(fā)出命令以配置或使用它了。更多的硬件會帶來更多的設(shè)備實例,虛擬的硬件也會帶來更多的設(shè)備實例。隨著網(wǎng)絡(luò)技術(shù),虛擬化技術(shù)的發(fā)展,更多的高級網(wǎng)絡(luò)設(shè)備被加入了到了Linux中,使得情況變得更加復(fù)雜。在以下章節(jié)中,將一一分析在虛擬化技術(shù)中經(jīng)常使用的幾種Linux網(wǎng)絡(luò)設(shè)備抽象類型:Bridge、802.1.qVLANdevice、VETH、TAP,詳細解釋如何用它們配合Linux中的Routetable、IPtable簡單的創(chuàng)建出本地虛擬網(wǎng)絡(luò)。
相關(guān)網(wǎng)絡(luò)設(shè)備工作原理
Bridge
Bridge(橋)是Linux上用來做TCP/IP二層協(xié)議交換的設(shè)備,與現(xiàn)實世界中的交換機功能相似。Bridge設(shè)備實例可以和Linux上其他網(wǎng)絡(luò)設(shè)備實例連接,既attach一個從設(shè)備,類似于在現(xiàn)實世界中的交換機和一個用戶終端之間連接一根網(wǎng)線。當(dāng)有數(shù)據(jù)到達時,Bridge會根據(jù)報文中的MAC信息進行廣播、轉(zhuǎn)發(fā)、丟棄處理。
圖1.Bridge設(shè)備工作過程
如圖所示,Bridge的功能主要在內(nèi)核里實現(xiàn)。當(dāng)一個從設(shè)備被attach到Bridge上時,相當(dāng)于現(xiàn)實世界里交換機的端口被插入了一根連有終端的網(wǎng)線。這時在內(nèi)核程序里,netdev_rx_handler_register()被調(diào)用,一個用于接受數(shù)據(jù)的回調(diào)函數(shù)被注冊。以后每當(dāng)這個從設(shè)備收到數(shù)據(jù)時都會調(diào)用這個函數(shù)可以把數(shù)據(jù)轉(zhuǎn)發(fā)到Bridge上。當(dāng)Bridge接收到此數(shù)據(jù)時,br_handle_frame()被調(diào)用,進行一個和現(xiàn)實世界中的交換機類似的處理過程:判斷包的類別(廣播/單點),查找內(nèi)部MAC端口映射表,定位目標(biāo)端口號,將數(shù)據(jù)轉(zhuǎn)發(fā)到目標(biāo)端口或丟棄,自動更新內(nèi)部MAC端口映射表以自我學(xué)習(xí)。
Bridge和現(xiàn)實世界中的二層交換機有一個區(qū)別,圖中左側(cè)畫出了這種情況:數(shù)據(jù)被直接發(fā)到Bridge上,而不是從一個端口接受。這種情況可以看做Bridge自己有一個MAC可以主動發(fā)送報文,或者說Bridge自帶了一個隱藏端口和寄主Linux系統(tǒng)自動連接,Linux上的程序可以直接從這個端口向Bridge上的其他端口發(fā)數(shù)據(jù)。所以當(dāng)一個Bridge擁有一個網(wǎng)絡(luò)設(shè)備時,如bridge0加入了eth0時,實際上bridge0擁有兩個有效MAC地址,一個是bridge0的,一個是eth0的,他們之間可以通訊。由此帶來一個有意思的事情是,Bridge可以設(shè)置IP地址。通常來說IP地址是三層協(xié)議的內(nèi)容,不應(yīng)該出現(xiàn)在二層設(shè)備Bridge上。但是Linux里Bridge是通用網(wǎng)絡(luò)設(shè)備抽象的一種,只要是網(wǎng)絡(luò)設(shè)備就能夠設(shè)定IP地址。當(dāng)一個bridge0擁有IP后,Linux便可以通過路由表或者IP表規(guī)則在三層定位bridge0,此時相當(dāng)于Linux擁有了另外一個隱藏的虛擬網(wǎng)卡和Bridge的隱藏端口相連,這個網(wǎng)卡就是名為bridge0的通用網(wǎng)絡(luò)設(shè)備,IP可以看成是這個網(wǎng)卡的。當(dāng)有符合此IP的數(shù)據(jù)到達bridge0時,內(nèi)核協(xié)議棧認為收到了一包目標(biāo)為本機的數(shù)據(jù),此時應(yīng)用程序可以通過Socket接收到它。一個更好的對比例子是現(xiàn)實世界中的帶路由的交換機設(shè)備,它也擁有一個隱藏的MAC地址,供設(shè)備中的三層協(xié)議處理程序和管理程序使用。設(shè)備里的三層協(xié)議處理程序,對應(yīng)名為bridge0的通用網(wǎng)絡(luò)設(shè)備的三層協(xié)議處理程序,即寄主Linux系統(tǒng)內(nèi)核協(xié)議棧程序。設(shè)備里的管理程序,對應(yīng)bridge0寄主Linux系統(tǒng)里的應(yīng)用程序。
Bridge的實現(xiàn)當(dāng)前有一個限制:當(dāng)一個設(shè)備被attach到Bridge上時,那個設(shè)備的IP會變的無效,Linux不再使用那個IP在三層接受數(shù)據(jù)。舉例如下:如果eth0本來的IP是192.168.1.2,此時如果收到一個目標(biāo)地址是192.168.1.2的數(shù)據(jù),Linux的應(yīng)用程序能通過Socket操作接受到它。而當(dāng)eth0被attach到一個bridge0時,盡管eth0的IP還在,但應(yīng)用程序是無法接受到上述數(shù)據(jù)的。此時應(yīng)該把IP192.168.1.2賦予bridge0。
另外需要注意的是數(shù)據(jù)流的方向。對于一個被attach到Bridge上的設(shè)備來說,只有它收到數(shù)據(jù)時,此包數(shù)據(jù)才會被轉(zhuǎn)發(fā)到Bridge上,進而完成查表廣播等后續(xù)操作。當(dāng)請求是發(fā)送類型時,數(shù)據(jù)是不會被轉(zhuǎn)發(fā)到Bridge上的,它會尋找下一個發(fā)送出口。用戶在配置網(wǎng)絡(luò)時經(jīng)常忽略這一點從而造成網(wǎng)絡(luò)故障。
VLANdevicefor802.1.q
VLAN又稱虛擬網(wǎng)絡(luò),是一個被廣泛使用的概念,有些應(yīng)用程序把自己的內(nèi)部網(wǎng)絡(luò)也稱為VLAN。此處主要說的是在物理世界中存在的,需要協(xié)議支持的VLAN。它的種類很多,按照協(xié)議原理一般分為:MACVLAN、802.1.qVLAN、802.1.qbgVLAN、802.1.qbhVLAN。其中出現(xiàn)較早,應(yīng)用廣泛并且比較成熟的是802.1.qVLAN,其基本原理是在二層協(xié)議里插入額外的VLAN協(xié)議數(shù)據(jù)(稱為802.1.qVLANTag),同時保持和傳統(tǒng)二層設(shè)備的兼容性。Linux里的VLAN設(shè)備是對802.1.q協(xié)議的一種內(nèi)部軟件實現(xiàn),模擬現(xiàn)實世界中的802.1.q交換機。
圖2.VLAN設(shè)備工作過程
如圖所示,Linux里802.1.qVLAN設(shè)備是以母子關(guān)系成對出現(xiàn)的,母設(shè)備相當(dāng)于現(xiàn)實世界中的交換機TRUNK口,用于連接上級網(wǎng)絡(luò),子設(shè)備相當(dāng)于普通接口用于連接下級網(wǎng)絡(luò)。當(dāng)數(shù)據(jù)在母子設(shè)備間傳遞時,內(nèi)核將會根據(jù)802.1.qVLANTag進行對應(yīng)操作。母子設(shè)備之間是一對多的關(guān)系,一個母設(shè)備可以有多個子設(shè)備,一個子設(shè)備只有一個母設(shè)備。當(dāng)一個子設(shè)備有一包數(shù)據(jù)需要發(fā)送時,數(shù)據(jù)將被加入VLANTag然后從母設(shè)備發(fā)送出去。當(dāng)母設(shè)備收到一包數(shù)據(jù)時,它將會分析其中的VLANTag,如果有對應(yīng)的子設(shè)備存在,則把數(shù)據(jù)轉(zhuǎn)發(fā)到那個子設(shè)備上并根據(jù)設(shè)置移除VLANTag,否則丟棄該數(shù)據(jù)。在某些設(shè)置下,VLANTag可以不被移除以滿足某些監(jiān)聽程序的需要,如DHCP服務(wù)程序。舉例說明如下:eth0作為母設(shè)備創(chuàng)建一個ID為100的子設(shè)備eth0.100。此時如果有程序要求從eth0.100發(fā)送一包數(shù)據(jù),數(shù)據(jù)將被打上VLAN100的Tag從eth0發(fā)送出去。如果eth0收到一包數(shù)據(jù),VLANTag是100,數(shù)據(jù)將被轉(zhuǎn)發(fā)到eth0.100上,并根據(jù)設(shè)置決定是否移除VLANTag。如果eth0收到一包包含VLANTag101的數(shù)據(jù),其將被丟棄。上述過程隱含以下事實:對于寄主Linux系統(tǒng)來說,母設(shè)備只能用來收數(shù)據(jù),子設(shè)備只能用來發(fā)送數(shù)據(jù)。和Bridge一樣,母子設(shè)備的數(shù)據(jù)也是有方向的,子設(shè)備收到的數(shù)據(jù)不會進入母設(shè)備,同樣母設(shè)備上請求發(fā)送的數(shù)據(jù)不會被轉(zhuǎn)到子設(shè)備上??梢园裋LAN母子設(shè)備作為一個整體想象為現(xiàn)實世界中的802.1.q交換機,下級接口通過子設(shè)備連接到寄主Linux系統(tǒng)網(wǎng)絡(luò)里,上級接口同過主設(shè)備連接到上級網(wǎng)絡(luò),當(dāng)母設(shè)備是物理網(wǎng)卡時上級網(wǎng)絡(luò)是外界真實網(wǎng)絡(luò),當(dāng)母設(shè)備是另外一個Linux虛擬網(wǎng)絡(luò)設(shè)備時上級網(wǎng)絡(luò)仍然是寄主Linux系統(tǒng)網(wǎng)絡(luò)。
需要注意的是母子VLAN設(shè)備擁有相同的MAC地址,可以把它當(dāng)成現(xiàn)實世界中802.1.q交換機的MAC,因此多個VLAN設(shè)備會共享一個MAC。當(dāng)一個母設(shè)備擁有多個VLAN子設(shè)備時,子設(shè)備之間是隔離的,不存在Bridge那樣的交換轉(zhuǎn)發(fā)關(guān)系,原因如下:802.1.qVLAN協(xié)議的主要目的是從邏輯上隔離子網(wǎng)?,F(xiàn)實世界中的802.1.q交換機存在多個VLAN,每個VLAN擁有多個端口,同一VLAN端口之間可以交換轉(zhuǎn)發(fā),不同VLAN端口之間隔離,所以其包含兩層功能:交換與隔離。LinuxVLANdevice實現(xiàn)的是隔離功能,沒有交換功能。一個VLAN母設(shè)備不可能擁有兩個相同ID的VLAN子設(shè)備,因此也就不可能出現(xiàn)數(shù)據(jù)交換情況。如果想讓一個VLAN里接多個設(shè)備,就需要交換功能。在Linux里Bridge專門實現(xiàn)交換功能,因此將VLAN子設(shè)備attach到一個Bridge上就能完成后續(xù)的交換功能。總結(jié)起來,Bridge加VLANdevice能在功能層面完整模擬現(xiàn)實世界里的802.1.q交換機。
Linux支持VLAN硬件加速,在安裝有特定硬件情況下,圖中所述內(nèi)核處理過程可以被放到物理設(shè)備上完成。
TAP設(shè)備與VETH設(shè)備
TUN/TAP設(shè)備是一種讓用戶態(tài)程序向內(nèi)核協(xié)議棧注入數(shù)據(jù)的設(shè)備,一個工作在三層,一個工作在二層,使用較多的是TAP設(shè)備。VETH設(shè)備出現(xiàn)較早,它的作用是反轉(zhuǎn)通訊數(shù)據(jù)的方向,需要發(fā)送的數(shù)據(jù)會被轉(zhuǎn)換成需要收到的數(shù)據(jù)重新送入內(nèi)核網(wǎng)絡(luò)層進行處理,從而間接的完成數(shù)據(jù)的注入。
圖3.TAP設(shè)備和VETH設(shè)備工作過程
如圖所示,當(dāng)一個TAP設(shè)備被創(chuàng)建時,在Linux設(shè)備文件目錄下將會生成一個對應(yīng)char設(shè)備,用戶程序可以像打開普通文件一樣打開這個文件進行讀寫。當(dāng)執(zhí)行write()操作時,數(shù)據(jù)進入TAP設(shè)備,此時對于Linux網(wǎng)絡(luò)層來說,相當(dāng)于TAP設(shè)備收到了一包數(shù)據(jù),請求內(nèi)核接受它,如同普通的物理網(wǎng)卡從外界收到一包數(shù)據(jù)一樣,不同的是其實數(shù)據(jù)來自Linux上的一個用戶程序。Linux收到此數(shù)據(jù)后將根據(jù)網(wǎng)絡(luò)配置進行后續(xù)處理,從而完成了用戶程序向Linux內(nèi)核網(wǎng)絡(luò)層注入數(shù)據(jù)的功能。當(dāng)用戶程序執(zhí)行read()請求時,相當(dāng)于向內(nèi)核查詢TAP設(shè)備上是否有需要被發(fā)送出去的數(shù)據(jù),有的話取出到用戶程序里,完成TAP設(shè)備的發(fā)送數(shù)據(jù)功能。針對TAP設(shè)備的一個形象的比喻是:使用TAP設(shè)備的應(yīng)用程序相當(dāng)于另外一臺計算機,TAP設(shè)備是本機的一個網(wǎng)卡,他們之間相互連接。應(yīng)用程序通過read()/write()操作,和本機網(wǎng)絡(luò)核心進行通訊。
VETH設(shè)備總是成對出現(xiàn),送到一端請求發(fā)送的數(shù)據(jù)總是從另一端以請求接受的形式出現(xiàn)。該設(shè)備不能被用戶程序直接操作,但使用起來比較簡單。創(chuàng)建并配置正確后,向其一端輸入數(shù)據(jù),VETH會改變數(shù)據(jù)的方向并將其送入內(nèi)核網(wǎng)絡(luò)核心,完成數(shù)據(jù)的注入。在另一端能讀到此數(shù)據(jù)。
網(wǎng)絡(luò)設(shè)置舉例說明
為了更好的說明Linux網(wǎng)絡(luò)設(shè)備的用法,下面將用一系列的例子,說明在一個復(fù)雜的Linux網(wǎng)絡(luò)元素組合出的虛擬網(wǎng)絡(luò)里,數(shù)據(jù)的流向。網(wǎng)絡(luò)設(shè)置簡介如下:一個中心Bridge:bridge0下attach了4個網(wǎng)絡(luò)設(shè)備,包括2個VETH設(shè)備,1個TAP設(shè)備tap0,1個物理網(wǎng)卡eth0。在VETH的另外一端又創(chuàng)建了VLAN子設(shè)備。Linux上共存在2個VLAN網(wǎng)絡(luò),既vlan100與vlan200。物理網(wǎng)卡和外部網(wǎng)絡(luò)相連,并且在它之下創(chuàng)建了一個VLANID為200的VLAN子設(shè)備。
從vlan100子設(shè)備發(fā)送ARP報文
圖4.ARP from vlan100 child device
如圖所示,當(dāng)用戶嘗試ping192.168.100.3時,Linux將會根據(jù)路由表,從vlan100子設(shè)備發(fā)出ARP報文,具體過程如下:
1)用戶ping192.168.100.3
2)Linux向vlan100子設(shè)備發(fā)送ARP信息。
3)ARP報文被打上VLANID100的Tag成為ARP@vlan100,轉(zhuǎn)發(fā)到母設(shè)備上。
4)VETH設(shè)備將這一發(fā)送請求轉(zhuǎn)變方向,成為一個需要接受處理的報文送入內(nèi)核網(wǎng)絡(luò)模塊。
5)由于對端的VETH設(shè)備被加入到了bridge0上,并且內(nèi)核發(fā)現(xiàn)它收到一個報文,于是報文被轉(zhuǎn)發(fā)到bridge0上。
6)bridge0處理此ARP@vlan100信息,根據(jù)TCP/IP二層協(xié)議發(fā)現(xiàn)是一個廣播請求,于是向它所知道的所有端口廣播此報文,其中一路進入另一對VETH設(shè)備的一端,一路進入TAP設(shè)備tap0,一路進入物理網(wǎng)卡設(shè)備eth0。此時在tap0上,用戶程序可以通過read()操作讀到ARP@vlan100,eth0將會向外界發(fā)送ARP@vlan100,但eth0的VLAN子設(shè)備不會收到它,因為此數(shù)據(jù)方向為請求發(fā)送而不是請求接收。
7)VETH將請求方向轉(zhuǎn)換,此時在另一端得到請求接受的ARP@vlan100報文。
8)對端VETH設(shè)備發(fā)現(xiàn)有數(shù)據(jù)需要接受,并且自己有兩個VLAN子設(shè)備,于是執(zhí)行VLAN處理邏輯。其中一個子設(shè)備是vlan100,與ARP@vlan100吻合,于是去除VLANID100的Tag轉(zhuǎn)發(fā)到這個子設(shè)備上,重新成為標(biāo)準(zhǔn)的以太網(wǎng)ARP報文。另一個子設(shè)備由于ID不吻合,不會得到此報文。
9)此VLAN子設(shè)備又被attach到另一個橋bridge1上,于是轉(zhuǎn)發(fā)自己收到的ARP報文。
10)bridge1廣播ARP報文。
11)最終另外一個TAP設(shè)備tap1收到此請求發(fā)送報文,用戶程序通過read()可以得到它。
從vlan200子設(shè)備發(fā)送ARP報文
圖5.ARP from vlan200 child device
和前面情況類似,區(qū)別是VLANID是200,對端的vlan200子設(shè)備設(shè)置為reorder_hdr=0,表示此設(shè)備被要求保留收到的報文中的VLANTag。此時子設(shè)備會收到ARP報文,但是帶了VLANID200的Tag,既ARP@vlan200。
從中心bridge發(fā)送ARP報文
圖6.ARP from central bridge
當(dāng)bridge0擁有IP時,通過Linux路由表用戶程序可以直接將ARP報文發(fā)向bridge0。這時tap0和外部網(wǎng)絡(luò)都能收到ARP,但VLAN子設(shè)備由于VLANID過濾的原因,將收不到ARP信息。
從外部網(wǎng)絡(luò)向物理網(wǎng)卡發(fā)送ARP@vlan200報文
圖7.ARP from external network
當(dāng)外部網(wǎng)絡(luò)連接在一個支持VLAN并且對應(yīng)端口為vlan200時,此情況會發(fā)生。此時所有的VLANID為200的VLAN子設(shè)備都將接受到報文,如果設(shè)置reorder_hdr=0則會收到帶Tag的ARP@vlan200。
從TAP設(shè)備以ping方式發(fā)送ARP
圖8.ping from TAP device
給tap0賦予IP并加入路由,此時再Ping其對應(yīng)網(wǎng)段的未知IP會產(chǎn)生ARP發(fā)送請求。需要注意的是此時由于tap0上存在的是發(fā)送而不是接收請求,因此ARP報文不會被轉(zhuǎn)發(fā)到橋上,從而什么也不會發(fā)生。圖中右邊畫了一個類似情況:從vlan200子設(shè)備發(fā)送ARP請求。由于缺少VETH設(shè)備反轉(zhuǎn)請求方向,因此報文也不會被轉(zhuǎn)發(fā)到橋上,而是直接通過物理網(wǎng)卡發(fā)往外部網(wǎng)絡(luò)。
以文件操作方式從TAP設(shè)備發(fā)送報文
圖9.file operation on TAP device
用戶程序指定tap0設(shè)備發(fā)送報文有兩種方式:socket和fileoperation。當(dāng)用socket_raw標(biāo)志新建socket并指定設(shè)備編號時,可以要求內(nèi)核將報文從tap0發(fā)送。但和前面的pingfromtap0情況類似,由于報文方向問題,消息并不會被轉(zhuǎn)發(fā)到bridge0上。當(dāng)用open()方式打開tap設(shè)備文件時,情況有所不同。當(dāng)執(zhí)行write()操作時,內(nèi)核認為tap0收到了報文,從而會觸發(fā)轉(zhuǎn)發(fā)動作,bridge0將收到它。如果發(fā)送的報文如圖所示,是一個以A為目的地的攜帶VLANID100Tag的單點報文,bridge0將會找到對應(yīng)的設(shè)備進行轉(zhuǎn)發(fā),對應(yīng)的VLAN子設(shè)備將收到?jīng)]有VLANID100Tag的報文。
Linux上配置網(wǎng)絡(luò)設(shè)備命令舉例
以Redhat6.2紅帽Linux發(fā)行版為例,如果已安裝VLAN內(nèi)核模塊和管理工具vconfig,TAP/TUN設(shè)備管理工具tunctl,那么可以用以下命令設(shè)置前述網(wǎng)絡(luò)設(shè)備:
創(chuàng)建Bridge:brctladdbr[BRIDGENAME]
刪除Bridge:brctldelbr[BRIDGENAME]
attach設(shè)備到Bridge:brctladdif[BRIDGENAME][DEVICENAME]
從Bridgedetach設(shè)備:brctldelif[BRIDGENAME][DEVICENAME]
查詢Bridge情況:brctlshow
創(chuàng)建VLAN設(shè)備:vconfigadd[PARENTDEVICENAME][VLANID]
刪除VLAN設(shè)備:vconfigrem[VLANDEVICENAME]
設(shè)置VLAN設(shè)備flag:vconfigset_flag[VLANDEVICENAME][FLAG][VALUE]
設(shè)置VLAN設(shè)備qos:
vconfigset_egress_map[VLANDEVICENAME][SKB_PRIORITY][VLAN_QOS]
vconfigset_ingress_map[VLANDEVICENAME][SKB_PRIORITY][VLAN_QOS]
查詢VLAN設(shè)備情況:cat/proc/net/vlan/[VLANDEVICENAME]
創(chuàng)建VETH設(shè)備:iplinkaddlink[DEVICENAME]typeveth
創(chuàng)建TAP設(shè)備:tunctl-p[TAPDEVICENAME]
刪除TAP設(shè)備:tunctl-d[TAPDEVICENAME]
查詢系統(tǒng)里所有二層設(shè)備,包括VETH/TAP設(shè)備:iplinkshow
刪除普通二層設(shè)備:iplinkdelete[DEVICENAME]type[TYPE]
Linux已經(jīng)提供一套基本工具供用戶創(chuàng)建出各種內(nèi)部網(wǎng)絡(luò),利用這些工具可以方便的創(chuàng)建出特定網(wǎng)絡(luò)給應(yīng)用程序使用,包括云計算中的初級內(nèi)部虛擬網(wǎng)絡(luò)。
以上就是Linux 上的基礎(chǔ)網(wǎng)絡(luò)設(shè)備都有哪些,小編相信有部分知識點可能是我們?nèi)粘9ぷ鲿姷交蛴玫降?。希望你能通過這篇文章學(xué)到更多知識。更多詳情敬請關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。