docker_practice/advanced_network/access_control.md

56 lines
2.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

## 容器访问控制
容器的访问控制主要通过Linux上的`iptables`防火墙来进行管理和实现。`iptables`是Linux上默认的防火墙软件在大部分发行版中都自带。
### 容器访问外部网络
容器要想访问外部网络需要本地系统的转发支持。在Linux系统中检查转发是否打开。
```
$sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 1
```
如果为0说明没有开启转发则需要手动打开。
```
$sysctl -w net.ipv4.ip_forward=1
```
如果在启动Docker服务的时候设定`--ip-forward=true`, Docker就会自动设定系统的`ip_forward`参数为1。
### 容器之间访问
容器之间相互访问,需要两方面的支持。
* 容器的网络拓扑是否已经互联。默认情况下,所有容器都会被连接到`docker0`网桥上。
* 本地系统的防火墙软件 -- `iptables`是否允许通过。
#### 访问所有端口
当启动Docker服务时候默认会添加一条转发策略到iptables的FORWARD链上。策略为通过`ACCEPT`)还是禁止(`DROP`)取决于配置`--icc=true`(缺省值)还是`--icc=false`。当然,如果手动指定`--iptables=false`则不会添加`iptables`规则。
可见,默认情况下,不同容器之间是允许网络相互访问的。如果为了安全考虑,可以在`/etc/default/docker`文件中配置`DOCKER_OPTS=--icc=false`来禁止它。
#### 访问指定端口
在通过`-icc=false`关闭网络访问后,还可以通过`--link=CONTAINER_NAME:ALIAS`选项来访问容器的开放端口。
例如在启动Docker服务时可以同时使用`icc=false --iptables=true`2个参数来关闭允许相互的网络访问并让Docker可以修改系统中的`iptables`规则。
此时,系统中的`iptables`规则可能是类似
```
$ 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`中为2个容器分别添加一条`ACCEPT`规则允许相互访问开放的端口取决于dockerfile中的EXPOSE行
当添加了`--link=CONTAINER_NAME:ALIAS`选项后,添加了`iptables`规则。
```
$ 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`参数指定的名字。主机名则不会被识别。