添加规则时,firewalld 如何在内部处理数据包状态?

添加规则时,firewalld 如何在内部处理数据包状态?

从背景来看,我可以在定义新的防火墙规则时iptables指定数据包连接状态(通常是NEW和/或)。ESTABLISHED例如,这对规则将确保http仅当由我的主机发起时才允许连接,而当由远程主机发起时则断开连接:

iptables -A INPUT -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT

然而,当我开始探索firewalld替代方案时,除了firewalld是一个有状态的防火墙管理服务之外,我找不到太多关于状态的文档,而且它似乎以某种方式在内部处理数据包状态。有人可以帮助解释iptables在使用创建防火墙规则时是否可以定义数据包状态(如上面的示例) firewalld?否则,我们如何在使用时实现相同的效果firewalld

答案1

您可以--direct通过命令使用规则firewall-cmd。在您的情况下,要执行的命令可能如下所示:

# Check for existing firewalld direct rules
$ sudo firewall-cmd --direct --get-all-rules
# Now add your direct rule
$ sudo firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 0 -p tcp --dport=80 -j ACCEPT -m state --state NEW
# Return traffic (ESTABLISHED for example) is automatically allowed due to firewalld's stateful nature
# Reload firewalld
$ sudo firewall-cmd --reload
# Check if your direct rule was successfully added
$ sudo firewall-cmd --direct --get-all-rules
# From server side create a listening port (if there is no service listening on TCP 80)
$ nc -vlt 80
# From client side, initiate a connection to server on port 80
# Where X.X.X.X is server IP or hostname (with a 3 seconds timeout)
$ nc -v -w 3 X.X.X.X 80

参考:https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/security_guide/using_the_direct_interface

答案2

确实如此不是ESTABLISHED为每个特定规则分别指定,状态很有意义RELATED,因为大多数手册、教程和firewalld只是创建这三个规则并将它们放在各自的 INPUT/OUTPUT/FORWARD 链的顶部:

iptables -A INPUT   -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A OUTPUT  -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT

对于 nft 来说是: ct state { established, related } accept

我几乎无法想象当您不使用这些全局规则时的情况:也许是为了测试 TCP/IP 堆栈,但在这种情况下,您最好不要使用任何预定义的规则。

相关内容