如果要深入了解docker的網(wǎng)絡(luò)配置局荚,那就得先了解iptables轮傍。本文接下來(lái)會(huì)從0到1的說(shuō)說(shuō)iptables挥下。
什么是iptables
iptables是linux自帶的一款開(kāi)源的內(nèi)核級(jí)基于數(shù)據(jù)包過(guò)濾的防火墻偎蘸。利用iptables可以實(shí)現(xiàn)諸如數(shù)據(jù)包過(guò)濾、轉(zhuǎn)發(fā)等功能迷雪。
基本概念
iptables包含表限书,表中包含鏈,鏈中包含規(guī)則章咧。(規(guī)則指的是一條條用于過(guò)濾數(shù)據(jù)包的語(yǔ)句)
iptables共有四個(gè)表五個(gè)鏈倦西,簡(jiǎn)稱(chēng)四表五鏈。
四表指的是filter, nat, mangle, raw赁严。其中前2個(gè)是用的最多的扰柠,后面2個(gè)用的較少,raw可以說(shuō)基本不怎么使用疼约。
五鏈指的是INPUT, OUTPUT, FORWARD, PREROUTING, POSTROUTING卤档。(注意,鏈名用大寫(xiě)程剥。)
下表列出了三個(gè)常用表中包含的鏈:
下面介紹常用的filter表和nat表劝枣。
filter表
過(guò)濾數(shù)據(jù)包,用于本機(jī)防火墻织鲸,這是默認(rèn)表舔腾。
包含的三個(gè)鏈,
INPUT 鏈:用于過(guò)濾所有目標(biāo)地址是本機(jī)的數(shù)據(jù)包
OUTPUT 鏈:用于過(guò)濾所有本機(jī)產(chǎn)生的數(shù)據(jù)包
FORWARD鏈:用于過(guò)濾所有路過(guò)本機(jī)的數(shù)據(jù)包
nat表
網(wǎng)絡(luò)地址轉(zhuǎn)換(Network Address Translation)搂擦。
包含的三個(gè)動(dòng)作稳诚,
DNAT:改變數(shù)據(jù)包的目的地址使包能重路由到某臺(tái)機(jī)器,使公網(wǎng)能夠訪(fǎng)問(wèn)局域網(wǎng)內(nèi)的服務(wù)器
SNAT: 改變數(shù)據(jù)包的源地址盾饮,使局域網(wǎng)能訪(fǎng)問(wèn)公網(wǎng)
MASQUERADE:假如當(dāng)前系統(tǒng)用的是ADSL動(dòng)態(tài)撥號(hào)方式采桃,那么每次撥號(hào)懒熙,出口IP都會(huì)改變丘损,SNAT就無(wú)法使用。而MASQUERADE作用就是將IP偽裝成為封包出去的那塊裝置上的IP工扎,MASQUERADE會(huì)自動(dòng)讀取ip地址然后做SNAT出去徘钥。
包含的三個(gè)鏈,
PREROUTING鏈:數(shù)據(jù)包到達(dá)防火墻時(shí)改變包的目的地址肢娘。
OUTPUT鏈:改變本地產(chǎn)生數(shù)據(jù)包的目標(biāo)地址呈础。
POSTROUTING:在數(shù)據(jù)包離開(kāi)防火墻時(shí)改變數(shù)據(jù)包的源地址舆驶。
原理淺析
如下圖,當(dāng)請(qǐng)求主機(jī)的某個(gè)服務(wù)時(shí)而钞,需要經(jīng)過(guò)iptables中的匹配規(guī)則沙廉,由上到下層層過(guò)濾。
下圖描述了一個(gè)數(shù)據(jù)包在linux內(nèi)核的處理流程臼节。
對(duì)于收到的每個(gè)數(shù)據(jù)包撬陵,都從A點(diǎn)進(jìn)來(lái),經(jīng)過(guò)路由判決(分析數(shù)據(jù)包的目的地址)网缝,如果是發(fā)送給本機(jī)的就經(jīng)過(guò)B點(diǎn)巨税,然后傳遞給進(jìn)程處理;否則就經(jīng)過(guò)C點(diǎn)粉臊,然后順著E點(diǎn)將該包轉(zhuǎn)發(fā)出去草添。
對(duì)于發(fā)送的每個(gè)數(shù)據(jù)包,也有一個(gè)路由判決扼仲,以確定該包是從哪個(gè)接口出去远寸,然后經(jīng)過(guò)D點(diǎn),最后也是順著E點(diǎn)將該包發(fā)送出去犀盟。
圖中ABCDE五個(gè)點(diǎn)就是上面提到的五個(gè)鏈而晒,如下圖:
再詳細(xì)點(diǎn),在上圖中添加表阅畴,那就變?yōu)橄聢D:
從該圖可以總結(jié)出:
- 四表其實(shí)是對(duì)鏈進(jìn)一步劃分出了4類(lèi)倡怎,且每類(lèi)在執(zhí)行上有著不同的優(yōu)先級(jí)。對(duì)于一個(gè)數(shù)據(jù)包贱枣,四個(gè)表中的規(guī)則處理的優(yōu)先級(jí):raw>mangle>nat>filter监署。
- 真正讓防火墻起作用的是規(guī)則,而五表其實(shí)是5個(gè)hook點(diǎn)纽哥,規(guī)則在這5個(gè)點(diǎn)執(zhí)行钠乏。
為了精簡(jiǎn),將該圖中不太常用的mangle表去掉春塌,剩下的表和鏈也是最常用的晓避,如下圖:
上圖中,上面的弧線(xiàn)所在的路徑只壳,常用來(lái)配置主機(jī)防火墻俏拱,而下面的從左到右的直線(xiàn),是用來(lái)做nat的吼句,docker默認(rèn)的網(wǎng)絡(luò)配置即通過(guò)該路徑锅必。
總結(jié)一下iptables的用途:
利用filter表作為主機(jī)防火墻;
利用nat表的POSTROUTING鏈惕艳,使局域網(wǎng)內(nèi)的機(jī)器上網(wǎng)搞隐;
利用nat表的PREROUTING鏈驹愚,將外部socket映射為內(nèi)部socket;
下一節(jié)中將描述docker默認(rèn)的nat網(wǎng)絡(luò)配置劣纲。