使用nftables的limit表达式可实现对业务子网新建连接的刚性速率限制,核心是匹配ct state new并设limit rate 60/minute burst 1 packets drop,确保仅限新连接、禁突发、不误伤长连接,规则须置于input链靠前且需固化验证。

使用 nftables 的 limit 表达式可对业务子网的新建连接(即 TCP SYN 或其他协议的首次连接)进行速率限制,超出阈值即丢弃,从而实现轻量级防护。关键在于精准匹配“新建连接”状态,并结合合理的时间窗口与限额。
匹配新建连接并应用 limit
仅限制新建连接(如 TCP SYN),避免影响已有会话,需配合 ct state new 使用。例如,限制 192.168.10.0/24 子网每分钟最多发起 60 个新连接:
nft add rule ip filter input ip saddr 192.168.10.0/24 tcp flags & (fin | syn | rst | ack) == syn ct state new limit rate 60/minute counter drop
说明:
-
tcp flags & (fin | syn | rst | ack) == syn精确匹配 SYN 包(TCP 握手第一步) -
ct state new确保只作用于连接跟踪中新建立的状态,兼容非 TCP 协议时可改用ip protocol tcp+tcp flags组合 -
limit rate 60/minute表示每分钟最多放行 60 个匹配包,超限即触发drop -
counter建议保留,便于后续用nft list ruleset -a查看命中计数
适配 UDP 或多协议业务场景
若业务含大量 UDP(如 DNS、VoIP),需单独处理“伪新建连接”。UDP 无 SYN,但可通过连接跟踪的 ct state untracked 或首包特征识别。更稳妥方式是按源 IP + 目标端口组合限速:
nft add rule ip filter input ip saddr 192.168.10.0/24 udp dport {53, 5060} limit rate 100/minute counter drop
说明:
- 对 DNS(53)和 SIP(5060)等关键 UDP 端口单独限速,防止泛洪
- 不依赖连接状态,直接基于五元组首包频率控制
- 若需更精细控制,可配合
limit burst(如limit rate 100/minute burst 10)允许短时突发
避免误伤与调试要点
limit 规则位置和匹配粒度直接影响效果。常见问题及建议:
- 规则必须放在
ct state new或协议匹配之后,否则可能因状态未建立而跳过 - 不要在 raw 表中使用 limit(raw 表绕过连接跟踪),应放在 filter 表的 input 或 forward 链
- 测试时先用
log prefix "LIMIT-HIT: "替代drop,确认匹配是否符合预期 - 生产环境建议搭配
meta pkttype host排除广播/组播干扰
持久化与监控
规则默认不保存,需导出并写入配置文件:
nft list ruleset > /etc/nftables.conf systemctl restart nftables
持续观察限速效果:
- 用
nft list chain ip filter input -a查看带 handle 的规则及 counter 值 - 结合
conntrack -L | grep 192.168.10分析实际连接分布 - 设置简单告警:当某条 limit 规则 counter 在 1 分钟内增长 > 90% 阈值时触发通知











