![添加规则时,firewalld 如何在内部处理数据包状态?](https://linux22.com/image/218434/%E6%B7%BB%E5%8A%A0%E8%A7%84%E5%88%99%E6%97%B6%EF%BC%8Cfirewalld%20%E5%A6%82%E4%BD%95%E5%9C%A8%E5%86%85%E9%83%A8%E5%A4%84%E7%90%86%E6%95%B0%E6%8D%AE%E5%8C%85%E7%8A%B6%E6%80%81%EF%BC%9F.png)
从背景来看,我可以在定义新的防火墙规则时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
答案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 堆栈,但在这种情况下,您最好不要使用任何预定义的规则。