![使用 upstart 的新套接字桥接器在第一次连接到端口 22 时启动 sshd](https://linux22.com/image/959655/%E4%BD%BF%E7%94%A8%20upstart%20%E7%9A%84%E6%96%B0%E5%A5%97%E6%8E%A5%E5%AD%97%E6%A1%A5%E6%8E%A5%E5%99%A8%E5%9C%A8%E7%AC%AC%E4%B8%80%E6%AC%A1%E8%BF%9E%E6%8E%A5%E5%88%B0%E7%AB%AF%E5%8F%A3%2022%20%E6%97%B6%E5%90%AF%E5%8A%A8%20sshd.png)
最近的 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
,则可能是防火墙问题。