使用 upstart 的新套接字桥接器在第一次连接到端口 22 时启动 sshd

使用 upstart 的新套接字桥接器在第一次连接到端口 22 时启动 sshd

最近的 Upstart 具有这些新的类似 systemd 的功能,即通过套接字桥接在传入连接上启动作业。我想在第一次连接到端口 22 时启动我的 sshd。

我现在有: start on socket PROTO=inet PORT=22在我的 ssh.conf 中,我有 upstart-socket-bridge 和 upstart-udev-bridge 作业正在运行。

当我连接到端口 22 上的机器时,ssh 作业启动正常,但 sshd 没有回复我。就好像它没有收到它并且无法接受它。重试连接无济于事,即使 sshd 现在正在运行并且应该正常接受连接。Upstart 仍然在搞乱它!

套接字事件手册页说:

当检测到传入连接时,表示套接字的文件描述符将传递给相关作业,以允许其接受(2)连接。此外,环境变量 UPSTART_JOB 将包含事件的名称(“套接字”),环境变量 UPSTART_FDS 将包含与监听套接字相对应的文件描述符的编号。

这是否意味着要利用这一点,ssh 需要特定支持来传递套接字 FD?如果是这样,那就有点破坏了所有的乐趣 :/

答案1

使用套接字桥需要一个修补的守护进程来处理给定的套接字。

man socket-event

当检测到传入连接时,表示套接字的文件描述符将传递给相关作业,以允许其接受(2)连接。此外,环境变量 UPSTART_JOB 将包含事件的名称(“套接字”),环境变量 UPSTART_FDS 将包含与监听套接字相对应的文件描述符的编号。

虽然 sshd 通常只是创建一个套接字并在其上运行 listen() 然后运行 ​​accept(),但 sshd 只需要读取 UPSTART_FDS 环境变量并在其上运行 accept()。

答案2

我强烈建议将 sshd 作为常规服务运行,而不是按需启动它。除了最极端的情况外,sshd 完全有能力自行管理连接。

如果您确实必须按需启动 sshd,则以下命令有助于进行故障排除:

  • ps auxw | grep ssh,在正在运行的进程列表中搜索 ssh。
  • netstat -tlp,列出服务当前正在监听的 TCP 端口。SSH 应该列在这里,如果没有,则 sshd 配置不正确。
  • ssh -vvv(从客户端运行),来自您的 ssh 会话的详细调试输出有助于查明故障点。
  • nmap <hostname>(从客户端运行 - 需要安装 nmap 包),列出主机上的开放端口。如果 SSH 未在此处列出,但在输出中列出netstat,则可能是防火墙问题。

相关内容