ssh: チャネル xx: オープン失敗: 接続失敗: オープン失敗

ssh: チャネル xx: オープン失敗: 接続失敗: オープン失敗

sshローカルUnixドメインソケットから別のコンピュータのドメインソケットに接続をリダイレクトするためにmacOSで実行されています。呼び出されるコマンドラインはsshおおよそ次のとおりです。

$ ssh -nNT -L /var/run/some.socket:/var/run/some.socket -o TCPKeepAlive=yes \
    -o ServerAliveCountMax=10 -o ServerAliveInterval=60 user@destination

いくつかの負荷テストを実行した後、特定のクライアント接続が失敗することがあり、ログを確認すると、次のsshエラー出力で接続が失敗したことがわかりました。

channel 41: open failed: connect failed: open failed
channel 44: open failed: connect failed: open failed
channel 47: open failed: connect failed: open failed
channel 49: open failed: connect failed: open failed
channel 51: open failed: connect failed: open failed
channel 59: open failed: connect failed: open failed
channel 62: open failed: connect failed: open failed
channel 64: open failed: connect failed: open failed

負荷テストパラメータは、100個の同時接続を実行することでした(接続、一部のデータ転送、一部のデータ受信、切断、合計10,000個の接続)。

観察された動作は、テストの開始時に最初の接続セットが非常に迅速に生成され、上記のエラーによって接続が失敗することがほとんどないことです。失敗の回数は実行ごとに異なりますが、通常は数から数十に達します。ほとんどの障害はテストの開始時に発生する傾向がありますが、時にはテストの後半(つまり最初の100回完了後)に発生することがあります。

localhost同様の説明を持つSOの他の投稿は、使用法と回避策の問題に対処しているように見えますが、127.0.0.1これはTCP / IPソケットではないため関係ありません。また、destination上記のコマンドのいくつかはIPアドレスとして指定されています。

問題を解決して追跡する方法は少し混乱しています。私は以下を使って作業の詳細なダンプを-vvv取得しようとしました。ssh

呼び出しはsshスクリプトで実行され、ulimit -n 1024すべてのソケットをサービスするために使用できるようにするには、呼び出し前に十分なファイル記述子を指定する必要があります。

ベストアンサー1

channel 41: open failed: connect failed: open failed

このエラーメッセージは、リモートSSHサーバーがトンネルターゲットに接続できないため、TCP転送要求を実行できないことを意味します。メッセージの最後の「オープン失敗」部分は、リモートSSHサーバーからのエラーメッセージです。

ポート転送を使用してSSHを実行すると、ポート転送は次のように機能します。

  1. ローカルSSHクライアントは、ローカルポート(あなたの場合は/var/run/some.socket)からTCP接続をリッスンします。
  2. イニシエータがローカルポートに接続すると、SSHクライアントは "direct-tcpip"チャネルに対する要求をサーバーに送信します。要求にはトンネル宛先(あなたの場合はリモートシステムの/var/run/some.socket)が含まれます。
  3. リモートSSHサーバーはトンネルの宛先とTCP接続を確立します。
  4. ローカルSSHクライアントとリモートSSHサーバーは、対応するTCP接続とdirect-tcpipチャネルの間で双方向にデータを中継します。

あなたの場合、SSHサーバーは何らかの理由でトンネルターゲットに接続できないため、手順3で失敗します。

リモートサーバーのSSHログを確認する必要があります。 SSHサーバープロセスが失敗した理由を説明するメッセージを記録した可能性があります。それ以外にも、負荷テスト中に間欠的にこの現象が発生すると言われており、負荷関連のサーバー側の問題を見てみましょう。私はいくつかの可能性を考えてみました。

  1. リモートシステムの/var/run/some.socketを受信するアプリケーションは、接続要求を十分に迅速に処理できず、バックログになっています。
  2. SSHサーバープロセスでいくつかのリソース制限(開いているファイル記述子の数など)が発生しました。

おすすめ記事