用iptables过滤非标准TCP标志位是防御Nmap隐蔽扫描最直接有效的底层手段,通过--tcp-flags精准匹配Xmas(FIN,URG,PSH)、Null(NONE)、SYN+FIN等非法组合并DROP静默丢弃,配合规则顺序优化实现端口隐藏。

用iptables过滤非标准TCP标志位,是应对Nmap等高级隐蔽扫描最直接有效的底层防御手段。这类扫描(如Xmas、Null、FIN、SYN+FIN)不走正常连接流程,专挑RFC未定义或禁止的标志组合试探端口状态,而合法业务流量几乎不会出现这些组合——直接拦截,既不影响服务,又能大幅降低被识别和定位的风险。
识别并拦截典型隐蔽扫描标志组合
关键不是“拦所有异常”,而是精准匹配扫描器惯用的非法组合。每条规则都应使用 -I 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
- 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
- 全一标志(ALL=1,纯构造包):iptables -I INPUT -p tcp --dport 80 --tcp-flags ALL ALL -j DROP
理解--tcp-flags参数的真实含义
这个参数必须同时指定两个字段,缺一不可:
- 检查范围(mask):比如写 ALL 表示关注全部6个标志位(URG、ACK、PSH、RST、SYN、FIN);写 SYN,ACK,FIN 则只关心这三个位,其余忽略
- 期望值(comp):在mask范围内,哪些位必须为1,其余必须为0。例如 --tcp-flags ALL SYN 意味着:所有6位中,只有SYN能为1,其他5位全得是0
误写成 --tcp-flags SYN,ACK SYN 就只检查SYN和ACK两位,可能漏掉URG或PSH——所以对隐蔽扫描,统一用 ALL 作mask更稳妥。
用DROP代替REJECT实现静默防御
REJECT会发RST包,等于告诉扫描器“端口开着但拒你”;而DROP完全不响应,让扫描器收不到任何回包,更容易误判为“主机不可达”或“防火墙屏蔽”。部署时注意顺序:
- 先放行可信IP或管理端口(如SSH的22端口)
- 再插入上述DROP规则
- 最后才是通用ACCEPT规则(如Web服务)
顺序错乱会导致合法流量被提前丢弃。部署后务必运行 iptables -L -v -n --line-numbers 核对位置。
验证效果与实用建议
用真实扫描命令测试是否生效:
- FIN扫描:nmap -sF -p80 目标IP
- Xmas扫描:nmap -sX -p80 目标IP
- Null扫描:nmap -sN -p80 目标IP
若返回 filtered 或超时无响应,说明规则起效。生产环境建议先在测试机上跑通,避免误封运维通道;如需保留特定IP白名单,应在DROP规则前加 -s x.x.x.x -j ACCEPT。

















