本篇博客將講述一些常見的虛擬網(wǎng)絡(luò)及其原理,如虛擬機網(wǎng)絡(luò)、WSL網(wǎng)絡(luò)、Linux網(wǎng)絡(luò)命名空間、Docker網(wǎng)絡(luò)。
網(wǎng)絡(luò)互聯(lián)設(shè)備本質(zhì)上就是能對信息進(jìn)行特定處理的設(shè)備。
網(wǎng)卡:發(fā)送與接收幀(糾錯、成幀、流控)
中繼器與集線器:恢復(fù)衰減信號,使信號不失真
網(wǎng)橋與二層交換機:分割沖突域,二層負(fù)載均衡
路由器與三層交換機:分割廣播域以及解析IP報文,三層負(fù)載均衡
這些網(wǎng)絡(luò)設(shè)備最核心的就是網(wǎng)卡。
傳統(tǒng)的網(wǎng)絡(luò)互聯(lián)設(shè)備都是物理世界真實的機器,但是本質(zhì)上這些物理設(shè)備都是對數(shù)據(jù)的處理(基于芯片而非CPU),而實際上,我們完全可以在一個終端里通過一個個程序來模擬這些物理互聯(lián)設(shè)備,這就是虛擬網(wǎng)絡(luò)互聯(lián)設(shè)備(就像在MC里做個電腦一樣,圖靈完備性與編程語言的自舉)。
首先來看一下網(wǎng)卡,網(wǎng)卡擁有三種工作模式,正常情況下,一個網(wǎng)卡是不會將除了廣播幀和自身MAC地址對應(yīng)的幀以外的幀繼續(xù)往上層協(xié)議繼續(xù)傳遞的,但是開啟混雜模式便可以將非自身MAC地址的幀傳遞到上層協(xié)議了。這樣便能解決虛擬網(wǎng)卡在一二層的傳遞。物理網(wǎng)卡開啟混雜模式接收虛擬網(wǎng)卡MAC地址的幀,這樣簡單的二層虛擬網(wǎng)絡(luò)就建立了,但出于沖突域的考慮,也許還需要虛擬的網(wǎng)橋?qū)Χ拥牧髁窟M(jìn)行隔離。
虛擬的網(wǎng)絡(luò)有很多,在操作系統(tǒng)中,比如Windows的WSL網(wǎng)絡(luò),或者Linux的網(wǎng)絡(luò)命名空間,或者虛擬機的網(wǎng)絡(luò)、Docker網(wǎng)絡(luò)、K8S網(wǎng)絡(luò)。接下來,將詳細(xì)講一下虛擬機的三種網(wǎng)絡(luò)模型。虛擬機的網(wǎng)絡(luò)共有三種模型,分別是Host-Only、NAT、橋接(此橋接和Docker的bridge模型名字一樣但不是一個東西)。
所謂的橋接模式就是物理的網(wǎng)卡開啟混雜模式,將所有路過該網(wǎng)卡的幀都傳到上層進(jìn)行處理,這是會有一個虛擬的交換機(或者網(wǎng)橋)在內(nèi)存中,然后都會傳給這個虛擬的交換機上,虛擬的交換機通過自學(xué)習(xí)將對應(yīng)的幀發(fā)到對應(yīng)的虛擬網(wǎng)卡里。在橋接模式下,虛擬網(wǎng)卡的IP地址往往和物理主機在同一個子網(wǎng)內(nèi),這樣當(dāng)子網(wǎng)內(nèi)其他主機訪問虛擬機的IP時,廣播ARP協(xié)議便能拿到虛擬主機的MAC地址然后進(jìn)行互聯(lián)。在橋接模式下,虛擬網(wǎng)卡和物理網(wǎng)卡處于同一個物理網(wǎng)絡(luò),虛擬機和物理機的網(wǎng)絡(luò)環(huán)境基本相同。在橋接模式下,虛擬機的IP地址可以靜態(tài)分配也可以通過局域網(wǎng)內(nèi)的DHCP服務(wù)器動態(tài)獲得IP地址。

第二種模式便是NAT模式,NAT模式會給物理主機建立兩個網(wǎng)卡,使物理機同時存在于兩個網(wǎng)絡(luò),一個真實的物理網(wǎng)絡(luò),另一個便是在主機內(nèi)部建立的虛擬網(wǎng)絡(luò),其工作模式類似私網(wǎng)訪問因特網(wǎng),因特網(wǎng)的主機沒法訪問私網(wǎng)的主機,私網(wǎng)的主機能夠訪問因特網(wǎng)(物理機網(wǎng)絡(luò)的主機無法訪問虛擬機,虛擬機能訪問物理機所在的網(wǎng)絡(luò)(通過路由表代理到物理機))。

第三種便是Host-Only,Host-Only的特點就是NAT模式?jīng)]有NAT設(shè)備,這樣虛擬機便不能訪問物理機所在的物理網(wǎng)絡(luò),但是和物理機在同一個虛擬網(wǎng)絡(luò),所以可以和物理機進(jìn)行互聯(lián)。這時候物理機其實打開網(wǎng)卡配置會發(fā)現(xiàn)兩個IP地址,這兩個IP地址分別對應(yīng)物理機在物理網(wǎng)絡(luò)和虛擬網(wǎng)絡(luò)的IP地址。

WSL是一個在Windows 10上能夠運行原生Linux二進(jìn)制可執(zhí)行文件(ELF格式)的兼容層。它是由微軟與Canonical公司合作開發(fā),其目標(biāo)是使純正的Ubuntu、Debian等映像能下載和解壓到用戶的本地計算機,并且映像內(nèi)的工具和實用工具能在此子系統(tǒng)上原生運行。在這里我們將通過一些命令來研究WSL的網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)。
首先,準(zhǔn)備一臺裝有WSL的windows操作系統(tǒng)(比如公司的主機),通過ipconfig命令我們可以看到兩個網(wǎng)卡配置,一個是以太網(wǎng)網(wǎng)卡(真實的連接在物理網(wǎng)絡(luò)的網(wǎng)卡,10.209.144.1是主機在以太局域網(wǎng)的IP地址,這個局域網(wǎng)的子網(wǎng)掩碼是255.255.254.0,這個局域網(wǎng)的默認(rèn)網(wǎng)關(guān)是10.209.144.1),另一個是WSL的虛擬網(wǎng)卡信息(基于本地環(huán)境搭建了一個虛擬網(wǎng)絡(luò),我的物理機在虛擬網(wǎng)絡(luò)中的IP是172.29.32.1,子網(wǎng)掩碼是255.255.240.0)

然后通過wsl命令進(jìn)入wsl內(nèi),使用ifconfig命令看到,虛擬的WSL的網(wǎng)卡有兩個,一個是回環(huán)網(wǎng)卡lo,指的是每臺主機的127.0.0.1的本地網(wǎng)絡(luò)網(wǎng)卡,另一個是eth網(wǎng)卡0,IP地址是172.29.33.47,子網(wǎng)掩碼是255.255.240.0,可以看到與windows的虛擬網(wǎng)卡位于同一個網(wǎng)絡(luò)。

然后回到windows操作系統(tǒng),使用route PRINT可以查看windows的路由信息,可以看到整個路由的默認(rèn)網(wǎng)關(guān)是10.209.144.1(物理以太網(wǎng)的網(wǎng)關(guān),應(yīng)該是路由器的地址,可以看到10.209.144.1是一個私有地址,如果要訪問因特網(wǎng)IP那么將會把幀發(fā)送到路由器,路由器解析幀分析IP報文,通過路由器的動態(tài)路由表跨越一個個局域網(wǎng)來到目標(biāo)網(wǎng)絡(luò)完成尋址)。同時可以看到172.29.32.0-255.255.240.0的報文將會轉(zhuǎn)發(fā)給172.29.32.1(這應(yīng)該是虛擬交換機的IP地址)。通過這個路由表大概能分析出本地主機為啥能訪問虛擬以太網(wǎng)和以太網(wǎng)以及因特網(wǎng)。

回到WSL,通過route -n查看路由表信息,可以發(fā)現(xiàn)兩個路由,在127.29.30.0-255.255.240.0的報文將發(fā)給0.0.0.0,在0.0.0.0-0.0.0.0的報文將發(fā)給172.29.32.1,也就是說WSL環(huán)境下,訪問因特網(wǎng)是通過轉(zhuǎn)發(fā)給虛擬交換機然后交換機通過NAT連上外網(wǎng)的。但是由于WSL的IP地址不在物理以太網(wǎng)的網(wǎng)段內(nèi),物理以太網(wǎng)內(nèi)的IP報文將會被轉(zhuǎn)發(fā)到交換機路由器最終丟失,物理以太網(wǎng)的主機將無法直接連通虛擬的WSL。通過上述的調(diào)查,其實可以發(fā)現(xiàn)WSL的網(wǎng)絡(luò)是類似于虛擬機的NAT模式。

上面講的是windows操作系統(tǒng)的虛擬網(wǎng)絡(luò),下面談?wù)凩inux操作系統(tǒng)的網(wǎng)絡(luò)。Linux操作系統(tǒng)和網(wǎng)絡(luò)相關(guān)的feature,比較重要的就是Netfilters與Iptables以及網(wǎng)絡(luò)命名空間。其中Netfilters工作在內(nèi)核空間,對網(wǎng)絡(luò)報文進(jìn)行過濾轉(zhuǎn)發(fā)以及NAT,而iptables工作于用戶空間,可以修改過濾轉(zhuǎn)發(fā)以及NAT相關(guān)的配置。另一個比較重要的技術(shù)便是網(wǎng)絡(luò)命名空間,網(wǎng)絡(luò)命名空間的特點就是每個網(wǎng)絡(luò)命名空間擁有獨立的網(wǎng)卡信息,獨立的路由表信息等,每個網(wǎng)絡(luò)命名空間獨享一個網(wǎng)絡(luò)棧。而這個技術(shù)的實現(xiàn)其實主要基于兩個技術(shù),那就是虛擬網(wǎng)絡(luò)技術(shù)與Linux的文件系統(tǒng)的抽象(基于抽象編程,Linux操作系統(tǒng)內(nèi)核并不在于文件系統(tǒng)是bfs還是rfs還是vfs或者ufs或者aufs,通過掛載在不同fs上使網(wǎng)絡(luò)相關(guān)的配置文件隔離,簡單講就是ThreadLocal)。
Docker的單機網(wǎng)絡(luò)模型便基于Linux的網(wǎng)絡(luò)命名空間實現(xiàn),Docker單機的網(wǎng)絡(luò)模式有host、container、none、bridge。其中host模式就是使用物理機的網(wǎng)絡(luò)命名空間;none模式不會配置網(wǎng)卡和IP、路由等信息;bridge模式將類似虛擬機的NAT模式;container模式則是獲得和某個container相同的網(wǎng)絡(luò)命名空間。