You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何限制Linux服务器中仅使用端口转发(ssh -N参数)的指定代理用户连接数

如何限制Linux服务器中仅使用端口转发(ssh -N参数)的指定代理用户连接数

我之前也碰到过一模一样的需求——给专属代理用户限制并发连接数,常规的MaxSessionslimits.conf确实对ssh -N这种无会话连接不太管用,下面给你分享几个亲测可行的方案,完全符合你的限制条件:

方案一:用ForceCommand+自定义脚本(最精准,推荐)

这个方案通过替换你现有的ForceCommand,用脚本提前检查当前连接数,超过限制就拒绝新连接,同时保留端口转发功能:

  1. 编写连接检查脚本
    创建一个脚本文件,比如/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
  1. 设置脚本权限
    为了安全,让脚本归root所有,并且只有root能修改,其他用户仅能执行:
chmod 755 /usr/local/bin/check-proxy-conns.sh
chown root:root /usr/local/bin/check-proxy-conns.sh
  1. 修改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
  1. 重启sshd生效
systemctl restart sshd

这样,当用户用ssh proxy-user@server -D 1080 -N连接时,脚本会先检查当前已有的代理连接数,超过上限就直接断开,否则保持连接并正常提供端口转发服务。

方案二:用limits.conf(简单但需配置PAM)

如果你的proxy-user只用于代理,没有其他进程需求,可以用用户进程数限制来实现:

  1. 编辑limits.conf
    打开/etc/security/limits.conf,添加一行:
proxy-user hard nproc 5

这里的5是最大进程数,每个ssh -N连接对应一个proxy-user身份的sshd子进程,所以这个数值就是最大并发连接数。

  1. 确保PAM生效
    检查/etc/pam.d/sshd文件中是否有这一行,如果没有就加上:
session required pam_limits.so
  1. 重启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

火山引擎 最新活动