Docker:限制访问某些IP地址的正确方法

我有一个Docker容器暴露端口3306到互联网。 我想限制访问某些公共IP地址。 作为一个例子,我们使用1.2.3.4。

作为一个附加条件,我希望规则能够在重启Docker守护进程并重新启动服务器的过程中生存下来。 这使我可以使用iptables-persistentiptables-save / iptables-restore )来重新启动服务器时恢复规则,而不会影响dockerd启动。

我尝试了以下内容:

  1. 修改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在链的顶部插入额外的规则,我的自定义规则最终被忽略。

  2. 修改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链,所有的自定义规则都消失了。

  3. 使用--iptables=false 。 虽然这在原则上起作用,但是这个解决scheme打破了标准的Docker转发function,并且需要手动设置转发规则。

如果没有正确的方法来做到这一点,我会感到惊讶。 有任何想法吗?

PS:我做了一些阅读,无济于事(例如步骤限制外部连接到docker容器与iptables?, docker – 暴露的端口可以从外部访问 – iptables规则忽略 ,但这些问题似乎并没有处理重新启动问题。 )

dockersd可以运行选项:

–iptables = FALSE

如果不是手动运行,而是作为服务使用,则足以在configuration文件/etc/docker/daemon.json中添加或修改以下行:

“iptables”:false,

更详细的文档可以在这里find