提问人:Torque 提问时间:4/28/2023 更新时间:4/29/2023 访问量:882
无法使用 firewalld 将流量转发到(无根)podman 容器
Unable to forward traffic to (rootless) podman container with firewalld
问:
我有一个绑定到 的无根 podman 容器,我想将外部流量转发到端口以转到该容器,但我无法完成:127.0.0.1:10080
80
[me@certvault ~]$ curl -sS http://127.0.0.1:10080 >/dev/null
[me@certvault ~]$ curl -sS http://127.0.0.1:80 >/dev/null
curl: (7) Failed to connect to 127.0.0.1 port 80: Connection refused
[me@certvault ~]$ sudo firewall-cmd --list-forward-ports
[me@certvault ~]$ sudo firewall-cmd --add-forward-port=port=80:proto=tcp:toport=10080:toaddr=127.0.0.1
success
[me@certvault ~]$ sudo firewall-cmd --list-forward-ports
port=80:proto=tcp:toport=10080:toaddr=127.0.0.1
[me@certvault ~]$ curl -sS http://127.0.0.1:80 >/dev/null
curl: (7) Failed to connect to 127.0.0.1 port 80: Connection refused
[me@certvault ~]$ curl -sS http://127.0.0.1:10080 >/dev/null
如您所见,除了将流量重定向到容器之外,一切正常。如果我删除了容器的限制和规则,一切正常,所以我认为基本设置和想法是可靠的。但是我不想仅仅为了将流量重定向到它而向世界公开容器自定义端口,而且这似乎是没有意义的。一旦外界到达港口,它甚至不需要知道港口。127.0.0.1
80
10080
答:
0赞
erig
4/29/2023
#1
# sudo firewall-cmd --add-forward port=port=80:proto=tcp:toport=10080:toaddr=127.0.0.1
此命令为默认区域添加转发端口。这将为进入默认区域的流量(例如公共区域)转发端口。这击中了 iptables/nftables 的链/钩子。PREROUTING
你的例子
$ curl -sS http://127.0.0.1:10080 >/dev/null
大概是从运行 firewalld 的主机执行的。因此,流量永远不会到达内核中的链/钩子。它会击中!PREROUTING
OUTPUT
尝试从另一台机器进行卷曲测试;不是运行 firewalld 的那个。
如果您希望它也能在运行 firewalld 的同一台机器上工作,则可以使用 firewalld v1.1.0 或更高版本中的策略来实现。事实上,这就是 podman 的新网络插件 netavark 所做的。
# firewall-cmd --permanent --new-policy outputDNAT
# firewall-cmd --permanent --policy outputDNAT --add-ingress-zone HOST
# firewall-cmd --permanent --policy outputDNAT --add-egress-zone ANY
# firewall-cmd --permanent --policy outputDNAT --add-rich-rule 'rule family="ipv4" destination address="127.0.0.1" forward-port port="80" protocol="tcp" to-port="10080"'
# firewall-cmd --reload
评论