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