进一步阅读

进一步阅读

我只是想在开始研究之前看看这是否可行。这是场景,我希望服务器不断侦听 SSH 请求(我确信它已经侦听,我只是不知道在哪里),并根据传入计算机的 IP 地址不执行任何操作或采取操作在 SSH 尝试开始之前。

注意:我希望允许每次 ssh 尝试(当然需要正确的凭据)进入系统,我只是希望能够在此之前执行一些操作。运行 Gentoo Base 2.4.1

答案1

要通过 TCP 提供服务,某些程序必须调用listen()以获取监听套接字,并且同一程序或与其相关的程序必须调用accept()以接受单独的传入 TCP 连接,以进一步连接的套接字。 OpenSSH 的服务器守护进程在这方面以两种基本模式运行。

  • 它是在没有-i选项的情况下启动的。它执行listen()然后循环重复调用accept()fork()关闭每个传入连接的子进程。
  • 它是从-i选项开始的。它期望有其他东西调用listen()accept()、 和fork(),并使用已连接的套接字作为已打开的文件描述符来执行它。

后一种模式是nowaitinetd超级服务器下的 TCP 服务器风格、Accept=yessystemd 中的 TCP 套接字单元风格以及与 Daniel J. Bernstein 的 UCSPI-TCP 配合使用的服务器风格。

不幸的是前一种模式才不是与systemdwait下的TCP服务器的风格inetdAccept=nosystemd下的TCP服务器的风格相对应。 OpenSSH 不使用该LISTEN_FDS协议,也不承认用于侦听套接字的已打开文件描述符。另外不幸的是,有些人鼓励这种使用模式,因此它很可能是 OpenSSH 设置为在您的系统上运行的方式。

因为你想要的是后一种模式。

您将其包裹ssh -i在其他内容中,该内容查看有关连接远程端的信息,并根据在 then exec()ing之前找到的内容执行操作ssh -i。 (UCSPI-TCP 使这变得非常容易,因为远程端信息被放入环境变量中。)然后您调用包装器而不是ssh -i直接调用。

执行此操作的细节取决于您,因为它们取决于您未告诉我们的事情,例如您正在使用的服务管理系统。它的范围很广,从ExecStartsystemd 服务单元中不同的插入片段到修改后的xinetd配置文件,再到./servicenosh 服务包中的替换程序。

另一种方法是使用文件中的机制,该方法将与非-i调用模式一起工作,但不会推广到提供特定服务的特定程序的某些选项之外(与前述方法相反)。除了设置 OpenSSH 选项的子集(包括日志级别)之外,这不能做任何事情,当然甚至不适用于其他 SSH 服务器软件,更不用说其他类型的服务了。Matchsshd_config

在你的包装中保持理智。 SSH 连接在执行时并未启动并运行;你应该不是(为了安全)阅读任何来自网络连接的数据,也不向其中写入任何数据;唯一要做的就是根据列表检查地址/端口,然后以某种方式配置每个会话的设置。

进一步阅读

相关内容