如何防止两个或多个具有不同 IP 的用户使用一个用户名同时连接到我的服务器?

如何防止两个或多个具有不同 IP 的用户使用一个用户名同时连接到我的服务器?

我用来绕过我国互联网过滤/审查的方法之一是 SSH 隧道。为此,我使用命令在 Ubuntu 18.04 服务器上创建一个用户adduser USERNAME --shell=/bin/false。但是,这种方法有一个主要缺陷,即多个具有不同 IP 地址的用户可以同时使用此用户名连接到我的服务器,导致服务器的 IP 被政府过滤。如何防止两个或多个具有不同 IP 的用户使用一个用户名同时连接(SSH 隧道)到我的服务器?

附言:我是 Linux 和 Ubuntu 的初级用户,所以请以简单的方式解释所有步骤。

答案1

防止来自多个 IP 的同时连接的一个简单方法是限制用户可以打开的活动会话数。这可以通过创建单个文件并重新启动 SSH 守护程序来实现。

您可以按照以下方式操作:

  1. 连接到您的服务器(如果尚未连接)
  2. 创建一个文件来/etc/security/limits.d包含连接限制规则:
    sudo {editor of choice} /etc/security/limits.d/10-ssh.conf 
    
    笔记:请务必{editor of choice}用您喜欢的文本编辑器进行替换。
  3. 在新文件中粘贴或输入以下内容:
    # Additional limits for users of SSH
    *    hard    maxlogins   1
    
  4. 保存文件
  5. 重新启动 SSH 守护程序
    sudo service ssh restart
    

配置如何工作

物品 意义
* 该规则适用于哪些人
hard 应使用何种程度的执法
maxlogins 正在执行的内容
1 执行限制

如果您希望仅对某些用户进行限制,您可以*用特定用户名替换。例如:

johnny   hard   maxlogins   3

这将限制只是johnny帐户可同时进行三个会话。

如果您希望某些用户组有限制,您可以*用组名替换。例如:

@family   hard   maxlogins   1

这会将family组中的帐户限制为一个同时连接。

如果您想要多个级别,可以向文件中添加更多行。例如:

# Additional limits for users of SSH
@family   hard   maxlogins   1
johnny    hard   maxlogins   2
*         hard   maxlogins   3

如果您决定在将来消除限制,只需删除该文件或将其重命名为类似的名称10-ssh.old,然后重新启动 SSH 守护程序。

答案2

在 Ubuntu 上pam_limits可以限制每个用户的会话数。

例如,当你阅读 Ubuntu 的配置文件时,/etc/pam.d/login你可以找到类似的一行session require pam_limits.so

# Sets up user limits according to /etc/security/limits.conf
# (Replaces the use of /etc/limits in old login)
session require pam_limits.so

因此,与旧版本相比,限制配置文件的路径已经改变login

无论如何,它都会到达/etc/security/上一个答案@matigo 但是我会编辑limits.conf文件而不是在子文件夹中创建文件,因为您需要限制的只有一个用户。

为了限制每个用户的会话数,您可以在文件中添加条目/etc/security/limits.conf

实际上,您可以在此文件的注释中看到示例

在文件末尾添加一行:

#<domain>      <type>  <item>         <value>
johndoe         hard    maxlogins      1

请记住注销你的用户johndoe重新开始sshd编辑完成后即可应用。

pkill -9 -u johndoe # kill all running apps under johndoe user
service ssh restart

精确终止johndoe终端会话

# First run "w" command

[root@vps ~]# w
00:34:21 up 48 days, 23:38, 4 users, load average: 0.79, 0.58, 0.56
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
kate pts/0 192.168.1.101 19:47 4:45m 0.04s 0.00s mc
johndoe pts/1 192.168.1.102 20:35 3:54m 2:23 0.00s nano
max pts/2 192.168.1.103 00:27 5.00s 0.08s 0.04s top
root pts/4 192.168.1.104 00:34 1.00s 0.02s 0.01s w

# then use pkill
pkill -9 -t pts/1

# then restart SSH
service ssh restart

PS我没有测试过,但也许你需要“-”代替“难的”在限制类型列中。

#<domain>      <type>  <item>         <value>
johndoe         -       maxlogins      1

如果您坚持使用直接 SSH 连接,那应该是一个解决方案...但是如果您使用它进行隧道连接,为什么不使用类似的东西呢wireguard

编辑 2023-05-02

当您使用 SSH 隧道时,我相信您需要一些解决方法。使用命令看不到流连接w,但您可以使用 显示它们netstat

因此,我的猜测是,在无法正常工作的情况下,使用它~/.ssh/rc来查看和计算正在运行的连接。johndoe - maxlogins 1limits.conf

首先检查PermitUserRC中的选项sshd_config。您需要启用它(默认情况下它是启用的)并重新启动ssh服务。

然后使用脚本检查当前 IP 的连接数。以下是要使用的脚本草稿(将这些行添加到您的~/.ssh/rc用户下johndoe):

myip=`awk -F" " '{split($0,a); print a[1]}' <<< $SSH_CLIENT`
conncount=`netstat -anpW | grep ':22 \+' | grep ESTABLISHED | grep $myip | wc -l`
if test $conncount -gt 1; then exit 429; fi;

解释:第 (1) 行获取当前 IP,(2) 计算:22端口的连接数$myip,(3) 如果来自此 IP 的连接数超过 1 个,则终止进程并以错误代码退出429

相关内容