W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
容器的訪問控制,主要通過 Linux 上的 iptables
防火墻來進(jìn)行管理和實(shí)現(xiàn)。iptables
是 Linux 上默認(rèn)的防火墻軟件,在大部分發(fā)行版中都自帶。
容器要想訪問外部網(wǎng)絡(luò),需要本地系統(tǒng)的轉(zhuǎn)發(fā)支持。在Linux 系統(tǒng)中,檢查轉(zhuǎn)發(fā)是否打開。
$sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 1
如果為 0,說明沒有開啟轉(zhuǎn)發(fā),則需要手動(dòng)打開。
$sysctl -w net.ipv4.ip_forward=1
如果在啟動(dòng) Docker 服務(wù)的時(shí)候設(shè)定 --ip-forward=true
, Docker 就會(huì)自動(dòng)設(shè)定系統(tǒng)的 ip_forward
參數(shù)為 1。
容器之間相互訪問,需要兩方面的支持。
docker0
網(wǎng)橋上。iptables
是否允許通過。當(dāng)啟動(dòng) Docker 服務(wù)時(shí)候,默認(rèn)會(huì)添加一條轉(zhuǎn)發(fā)策略到 iptables 的 FORWARD 鏈上。策略為通過(ACCEPT
)還是禁止(DROP
)取決于配置--icc=true
(缺省值)還是 --icc=false
。當(dāng)然,如果手動(dòng)指定 --iptables=false
則不會(huì)添加 iptables
規(guī)則。
可見,默認(rèn)情況下,不同容器之間是允許網(wǎng)絡(luò)互通的。如果為了安全考慮,可以在 /etc/default/docker
文件中配置 DOCKER_OPTS=--icc=false
來禁止它。
在通過 -icc=false
關(guān)閉網(wǎng)絡(luò)訪問后,還可以通過 --link=CONTAINER_NAME:ALIAS
選項(xiàng)來訪問容器的開放端口。
例如,在啟動(dòng) Docker 服務(wù)時(shí),可以同時(shí)使用 icc=false --iptables=true
參數(shù)來關(guān)閉允許相互的網(wǎng)絡(luò)訪問,并讓 Docker 可以修改系統(tǒng)中的 iptables
規(guī)則。
此時(shí),系統(tǒng)中的 iptables
規(guī)則可能是類似
$ sudo iptables -nL
...
Chain FORWARD (policy ACCEPT)
target prot opt source destination
DROP all -- 0.0.0.0/0 0.0.0.0/0
...
之后,啟動(dòng)容器(docker run
)時(shí)使用 --link=CONTAINER_NAME:ALIAS
選項(xiàng)。Docker 會(huì)在 iptable
中為 兩個(gè)容器分別添加一條 ACCEPT
規(guī)則,允許相互訪問開放的端口(取決于 Dockerfile 中的 EXPOSE 行)。
當(dāng)添加了 --link=CONTAINER_NAME:ALIAS
選項(xiàng)后,添加了 iptables
規(guī)則。
$ sudo iptables -nL
...
Chain FORWARD (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- 172.17.0.2 172.17.0.3 tcp spt:80
ACCEPT tcp -- 172.17.0.3 172.17.0.2 tcp dpt:80
DROP all -- 0.0.0.0/0 0.0.0.0/0
注意:--link=CONTAINER_NAME:ALIAS
中的 CONTAINER_NAME
目前必須是 Docker 分配的名字,或使用 --name
參數(shù)指定的名字。主機(jī)名則不會(huì)被識別。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: