iptables不支持匹配TCP窗口大小,因其内核模块未提供--tcp-window选项,且窗口值本身无强区分性,无法可靠识别扫描器;可行替代方案是结合connlimit、limit、tcp-flags和state模块进行行为与状态分析。

iptables 本身不支持直接匹配 TCP 窗口大小(TCP Window Size)这一字段。
为什么iptables不能靠窗口大小识别扫描器
TCP 窗口大小是 TCP 头部中的一个 16 位无符号整数字段,用于流量控制。但 iptables 的内核匹配模块(包括 tcp、ip、conntrack 等)未提供 --tcp-window 或类似原生匹配选项。其 --tcp-flags 只能检查标志位(SYN/ACK/FIN/RST/URG/PSH),--tcp-option 仅支持匹配特定 TCP 选项(如 MSS、SACK、Timestamp),且不包含窗口字段。
更关键的是:窗口值本身不具备强区分性——正常客户端(如 curl、浏览器)与扫描器(如 Nmap、Hydra)都可能发送任意合法窗口值(0–65535),且现代扫描器常模拟真实行为(如设置 64240、8192 等常见值)。单靠窗口大小无法可靠区分自动化攻击和合法连接。
真正可行的替代思路:用状态+行为+上下文组合判断
虽然不能看窗口,但可通过 iptables 配合其他机制,间接识别高频、非交互式、低质量的认证探测行为:
-
限制新建连接速率:对 SSH(22)、RDP(3389)、HTTP 登录端点(如 /login)等认证端口,用 -m connlimit 和 -m limit 控制单位时间内的新连接数。例如:
iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 3 --connlimit-mask 32 -j REJECT - 拦截无状态的“假握手”:扫描器常发 SYN 后不完成三次握手(如 SYN 扫描)或快速重传 FIN/RST(暴力探测后立即断连)。可结合 --tcp-flags 拒绝异常组合(如 SYN+FIN、FIN+URG+PSH),再用 -m state --state INVALID 丢弃非法状态包。
- 配合 conntrack 匹配短连接特征:对已建立连接,检查其存活时间是否极短(
更有效的实战路径:绕过iptables做深度识别
若目标是精准识别自动化认证攻击(如 Hydra 爆破、Nmap 的 --script http-brute),建议放弃纯 iptables 方案,转而采用分层防御:
- 应用层防护:Web 登录页加验证码、请求频率限制(Nginx 的 limit_req)、登录失败锁定(PAM faillock);SSH 禁用密码改用密钥、启用 MaxAuthTries。
-
日志联动封禁:用 fail2ban 或自定义脚本监控 /var/log/auth.log 或 web access.log,提取高频失败 IP,自动调用
iptables -I INPUT -s x.x.x.x -j DROP或写入 ipset 集合。 - 用 eBPF 替代 iptables(进阶):通过 Cilium 或自研 eBPF 程序,可在内核层解析完整 TCP 包并读取窗口字段,结合连接生命周期、payload 模式做实时判定。但这已超出传统 iptables 范畴。
归根结底,TCP 窗口大小不是攻击指纹,而是协议参数。靠它识别扫描器既不可行,也不必要。重点应放在连接行为模式、认证上下文和日志反馈上。

















