recent 模块做限速
iptables 的 recent 模块可以按来源地址做连接限速:记录每个来源新建连接的次数,在设定时间窗口内超过阈值就丢弃后续包。用它给 22 端口的新连接做限速,可以压低爆破速率;由于只作用于 NEW 状态的连接,已经建立的会话不受影响,比整 IP 封禁更温和。
基本信息
| 适用平台 | Linux(iptables) |
|---|---|
| 风险等级 | 中 |
| 基线要求 | SSH 具备限速或封锁机制 |
| 使用的模块 | recent(xt_recent) |
| 状态查看 | /proc/net/xt_recent/ 下按规则名查看 |
典型使用场景
- 公网 SSH 入口的爆破速率压制
- 与 fail2ban 配合形成缓解加封禁两层
- 排查自动化工具被误伤的问题
- 临时性攻击流量的削峰
- 没有 fail2ban 环境的轻量替代方案
recent 限速模板
recent 限速模板
iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -m recent --set --name SSHBL # 记录新建连接
iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -m recent --update --seconds 60 --hitcount 4 --name SSHBL -j DROP # 60 秒内超过 4 次新连接就丢包
iptables -L INPUT -n --line-numbers | head -10 # 查看规则是否已插入
cat /proc/net/xt_recent/SSHBL 2>/dev/null | head # 查看被记录的来源列表
iptables-save > /etc/iptables/rules.v4 # 持久化,避免重启后丢失参数读法
| 参数 | 含义 | 注意点 |
|---|---|---|
| --set | 把来源地址记录进列表 | 只对新建连接生效 |
| --update | 检查时间窗口内的命中次数 | 与 --seconds、--hitcount 配合 |
| --seconds 60 | 统计的时间窗口 | 窗口越短越灵敏 |
| --hitcount 4 | 允许的新连接次数 | 过小会误伤自动化工具 |
| -j DROP | 超限后的动作 | 丢弃比拒绝更省资源 |
命中后该来源在 60 秒内的新包会被丢弃,而已经建立的会话不受影响,比 fail2ban 的整 IP 封禁更温和。
recent 列表是内存态(可以在 /proc/net/xt_recent/ 下查看),重启即清空:它只是缓解层,不能当作持久防护。
hitcount 阈值设得过小(比如 2)会误伤自动化工具:Ansible 并发连接与 CI 部署常常在短时间内发起多次新连接,阈值要按实际工具行为设定。
限速规则最好与日志配合:在丢弃动作之前加一条记录规则,才能统计到攻击量级;否则被丢掉的连接不会留下任何痕迹,无法判断限速是否真的在起作用。