【发布时间】:2015-08-26 12:02:16
【问题描述】:
几天前才意识到 Docker 似乎绕过了我的 iptable 规则。我对 Docker 和 iptables 的经验并不令人难以置信。最近几天尝试了很多不同的东西。还看到最近的 docker 版本有很大的变化,有一个特殊的 DOCKER 链,应该允许我这样做。但是不确定我做错了什么,但它永远不会像我期望的那样做。
所以我想要的很简单。我希望它表现得像预期的那样。如果我有一个 ACCEPT-Rule 要通过,如果没有它就会被阻止。
我的 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”创建一个容器,每个人都可以访问它。谁能帮助我并告诉我如何更改上述文件?
谢谢!
Docker-版本: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 所说的那样做。只是没有加到 FORWARD 链上,我把它加到了 DOCKER 链上。 FORWARD 链的问题在于 Docker 在第一个位置重新启动时会在其中添加它的东西。这导致我的规则被推倒并且没有任何效果。然而对于 DOCKER 链,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
【问题讨论】: