我已经在同一台机器上安装了Docker和Podman。那是我的第一个问题吗?也许。但是我的目标既要实现,又要继续。
我的问题是:Docker的规则和Podman的规则之间似乎存在iptables冲突,和我的工作解决方案对我来说没有任何意义。
版本信息: 作业系统:RHEL 7.6 播客:0.11.1.1 码头工人:18.09.1 iptables:1.4.21
两点信息:
我正在运行带有podman的容器,该容器公开一个端口(例如,假设5000)。我构建了3个测试用例,它们有助于说明我的问题以及在使远程访问起作用的情况3中遇到的极其奇怪的行为。继续阅读。
第一种情况完全有意义:我正常安装Podman,不安装任何Docker ,然后运行容器。 of!容器运行,并且可以按我的期望远程访问端口。
第二种情况是远程访问失败。我通常安装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
现在是第三种情况:
我决定删除CNI-HOSTPORT-DNAT
规则:
iptables -t nat -D PREROUTING 2
突然之间,我可以再次通过端口5000远程访问该容器。
我的问题是:
为什么删除上述规则会使事情再次起作用?您可能会认为,删除CNI生成的规则会破坏Podman网络。但事实并非如此。我很困惑!
谢谢。
更新:发现了问题,这是我的错。
DNAT之后,我的数据包已正确发送到FORWARD链,但是该链上有一个默认的DROP,并且该链上没有规则来接受绑定到端口5000的数据包。一旦我添加了FORWARD规则以接受dport = 5000个数据包,它开始工作。
这个问题可以解决。