我用来绕过我国互联网过滤/审查的方法之一是 SSH 隧道。为此,我使用命令在 Ubuntu 18.04 服务器上创建一个用户adduser USERNAME --shell=/bin/false
。但是,这种方法有一个主要缺陷,即多个具有不同 IP 地址的用户可以同时使用此用户名连接到我的服务器,导致服务器的 IP 被政府过滤。如何防止两个或多个具有不同 IP 的用户使用一个用户名同时连接(SSH 隧道)到我的服务器?
附言:我是 Linux 和 Ubuntu 的初级用户,所以请以简单的方式解释所有步骤。
答案1
防止来自多个 IP 的同时连接的一个简单方法是限制用户可以打开的活动会话数。这可以通过创建单个文件并重新启动 SSH 守护程序来实现。
您可以按照以下方式操作:
- 连接到您的服务器(如果尚未连接)
- 创建一个文件来
/etc/security/limits.d
包含连接限制规则:
笔记:请务必sudo {editor of choice} /etc/security/limits.d/10-ssh.conf
{editor of choice}
用您喜欢的文本编辑器进行替换。 - 在新文件中粘贴或输入以下内容:
# Additional limits for users of SSH * hard maxlogins 1
- 保存文件
- 重新启动 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 1
limits.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