iptables --tcp-flags 通过指定检查范围(mask)和期望值(comp)精准拦截非法tcp标志组合,如xmas/null/fin扫描等,需用drop静默丢弃并置于input链前端,部署前须测试验证。

用 iptables 的 --tcp-flags 参数过滤非法 TCP 标志组合,本质不是“捕获”,而是精准识别并拦截违反 RFC 规范的异常报文。这类报文几乎只出现在端口扫描或探测行为中(如 Nmap 的 FIN/Xmas/Null 扫描),正常业务流量不会产生。关键在于理解两个字段的配合逻辑,并把规则放在合适位置。
掌握 --tcp-flags 的核心写法
--tcp-flags 必须同时指定两个参数:检查范围(mask)和期望值(comp)。两者缺一不可:
-
检查范围(mask):明确你要盯哪些标志位,例如
SYN,ACK,FIN,RST或简写为ALL(即所有 6 位:URG、ACK、PSH、RST、SYN、FIN) -
期望值(comp):在 mask 指定的范围内,哪些位必须为 1,其余必须为 0。比如
--tcp-flags SYN,ACK,FIN,RST SYN表示:只看这 4 位,其中仅 SYN 可为 1,其他三位必须全为 0——这正是三次握手第一个包的唯一合法形态 - 特殊关键字
NONE表示 mask 范围内所有位都应为 0;ALL表示 mask 范围内所有位都应为 1
针对典型非法组合设置拦截规则
以下规则建议使用 -I INPUT 插入 INPUT 链最前端,确保优先于服务放行规则执行:
- 拦截 Xmas 扫描(FIN+URG+PSH 共存):
iptables -I INPUT -p tcp --dport 80 --tcp-flags ALL FIN,URG,PSH -j DROP - 拦截 Null 扫描(全零标志):
iptables -I INPUT -p tcp --dport 80 --tcp-flags ALL NONE -j DROP - 拦截全一标志(非法组合):
iptables -I INPUT -p tcp --dport 80 --tcp-flags ALL ALL -j DROP - 拦截 SYN+FIN 同时置位(违反 TCP 规范):
iptables -I INPUT -p tcp --dport 80 --tcp-flags SYN,FIN SYN,FIN -j DROP - 拦截仅含 FIN 的包(FIN 扫描常用):
iptables -I INPUT -p tcp --dport 80 --tcp-flags ALL FIN -j DROP
注意规则顺序与静默丢弃策略
仅用 REJECT 会返回 RST 包,等于向扫描器暴露“端口开着但拒绝你”;若想让它误判为“主机不可达”或“端口关闭”,推荐统一使用 DROP 实现静默丢弃。
-
DROP规则必须放在所有白名单ACCEPT规则之后、上述非法标志拦截规则之前,否则会提前截断合法连接 - 部署前务必运行
iptables -L -v -n --line-numbers查看规则顺序,确认逻辑链路正确 - 建议先在测试环境验证,避免误拒 SSH、管理端口等关键流量;如需放行特定 IP,务必在 DROP 规则前添加对应
ACCEPT
验证是否生效
部署后可用 Nmap 发起对应扫描验证效果:
-
nmap -sF -p80 target_ip(FIN 扫描) -
nmap -sX -p80 target_ip(Xmas 扫描) -
nmap -sN -p80 target_ip(Null 扫描)
若返回 filtered 或长时间无响应,说明规则已生效。不复杂但容易忽略。











