iptables过滤非标准tcp标志位可有效防御nmap扫描,通过--tcp-flags指定检查范围和期望值匹配异常组合(如fin、xmas、null扫描),并用reject/drop规则阻断,部署时需注意规则顺序与管理端口安全。

用iptables过滤非标准TCP标志位,是防御Nmap等扫描器探测的有效手段。核心思路是:正常通信只使用有限的、符合RFC规范的标志组合(如SYN、SYN+ACK、ACK、FIN+ACK),而扫描器常依赖异常组合(如FIN+URG+PSH、全零、全一)来探知端口状态或绕过检测。iptables可通过--tcp-flags精准匹配并拦截这些非常规报文。
理解--tcp-flags参数的两个关键字段
iptables中--tcp-flags必须指定两组标志:
-
检查范围(mask):声明要关注哪些TCP标志位(如
SYN,ACK,FIN,RST,URG,PSH或简写为ALL) - 期望值(comp):在上述范围内,哪些位必须为1,其余必须为0
例如:--tcp-flags SYN,ACK,FIN,RST SYN表示:只检查SYN/ACK/FIN/RST这4位;其中仅SYN必须为1,其余3位必须全为0——这正是三次握手第一次SYN包的合法形态。
针对常见扫描手法设置拒绝规则
以下规则应插入INPUT链前端(用-I INPUT),优先于服务放行规则:
- 拒绝仅含FIN的包(Xmas扫描常用):
iptables -I INPUT -p tcp --dport 80 --tcp-flags ALL FIN -j REJECT - 拒绝FIN+URG+PSH组合(Xmas Tree扫描):
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
注意:该规则必须放在所有白名单和显式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(22端口)等管理端口盲目套用DROP,避免锁死;生产环境务必先在测试机验证,且保留console直连通道。










