iptables无法深度解析应用层协议或识别扫描器指纹,但可通过tcp标志、连接状态、载荷字符串、端口组合等特征拦截认证探测行为,适用于未加密协议或tls握手前阶段。

iptables 本身不支持深度解析应用层协议(如 SSH、FTP、HTTP 认证字段),也无法直接识别“某款扫描器”的指纹,但它可以通过匹配 TCP 层及部分载荷特征,有效拦截常见自动化扫描工具发起的认证探测行为。关键在于:聚焦扫描器的 行为共性(如异常端口组合、固定载荷片段、连接模式),而非试图识别厂商名称。
利用 TCP 标志与连接状态过滤暴力/试探性连接
多数扫描器(如 Nmap 的 -sS 扫描、Hydra 的预连接探测)会发送大量 SYN 包或快速建立/关闭连接,可结合 conntrack 模块限制连接速率:
- 防 SYN 洪水式扫描:
iptables -A INPUT -p tcp --syn -m connlimit --connlimit-above 5 --connlimit-mask 24 -j DROP(单个 /24 网段最多 5 个并发 SYN) - 限新连接频率:
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m limit --limit 3/min --limit-burst 5 -j ACCEPT,再接-j DROP拦截超频请求 - 封禁已完成三次握手但立即断开的连接(常见于认证探测):
iptables -A INPUT -p tcp --dport 22 -m state --state INVALID -j DROP
匹配典型认证请求的 TCP 载荷特征(需启用 string 模块)
部分扫描器在首次连接时即发送固定字符串(如 SSH 扫描器发 SSH- 协商头、FTP 扫描器发 USER anonymous),可用 xt_string 匹配明文载荷:
- 拦截含常见弱凭证的 FTP 登录尝试:
iptables -A INPUT -p tcp --dport 21 -m string --string "USER anonymous" --algo bm -j DROP - 阻断非标准 SSH 客户端标识(如某些扫描器硬编码的
SSH-2.0-scanbot):iptables -A INPUT -p tcp --dport 22 -m string --string "scanbot" --algo bm -j DROP - 注意:仅适用于未加密协议或 TLS 握手前的明文阶段;HTTPS/SSH 加密后载荷不可见,此方法失效
结合源端口与目标端口组合识别异常扫描行为
真实客户端通常使用高位临时端口(>1024),而部分扫描器为节省资源会复用低端口或固定端口:
- 拦截来自知名扫描端口(如源端口 53、67、123)的认证请求:
iptables -A INPUT -p tcp --sport 53 --dport 22 -j DROP - 拒绝源端口 = 目标端口的连接(如 22→22、3389→3389),这不符合常规客户端行为:
iptables -A INPUT -p tcp --sport 22 --dport 22 -j DROP - 配合 geoip 或黑名单 IP 库效果更佳,但 iptables 原生命令不内置地理匹配,需借助 xtables-addons 或外部脚本更新 ipset
重要提醒:iptables 的能力边界与替代建议
iptables 是网络层/传输层工具,无法解密 TLS、解析 Base64 编码的 HTTP Basic Auth、识别混淆 User-Agent 或动态生成的扫描载荷。对现代扫描器(如 nuclei、ffuf)或加密协议,应转向:
- 应用层防护:Nginx/Apache 的
auth_basic+ fail2ban 监控日志关键词 - 主机级入侵检测:用 suricata 或 zeek 分析应用层流量,触发 iptables 封禁
- 服务加固:禁用密码登录(SSH)、关闭不必要的认证接口、设置强密码策略










