首页 > 解决方案 > 允许 DOCKER-USER 链中的一些 IP 用于入站流量,拒绝所有其他 IP

问题描述

我试图只允许某些 IP 地址访问主机上 docker 容器公开的端口。所有其余的外部 IP 都应该无法访问它们(即使我在 上公开了一个端口0.0.0.0)。互联网上有很多解决方法如何实现这一点 - 从禁用 docker 的 iptables 管理开始并手动管理所有 iptables 规则(这不是很酷,特别是如果您必须处理 docker swarm 入口路由等),直到使用 cronjobs 和自定义脚本重置 iptables 规则的肮脏解决方案。但是,嘿,我们有一个DOCKER-USER链条,似乎适合这种东西?

Docker 与防火墙的问题

众所周知,docker 在启动时会添加一些 iptables 链和规则以发挥其网络魔力。问题是它会FORWARD在每次 docker 服务重启时将这些链添加到链的最顶端,这意味着您在该链上包含拒绝的所有预定义规则变得完全无用。Docker 文档建议将其DOCKER-USER链用于此类事情(从 docker 的角度来看,此链中的规则保持不变,并且在任何其他 docker 规则之前执行)。

从 docker 文档中的示例中,我们可以看到我们可以允许访问一个 IP(并拒绝其他 IP)使用

-I DOCKER-USER -i eth0 ! -s 1.2.3.4 -j DROP

这种命令有效,只有 IP1.2.3.4可以访问 docker 的公开端口。但问题是,在这种情况下,容器无法连接到 Internet

所以情况是...

Chain DOCKER-USER (1 references)
target     prot opt source               destination                  
RETURN     all  --  0.0.0.0/0            0.0.0.0/0

一切正常,所有外部流量都被允许,并且:

Chain DOCKER-USER (1 references)
target     prot opt source               destination         
DROP       all  -- !1.2.3.4              0.0.0.0/0           
RETURN     all  --  0.0.0.0/0            0.0.0.0/0

只允许 IP1.2.3.4访问 docker 的公开服务(这很好!),但容器内部没有 Internet 连接。那是个问题。没有添加其他 iptables 规则 - 只有 docker 的默认值 +DOCKER-USER链中的这个自定义 DROP。我正在尝试RETURN内部 IP 范围,例如10.0.0.0/8,172.16.0.0/12并且192.168.0.0/16在这个链中(一些论坛帖子建议尝试这样做),所以我的链看起来像:

Chain DOCKER-USER (1 references)
target     prot opt source               destination       
RETURN     all  --  192.168.0.0/16       0.0.0.0/0           
RETURN     all  --  172.16.0.0/12        0.0.0.0/0           
RETURN     all  --  10.0.0.0/8           0.0.0.0/0  
ACCEPT     all  --  1.2.3.4              0.0.0.0/0             
DROP       all  --  0.0.0.0/0            0.0.0.0/0

但仍然没有成功 - docker 的暴露端口只能从1.2.3.4(这又很好)访问,但仍然没有来自容器的 Internet 连接。

关于为什么会发生这种情况以及如何在限制入站流量的同时允许容器与外界通信的任何想法?

提前致谢!

标签: linuxdockerdocker-composefirewalliptables

解决方案


*filter
:DOCKER-USER - [0:0]
-A DOCKER-USER -m state --state RELATED,ESTABLISHED -j ACCEPT
-A DOCKER-USER -s A.B.C.D -j ACCEPT
-A DOCKER-USER -i MY_WAN_INTERFACE_NAME -j DROP

推荐阅读