Pet*_*sen 7 networking iptables docker
我有一个 Docker 容器向 Internet 公开端口 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
Run Code Online (Sandbox Code Playgroud)
这在启动 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
Run Code Online (Sandbox Code Playgroud)
这一直有效,直到dockerd
重新启动。看起来在重新启动时dockerd
清除了DOCKER
链,并且所有自定义规则都消失了。
使用--iptables=false
. 虽然这在原理上是有效的,但该解决方案打破了标准的 Docker 转发功能,需要手动设置转发规则。
如果没有适当的方法来做到这一点,我会感到惊讶。有任何想法吗?
PS:我做了一些阅读,但无济于事(例如,使用 iptables 限制与 docker 容器的外部连接的步骤?,Docker - 可从外部访问的暴露端口 - iptables 规则被忽略,但这些问题似乎无法解决重启问题。 )
小智 1
dockersd可以使用以下选项运行:
--iptables=假
如果不手动运行而是用作服务,则只需在配置文件/etc/docker/daemon.json中添加或修改以下行即可:
“iptables”:假,