iptables无法直接限制身份认证状态数,只能通过connlimit模块限制同一IP的并发TCP连接数或新建连接频率,结合conntrack和recent模块实现对SSH等认证行为的网络层防护。

iptables 本身不直接限制“身份认证状态数”,它没有用户会话或登录状态的概念。所谓“并发身份认证状态”,实际对应的是底层网络连接行为——比如 SSH 登录尝试、HTTP Basic Auth 请求、RADIUS/TACACS+ 连接等。真正能控制的,是这些协议建立的 TCP 连接数 或 新建连接频率,而核心依赖的是内核的 conntrack(连接跟踪)机制 和 connlimit 扩展模块。
明确目标:把“认证状态”映射到可管控的网络实体
身份认证过程通常伴随以下典型网络表现:
- SSH 登录:每次新连接(
--syn包)触发一次认证流程 - HTTPS + 表单登录:每个用户会话常对应一个或多个长连接(如 WebSocket、Keep-Alive)
- RADIUS 认证:基于 UDP,但高频重试易被识别为扫描行为
因此,限制“并发身份认证状态数”,本质是限制:单位时间内来自同一源 IP 的新建连接数,或 同一 IP 当前已建立的活跃连接数。conntrack 模块提供连接状态视图,connlimit 则在此基础上做阈值判断。
用 connlimit 限制每个 IP 的并发认证连接数
这是最常用、最直接的方式,适用于 SSH、Web 登录端口等 TCP 服务:
- 限制每个 IP 对 SSH(22 端口)最多同时建立 3 个连接:
- 限制每个 C 类网段(如 192.168.1.0/24)对 Web 管理后台(8443 端口)总连接数不超过 5:
- 注意:
--syn确保只匹配新建连接握手阶段,不影响已有会话数据传输 -
--connlimit-mask 24表示按 /24 子网聚合统计,适合防御同一局域网内的暴力尝试
结合 conntrack + recent 实现时间窗口内新建连接频控
connlimit 控制“当前并发数”,而某些认证服务(如 PAM-over-SSH)在失败后仍会短暂占用连接资源。若需防爆破,建议叠加基于时间窗口的新建连接速率限制:
- 允许每个 IP 每 60 秒最多发起 6 次新的 SSH 连接请求:
iptables -A INPUT -p tcp --syn --dport 22 -m conntrack --ctstate NEW -m recent --update --seconds 60 --hitcount 7 --name ssh_attempt -j DROP
- 该策略不依赖连接是否成功完成认证,只要发了 SYN 就计数,更贴近“认证尝试”的语义
- 务必确保
recent模块已加载:modprobe xt_recent
关键注意事项与调优点
实际生效前需确认几项基础前提:
- 系统必须启用连接跟踪:
net.ipv4.ip_conntrack_enable = 1(现代内核默认开启) - 检查当前 conntrack 表容量是否充足:
cat /proc/sys/net/netfilter/nf_conntrack_max;若频繁出现 “nf_conntrack: table full” 日志,需增大该值 - 规则顺序很重要:应放在 ACCEPT 已建立连接(
ESTABLISHED,RELATED)规则之后、其他拒绝规则之前 - 测试时建议用
-I INPUT 1插入顶部,并搭配iptables -L INPUT -n --line-numbers验证位置
不复杂但容易忽略:所有限制都作用于网络层连接,无法区分“合法用户多开”和“恶意爆破”。如需更精细的业务层控制(如每账号限 2 个活跃会话),需由应用自身实现会话管理,iptables 只作第一道防线。

















