:"时忽略 iptable 规则-6ren"> :"时忽略 iptable 规则-几天前才意识到 Docker 似乎绕过了我的 iptable 规则。我对 Docker 和 iptables 的经验并不令人难以置信。最近几天尝试了很多不同的东西。还看到最近的 docker 版本有很-6ren">
gpt4 book ai didi

Docker 使用 "-p :"时忽略 iptable 规则

转载 作者:IT老高 更新时间:2023-10-28 12:44:10 25 4
gpt4 key购买 nike

几天前才意识到 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

最佳答案

我不是 iptables 方面的专家,但我知道如果您使用 -p 127.0.0.1:123:123 运行容器,那么端口将不会在所有接口(interface)上公开,只是在环回上。

关于Docker 使用 "-p <port>:<port>"时忽略 iptable 规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30769829/

25 4 0