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

Pet*_*sen 7 networking iptables docker

我有一个 Docker 容器向 Internet 公开端口 3306。我想限制对某些公共 IP 地址的访问。例如,让我们使用 1.2.3.4。

作为附加条件,我希望规则在重新启动 Docker 守护程序和重新启动服务器后仍然存在。这允许我在服务器重新启动时使用iptables-persistent( iptables-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
    
    Run Code Online (Sandbox Code Playgroud)

    这在启动 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
    
    Run Code Online (Sandbox Code Playgroud)

    这一直有效,直到dockerd重新启动。看起来在重新启动时dockerd清除了DOCKER链,并且所有自定义规则都消失了。

  3. 使用--iptables=false. 虽然这在原理上是有效的,但该解决方案打破了标准的 Docker 转发功能,需要手动设置转发规则。

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

PS:我做了一些阅读,但无济于事(例如,使用 iptables 限制与 docker 容器的外部连接的步骤?Docker - 可从外部访问的暴露端口 - iptables 规则被忽略,但这些问题似乎无法解决重启问题。 )

小智 1

dockersd可以使用以下选项运行:

--iptables=假

如果不手动运行而是用作服务,则只需在配置文件/etc/docker/daemon.json中添加或修改以下行即可:

“iptables”:假,

更详细的文档可以在这里找到