最近の Upstart には、socket-bridge 経由の接続時にジョブを開始する、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 にはイベントの名前 ("socket") が含まれ、環境変数 UPSTART_FDS にはリスニングソケットに対応するファイル記述子の番号が含まれます。
つまり、これを利用するには、ssh がソケット FD を渡すための特別なサポートを必要とするということですか? もしそうなら、それはちょっと楽しみを台無しにします :/
答え1
ソケット ブリッジを使用するには、指定されたソケットを処理できるパッチを適用したデーモンが必要です。
からman socket-event
:
着信接続が検出されると、ソケットを表すファイル記述子が問題のジョブに渡され、接続を受け入れる(2)ことができます。さらに、環境変数 UPSTART_JOB にはイベントの名前 ("socket") が含まれ、環境変数 UPSTART_FDS にはリスニングソケットに対応するファイル記述子の番号が含まれます。
通常、sshd は単にソケットを作成し、その上で listen() を実行してから accept() を実行しますが、sshd は UPSTART_FDS 環境変数を読み取って、その上で accept() を実行するだけで済みます。
答え2
sshd をオンデマンドで起動するのではなく、通常のサービスとして実行することを強くお勧めします。sshd は、極端な場合を除き、独自に接続を管理する能力が十分にあります。
どうしてもオンデマンドで sshd を起動する必要がある場合は、次のコマンドがトラブルシューティングに役立ちます。
ps auxw | grep ssh
実行中のプロセスのリストで ssh を grep で検索します。netstat -tlp
は、サービスが現在リッスンしている TCP ポートのリストを表示します。SSH はここにリストされるはずです。リストされていない場合は、sshd が正しく構成されていません。ssh -vvv
(クライアントから実行)、SSH セッションからの詳細なデバッグ出力は、障害ポイントの特定に役立ちます。nmap <hostname>
(クライアントから実行 - nmap パッケージのインストールが必要)、ホスト上の開いているポートを一覧表示します。SSH がここには表示されていないが、netstat
出力には表示されている場合は、ファイアウォールに問題がある可能性があります。