直接用--tcp-flags拦截非法tcp标志组合是最轻量高效的第一道防线,需同时指定检查范围(mask)和期望值(comp),如--tcp-flags all fin,urg,psh匹配xmas扫描并drop静默丢包,规则须置于白名单后、异常规则前以确保逻辑正确。

直接用 --tcp-flags 拦截非法 TCP 标志组合,是最轻量、最有效的第一道防线。它不依赖连接状态,响应快,能静默阻断扫描行为,让攻击者无法准确判断端口是否真实开放。
理解 --tcp-flags 的两个必要参数
这个参数必须同时指定 检查范围(mask) 和 期望值(comp),缺一不可:
-
检查范围(mask):声明你要关注哪些标志位,例如
ALL(即 URG、ACK、PSH、RST、SYN、FIN 全部6位),或精简为SYN,FIN,RST -
期望值(comp):在 mask 范围内,哪些位必须为 1,其余必须全为 0;
NONE表示全部为 0,ALL表示全部为 1 - 举例:
--tcp-flags SYN,ACK,FIN,RST SYN表示只检查这4位,其中仅 SYN 可为 1,其余三位必须为 0——这正是三次握手首包的唯一合法形态
针对常见非法组合设置 DROP 规则
以下规则建议用 -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
规则顺序与静默丢弃策略
使用 DROP 而非 REJECT 是关键——REJECT 会返回 RST 包,等于告诉扫描器“端口开着但拒绝你”;DROP 是静默丢弃,扫描器收不到任何响应,容易误判为“主机不可达”或“端口关闭”。
- 这条通用
DROP规则(如iptables -I INPUT -p tcp --dport 80 -j DROP)必须放在所有白名单ACCEPT规则之后、上述异常标志规则之前 - 否则会提前截断合法流量,导致服务不可用
- 部署后务必运行
iptables -L -v -n --line-numbers检查规则顺序是否正确
验证与安全注意事项
部署后可用 Nmap 验证效果:
-
nmap -sF -p80 target_ip(FIN 扫描) -
nmap -sX -p80 target_ip(Xmas 扫描) -
nmap -sN -p80 target_ip(Null 扫描) - 若返回
filtered或长时间无响应,说明规则已生效 - 务必先在测试机上验证,避免误拒 SSH、管理端口等关键流量
- 如需保留特定 IP 访问权限,必须在
DROP规则前添加对应白名单ACCEPT规则











