iptables无法利用tcp窗口大小识别自动化爆破行为,因其内核tcp模块缺失--tcp-window选项,且窗口值(0–65535)在合法客户端与扫描器间无区分性;可行方案是结合connlimit、limit、tcp-flags和state模块,基于高频新建连接、短生命周期、非法标志组合等稳定行为特征进行识别与拦截。

iptables 无法利用 TCP 窗口大小识别自动化爆破行为。
这不是配置问题,而是内核能力限制:iptables 的 tcp 模块没有 --tcp-window 或任何等效选项,无法读取、解析或匹配 TCP 头部中字节 14–15 的窗口字段。
更关键的是——窗口值本身不具备识别价值:
- 合法客户端(如 OpenSSH、curl、浏览器)与扫描器(Hydra、Medusa、Nmap 的 brute 脚本)均可自由设置任意合法窗口值(0–65535);
- 现代扫描工具普遍模拟真实行为,例如默认用 64240、8192、65535 等常见值,与正常连接无统计差异;
- 即使硬编码偏移尝试用
u32模块提取(如0>>24&0xFFFF),也会因 TCP 选项长度可变、IP 分片、GRO/GSO 卸载等因素导致偏移错位,规则极易失效或误杀。
真正能用于识别自动化爆破的,是其可被 iptables 稳定观测的行为特征:
-
高频新建连接 + 短连接生命周期
- 对 SSH(22)、RDP(3389)、HTTP 登录端点等,用
connlimit限制单 IP 并发连接数:iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 3 --connlimit-mask 32 -j REJECT - 结合
limit控制单位时间新连接速率:iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m limit --limit 3/min --limit-burst 5 -j ACCEPT
- 对 SSH(22)、RDP(3389)、HTTP 登录端点等,用
-
异常 TCP 状态与标志组合
- 扫描器常在爆破前快速建连又断开,留下大量
INVALID状态包:iptables -A INPUT -p tcp --dport 22 -m state --state INVALID -j DROP - 拒绝非法标志组合(如 SYN+FIN、全零、FIN+URG+PSH),这些几乎不出现在合法认证流程中:
iptables -I INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROPiptables -I INPUT -p tcp --tcp-flags ALL NONE -j DROP
- 扫描器常在爆破前快速建连又断开,留下大量
-
明文载荷中的弱凭证或固定字符串(仅限未加密协议)
- FTP 弱登录尝试:
iptables -A INPUT -p tcp --dport 21 -m string --string "USER anonymous" --algo bm -j DROP - SSH 客户端标识含扫描器特征(如
scanbot、bruteshark):iptables -A INPUT -p tcp --dport 22 -m string --string "scanbot" --algo bm -j DROP⚠️ 注意:该方式对 TLS/SSL 加密流量(HTTPS、SSHv2 密钥交换后)完全无效。
- FTP 弱登录尝试:
若目标是精准防御自动化爆破,应放弃纯 iptables 窗口匹配思路,转向分层防护:
- 应用层:Nginx
limit_req限制登录接口频率、Web 登录页加验证码、PAMfaillock锁定失败账户; - 协议层:SSH 禁用密码认证、启用
MaxAuthTries 3、使用AllowUsers白名单; - 基础设施层:用
ipset + fail2ban或crowdsec根据日志自动封禁,比静态规则更适应动态攻击模式。











