您的iptables配置现在看起来有些破损,就像您在不重新启动Docker的情况下将其清除了一样。例如,和表中都有一条DOCKER
链,但是没有引用它的规则,因此放在该链中的规则将不起作用。filter``nat
通常,如果要实现影响Docker容器的iptables规则,则需要将它们放在FORWARD
表链中filter
。每个容器都有其 自己的 IP地址,这意味着您的主机仅接受数据包,然后将FORWARD
其发送到容器地址。
INPUT
链中的规则仅适用于主机全局网络名称空间中接口的最终目的地为地址的数据包。
但是,我不确定iptables实际上是您的问题。
如果您试图公开容器中的服务,以使其他系统可以使用它们,则需要使用-p
标记来发布这些端口docker run
。您可以在文档的此部分中阅读有关此内容的更多信息。
如果您想使用要完成的任务的特定示例来更新您的问题,我可以提供更有针对性的答案。
的确,当您使用发布容器端口时,-p
它通常可用于任何源ip地址。为了限制对已发布端口的访问,您需要向FORWARD
链中添加新规则。例如,如果我启动Web服务器:
docker run --name web -p 80:8080 larsks/mini-httpd
容器中的Web服务器现在可以在主机上的端口8080上使用。如果要阻止对该端口的访问,则需要在该FORWARD
链中插入一条规则,以阻止对容器ip上的端口80的访问。所以首先我需要容器的IP地址:
$ web_ip=$(docker inspect --format '{{ .NetworkSettings.IPAddress }}' web)
$ echo $web_ip
172.17.0.5
我在FORWARD
链中创建的规则必须位于docker创建的规则 之前 ,因此我需要指定一个明确的位置:
iptables -I FORWARD 1 -d $web_ip -p tcp --dport 80 \! -s 192.168.1.10 -j DROP
这将阻止来自192.168.1.10以外的主机的所有流量。
如果您希望规则适用于所有容器而不是特定容器,则可以将其绑定到docker0
接口而不是特定的IP地址:
-A FORWARD -o docker0 -p tcp --dport 80 \! -s 192.168.1.10 -j DROP
这将禁止访问 任何 容器上的端口80 。