firewalld本身不支持直接丢弃非法标志位包,因其仅为策略抽象层,缺乏对tcp标志位组合的细粒度匹配能力;需通过--direct调用iptables或改用nftables手动添加规则实现,但存在兼容性与冲突风险。

firewalld 本身不支持直接丢弃非法标志位包
firewalld 是一个策略抽象层,它不提供对 TCP 标志位(如 FIN、SYN、RST、URG、PSH、ACK)组合的细粒度匹配能力。所谓“非法标志位包”(例如 SYN+FIN、NULL 扫描、XMAS 扫描)必须由底层 iptables 或 nftables 的 tcp 模块处理,firewalld 的 rich rule 和 direct rules 都无法原生表达这类条件。
用 firewall-cmd --direct 调用 iptables 的 tcp 模块拦截
虽然 firewalld 不支持,但可以通过 --direct 接口插入原生 iptables 规则(前提是系统后端仍是 iptables;CentOS 7/8 默认是 iptables 兼容层,RHEL 9+ 可能为 nftables,需确认):
- 先确认当前后端:运行
firewall-cmd --state并检查/proc/sys/net/netfilter/nf_conntrack_version或lsmod | grep nf_tables - 添加检测并丢弃常见畸形包的规则(仅限 iptables 后端):
firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 0 -p tcp --tcp-flags ALL NONE -j DROP firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 0 -p tcp --tcp-flags ALL ALL -j DROP firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 0 -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 0 -p tcp --tcp-flags ALL SYN,FIN,PSH -j DROP firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 0 -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP
- 这些规则优先级设为
0,确保在 firewalld 默认链规则之前执行 - 务必执行
firewall-cmd --reload生效
CentOS/RHEL 9+ 使用 nftables 后端时需改用 nft
若系统已切换至 nftables(如 RHEL 9+ 默认),firewall-cmd --direct 插入的仍是 iptables 规则,可能被忽略或失效。此时应绕过 firewalld 直接管理:
- 检查是否启用 nftables:运行
nft list ruleset | head -5 - 创建自定义 nft 表和链(不依赖 firewalld):
nft add table inet filter nft add chain inet filter badtcp { type filter hook input priority 0 \; } nft add rule inet filter badtcp tcp flags & (fin|syn|rst|ack|urg|psh) != 0 && tcp flags & (fin|syn|rst|ack|urg|psh) == fin|syn|rst|ack|urg|psh drop nft add rule inet filter badtcp tcp flags & (fin|syn|rst|ack|urg|psh) == 0 drop - 注意:启用此类 nft 规则后,firewalld 的
--reload可能清空它们——二者存在冲突风险
真正需要关注的是:误配会导致 SSH 断连或连接异常
非法标志位规则非常敏感,稍有不慎就会干扰正常 TCP 握手或 Keepalive 流量:
- 不要在生产环境直接加
--tcp-flags ALL ALL,某些老旧客户端或中间设备会发全置位包 - 避免对
ESTABLISHED连接应用这些规则,应只作用于NEW状态:加-m state --state NEW(iptables)或tcp dport 22 ct state new(nft) - 云服务器上,安全组(Security Group)若放行了
0.0.0.0/0,这些规则根本没机会触发——得先收紧安全组 - 验证方式不是看日志,而是用
hping3测试:hping3 -S -F -P -U -c 2 -p 22 127.0.0.1,再查iptables -L INPUT -n -v计数器是否增长
这类防护本质是“补漏”,不能替代 fail2ban、WAF 或内核参数加固(如 net.ipv4.tcp_invalid_ratelimit)。规则一旦加错,SSH 连接可能瞬间中断且无法恢复——操作前务必留好带外访问或 console 权限。











