connlimit 与畸形包过滤
端口扫描与暴力枚举的共同特征是「单来源短时间大量连接」。connlimit 模块可以对单个来源(或网段)限制并发连接数,超限直接拒绝;再配合丢弃非法 TCP 标志位组合(NULL、XMAS 等畸形包),能挡掉一批低质量扫描器。
基本信息
| 适用平台 | Linux(iptables 1.4+,connlimit 与 tcp 扩展) |
|---|---|
| 关键参数 | --connlimit-above 上限、--connlimit-mask 掩码(32 表示单 IP) |
| 搭配项 | --syn 只匹配新建连接,避免影响已建立会话 |
| 基线 | 单源并发有上限,畸形 TCP 标志位被丢弃 |
典型使用场景
- 内部管理端口:限制单源并发,抑制自动化猜解工具的高并发探测
- 对外 Web 入口的粗筛:拿掉明显的扫描器,减轻后端压力
- 与其他手段配合:与 fail2ban、云 WAF 分层,各管一段
- 应急期间临时加固:攻击进行时快速上规则,事后评估是否常态化
规则示例
规则示例
# 丢弃非法标志位组合:全 0 与全 1 都是畸形包,正常握手不会出现
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP
# 单源到 443 的并发上限 50(只匹配新建连接)
iptables -A INPUT -p tcp --syn --dport 443 -m connlimit --connlimit-above 50 --connlimit-mask 32 -j REJECT --reject-with tcp-reset
# 查看命中计数,判断阈值是否合适
iptables -L INPUT -n -v --line-numbers | head -20参数读法
| 参数 | 含义 | 常见取值建议 |
|---|---|---|
| --connlimit-above | 超过该数值的并发连接被处理 | 按业务实测峰值上浮,不要凭感觉 |
| --connlimit-mask | 统计并发时的来源聚合粒度 | 32 表示按单 IP,24 表示按网段 |
| --syn | 只匹配新建连接请求 | 配合端口限制时必须加,否则误伤长连接 |
| --reject-with | 拒绝时返回的响应 | tcp-reset 更快失败;DROP 更隐蔽 |
NAT 后大量用户共享出口 IP 时,按单 IP 限并发会误伤:面向 C 端的入口更适合用速率限制(recent 或 hashlimit)而不是并发数限制。
阈值必须压测后定:拍脑袋设 20 会让高峰期正常用户被拒,设 5000 又对扫描毫无作用。
规则顺序决定效果:限速与畸形包丢弃要放在通用放行之前,排在末尾的规则永远不会被匹配,配置看起来齐全却毫无作用。