我只是想在开始研究之前看看这是否可行。这是场景,我希望服务器不断侦听 SSH 请求(我确信它已经侦听,我只是不知道在哪里),并根据传入计算机的 IP 地址不执行任何操作或采取操作在 SSH 尝试开始之前。
注意:我希望允许每次 ssh 尝试(当然需要正确的凭据)进入系统,我只是希望能够在此之前执行一些操作。运行 Gentoo Base 2.4.1
答案1
要通过 TCP 提供服务,某些程序必须调用listen()
以获取监听套接字,并且同一程序或与其相关的程序必须调用accept()
以接受单独的传入 TCP 连接,以进一步连接的套接字。 OpenSSH 的服务器守护进程在这方面以两种基本模式运行。
- 它是在没有
-i
选项的情况下启动的。它执行listen()
然后循环重复调用accept()
和fork()
关闭每个传入连接的子进程。 - 它是从
-i
选项开始的。它期望有其他东西调用listen()
、accept()
、 和fork()
,并使用已连接的套接字作为已打开的文件描述符来执行它。
后一种模式是nowait
旧inetd
超级服务器下的 TCP 服务器风格、Accept=yes
systemd 中的 TCP 套接字单元风格以及与 Daniel J. Bernstein 的 UCSPI-TCP 配合使用的服务器风格。
不幸的是前一种模式才不是与systemdwait
下的TCP服务器的风格inetd
和Accept=no
systemd下的TCP服务器的风格相对应。 OpenSSH 不使用该LISTEN_FDS
协议,也不承认用于侦听套接字的已打开文件描述符。另外不幸的是,有些人鼓励这种使用模式,因此它很可能是 OpenSSH 设置为在您的系统上运行的方式。
因为你想要的是后一种模式。
您将其包裹ssh -i
在其他内容中,该内容查看有关连接远程端的信息,并根据在 then exec()
ing之前找到的内容执行操作ssh -i
。 (UCSPI-TCP 使这变得非常容易,因为远程端信息被放入环境变量中。)然后您调用包装器而不是ssh -i
直接调用。
执行此操作的细节取决于您,因为它们取决于您未告诉我们的事情,例如您正在使用的服务管理系统。它的范围很广,从ExecStart
systemd 服务单元中不同的插入片段到修改后的xinetd
配置文件,再到./service
nosh 服务包中的替换程序。
另一种方法是使用文件中的机制,该方法将与非-i
调用模式一起工作,但不会推广到提供特定服务的特定程序的某些选项之外(与前述方法相反)。除了设置 OpenSSH 选项的子集(包括日志级别)之外,这不能做任何事情,当然甚至不适用于其他 SSH 服务器软件,更不用说其他类型的服务了。Match
sshd_config
在你的包装中保持理智。 SSH 连接在执行时并未启动并运行;你应该不是(为了安全)阅读任何来自网络连接的数据,也不向其中写入任何数据;唯一要做的就是根据列表检查地址/端口,然后以某种方式配置每个会话的设置。
进一步阅读
- 乔纳森·德博因·波拉德 (2016)。UNIX 客户端-服务器程序接口上的 gen。经常给出的答案。
- 丹尼尔·伯恩斯坦 (1996)。UNIX 客户端-服务器程序接口。 cr.yp.to。
- 乔纳森·德博因·波拉德 (2016)。
ucspi-socket-rules-check
。诺什工具集。软件。 - https://unix.stackexchange.com/a/315470/5132