connlimit无法直接限制用户组,因其工作在内核网络层,仅识别ip、端口等网络信息,而用户组属于sshd应用层认证后的上下文,iptables无法获取;需结合sshd的match group配置或pam/systemd等系统机制实现。

iptables 的 connlimit 模块本身不识别“用户组”(如 Linux 的 group),它只能基于网络层信息(如源 IP、目标端口、连接状态)做限制。要实现“按用户组限制 SSH 并发数”,需结合系统级机制(如 PAM、sshd 配置)与 iptables 协同完成,不能单靠 connlimit 直接匹配用户组。
为什么 connlimit 无法直接限制用户组
connlimit 是 netfilter 内核模块,在网络协议栈的 IP 层工作,此时 SSH 连接尚未完成认证,更无用户身份(UID/GID)或所属组信息。用户组属于应用层(sshd 进程)管理范畴,iptables 无法获取该上下文。
可行的替代方案:按源 IP + 用户组间接控制
若用户组成员使用固定 IP 或 IP 段(如内网办公环境),可将用户组映射为 IP 范围,再用 connlimit 限制:
- 确认该用户组所有成员登录来源 IP 是否可控(例如:运维组固定使用 192.168.10.0/24)
- 加载 connlimit 模块:
modprobe ipt_connlimit - 添加规则(限制每个源 IP 最多 2 个并发 SSH 连接):
iptables -A INPUT -p tcp --dport 22 -s 192.168.10.0/24 -m connlimit --connlimit-above 2 -j REJECT --reject-with tcp-reset - 如需按“每个 /32 IP”单独限流(更精确),保留
--connlimit-mask 32(默认值)
真正按用户组限制:需结合 sshd 和 PAM
若必须按 Linux 用户组(如 sshusers)控制并发连接数,应使用以下组合方式:
- 在
/etc/ssh/sshd_config中启用MaxSessions和MaxStartups(全局或 Match 块) - 用
Match Group sshusers针对组配置:
Match Group sshusers
MaxSessions 3
MaxStartups 5:30:10 - 重启服务:
systemctl restart sshd - 注意:
MaxSessions控制单个用户的会话数(如 SSH 多窗口、端口转发等),MaxStartups控制未认证连接排队上限,二者配合可有效抑制暴力扫描和滥用
进阶:结合 systemd-logind 或 cgroup 限制登录进程总数
对高安全要求场景,可进一步绑定用户组与资源限额:
- 为用户组创建 systemd slice(如
/etc/systemd/system/sshslice.slice),设置TasksMax=10 - 在
/etc/login.defs或用户 shell 启动脚本中,通过systemd-run --scope --slice=sshslice.slice包裹登录会话 - 或使用
pam_systemd.so自动为组内用户分配 slice(需定制 PAM 配置) - 该方式从进程级限制总并发数,比网络层更贴近“用户组”语义










