如果我“杀死”了 ssh 服务器,为什么 ssh 会话仍然处于活动状态?

如果我“杀死”了 ssh 服务器,为什么 ssh 会话仍然处于活动状态?

我现在遇到过这种情况:通过 ssh 连接到 Ubuntu 14.04 后,你将 sshd_config 更改为无效状态,这service ssh reload将导致服务器停止倾听不会关闭活动的 ssh 会话我已经建立。

重现我所做的步骤:

  1. 连接到 ssh 服务器:

    ssh host
    
  2. 改为/etc/ssh/sshd_config无效状态,例如设置:

    GatewayPorts 0.0.0.0:62222
    
  3. 重新加载服务器配置

    sudo service ssh reload
    
  4. 检查步骤1)中建立的ssh连接是否仍然有效,并且您可以输入任何您想要的内容。

  5. 不要关闭已经建立的连接并尝试从另一个终端再次连接服务器:

    ssh host
    

就我而言,我收到了这条信息:

ssh: connect to host IP_ADDR port SSH_PORT: Connection refused

这意味着 ssh 服务器不再监听传入的连接,但不知何故仍然神奇地运行并处理我建立的连接。

我认为这有时对某些人来说非常有用把自己锁起来进入 ssh 会话,以便其他人无法连​​接确保服务器能够执行用户想要的任何操作。

所以问题是:这是期望的行为吗?这种实现的初衷是什么?

顺便说一句,我注意到 ssh 服务器在这种情况下处于不一致的状态:

$ service ssh reload
reload: Job is not running: ssh
$ service ssh start
start: Job is already running: ssh

因此,为了恢复服务器,我必须运行:

service ssh reload

可能需要注意的重要事项:

  1. Ubuntu 服务器配置如下:邮箱 v0.20并且未做进一步的改变。
  2. 服务器提供商(DigitalOcean)在 sshd_config 中为我设置了另外两条规则:
    • 客户端存活间隔 120
    • 客户端存活数最大 2

答案1

因为用户的连接在不同的进程中运行。这是非常有用的功能。

  • 它可以防止你因配置不当而将自己锁定在服务器之外
  • 它具有更强的防故障能力:单个(用户)进程的故障不会杀死所有其他连接
  • 它比处理所有连接的单个进程提供更好的性能
  • 它更加安全:用户实际上被分成不同的进程。

以这种方式编写 TCP 服务器是一种常见做法。它与 Apache 略有不同,Apache 会生成多个工作程序,这些工作程序将在后续连接中重复使用。

相关内容