MaxSessions/MaxStartups 会修复 ssh“连接被拒绝”消息吗?

MaxSessions/MaxStartups 会修复 ssh“连接被拒绝”消息吗?

底部更新 -->

我正在使用Red Hat Enterprise Linux Server 版本 7.4 (Maipo) VM在我的 OS 班上,大约有 20 名学生,他们通常使用自己的特定用户 ID 向这台机器发起大约两个 ssh 连接。当学生陆续进入教室时,这种方法似乎效果很好。

但是,在课程开始时,当大多数学生尝试登录时,我有一些学生无法登录系统并显示一条“ssh: connect to host xxx.xxx.xxx.xxx port 22: Connection refused”消息。等待 20 分钟左右似乎最终让更多人进入。sshd 肯定正在运行。被拒绝的用户组各不相同,有时也包括我。我可能在几分钟前通过 ssh 成功连接,但随后无法启动第二个会话。

我们所有的传出流量都使用多对一 NAT 设置,因此服务器上的所有传入 ssh 连接都将显示为来自同一 IP 号。查看文档并进行一些挖掘后,我更改了以下两个参数sshd_配置文件:

#MaxSessions 10
MaxSessions 500

#MaxStartups 10:30:100
MaxStartups 75:10:200

据我了解最大会话数控制到服务器的活动 ssh 连接的数量 - 即使仅来自一个 IP 号码,而最大创业公司与初始连接尝试有关(例如,尝试登录但尚未提供密码的人),因此在这种情况下,我可以在启动时容纳 75,然后速率将增加 10%,直到达到 200 的限制(所以我应该设置 MaxSessions 并且这个数字相同吗?)

我使用密码验证,并且禁用了 root 登录。我们通常使用 git bash shell 从 Windows 10 计算机登录(虽然我也使用过 putty 来查看这是否会有所不同,但结果没有)。

无论如何,我在这里处理登录问题是否正确?问题是我无法随意可靠地重现这个问题。这个问题似乎只发生在课堂上,当同时有大量连接尝试时,其他时候我登录和退出都没有遇到任何问题,而且没有一个学生在其他时候报告过这个问题。

我还能尝试什么来帮助诊断和修复此问题?我知道这似乎是许多人都会遇到的一种错误,我在这里读了很多,但还没有找到一个有效的解决方案。


更新

因此,当我尝试使用这个小脚本重现这个问题时(感谢@RobbieMckennie 给了我这个想法)

LIMIT=5

for i in $(seq $LIMIT)
do
    echo 
    echo "============================= ${i} ==================="
    ssh -vvv [email protected]
    echo 
done

我尝试登录三次后会得到以下信息:

$ ssh -vvv [email protected]
OpenSSH_7.5p1, OpenSSL 1.0.2k  26 Jan 2017
debug1: Reading configuration data /etc/ssh/ssh_config
debug2: resolving "xx.xx.xxx.xx" port 22
debug2: ssh_connect_direct: needpriv 0
debug1: Connecting to xx.xx.xxx.xx [xx.xx.xxx.xx] port 22.
debug1: connect to address xx.xx.xxx.xx port 22: Connection refused
ssh: connect to host xx.xx.xxx.xx port 22: Connection refused

事实上,如果我快速连续登录 3 次,我就能“手动”重现此问题,第 4 次尝试就会出现这种情况。原始 IP 号码位于 fail2ban ( jail.local) 中的 ignoreip 列表中,据我所知,它似乎可以正常工作

2017-10-12 07:38:04,481 fail2ban.filter         [52845]: WARNING Determined IP using DNS Lookup: c-yy-yy-yy-yyy.hsd1.il.comcast.net = ['yy.yy.yy.yyy']
2017-10-12 07:38:04,482 fail2ban.filter         [52845]: INFO    [sshd] Ignore yy.yy.yy.yyy by ip

尽管我不确定这个警告是否意味着什么。

因此,有两个问题:

  1. 是什么原因导致拒绝?据我所知,我甚至还没有进入系统。我需要调整配置设置吗?

  2. 更重要的是,当我的 22 名学生都尝试从校园登录时,由于我们的多对一 NAT,所有这些连接都来自同一个 IP 号码,这能解释这一点吗?在我看来,这是可能的(?)

唯一不同的是,当发生拒绝时,学生需要大约 15 分钟左右才能登录,而在上面我的实验中,我几秒钟内就可以重新登录。这可能是由于某种积压造成的吗?

特别是这个条目,我刚刚在 IPtables 中发现了这个条目

Chain INPUT_direct (1 references)
target     prot opt source               destination
           tcp  --  anywhere             anywhere             tcp dpt:ssh state NEW recent: SET name: DEFAULT side: source mask: 255.255.255.255

REJECT     tcp  --  anywhere             anywhere             tcp dpt:ssh state NEW recent: UPDATE seconds: 30 **hit_count: 4** name: DEFAULT side: source mask: 255.255.255.255 reject-with tcp-reset

这可以解释 3 次登录的限制,但同样,我不确定这是否可以解释当我们遇到这种情况时在校园里等待 15 分钟左右才能重新登录。

答案1

我知道我迟到了 ;-) 但我想你已经运行了 fail2ban,或者类似的东西?

Fail2ban 可以帮助保护各种守护进程免受暴力攻击。对于 sshd,fail2ban 会暂时阻止重复登录失败的 IP 地址的端口。有几种方法可以解决这种情况:停止 fail2ban、将学校的 IP 列入白名单、...

答案2

我遇到过类似的问题,最终一些恶意机器人默认占用了所有可用的连接插槽。

与我们从手册页中了解到的情况不同,当达到限制时,MaxStartups 不会按 FIFO 顺序丢弃待处理的连接,但会忽略所有新连接。因此,如果您使用默认值 10,并且有 10 个人连接但未发送任何内容,您将无法再登录。基本上,如果您不希望有人通过打开大量连接轻易将您锁定在系统之外(默认设置下 DoS 可能性很高),则您希望该数字非常高。

还有另一个设置:LoginGraceTime。这是未经身份验证的用户被服务器踢出之前的时间,默认为 600 秒。这解释了为什么 OP 看到学生实际登录前有大约 15 分钟的延迟。您希望此设置尽可能低,以便可以快速丢弃虚拟连接。

我可能会联系 debian 的 openssh 维护者来讨论这个问题。默认配置不应该那么容易受到 DoS 攻击。

编辑:我查看了错误报告、CVE 和 openssh 源代码。由于连接是以一次性分配的方式处理的,因此增加 MaxStartups 会对 RAM 使用产生直接且持续的影响。基本上有一些“malloc(MAX_STARTUPS*sizeof(connection))”。实际上,修复此问题需要对 openssh 处理内存分配的方式进行重大修改,而这需要花费别人没有的时间。

相关内容