我试图仅允许某些IP地址访问主机上docker容器公开的端口。其余所有外部IP都将无法访问它们(即使我公开了0.0.0.0
上的端口)。互联网上有很多解决方法来实现这一点-从为docker禁用iptables管理并手动管理所有iptables规则开始(这不是很酷,特别是如果您必须处理docker swarm入口路由等),直到使用cronjobs和自定义脚本重置iptables规则的肮脏解决方案。但是,嘿,我们有一个DOCKER-USER
链,似乎适合于这种东西?
我们知道,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/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
但仍然没有成功-只能从1.2.3.4
访问docker的暴露端口(这很好),但是仍然没有来自容器的Internet连接。
关于为什么发生这种情况的任何想法,以及如何在限制入站流量的同时允许容器与外界通信?
谢谢!
答案 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