几天前刚刚意识到,码头工人似乎绕过了我的规定。我在码头和iptables的经验都不是很好。在过去的日子里尝试了很多不同的东西。也看到了在最近的码头版本有很大的变化,与一个特殊的码头链,应该允许我这样做。然而,不确定我做错了什么,但它从来不做我期望它做的事情。
所以我想要的很简单。我希望它表现得像预期的那样。如果我有一个接受规则通过,如果没有,它就会被封锁。
我的iptable最初是这样的(所以在我多次尝试失败之前):
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [779:162776]
-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -s 1.2.3.4 -p tcp -m tcp --dport 123 -j ACCEPT
-A INPUT -j DROP
COMMIT希望它能做我想做的。只允许访问端口22和80,还允许ip 1.2.3.4中的端口123。但是,如果我用"-p 123:123“创建一个容器,那么每个人都可以访问它。有谁能帮我,告诉我如何更改上面的文件吗?
谢谢!
码头-版本: 1.6.2
编辑:
最初我的不同尝试是为了不使问题复杂化。然而,至少添加其中一个可能会有帮助。
*nat
:PREROUTING ACCEPT [319:17164]
:INPUT ACCEPT [8:436]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [16:960]
:DOCKER - [0:0]
COMMIT
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [779:162776]
:DOCKER - [0:0]
-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A DOCKER -s 1.2.3.4 -p tcp -m tcp --dport 123 -j ACCEPT
-A DOCKER -j DROP
-A INPUT -j DROP
COMMIT以上类型的作品。然而,得到了许多其他的问题。例如,我是否遇到了容器链接问题,DNS不再工作,等等。因此,最后添加了许多额外的规则来解决这个问题,但我永远不会进入一个运行正常的状态。所以我想大多数人都有更好更容易的解决方案。
解决方案:
结果差不多和larsks说的一样。只是没有把它添加到前链,而是我把它添加到了码头链中。前向链的问题是当它在第一位置重新启动时,Docker会在那里添加它的东西。结果导致我的规则被推倒而没有任何效果。然而,对于码头连锁,似乎码头只附加了额外的规则,所以我的保留有效。因此,当我保存我的规则,然后重新启动服务器时,一切仍然正常。
所以现在看起来差不多是这样的:
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [779:162776]
:DOCKER - [0:0]
# That I can access from IP 1.2.3.4
-A DOCKER -s 1.2.3.4/32 -p tcp -m tcp --dport 123 -j ACCEPT
# That I can access from other Docker containers
-A DOCKER -o docker0 -p tcp -m tcp --dport 123 -j ACCEPT
# Does not allow it for anything else
-A DOCKER -p tcp --dport 123 -j DROP
-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -j DROP
COMMIT发布于 2015-06-11 02:20:40
您的iptables配置现在看起来有点坏,好像您在没有重新启动Docker的情况下就清除了它。例如,DOCKER链在filter表和nat表中都可用,但没有引用它的规则,因此放置在该链中的规则不会产生任何影响。
通常,如果您想要实现影响您的Docker容器的iptables规则,它们需要进入filter表的filter链。每个容器都有自己的ip地址,这意味着您的主机只是接受数据包,然后将它们FORWARD到容器地址。
INPUT链中的规则仅适用于主机全局网络命名空间中的接口上的地址的最终目的地的数据包。
但是,我不确定iptable实际上是你的问题。
如果您试图在容器中公开服务,使其可供其他系统使用,则需要使用-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号港口。
发布于 2015-06-12 14:08:41
我不是iptable方面的专家,但我知道如果您使用-p 127.0.0.1:123:123运行容器,那么端口将不会在所有接口上公开,只是在环回上。
发布于 2017-01-09 14:21:15
结果差不多和larsks说的一样。只是没有把它添加到前链,而是我把它添加到了码头链中。
我在docs中发现了同样的情况:https://docs.docker.com/v1.5/articles/networking/#the-world
Docker不会从DOCKER筛选链中删除或修改任何预先存在的规则。此允许用户预先创建,进一步限制对容器的访问所需的任何规则。 默认情况下,Docker的转发规则允许所有外部源IP。只允许特定的IP或网络访问容器,请在DOCKER筛选链的顶部插入一个被否定的规则。例如,为了限制外部访问,使只有源IP 8.8.8.8可以访问容器,可以添加以下规则: $ iptables -I DOCKER -i ext_if!-s 8.8.8.8 -j DROP
https://stackoverflow.com/questions/30769829
复制相似问题