nftables用limit表达式限制子网新建连接速率,需结合ct state new、ip saddr与limit rate x/单位 burst y packets,对指定子网的新建tcp连接(syn包)实施聚合限速,适用于办公网段或跳板机出口管控。

用 nftables 的 limit 表达式限制特定子网的新建连接速率,核心是结合连接状态(ct state new)、源地址范围(ip saddr)与限速策略,实现按子网维度控制单位时间内的新建连接请求数。它不区分单个 IP,而是对整个子网做聚合限速,适合管控某段内网或合作方出口的接入强度。
明确限速目标与适用场景
限速对象是「新建 TCP 连接请求」(即 SYN 包),不是已建立连接,也不是所有流量。典型用途包括:
- 防止办公网段(如 192.168.10.0/24)内批量脚本发起过多 SSH 或 API 调用
- 约束云上某批跳板机(如 10.0.5.0/28)向后端服务发起的连接洪流
- 为测试环境子网设置温和接入阈值,避免误操作打爆服务
基础语法与关键参数说明
nftables 的 limit 是表达式(expression),写在 rule 中,格式为:limit rate [数值] [单位] burst [数量] packets
重点参数含义:
-
rate 10/minute:平均速率上限,每分钟最多放行 10 个匹配包 -
burst 5:初始令牌桶容量,允许短时突发 5 个包(例如网络抖动后重连) -
packets表示按数据包计数;若省略,默认也是按包,但显式写出更清晰 - 限速只作用于当前 rule 匹配到的流量,必须搭配
ct state new和ip saddr才能精准命中子网的新建连接
完整配置示例(以限制 172.16.20.0/24 子网 SSH 新建连接为例)
以下命令逐条执行,适用于标准 filter table:
nft add table ip filter
nft add chain ip filter input { type filter hook input priority 0 \; }
nft add rule ip filter input ip saddr 172.16.20.0/24 tcp dport 22 ct state new limit rate 8/minute burst 4 packets counter accept
nft add rule ip filter input ip saddr 172.16.20.0/24 tcp dport 22 ct state new drop
说明:
- 第一条规则:对来自该子网、目标端口 22、且为新建连接的包,启用限速(8/分钟 + 突发 4),放行并计数
- 第二条规则:对同一条件但未被上一条放行的包,直接丢弃(
drop,非reject,避免触发客户端重试) - 两条规则顺序不能颠倒,否则限速失效;建议插入在 INPUT 链靠前位置
验证与调优建议
上线前务必验证效果:
- 用
nft list ruleset检查规则是否加载成功 - 临时把
accept改成log prefix "SUBNET-LIMIT: ",再用dmesg -t | grep SUBNET-LIMIT观察实际拦截情况 - 若发现正常业务被误限,可适当提高
rate或burst值;若攻击仍能穿透,需确认是否混用公网 IP 或 NAT 后源地址失真 - 注意:nftables 的
limit是 per-rule 计数,不支持像hashlimit那样按 IP 单独统计,所以它天然就是子网级聚合限速,无需额外配置模式











