使用firewall-cmd 在 iptables 中添加永久的 PREROUTING 规则

使用firewall-cmd 在 iptables 中添加永久的 PREROUTING 规则

firewall-cmd我正在尝试在 RHEL 7 上的iptables(NAT)中的 PREROUTING 链中添加一条新规则:

$ firewall-cmd --permanent --direct --add-rule ipv4 nat PREROUTING 0 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 8161

然后我通过以下方式检查 iptables $ iptables -t nat -L

...
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination
PREROUTING_direct  all  --  anywhere             anywhere
PREROUTING_ZONES_SOURCE  all  --  anywhere             anywhere
PREROUTING_ZONES  all  --  anywhere             anywhere
...
Chain PREROUTING_direct (1 references)
target     prot opt source               destination
REDIRECT   tcp  --  anywhere             anywhere             tcp dpt:http redir ports 8161
...

但是,如果我运行如下等效的 iptables 命令:

...
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination
PREROUTING_direct  all  --  anywhere             anywhere
PREROUTING_ZONES_SOURCE  all  --  anywhere             anywhere
PREROUTING_ZONES  all  --  anywhere             anywhere
REDIRECT   tcp  --  anywhere             anywhere             tcp dpt:http redir ports 8161
...
Chain PREROUTING_direct (1 references)
target     prot opt source               destination
REDIRECT   tcp  --  anywhere             anywhere             tcp dpt:http redir ports 8161

我得到了这个附加规则,Chain PREROUTING即使防火墙被禁用(即禁用防火墙守护程序并运行命令iptables),这也允许预路由工作。

所以,我的问题有两个:

  • 是否有firewall-cmd与上述命令功能完全相同的命令iptables
  • 是否可以通过永久添加此规则firewall-cmd并在防火墙守护程序被禁用后仍然保留在那里?

答案1

您使用的是firewall-cmdwith--direct选项,这意味着它接受 iptables 命令。因此,您只需使用相同的选项即可iptables -t nat获得相同的效果,但有一个例外。使用firewall-cmd这种方式会将 NAT 规则添加到PREROUTING_direct链中,而直接使用iptableswith 会将规则添加到PREROUTING链中。

在 的输出中iptables -t nat -L,您添加了两次规则:每个链一次。

至于问题的第二部分,firewalld 服务在停止时将删除所有定义的链。因此,添加的规则PREROUTING_direct将不再可用。简短的回答是“否”。

答案2

我在 Chain PREROUTING 中获得了这个附加规则,即使防火墙被禁用,这也允许预路由工作。

所以我并不完全确定这是否属实。

如果在停止firewalld时PREROUTING不再起作用(我不清楚你为什么要这样做),那么我会假设这是因为firewalld正在删除其整个策略(例如iptables -F/ iptables -X)。在这种情况下,手动添加同一规则的另一个版本的事实不会有什么区别。 iptables -F仍然会删除它。

只要您不停止防火墙,您的(第一个)命令应该会为您提供所需的永久预路由规则。我倾向于认为这应该足够了,但我很可能遗漏了您的一些需求。

需要明确的是:没有实际的在 PREROUTING_DIRECT 链或 PREROUTING 链中使用预路由规则之间的区别。这两种方法的工作原理相同,效果相同,并且无需对防火墙策略进行其他更改,应该可以满足您的需要。

唯一的区别是,firewalld 本质上是在后台为你做一些管理工作,并将你的实际的规则是用户定义的链而不是系统定义的链。

总结:我只会让firewalld保持运行,并使用其命令来创建和管理您的规则。虽然firewall-cmd与“raw”iptables命令的视觉效果略有不同,但它们对网络流量的影响相同。

相关内容