Docker 与 IPtables

Docker 与 IPtables

docker行为

默认情况下,Docker deamon会在启动container的时候向iptables中添加转发的规则。它会创建一个filter chain - DOCKER。

Chain FORWARD (policy DROP)
target     prot opt source               destination
DOCKER     all  --  0.0.0.0/0            0.0.0.0/0
...

Chain DOCKER (1 references)
target     prot opt source               destination
  • 同时,docke利用这个规则r向外暴露container的端口。但是,很不幸,这条规则将这个端口暴露给了全世界。

  • 所以,如果你是在宿主机直接运行docker,同时这个宿主机已经拥有了关于防火墙的一些配置(利用iptables)。

  • 那么,可以考虑在创建或者运行container的时候使用 --iptables=false。

docker对iptables的操作?

首先,我们确定场景:

  • 主机服务器可访问网络

    • 在主机内使用docker构建container

    • 主机拥有iptables,并用其进行防火墙的配置

    • 之后,我们需要让docker取消对我们系统iptables的操作和修改。我们就在启动daemon的时候使用如下的配置:

对于使用sysvinit和upstart的系统,我们可以修改 /etc/default/docker,docker的配置文件。对于systemd:

然后,重启我们的防火墙,同时重启docker daemon。然后我们就能够看到DOCKER这个chain以及和其相关的FORWARDchain的配置已经没有了。

为docker配置iptables, 例如以太网卡 ech0, docker默认网卡名称: 'docker0'。

我们可以通过以下设置配置FORWARD的rules:

同时,如果你想要暴露一个正在运行的container的TCP端口10000,,这个container需要将这port暴露给任何IP:

同时,我们可以将这个规则加入到iptables中,让外来访问可以通过防火墙访问container:

Last updated