計(jì)算機(jī)網(wǎng)絡(luò)小實(shí)操-NAT與橋接

四層結(jié)構(gòu)

我們考慮四層的網(wǎng)絡(luò)結(jié)構(gòu),如下圖右側(cè):


image.png

由這個(gè)圖,我們可以簡單得到幾個(gè)結(jié)論:
① 網(wǎng)卡層的轉(zhuǎn)發(fā),是靠MAC地址;
② 網(wǎng)絡(luò)層的轉(zhuǎn)發(fā),是靠IP地址;
③ 傳輸層的轉(zhuǎn)發(fā),是靠端口;
⑤ Socket就是操作系統(tǒng)提供的,通過一個(gè)fd的占用,就可以屏蔽下面的工作,順利讀取數(shù)據(jù),并做對應(yīng)協(xié)議解析;
⑥ 對于輸入的數(shù)據(jù),從下到上解析;對于輸出的數(shù)據(jù),從上到下解析;當(dāng)然也有可能是平級傳輸(在對等情況下,忽略上下過程);
⑦ 數(shù)據(jù)包轉(zhuǎn)發(fā)過程中,IP地址是不會(huì)改變的,都是通過MAC地址改變來傳遞,除非做了NAT;
⑧ 網(wǎng)橋和交換機(jī)工作在第一層;NAT工作在第三層;

橋接與交換機(jī)[1]

橋接原理

image.png

可以看到,網(wǎng)橋通過記錄A、B兩個(gè)端口的MAC地址,可以實(shí)現(xiàn)在第一層解包后,向另一個(gè)網(wǎng)段轉(zhuǎn)發(fā)消息。

交換機(jī)原理

image.png

可以知道,交換機(jī)上面是有N個(gè)插口的,所以他的表記錄的內(nèi)容是每一個(gè)插口的MAC地址。

此時(shí)如果某個(gè)插口對應(yīng)的是交換機(jī),就會(huì)進(jìn)一步套娃:在外層交換機(jī)視角,記錄可能被內(nèi)存交換機(jī)反復(fù)刷新,觸發(fā)“擴(kuò)散”操作,即廣播到內(nèi)層;在內(nèi)層交換機(jī)視角,有所記錄,直接轉(zhuǎn)發(fā)即可。

特征

① 網(wǎng)卡層;
② 集中式管理,即所有節(jié)點(diǎn)會(huì)先發(fā)送到網(wǎng)橋,再轉(zhuǎn)發(fā),即使是內(nèi)網(wǎng)設(shè)備;
③ 能實(shí)現(xiàn)內(nèi)網(wǎng)穿透,但是因?yàn)閕p地址,不能在公網(wǎng)訪問。

NAT

NAT不是特指一個(gè)設(shè)備,更多是指實(shí)現(xiàn)了一個(gè)功能。

原理

image.png

可以看到,NAT實(shí)現(xiàn)了將一個(gè)“IP+Port”替換為另一個(gè)“IP+Port”的功能。
從IP角度,此時(shí)這個(gè)設(shè)備必須同時(shí)存在于“公網(wǎng)IP環(huán)”上和“內(nèi)網(wǎng)IP環(huán)”上,同時(shí)也正是這個(gè)功能,使得數(shù)據(jù)能在兩個(gè)環(huán)上跳轉(zhuǎn)。

特征

① 傳輸層
② IP地址會(huì)發(fā)生變化
③ 兩個(gè)環(huán)的交匯處

Docker的網(wǎng)絡(luò)模式

常見的網(wǎng)絡(luò)模式有5種,分別為

  • bridge:實(shí)際上是NAT模式;Docker中默認(rèn)的網(wǎng)絡(luò)驅(qū)動(dòng)模型,在啟動(dòng)容器時(shí)如果不指定則默認(rèn)為此驅(qū)動(dòng)類型;
  • host:實(shí)際上是橋接模式;打破Docker容器與宿主機(jī)之間的網(wǎng)絡(luò)隔離,直接使用宿主機(jī)的網(wǎng)絡(luò)環(huán)境,該模型僅適用于Docker17.6及以上版本;
  • overlay:可以連接多個(gè)docker守護(hù)進(jìn)程或者滿足集群服務(wù)之間的通信;適用于不同宿主機(jī)上的docker容器之間的通信;
  • none:即禁用了網(wǎng)絡(luò)驅(qū)動(dòng),需要自己手動(dòng)自定義網(wǎng)絡(luò)驅(qū)動(dòng)配置;
  • plugins:使用第三方網(wǎng)絡(luò)驅(qū)動(dòng)插件;

主要關(guān)注橋接(Bridge)模式


image.png

可以很明顯看到,docker0作為一個(gè)虛擬網(wǎng)橋(擁有ip),和ens160這個(gè)物理網(wǎng)卡做了橋接(ip_forwad),然后Docker Container在連在虛擬網(wǎng)卡的環(huán)上。
此時(shí)兩個(gè)環(huán)就出來了,只不過,內(nèi)層環(huán)是在宿主機(jī)內(nèi)部的。
無論這個(gè)模式叫什么名字,我們都要清楚,他的實(shí)現(xiàn)實(shí)際上是NAT,也就是說,container的網(wǎng)絡(luò)是在宿主機(jī)的下層網(wǎng)絡(luò),即如果不通過宿主機(jī),宿主機(jī)同級網(wǎng)絡(luò)無法訪問container網(wǎng)絡(luò)。

為什么要叫橋接模式呢?
我個(gè)人更傾向于叫做NAT模式,除了滿足NAT的一些特征,一些相關(guān)組件也能和NAT對應(yīng)上,比如地址轉(zhuǎn)換是通過iptables轉(zhuǎn)換的(而不是通過一個(gè)表)
but 暫且認(rèn)為是docker覺得自己docker0最精妙的地方就是網(wǎng)卡和veth-pair的設(shè)計(jì),所以取名叫做橋接模式吧,同時(shí)它抽象了iptables的功能,讓讀者認(rèn)為他就是簡單能將container的流量轉(zhuǎn)發(fā)到docker0上(忽略ip地址變化,甚至認(rèn)為公網(wǎng)上就直接是指向container的ip),此時(shí)就滿足了橋接的含義。

VMware的網(wǎng)絡(luò)模式

一共有三種網(wǎng)絡(luò)模式:橋接模式(VMnet0)、NAT(VMnet8)、僅主機(jī)模式(VMnet1)

橋接模式

image.png

對于虛擬機(jī)的流量,會(huì)被物理網(wǎng)卡轉(zhuǎn)發(fā)到虛擬交換機(jī)上再轉(zhuǎn)發(fā),所以可以認(rèn)為路由器直接相連交換機(jī),交換機(jī)再與這些網(wǎng)卡平等相連。
它橋接了物理網(wǎng)卡,這樣物理網(wǎng)卡的消息就能轉(zhuǎn)發(fā)到虛擬機(jī)上。
注意,VMnet0只是一個(gè)擺設(shè),沒有實(shí)際用處。

NAT模式

image.png

圖示中的NAT設(shè)備如同iptables一樣,對發(fā)送過來的ip地址做轉(zhuǎn)換;我們知道,NAT必須要主動(dòng)向外界發(fā)消息,不然無法訪問內(nèi)部,即我們不能走"物理網(wǎng)卡-NAT設(shè)備"這條線相連,為了解決這個(gè)問題,于是引入了VMnet8,使得物理機(jī)網(wǎng)絡(luò)與虛擬網(wǎng)絡(luò)有一個(gè)重疊,這樣通過VMnet8可以訪問到虛擬機(jī)(如主機(jī)模式)。

主機(jī)模式

image.png

圖示很明顯,我們在物理機(jī)想訪問虛擬網(wǎng)絡(luò),只有通過VMnet8,但是VMnet8又與物理網(wǎng)卡隔離,這樣整個(gè)虛擬網(wǎng)絡(luò)都無法被外界訪問。

Docker端口映射猜想

我們都知道,在啟動(dòng)一個(gè)container的時(shí)候,如果想要公網(wǎng)訪問(即不在機(jī)器上直接訪問),必須要做端口映射,如“-p 9980:80”。

  • 從原理上,這個(gè)參數(shù)代表了iptables中增加了一條轉(zhuǎn)換規(guī)則(這不就是NAT嗎?。@樣流量就能打到對應(yīng)的container上了。
  • (猜想)具體的數(shù)據(jù)流向<1.14.46.100:8723, 1.14.46.101:12443>,其中1.14.46.101為宿主機(jī)路由器的公網(wǎng)IP,當(dāng)數(shù)據(jù)到達(dá)路由器時(shí),觸發(fā)NAT,進(jìn)入下一層網(wǎng)絡(luò):<1.14.46.100:8723, 192.168.1.10:9980>,由路由器送到宿主機(jī),iptables攔截下,轉(zhuǎn)發(fā)到再下一層網(wǎng)絡(luò)(下證):<1.14.46.100:8723, 172.18.0.2:80>,此時(shí)就完成了從公網(wǎng)打到container的流程。
  • 宿主機(jī)上一定有一個(gè)socket文件(可能在overlay中),在監(jiān)聽172.18.0.2:80這個(gè)端口,這樣container中的應(yīng)用就能從這里面取出數(shù)據(jù)進(jìn)行應(yīng)用層的處理了。

這個(gè)參數(shù)會(huì)帶來一個(gè)iptables的增加,如下,作用是將主機(jī)9980的流量,轉(zhuǎn)發(fā)到172.17.0.2:80上。
iptables -t nat -A DOCKER ! -i docker0 -p tcp -m tcp --dport 9980 -j DNAT --to-destination 172.17.0.2:80

[1](網(wǎng)絡(luò)基礎(chǔ)之網(wǎng)橋和交換機(jī)的工作原理及區(qū)別ugly_girl的博客-CSDN博客網(wǎng)橋和交換機(jī)的區(qū)別)
[2](VMware Wo(hù)rkstation 的三種網(wǎng)絡(luò)模式 - 知乎 (zhihu.com)
[3](iptables詳解及docker的iptables規(guī)則_摩洛哥M的博客-CSDN博客_docker iptables)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容