限制网络访问,但允许特定IP访问正在运行的Docker容器。

3
我尝试使用一个docker容器,只有特定的IP地址可以从运行的容器中访问。 iptables仅在特权docker容器中起作用。但是用户可以更改iptables本身。 一个好的想法是创建一个带有dockerfile和iptables的docker镜像。但是,在创建映像时没有特权权限选项。 有人有解决这个问题的想法吗?

在主机上创建iptables(在“FORWARD”链中),而不是在Docker容器内部。 - larsks
1
但是我如何处理不同的IP地址,以适应不同的Docker实例? - user1200794
1个回答

3
每个Docker容器都有一个唯一的IP地址,因此如果您想允许一个具有地址172.17.0.21的容器,并且希望它仅能访问地址8.8.8.8,您可以执行以下操作:
iptables -A FORWARD -s 172.17.0.21 -d 8.8.8.8 -j ACCEPT
iptables -A FORWARD -s 172.17.0.21 -j REJECT --reject-with icmp-host-prohibited

使用nsenter命令可以在非特权容器内部修改iptables规则。例如,如果您启动了一个Docker容器:

docker run --name example -d myimage

您可以按照以下方式获取该容器的 PID :

pid=$(docker inspect -f '{{.State.Pid}}' example)

然后使用 nsenter 在容器的网络命名空间内运行命令:

nsenter -t $pid -n iptables ...

这些命令将在容器内运行,不受功能限制。


使用nsenter添加iptables规则看起来很好。有没有什么提示可以使这些规则在容器启动时持久/重新启用? - Steffan Karger
我认为没有一个很好的方法使这个持久化。最好的办法是将所有必要的命令放在一个脚本中,这样你只需要运行一个命令来恢复事物,而不需要太多的努力。 - larsks

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接