允许DOCKER-USER链中的某些IP用于入站流量,而拒绝所有其余的

时间:2018-12-10 20:47:49

标签: linux docker docker-compose firewall iptables

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

Docker-vs-Firewall问题

我们知道,Docker在启动时会添加一些iptables链和规则,以实现其网络魔术。事实是,它将这些链添加到每次docker服务重启的FORWARD链的最顶端,这意味着您对该链上所有带有拒绝的预定义规则将变得完全无用。 Docker documentation suggests to use its DOCKER-USER chain for such kind of things(从docker的角度来看,该链中的规则保持不变,并且在执行其他docker规则之前执行)。

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

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

这种命令有效,只有IP 1.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

仅允许IP 1.2.3.4访问docker的公开服务(很好!),但是容器内部没有Internet连接。那是个问题。没有添加其他iptables规则-仅添加了docker的默认规则和DOCKER-USER链中的这一自定义DROP。我正在尝试在此链中RETURN个内部IP范围,例如10.0.0.0/8172.16.0.0/12192.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

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

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

谢谢!

1 个答案:

答案 0 :(得分:0)

*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