用iptables过滤异常TCP标志位可有效防御Nmap隐蔽扫描:通过--tcp-flags指定检查范围和期望值,精准拦截FIN、Xmas、Null等非法组合报文,并配合DROP规则隐藏端口状态。

用iptables过滤异常TCP标志位,是防御Nmap等工具隐蔽扫描最直接有效的手段之一。核心在于:正常通信只使用RFC定义的合法组合(如SYN、SYN+ACK、FIN+ACK),而扫描器常靠非法或非常规组合(如仅FIN、全零、FIN+URG+PSH)试探端口状态、绕过基础防火墙。iptables通过--tcp-flags精准识别并拦截这类报文,不依赖状态跟踪,响应快、开销低。
理解--tcp-flags的两个参数含义
该选项必须同时指定两组内容,缺一不可:
-
检查范围(mask):声明你要关注哪些TCP标志位,例如
ALL(SYN/ACK/FIN/RST/URG/PSH)、SYN,FIN,RST等 -
期望值(comp):在上述范围内,哪些位必须为1,其余必须为0。比如
--tcp-flags SYN,ACK SYN表示:只看SYN和ACK这两位,其中SYN必须为1、ACK必须为0——这正是三次握手首包的唯一合法形态
针对典型隐蔽扫描设置拒绝规则
以下规则应使用-I INPUT插入INPUT链最前端,确保优先于服务放行规则执行:
- 阻断FIN扫描(Xmas扫描常用):
iptables -I INPUT -p tcp --dport 80 --tcp-flags ALL FIN -j REJECT - 阻断Xmas Tree扫描(FIN+URG+PSH):
iptables -I INPUT -p tcp --dport 80 --tcp-flags ALL FIN,URG,PSH -j REJECT - 阻断Null扫描(全零标志):
iptables -I INPUT -p tcp --dport 80 --tcp-flags ALL NONE -j REJECT - 阻断圣诞树攻击(全一标志):
iptables -I INPUT -p tcp --dport 80 --tcp-flags ALL ALL -j REJECT - 阻断SYN+FIN共置(违反TCP规范):
iptables -I INPUT -p tcp --dport 80 --tcp-flags SYN,FIN SYN,FIN -j REJECT
配合DROP隐藏端口存在性
单纯REJECT会返回RST包,暴露“端口开放但拒绝连接”;若想让扫描器误判为“端口关闭”或“主机不可达”,可在上述规则后加一条静默丢弃规则:
iptables -I INPUT -p tcp --dport 80 -j DROP- 注意:这条规则必须放在所有白名单(如SSH允许)和显式
ACCEPT规则之后、异常标志拒绝规则之前。否则会提前截断合法流量 - 部署前建议用
iptables -L -v -n --line-numbers确认规则顺序
验证是否生效
在Kali等环境中发起对应扫描,观察响应:
-
nmap -sF -p80 目标IP(FIN扫描)→ 应无响应或返回filtered -
nmap -sX -p80 目标IP(Xmas扫描)→ 同上 -
nmap -sN -p80 目标IP(Null扫描)→ 同上 - 若返回
closed或超时,说明DROP规则已起效;若返回filtered,说明REJECT规则已拦截

















