使用 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 現在正在運作並且應該正常接受連線。暴發戶還在搞事情!

套接字事件手冊頁說:

當偵測到傳入連線時,表示套接字的檔案描述符將傳遞給相關作業以允許其接受(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, grep for ssh 在正在執行的進程清單中。
  • netstat -tlp,給出服務目前正在偵聽的 TCP 連接埠的清單。此處應列出 SSH,如果沒有,則表示 sshd 未正確配置。
  • ssh -vvv(從客戶端運行),ssh 會話的詳細偵錯輸出有助於找出故障點。
  • nmap <hostname>(從客戶端運行 - 需要安裝 nmap 軟體包),列出主機上的開放連接埠。如果此處未列出 SSH,但在netstat輸出中列出,則可能存在防火牆問題。

相關內容