版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
手把手帶你搞定4大容器網(wǎng)絡(luò)問題一直以來,網(wǎng)絡(luò)都是容器中令人頭疼的問題。本文的主要目的是帶你解決容器網(wǎng)絡(luò)問題,讓你不再對它恐懼。使用容器總是感覺像變魔術(shù)一樣。對那些了解其內(nèi)部原理的人來說,它是一種很好的方式;而對那些不了解其內(nèi)部原理的人來說,這是一種可怕的方式。幸運(yùn)的是,我們研究容器化技術(shù)的內(nèi)部原理已經(jīng)很長一段時(shí)間了。我們甚至發(fā)現(xiàn),容器只是隔離的、受限制的Linux進(jìn)程,鏡像并不是運(yùn)行容器所必須的,相反——要構(gòu)建一個鏡像,我們需要運(yùn)行一些容器?,F(xiàn)在,讓我們來解決下容器網(wǎng)絡(luò)問題?;蛘?,更準(zhǔn)確地說,是單主機(jī)容器網(wǎng)絡(luò)問題。在本文中,我們將回答以下問題:如何虛擬化網(wǎng)絡(luò)資源,使容器認(rèn)為它們中的每一個都有一個專用的網(wǎng)絡(luò)堆棧?如何將容器變成友好的鄰居,防止它們相互干擾,并教它們?nèi)绾魏芎玫販贤??怎樣從容器?nèi)部訪問外部世界(比如互聯(lián)網(wǎng))?如何從外部世界(即端口發(fā)布)訪問運(yùn)行在一臺機(jī)器上的容器?因此,很明顯,單主機(jī)容器網(wǎng)絡(luò)只不過是一些眾所周知的Linux工具的簡單組合:網(wǎng)絡(luò)命名空間虛擬以太網(wǎng)設(shè)備(veth)虛擬網(wǎng)絡(luò)交換機(jī)(網(wǎng)橋)IP路由和網(wǎng)絡(luò)地址轉(zhuǎn)換(NAT)不管怎樣,不需要任何代碼就可以讓網(wǎng)絡(luò)魔法發(fā)生……1前提條件任何還算不錯的Linux發(fā)行版可能都足矣。本文中的所有例子都是在一個全新的vagrantCentOS8虛擬機(jī)上完成的:$vagrantinitcentos/8$vagrantup$vagrantssh[vagrant@localhost~]$uname-aLinuxlocalhost.localdomain4.18.0-147.3.1.el8_1.x86_64簡單起見,在本文中,我們不打算依賴任何成熟的容器化解決方案(例如docker或podman)。相反,我們將關(guān)注基本概念,并使用最簡單的工具來實(shí)現(xiàn)我們的學(xué)習(xí)目標(biāo)。2通過網(wǎng)絡(luò)命名空間隔離容器Linux網(wǎng)絡(luò)堆棧是由什么組成的?很明顯,是網(wǎng)絡(luò)設(shè)備的集合。還有什么?可能是路由規(guī)則集。不要忘了還有netfilter鉤子集,包括由iptables規(guī)則定義的。我們可以快速創(chuàng)建一個不是很完善的inspect-net-stack.sh腳本:#!/usr/bin/envbashecho">Networkdevices"iplinkecho-e"\n>Routetable"iprouteecho-e"\n>Iptablesrules"iptables--list-rules在運(yùn)行它之前,讓我們稍微修改下iptables規(guī)則,讓其更容易識別:$sudoiptables-NROOT_NS之后,在我的機(jī)器上執(zhí)行inspect腳本會產(chǎn)生以下輸出:$sudo./inspect-net-stack.sh>Networkdevices1:lo:mtu65536qdiscnoqueuestateUNKNOWNmodeDEFAULTgroupdefaultqlen1000link/loopback00:00:00:00:00:00brd00:00:00:00:00:002:eth0:mtu1500qdiscfq_codelstateUPmodeDEFAULTgroupdefaultqlen1000link/ether52:54:00:e3:27:77brdff:ff:ff:ff:ff:ff>Routetabledefaultviadeveth0protodhcpmetric100/24deveth0protokernelscopelinksrc5metric100>Iptablesrules-PINPUTACCEPT-PFORWARDACCEPT-POUTPUTACCEPT-NROOT_NS之所以對這個輸出感興趣,是因?yàn)槲覀兿氪_保即將創(chuàng)建的每個容器都將獲得一個單獨(dú)的網(wǎng)絡(luò)堆棧。你可能已經(jīng)聽說過,用于容器隔離的其中一個Linux名稱空間是網(wǎng)絡(luò)命名空間(networknamespace)。按照manip-netns的說法,“網(wǎng)絡(luò)命名空間在邏輯上是網(wǎng)絡(luò)堆棧的另一個副本,有自己的路由、防火墻規(guī)則和網(wǎng)絡(luò)設(shè)備?!焙唵纹鹨?,這將是我們在本文中使用的唯一命名空間。與其創(chuàng)建完全隔離的容器,不如將范圍限制在網(wǎng)絡(luò)堆棧中。創(chuàng)建網(wǎng)絡(luò)命名空間的一種方法是ip工具——是事實(shí)標(biāo)準(zhǔn)iproute2工具集的一部分:$sudoipnetnsaddnetns0$ipnetnsnetns0如何開始使用剛剛創(chuàng)建的命名空間?有一個可愛的Linux命令叫做nsenter。它輸入一個或多個指定的名稱空間,然后執(zhí)行給定的程序:$sudonsenter--net=/var/run/netns/netns0bash#Thenewlycreatedbashprocesslivesinnetns0$sudo./inspect-net-stack.sh>Networkdevices1:lo:mtu65536qdiscnoopstateDOWNmodeDEFAULTgroupdefaultqlen1000link/loopback00:00:00:00:00:00brd00:00:00:00:00:00>Routetable>Iptablesrules-PINPUTACCEPT-PFORWARDACCEPT-POUTPUTACCEPT從上面的輸出可以清楚地看出,在netns0命名空間內(nèi)運(yùn)行的bash進(jìn)程看到的是一個完全不同的網(wǎng)絡(luò)堆棧。沒有路由規(guī)則,沒有自定義iptables鏈,只有一個環(huán)回網(wǎng)絡(luò)設(shè)備。到目前為止,一切順利……3使用虛擬以太網(wǎng)設(shè)備(veth)將容器連接到主機(jī)如果我們不能與一個專用的網(wǎng)絡(luò)堆棧通信,那么它就沒那么有用了。幸運(yùn)的是,Linux為此提供了一個合適工具——虛擬以太網(wǎng)設(shè)備!按照manveth的說法,“veth設(shè)備是虛擬以太網(wǎng)設(shè)備。它們可以作為網(wǎng)絡(luò)命名空間之間的隧道,創(chuàng)建一個連接到另一個命名空間中物理網(wǎng)絡(luò)設(shè)備的橋,但也可以作為獨(dú)立的網(wǎng)絡(luò)設(shè)備使用?!碧摂M以太網(wǎng)設(shè)備總是成對出現(xiàn)。不用擔(dān)心,讓我們看一下創(chuàng)建命令就會明白了:$
sudo
ip
link
add
veth0
type
veth
peer
name
ceth0通過這個命令,我們剛剛創(chuàng)建了一對相互連接的虛擬以太網(wǎng)設(shè)備。名稱veth0和ceth0是任起的:$iplink1:lo:mtu65536qdiscnoqueuestateUNKNOWNmodeDEFAULTgroupdefaultqlen1000link/loopback00:00:00:00:00:00brd00:00:00:00:00:002:eth0:mtu1500qdiscfq_codelstateUPmodeDEFAULTgroupdefaultqlen1000link/ether52:54:00:e3:27:77brdff:ff:ff:ff:ff:ff5:ceth0@veth0:mtu1500qdiscnoopstateDOWNmodeDEFAULTgroupdefaultqlen1000link/ether66:2d:24:e3:49:3fbrdff:ff:ff:ff:ff:ff6:veth0@ceth0:mtu1500qdiscnoopstateDOWNmodeDEFAULTgroupdefaultqlen1000link/ether96:e8:de:1d:22:e0brdff:ff:ff:ff:ff:ff創(chuàng)建后,veth0和ceth0都駐留在主機(jī)的網(wǎng)絡(luò)堆棧(也稱為根網(wǎng)絡(luò)命名空間)上。為了連接根命名空間和netns0命名空間,我們需要將一個設(shè)備保留在根命名空間中,并將另一個設(shè)備移到netns0中:$sudoiplinksetceth0netnsnetns0#Listallthedevicestomakesureoneofthemdisappearedfromtherootstack$iplink1:lo:mtu65536qdiscnoqueuestateUNKNOWNmodeDEFAULTgroupdefaultqlen1000link/loopback00:00:00:00:00:00brd00:00:00:00:00:002:eth0:mtu1500qdiscfq_codelstateUPmodeDEFAULTgroupdefaultqlen1000link/ether52:54:00:e3:27:77brdff:ff:ff:ff:ff:ff6:veth0@if5:mtu1500qdiscnoopstateDOWNmodeDEFAULTgroupdefaultqlen1000link/ether96:e8:de:1d:22:e0brdff:ff:ff:ff:ff:fflink-netnsnetns0一旦我們打開設(shè)備并分配了正確的IP地址,任何出現(xiàn)在其中一臺設(shè)備上的數(shù)據(jù)包都會立即出現(xiàn)在連接兩個命名空間的對端設(shè)備上。讓我們從根命名空間開始:$sudoiplinksetveth0up$sudoipaddradd1/16devveth0接下來是etns0:$sudonsenter--net=/var/run/netns/netns0$iplinksetloup#whoops$iplinksetceth0up$ipaddradd0/16devceth0$iplink1:lo:mtu65536qdiscnoqueuestateUNKNOWNmodeDEFAULTgroupdefaultqlen1000link/loopback00:00:00:00:00:00brd00:00:00:00:00:005:ceth0@if6:mtu1500qdiscnoqueuestateUPmodeDEFAULTgroupdefaultqlen1000link/ether66:2d:24:e3:49:3fbrdff:ff:ff:ff:ff:fflink-netnsid0通過veth設(shè)備連接網(wǎng)絡(luò)命名空間現(xiàn)在可以檢查下連接了:#From`netns0`,pingroot'sveth0$ping-c21PING1(1)56(84)bytesofdata.64bytesfrom1:icmp_seq=1ttl=64time=0.038ms64bytesfrom1:icmp_seq=2ttl=64time=0.040ms---1pingstatistics---2packetstransmitted,2received,0%packetloss,time58msrttmin/avg/max/mdev=0.038/0.039/0.040/0.001ms#Leave`netns0`$exit#Fromrootnamespace,pingceth0$ping-c20PING0(0)56(84)bytesofdata.64bytesfrom0:icmp_seq=1ttl=64time=0.073ms64bytesfrom0:icmp_seq=2ttl=64time=0.046ms---0pingstatistics---2packetstransmitted,2received,0%packetloss,time3msrttmin/avg/max/mdev=0.046/0.059/0.073/0.015ms同時(shí),如果我們試圖從netns0命名空間訪問任何其他地址,都會失?。?Insiderootnamespace$ipaddrshowdeveth02:eth0:mtu1500qdiscfq_codelstateUPgroupdefaultqlen1000link/ether52:54:00:e3:27:77brdff:ff:ff:ff:ff:ffinet5/24brd55scopeglobaldynamicnoprefixrouteeth0valid_lft84057secpreferred_lft84057secinet6fe80::5054:ff:fee3:2777/64scopelinkvalid_lftforeverpreferred_lftforever#Rememberthis5$sudonsenter--net=/var/run/netns/netns0#Tryhost'seth0$ping5connect:Networkisunreachable#TrysomethingfromtheInternet$pingconnect:Networkisunreachable不過,這很容易解釋。對于這樣的數(shù)據(jù)包,在netns0的路由表中沒有路由。其中,唯一的條目顯示了如何到達(dá)/16網(wǎng)絡(luò):#From`netns0`namespace:$iproute/16devceth0protokernelscopelinksrc0Linux有很多方法來填充路由表。其中之一是從直接連接的網(wǎng)絡(luò)接口提取路由。記住,在命名空間創(chuàng)建后,netns0的路由表是空的。但隨后我們添加了ceth0設(shè)備,并為它分配了一個IP地址0/16。由于我們使用的不是一個簡單的IP地址,而是地址和網(wǎng)絡(luò)掩碼的組合,網(wǎng)絡(luò)堆棧會設(shè)法從中提取路由信息。每個發(fā)往/16網(wǎng)絡(luò)的數(shù)據(jù)包將通過ceth0設(shè)備發(fā)送。但是任何其他的包都會被丟棄。類似地,在根命名空間中有一條新路由:在公眾號編程技術(shù)圈后臺回復(fù)“Java”,獲取一份驚喜禮包。#From`root`namespace:$iproute#...omitedlines.../16devveth0protokernelscopelinksrc1現(xiàn)在,我們已經(jīng)回答了我們的第一個問題。我們現(xiàn)在知道了如何隔離、虛擬化和連接Linux網(wǎng)絡(luò)堆棧。4通過虛擬網(wǎng)絡(luò)交換機(jī)(網(wǎng)橋)實(shí)現(xiàn)容器互連容器化的整個理念可以歸結(jié)為有效的資源共享。也就是說,每臺機(jī)器一個容器的情況并不常見。相反,我們的目標(biāo)是在共享環(huán)境中運(yùn)行盡可能多的隔離進(jìn)程。那么,如果我們按照上面的veth方法將多個容器放在同一主機(jī)上,會發(fā)生什么呢?讓我們添加第二個容器:#Fromrootnamespace$sudoipnetnsaddnetns1$sudoiplinkaddveth1typevethpeernameceth1$sudoiplinksetceth1netnsnetns1$sudoiplinksetveth1up$sudoipaddradd1/16devveth1$sudonsenter--net=/var/run/netns/netns1$iplinksetloup$iplinksetceth1up$ipaddradd0/16devceth1我最喜歡的部分,檢查連接:#From`netns1`wecannotreachtherootnamespace!$ping-c21PING1(1)56(84)bytesofdata.From0icmp_seq=1DestinationHostUnreachableFrom0icmp_seq=2DestinationHostUnreachable---1pingstatistics---2packetstransmitted,0received,+2errors,100%packetloss,time55mspipe2#Butthereisaroute!$iproute/16devceth1protokernelscopelinksrc0#Leaving`netns1`$exit#Fromrootnamespacewecannotreachthe`netns1`$ping-c20PING0(0)56(84)bytesofdata.From1icmp_seq=1DestinationHostUnreachableFrom1icmp_seq=2DestinationHostUnreachable---0pingstatistics---2packetstransmitted,0received,+2errors,100%packetloss,time23mspipe2#From`netns0`weCANreach`veth1`$sudonsenter--net=/var/run/netns/netns0$ping-c21PING1(1)56(84)bytesofdata.64bytesfrom1:icmp_seq=1ttl=64time=0.037ms64bytesfrom1:icmp_seq=2ttl=64time=0.046ms---1pingstatistics---2packetstransmitted,2received,0%packetloss,time33msrttmin/avg/max/mdev=0.037/0.041/0.046/0.007ms#Butwestillcannotreach`netns1`$ping-c20PING0(0)56(84)bytesofdata.From0icmp_seq=1DestinationHostUnreachableFrom0icmp_seq=2DestinationHostUnreachable---0pingstatistics---2packetstransmitted,0received,+2errors,100%packetloss,time63mspipe2有點(diǎn)不對勁……netns1遇到問題。由于某些原因,它不能與根通信,我們也不能從根命名空間訪問它。然而,由于兩個容器都位于同一個IP網(wǎng)絡(luò)/16中,我們現(xiàn)在可以從netns0容器與主機(jī)的veth1進(jìn)行通信。非常有趣……我花了些時(shí)間才想明白,但顯然我們面臨的是路由沖突。讓我們檢查下根命名空間中的路由表:$iproute#...omitedlines...#/16devveth0protokernelscopelinksrc1/16devveth1protokernelscopelinksrc1雖然在添加了第二個veth對后,根的網(wǎng)絡(luò)堆棧學(xué)習(xí)到了新的路由/16devveth1protokernelscopelinksrc1,但是,現(xiàn)有的路由中已經(jīng)有一條針對同一網(wǎng)絡(luò)的路由。當(dāng)?shù)诙€容器試圖pingveth1設(shè)備時(shí),將選擇第一個路由,這會破壞連接。如果我們刪除第一條路由sudoiproutedelete/16devveth0protokernelscopelinksrc1,并重新檢查連接,情況就會反過來,即netns1的連接將恢復(fù),但netns0就有問題了。我相信,如果我們?yōu)閚etns1選擇另一個IP網(wǎng)絡(luò),一切就沒問題了。然而,多個容器位于一個IP網(wǎng)絡(luò)中是一個合理的用例。因此,我們需要以某種方式調(diào)整veth方法…看看Linux網(wǎng)橋——另一種虛擬網(wǎng)絡(luò)設(shè)施!Linux網(wǎng)橋的行為就像一個網(wǎng)絡(luò)交換機(jī)。它會在連接到它的接口之間轉(zhuǎn)發(fā)數(shù)據(jù)包。因?yàn)樗且粋€交換機(jī),所以它是在L2(即以太網(wǎng))層完成這項(xiàng)工作的。讓我們試著操作下吧。但首先,我們需要清理現(xiàn)有的設(shè)置,因?yàn)榈侥壳盀橹梗覀兯龅囊恍┡渲酶膶?shí)際上已經(jīng)不再需要了。刪除網(wǎng)絡(luò)命名空間就足夠了:$sudoipnetnsdeletenetns0$sudoipnetnsdeletenetns1#Butifyoustillhavesomeleftovers...$sudoiplinkdeleteveth0$sudoiplinkdeleteceth0$sudoiplinkdeleteveth1$sudoiplinkdeleteceth1快速重建兩個容器。注意,我們沒有給新的veth0和veth1設(shè)備分配任何IP地址:$sudoipnetnsaddnetns0$sudoiplinkaddveth0typevethpeernameceth0$sudoiplinksetveth0up$sudoiplinksetceth0netnsnetns0$sudonsenter--net=/var/run/netns/netns0$iplinksetloup$iplinksetceth0up$ipaddradd0/16devceth0$exit$sudoipnetnsaddnetns1$sudoiplinkaddveth1typevethpeernameceth1$sudoiplinksetveth1up$sudoiplinksetceth1netnsnetns1$sudonsenter--net=/var/run/netns/netns1$iplinksetloup$iplinksetceth1up$ipaddradd0/16devceth1$exit確保主機(jī)上沒有新路由:$iproutedefaultviadeveth0protodhcpmetric100/24deveth0protokernelscopelinksrc5metric100最后,創(chuàng)建網(wǎng)橋接口:$sudoiplinkaddbr0typebridge$sudoiplinksetbr0up現(xiàn)在,將veth0和veth1兩端都連接到網(wǎng)橋上:$sudoiplinksetveth0masterbr0$sudoiplinksetveth1masterbr0然后檢查容器之間的連接:$sudonsenter--net=/var/run/netns/netns0$ping-c20PING0(0)56(84)bytesofdata.64bytesfrom0:icmp_seq=1ttl=64time=0.259ms64bytesfrom0:icmp_seq=2ttl=64time=0.051ms---0pingstatistics---2packetstransmitted,2received,0%packetloss,time2msrttmin/avg/max/mdev=0.051/0.155/0.259/0.104ms$sudonsenter--net=/var/run/netns/netns1$ping-c20PING0(0)56(84)bytesofdata.64bytesfrom0:icmp_seq=1ttl=64time=0.037ms64bytesfrom0:icmp_seq=2ttl=64time=0.089ms---0pingstatistics---2packetstransmitted,2received,0%packetloss,time36msrttmin/avg/max/mdev=0.037/0.063/0.089/0.026ms真令人愉快!一切正常。使用這種新方法,我們根本沒有配置veth0和veth1。我們只在ceth0和ceth1端分配了兩個IP地址。但是,由于它們都在同一個以太網(wǎng)段(記住,我們將它們連接到虛擬交換機(jī)),所以L2層上有連接:$sudonsenter--net=/var/run/netns/netns0$ipneigh0devceth0lladdr6e:9c:ae:02:60:deSTALE$exit$sudonsenter--net=/var/run/netns/netns1$ipneigh0devceth1lladdr66:f3:8c:75:09:29STALE$exit恭喜,我們學(xué)會了如何將容器變成友好的鄰居,防止它們相互干擾,并保持連接性。5訪問外部世界(IP路由和偽裝)容器之間可以通信了。但它們可以和主機(jī)(即根命名空間)通信嗎?$sudonsenter--net=/var/run/netns/netns0$ping5#eth0addressconnect:Networkisunreachable很明顯,netns0中沒有相應(yīng)的路由:$iproute/16devceth0protokernelscopelinksrc0根命名空間也不能和容器通信:#Useexittoleave`netns0`first:$ping-c20PING0(0)56(84)bytesofdata.From23icmp_seq=1DestinationNetUnreachableFrom23icmp_seq=2DestinationNetUnreachable---0pingstatistics---2packetstransmitted,0received,+2errors,100%packetloss,time3ms$ping-c20PING0(0)56(84)bytesofdata.From23icmp_seq=1DestinationNetUnreachableFrom23icmp_seq=2DestinationNetUnreachable---0pingstatistics---2packetstransmitted,0received,+2errors,100%packetloss,time3ms為了在根命名空間和容器命名空間之間建立連接,我們需要為網(wǎng)橋網(wǎng)絡(luò)接口分配IP地址:$
sudo
ip
addr
add
/16
dev
br0一旦我們給網(wǎng)橋接口分配了IP地址,我們的主機(jī)路由表上就會多一條路由:$iproute#...omittedlines.../16devbr0protokernelscopelinksrc$ping-c20PING0(0)56(84)bytesofdata.64bytesfrom0:icmp_seq=1ttl=64time=0.036ms64bytesfrom0:icmp_seq=2ttl=64time=0.049ms---0pingstatistics---2packetstransmitted,2received,0%packetloss,time11msrttmin/avg/max/mdev=0.036/0.042/0.049/0.009ms$ping-c20PING0(0)56(84)bytesofdata.64bytesfrom0:icmp_seq=1ttl=64time=0.059ms64bytesfrom0:icmp_seq=2ttl=64time=0.056ms---0pingstatistics---2packetstransmitted,2received,0%packetloss,time4msrttmin/avg/max/mdev=0.056/0.057/0.059/0.007ms容器可能還具有ping網(wǎng)橋接口的能力,但它們?nèi)匀粺o法連接到主機(jī)的eth0。我們需要為容器添加默認(rèn)路由:在公眾號后端架構(gòu)師后臺回復(fù)“架構(gòu)整潔”,獲取一份驚喜禮包。$sudonsenter--net=/var/run/netns/netns0$iprouteadddefaultvia$ping-c25PING5(5)56(84)bytesofdata.64bytesfrom5:icmp_seq=1ttl=64time=0.036ms64bytesfrom5:icmp_seq=2ttl=64time=0.053ms---5pingstatistics---2packetstransmitted,2received,0%packetloss,time14msrttmin/avg/max/mdev=0.036/0.044/0.053/0.010ms#Andrepeatthechangefor`netns1`這項(xiàng)更改基本上把主機(jī)變成了路由器,網(wǎng)橋接口成了容器的默認(rèn)網(wǎng)關(guān)。很好,我們將容器與根命名空間連接起來了。現(xiàn)在,讓我們嘗試將它們與外部世界連接起來。默認(rèn)情況下,在Linux中數(shù)據(jù)包轉(zhuǎn)發(fā)(即路由器功能)是禁用的。我們需要打開它:#Intherootnamespacesudobash-c'echo1>/proc/sys/net/ipv4/ip_forward'又到我最喜歡的部分了,檢查連接:$sudonsenter--net=/var/run/netns/netns0$ping#hangsindefinitelylongforme...還是不行。我們漏了什么嗎?如果容器向外部世界發(fā)送數(shù)據(jù)包,那么目標(biāo)服務(wù)器將不能將數(shù)據(jù)包發(fā)送回容器,因?yàn)槿萜鞯腎P地址是私有的。也就是說,只有本地網(wǎng)絡(luò)才知道特定IP的路由規(guī)則。世界上有很多容器共享完全相同的私有IP地址0。解決這個問題的方法叫做網(wǎng)絡(luò)地址轉(zhuǎn)換(NAT)。在進(jìn)入外部網(wǎng)絡(luò)前,由容器發(fā)出的數(shù)據(jù)包將其源IP地址替換為主機(jī)的外部接口地址。主機(jī)還將跟蹤所有現(xiàn)有的映射,并且在數(shù)據(jù)包到達(dá)時(shí),它會在將其轉(zhuǎn)發(fā)回容器之前還原IP地址。聽起來很復(fù)雜,但我有個好消息要告訴你!有了iptables模塊,我們只需要一個命令就可以實(shí)現(xiàn):$
sudo
iptables
-t
nat
-A
POSTROUTING
-s
/16
!
-o
br0
-j
MASQUERADE這個命令相當(dāng)簡單。我們正在向POSTROUTING鏈的nat表添加一條新規(guī)則,要求偽裝所有源自/16網(wǎng)絡(luò)的數(shù)據(jù)包,但不是通過網(wǎng)橋接口。檢查連接:$sudonsenter--net=/var/run/netns/netns0$ping-c2PING()56(84)bytesofdata.64bytesfrom:icmp_seq=1ttl=61time=43.2ms64bytesfrom:icmp_seq=2ttl=61time=36.8ms---pingstatistics---2packetstransmitted,2received,0%packetloss,time2msrttmin/avg/max/mdev=36.815/40.008/43.202/3.199ms注意,我們遵循的是默認(rèn)允許(bydefault-allow)策略,這在現(xiàn)實(shí)世界中可能相當(dāng)危險(xiǎn)。對于每個鏈,主機(jī)默認(rèn)的iptables策略都是ACCEPT:sudoiptables-S-PINPUTACCEPT-PFORWARDACCEPT-POUTPUTACCEPT相反,作為一個很好的例子,Docker默認(rèn)限制了一切,然后只啟用已知路徑的路由。以下是在CentOS8機(jī)器上(在5005端口上暴露了單個容器)Docker守護(hù)進(jìn)程生成的轉(zhuǎn)儲規(guī)則:$sudoiptables-tfilter--list-rules-PINPUTACCEPT-PFORWARDDROP-POUTPUTACCEPT-NDOCKER-NDOCKER-ISOLATION-STAGE-1-NDOCKER-ISOLATION-STAGE-2-NDOCKER-USER-AFORWARD-jDOCKER-USER-AFORWARD-jDOCKER-ISOLATION-STAGE-1-AFORWARD-odocker0-mconntrack--ctstateRELATED,ESTABLISHED-jACCEPT-AFORWARD-odocker0-jDOCKER-AFORWARD-idocker0!-odocker0-jACCEPT-AFORWARD-idocker0-odocker0-jACCEPT-ADOCKER-d/32!-idocker0-odocker0-ptcp-mtcp--dport5000-jACCEPT-ADOCKER-ISOLATION-STAGE-1-idocker0!-odocker0-jDOCKER-ISOLATION-STAGE-2-ADOCKER-ISOLATION-STAGE-1-jRETURN-ADOCKER-ISOLATION-STAGE-2-odocker0-jDROP-ADOCKER-ISOLATION-STAGE-2-jRETURN-ADOCKER-USER-jRETURN$sudoiptables-tnat--list-rules-PPREROUTINGACCEPT-PINPUTACCEPT-PPOSTROUTINGACCEPT-POUTPUTACCEPT-NDOCKER-APREROUTING-maddrtype--dst-typeLOCAL-jDOCKER-APOSTROUTING-s/16!-odocker0-jMASQUERADE-APOSTROUTING-s/32-d/32-ptcp-mtcp--dport5000-jMASQUERADE-AOUTPUT!-d/8-maddrtype--dst-typeLOCAL-jDOCKER-ADOCKER-idocker0-jRETURN-ADOCKER!-idocker0-ptcp-mtcp--dport5005-jDNAT--to-destination:5000$sudoiptables-tmangle--list-rules-PPREROUTINGACCEPT-PINPUTACCEPT-PFORWARDACCEPT-POUTPUTACCEPT-PPOSTROUTINGACCEPT$sudoiptables-traw--list-rules-PPREROUTINGACCEPT-POUTPUTACCEPT6從外部訪問容器(端口發(fā)布)我們都知道,有一種做法是將容器端口發(fā)布到主機(jī)的部分(或全部)接口。但端口發(fā)布的真正含義是什么?假設(shè)我們有一個在容器內(nèi)運(yùn)行的服務(wù)器:$sudonsenter--net=/var/run/netns/netns0$python3-mhttp.server--bind05000如果我們試圖從主機(jī)向這個服務(wù)器進(jìn)程發(fā)送一個HTTP請求,一切都沒問題(好吧,根命名空間和所有容器接口之間都有連接,為什么沒有呢?):#Fromrootnamespace$curl0:5000#...omitedlines...但是,如果我們要從外部訪問該服務(wù)器,我們將使用哪個IP地址?我們知道的唯一IP地址可能是主機(jī)的外部接口地址eth0:$curl5:5000curl:(7)Failedtoconnec
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 檢察文檔管理數(shù)字化資料
- 第二屆全國小動物臨床技能大賽參考試題庫(含答案)
- 《網(wǎng)絡(luò)安全法》知識考試題庫300題(含答案)
- 2025年新疆交通職業(yè)技術(shù)學(xué)院高職單招職業(yè)技能測試近5年??及鎱⒖碱}庫含答案解析
- 專題06 語法填空 解題技巧
- 2025年春季學(xué)期學(xué)校德育工作計(jì)劃安排表(完整版)
- 實(shí)驗(yàn)室的租賃合同
- 范文汽車場地租賃合同
- 搭建冷庫及對設(shè)備的銷售安裝合同
- 建筑服務(wù)勞務(wù)合同范本
- 2025年有機(jī)肥行業(yè)發(fā)展趨勢分析報(bào)告
- 2023-2024年員工三級安全培訓(xùn)考試題及參考答案(綜合題)
- 2025保安部年度工作計(jì)劃
- 2024年江蘇經(jīng)貿(mào)職業(yè)技術(shù)學(xué)院單招職業(yè)適應(yīng)性測試題庫
- 招標(biāo)采購基礎(chǔ)知識培訓(xùn)
- 電力系統(tǒng)分布式模型預(yù)測控制方法綜述與展望
- 2024年注冊建筑師-二級注冊建筑師考試近5年真題附答案
- 五年級口算題卡每天100題帶答案
- 2024年貴州省中考理科綜合試卷(含答案)
- 無人機(jī)技術(shù)與遙感
評論
0/150
提交評論