如何为Linux用户限制VSFTPD与SSH的总并发连接数(上限5)?
可行!完整实现方案
这个需求完全可以落地,核心思路是通过PAM认证模块配合自定义脚本,在用户发起SSH/SFTP或VSFTPD连接前,统一统计该用户的两类连接总数,超过阈值就直接拒绝新请求。下面是具体的配置步骤:
一、编写连接计数脚本
先创建一个脚本,用来统计指定用户当前的SSH和VSFTPD连接数总和。保存为/usr/local/bin/check_user_connections.sh:
#!/bin/bash USER="$1" # 统计SSH/SFTP连接数:筛选该用户名下的sshd子进程数量 SSH_COUNT=$(ps -u "$USER" | grep -c sshd) # 统计VSFTPD连接数:筛选该用户名下的vsftpd子进程数量 VSFTP_COUNT=$(ps -u "$USER" | grep -c vsftpd) # 计算总连接数 TOTAL=$((SSH_COUNT + VSFTP_COUNT)) # 阈值设为5,超过则返回非0值(PAM会触发拒绝逻辑) if [ "$TOTAL" -ge 5 ]; then exit 1 else exit 0 fi
给脚本添加可执行权限:
chmod +x /usr/local/bin/check_user_connections.sh
二、配置PAM限制SSH/SFTP连接
编辑SSH的PAM配置文件/etc/pam.d/sshd,在文件开头新增一行:
auth required pam_exec.so quiet expose_authtok /usr/local/bin/check_user_connections.sh %u
说明:
%u会自动将当前登录的用户名传递给脚本,pam_exec.so会在认证环节先执行脚本,若脚本返回非0值,直接拒绝用户登录请求。
三、配置PAM限制VSFTPD连接
编辑VSFTPD的PAM配置文件/etc/pam.d/vsftpd,同样在开头新增一行:
auth required pam_exec.so quiet expose_authtok /usr/local/bin/check_user_connections.sh %u
四、补充服务配置优化
SSH侧补充限制:如果想避免单个SSH会话开启过多子进程(比如多次SFTP复用连接),可以在
/etc/ssh/sshd_config中针对目标用户/用户组设置会话上限(作为全局计数的补充):Match User target_user MaxSessions 5配置完成后重启sshd服务:
systemctl restart sshdVSFTPD侧确认配置:确保VSFTPD启用PAM认证,在
/etc/vsftpd.conf中检查以下配置:pam_service_name=vsftpd userlist_enable=NO tcp_wrappers=NO重启vsftpd服务:
systemctl restart vsftpd
五、测试验证
- 用目标用户同时开启4个SSH连接,尝试第5个可以正常登录;
- 保持5个SSH连接,再发起VSFTPD连接会被直接拒绝;
- 关闭1个SSH连接后,再次发起VSFTPD连接即可成功。
注意事项
- 如果你的系统中vsftpd运行时的进程名不是
vsftpd,需要修改脚本中grep的匹配关键词; - 确保系统已安装
pam_exec模块(大部分主流发行版默认包含); - 针对批量用户,可以通过
Match Group在sshd_config中配置组规则,或在脚本中添加用户组的判断逻辑。
内容的提问来源于stack exchange,提问作者CodeWriter




