2

我已经在同一台机器上安装了 Docker 和 Podman。这是我的第一个问题吗?也许。但我的目标是两者都运行,无论如何我都想继续。

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

版本信息:操作系统:RHEL 7.6 Podman:0.11.1.1 Docker:18.09.1 Iptables:1.4.21

两点信息:

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

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

  1. 第一种情况完全有道理:我正常安装 Podman,没有安装任何 Docker,然后运行容器。噗!容器运行,我可以远程访问端口,正如我所料。

  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 数据包,它开始工作了。

这个问题可以关闭。

4

0 回答 0