Docker容器訪問控制

2018-08-04 17:56 更新

容器的訪問控制,主要通過 Linux 上的 iptables 防火墻來進行管理和實現(xiàn)。iptables 是 Linux 上默認的防火墻軟件,在大部分發(fā)行版中都自帶。

容器訪問外部網(wǎng)絡(luò)

容器要想訪問外部網(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ā),則需要手動打開。

$sysctl -w net.ipv4.ip_forward=1

如果在啟動 Docker 服務(wù)的時候設(shè)定 --ip-forward=true, Docker 就會自動設(shè)定系統(tǒng)的 ip_forward 參數(shù)為 1。

容器之間訪問

容器之間相互訪問,需要兩方面的支持。

  • 容器的網(wǎng)絡(luò)拓撲是否已經(jīng)互聯(lián)。默認情況下,所有容器都會被連接到 docker0 網(wǎng)橋上。
  • 本地系統(tǒng)的防火墻軟件 -- iptables 是否允許通過。

訪問所有端口

當啟動 Docker 服務(wù)時候,默認會添加一條轉(zhuǎn)發(fā)策略到 iptables 的 FORWARD 鏈上。策略為通過(ACCEPT)還是禁止(DROP)取決于配置--icc=true(缺省值)還是 --icc=false。當然,如果手動指定 --iptables=false 則不會添加 iptables 規(guī)則。

可見,默認情況下,不同容器之間是允許網(wǎng)絡(luò)互通的。如果為了安全考慮,可以在 /etc/default/docker 文件中配置 DOCKER_OPTS=--icc=false 來禁止它。

訪問指定端口

在通過 -icc=false 關(guān)閉網(wǎng)絡(luò)訪問后,還可以通過 --link=CONTAINER_NAME:ALIAS 選項來訪問容器的開放端口。

例如,在啟動 Docker 服務(wù)時,可以同時使用 icc=false --iptables=true 參數(shù)來關(guān)閉允許相互的網(wǎng)絡(luò)訪問,并讓 Docker 可以修改系統(tǒng)中的 iptables 規(guī)則。

此時,系統(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
...

之后,啟動容器(docker run)時使用 --link=CONTAINER_NAME:ALIAS 選項。Docker 會在 iptable 中為 兩個容器分別添加一條 ACCEPT 規(guī)則,允許相互訪問開放的端口(取決于 Dockerfile 中的 EXPOSE 行)。

當添加了 --link=CONTAINER_NAME:ALIAS 選項后,添加了 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ù)指定的名字。主機名則不會被識別。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號