docker和podman iptables规则是否冲突?

时间:2019-02-15 17:36:35

标签: docker iptables cni

我已经在同一台机器上安装了Docker和Podman。那是我的第一个问题吗?也许。但是我的目标既要实现,又要继续。

我的问题是:Docker的规则和Podman的规则之间似乎存在iptables冲突,我的工作解决方案对我来说没有任何意义。

版本信息: 作业系统:RHEL 7.6 播客:0.11.1.1 码头工人:18.09.1 iptables:1.4.21

两点信息:

  1. docker守护程序在启动时为容器网络添加了iptables规则。
  2. 运行容器时,Podman通过CNI(容器网络接口)添加iptables规则以进行容器联网。

我正在运行带有podman的容器,该容器公开一个端口(例如,假设5000)。我构建了3个测试用例,它们有助于说明我的问题以及在使远程访问起作用的情况3中遇到的极其奇怪的行为。继续阅读。

  1. 第一种情况完全有意义:我正常安装Podman,不安装任何Docker ,然后运行容器。 of!容器运行,并且可以按我的期望远程访问端口。

  2. 第二种情况是远程访问失败。我通常安装Podman,安装并运行Docker服务,然后使用Podman 运行我的容器。繁荣。远程访问失败,因为没有到主机的路由。

在继续讨论第三种情况之前,请注意两个非常具体的iptables规则,这一点很重要。您可以通过运行以下命令查看这些规则(如果您正在运行Docker守护程序并且运行了Podman容器):

iptables -t nat -nL PREROUTING

命令的输出为:

Chain PREROUTING (policy ACCEPT)
target    prot opt source            destination
DOCKER    all  --  0.0.0.0/0         0.0.0.0/0      ADDRTYPE match dst-type LOCAL
CNI-HOSTPORT-DNAT    all  --  0.0.0.0/0         0.0.0.0/0      ADDRTYPE match dst-type LOCAL

现在是第三种情况:

  1. 所以我在iptables中闲逛,我知道这很危险。

我决定删除CNI-HOSTPORT-DNAT规则:

iptables -t nat -D PREROUTING 2

突然之间,我可以再次通过端口5000远程访问该容器。

我的问题是:

为什么删除上述规则会使事情再次起作用?您可能会认为,删除CNI生成的规则会破坏Podman网络。但事实并非如此。我很困惑!

谢谢。

更新:发现了问题,这是我的错。

DNAT之后,我的数据包已正确发送到FORWARD链,但是该链上有一个默认的DROP,并且该链上没有规则来接受绑定到端口5000的数据包。一旦我添加了FORWARD规则以接受dport = 5000个数据包,它开始工作。

这个问题可以解决。

0 个答案:

没有答案