iptables不能识别“指纹探测”概念,但能精准拦截具备可量化网络特征的探测行为,如TCP SYN扫描发40–55字节超短包、SSH探测首包

iptables 不能识别“指纹探测”这个概念本身,但它能精准拦截具备可量化网络特征的探测行为——关键不是看扫描器叫什么,而是抓住它发出来的包在协议层暴露的破绽:异常长度、非法标志、固定载荷、高频连接模式。这些特征稳定、轻量、无需解密,适合 iptables 在内核态快速决策。
用 length 模块卡住超短/固定长度探测包
很多指纹扫描器为绕过检测或适配工具逻辑,会刻意构造极短或固定长度的数据包,与真实业务流量明显不同:
- TCP SYN 扫描(如 Masscan)常发 40–55 字节包(低于合法最小 60 字节),可用:
iptables -A INPUT -p tcp --syn -m state --state NEW -m length --length 0:59 -j DROP - SSH 探测首包通常 iptables -A INPUT -p tcp --dport 22 -m length --length 0:54 -j DROP
- DNS 反射攻击常用伪造源 IP 的 32 字节 UDP 查询,可精准拦截:
iptables -A INPUT -p udp --sport 53 -m length --length 32 -j DROP
用 tcp-flags 拦截非法标志组合
指纹扫描常依赖非标准 TCP 标志组合试探系统响应差异,这类包几乎不出现在合法通信中:
- 全零标志(Null 扫描):
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP - FIN+URG+PSH(Xmas 扫描):
iptables -A INPUT -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP - SYN 与 FIN 同时置位(违反 RFC):
iptables -A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP - 仅含 ACK 但无对应连接(伪造会话探测):
iptables -A INPUT -p tcp --tcp-flags ALL ACK -m state --state INVALID -j DROP
用 recent + connlimit 控制试探密度
单个 IP 在短时间内轮询多个端口或建立大量半开连接,是自动化指纹探测的典型行为,靠静态规则无法覆盖,需状态跟踪:
- 60 秒内对任意端口发起 ≥10 个新 SYN 包即拉黑:
iptables -A INPUT -p tcp --syn -m recent --name fp-scan --rcheck --seconds 60 --hitcount 10 -j DROP - 限制单 IP 到 SSH 端口的并发未完成连接 ≤3 个:
iptables -A INPUT -p tcp --dport 22 -m connlimit --connlimit-above 3 --connlimit-mask 32 -j REJECT - 对 Web 端口(80/443)启用连接速率限制,防暴力试探:
iptables -A INPUT -p tcp --dport 80 -m state --state NEW -m limit --limit 3/min --limit-burst 5 -j ACCEPT
用 string 模块匹配明文载荷特征(慎用)
仅适用于未加密协议或 TLS 握手前阶段,匹配固定字符串可辅助识别特定扫描器行为:
- 拦截含常见弱凭证的 FTP 尝试:
iptables -A INPUT -p tcp --dport 21 -m string --string "USER anonymous" --algo bm -j DROP - 阻断硬编码客户端标识的 SSH 探测(如含 scanbot):
iptables -A INPUT -p tcp --dport 22 -m string --string "scanbot" --algo bm -j DROP - 注意:HTTPS、加密 SSH 流量载荷不可见,此方法无效;且 string 模块性能开销大,不建议在高流量节点滥用
不复杂但容易忽略:所有规则上线前务必先用 LOG 替代 DROP,观察真实流量分布,确认无误再切换;同时确保 -m state ESTABLISHED,RELATED 规则置于 length 或 string 规则之前,避免干扰正常连接。

















