如何限制Linux服务器中仅使用端口转发(ssh -N参数)的指定代理用户连接数
如何限制Linux服务器中仅使用端口转发(ssh -N参数)的指定代理用户连接数
我之前也碰到过一模一样的需求——给专属代理用户限制并发连接数,常规的MaxSessions和limits.conf确实对ssh -N这种无会话连接不太管用,下面给你分享几个亲测可行的方案,完全符合你的限制条件:
方案一:用ForceCommand+自定义脚本(最精准,推荐)
这个方案通过替换你现有的ForceCommand,用脚本提前检查当前连接数,超过限制就拒绝新连接,同时保留端口转发功能:
- 编写连接检查脚本
创建一个脚本文件,比如/usr/local/bin/check-proxy-conns.sh,内容如下:
#!/bin/bash # 这里设置允许的最大并发连接数,你可以根据需求修改 MAX_ALLOWED=5 # 统计当前proxy-user的仅端口转发类型连接(对应sshd进程状态为[net]的) current_conns=$(ps aux | grep 'sshd: proxy-user' | grep -v grep | grep -c '\[net\]') # 连接数超限则拒绝 if [ "$current_conns" -gt "$MAX_ALLOWED" ]; then echo "抱歉,当前代理连接已达上限($MAX_ALLOWED),请稍后再试" exit 1 fi # 保持连接存活(因为ssh -N本来不执行命令,用sleep infinity维持连接不中断) sleep infinity
- 设置脚本权限
为了安全,让脚本归root所有,并且只有root能修改,其他用户仅能执行:
chmod 755 /usr/local/bin/check-proxy-conns.sh chown root:root /usr/local/bin/check-proxy-conns.sh
- 修改sshd配置
打开你的sshd_config,找到Match User proxy-user块,把原来的ForceCommand替换成脚本路径:
Match User proxy-user AllowTcpForwarding yes X11Forwarding no PermitTunnel no GatewayPorts no AllowAgentForwarding no PasswordAuthentication yes ForceCommand /usr/local/bin/check-proxy-conns.sh
- 重启sshd生效
systemctl restart sshd
这样,当用户用ssh proxy-user@server -D 1080 -N连接时,脚本会先检查当前已有的代理连接数,超过上限就直接断开,否则保持连接并正常提供端口转发服务。
方案二:用limits.conf(简单但需配置PAM)
如果你的proxy-user只用于代理,没有其他进程需求,可以用用户进程数限制来实现:
- 编辑limits.conf
打开/etc/security/limits.conf,添加一行:
proxy-user hard nproc 5
这里的5是最大进程数,每个ssh -N连接对应一个proxy-user身份的sshd子进程,所以这个数值就是最大并发连接数。
- 确保PAM生效
检查/etc/pam.d/sshd文件中是否有这一行,如果没有就加上:
session required pam_limits.so
- 重启sshd
systemctl restart sshd
这个方法的缺点是会限制该用户的所有进程数,但如果proxy-user没有其他用途,这个方案最简单。
方案三:用iptables(适合该用户所有连接都是代理的情况)
如果proxy-user的所有ssh连接都是ssh -N代理,没有其他操作,可以用iptables基于用户UID限制并发连接数:
执行以下命令添加规则:
iptables -A INPUT -p tcp --dport 22 -m owner --uid-owner proxy-user -m connlimit --connlimit-above 5 -j REJECT --reject-with tcp-reset
这里的5是最大并发连接数,--uid-owner proxy-user确保只针对该用户生效,不会影响其他用户。
如果需要规则永久生效,根据你的系统用iptables-save或者对应的工具保存规则(比如netfilter-persistent)。
备注:内容来源于stack exchange,提问作者mhn2




