我有一个Docker容器暴露端口3306到互联网。 我想限制访问某些公共IP地址。 作为一个例子,我们使用1.2.3.4。
作为一个附加条件,我希望规则能够在重启Docker守护进程并重新启动服务器的过程中生存下来。 这使我可以使用iptables-persistent ( iptables-save / iptables-restore )来重新启动服务器时恢复规则,而不会影响dockerd启动。
我尝试了以下内容:
修改FORWARD链:
iptables -I FORWARD -p tcp --dport 3306 -j REJECT iptables -I FORWARD -p tcp --dport 3306 -s 1.2.3.4 -j ACCEPT
这在启动Docker守护进程后完成。 当重启守护进程时,Docker在链的顶部插入额外的规则,我的自定义规则最终被忽略。
修改DOCKER链:
iptables -N DOCKER # if chain does not yet exist iptables -I DOCKER -p tcp --dport 3306 -j REJECT iptables -I DOCKER -p tcp --dport 3306 -s 1.2.3.4 -j ACCEPT
这工作,直到dockerd重新启动。 它看起来像dockerd重新启动清除DOCKER链,所有的自定义规则都消失了。
使用--iptables=false 。 虽然这在原则上起作用,但是这个解决scheme打破了标准的Docker转发function,并且需要手动设置转发规则。
如果没有正确的方法来做到这一点,我会感到惊讶。 有任何想法吗?
PS:我做了一些阅读,无济于事(例如步骤限制外部连接到docker容器与iptables?, docker – 暴露的端口可以从外部访问 – iptables规则忽略 ,但这些问题似乎并没有处理重新启动问题。 )
dockersd可以运行选项:
–iptables = FALSE
如果不是手动运行,而是作为服务使用,则足以在configuration文件/etc/docker/daemon.json中添加或修改以下行:
“iptables”:false,
更详细的文档可以在这里find