web-dev-qa-db-ja.com

ssh ProxyCommandは実際にはどのように機能しますか?

私はsshのProxyCommand機能の使用に慣れており、それを使用して複数の要塞ホストをホップして最終的なホストに効率的に到達できます。しかし、私はそれが実際にバックエンドでどのように機能するのか理解できないようです。

たとえば次の設定ファイルがあります。

Host final
Hostname final.com
Port 22
AgentForwarding yes
User guestuser
ProxyCommand "ssh [email protected] -W %h:%p"

Host finalに接続する場合、final.comに接続する前にProxyCommandが実行されることを理解しています。しかし、それでも接続の順序を理解できていないようです。

そして、オプション-W %h:%pは何をしますか?これはnetcat機能であり、nc %h %pに類似していることを理解しています。

私の理解がここまで行く限り、操作のシーケンスです。私が間違っているかどうか親切に知らせてください。私の例では、上記で指定した構成ファイルを使用します。

  1. ユーザーはssh finalを入力します
  2. Bastion.comへのssh接続が作成されました。
  3. Netcatトンネルは、bastion.comからfinal.comのポート22に作成されます。 netcatのstdinは、bastion.comへの接続で取得したシェルに接続されています。
  4. これで、システムからfinal.comに接続できました。この接続の前半は、システムからbastion.comへのssh接続です。この接続の後半は、bastion.comからfinal.comへのnetcatトンネルです。
  5. ここで、ssh finalコマンドは上記の接続をプロキシとして受け取り、この既存の接続を介してデータをトンネルします。

さらに、この手法がssh stackingとしても知られているかどうかも知りたいです。

追加された改行

8
Naruto Uzumaki

3)netcatトンネルがbastion.comからfinal.comのポート22に作成されます。

false、netcatはありません。

1)ユーザーがssh final on localhost。これにより、親sshプロセスが起動します
2)親sshは、I/Oをパイプにリダイレクトして子sshを作成します
3)子sshがbastion.comへの接続を作成します。
4)bastion.comのsshdプロセスは、final.com:22へのTCP接続を作成します
5)localhostとbastion.com間の既存のssh接続にsshチャネルが追加されます
6)親sshがハンドシェイクデータをパイプに書き込み、子sshがパイプからデータを読み取り、sshチャネル経由でbastion.comのsshdに送信します。 sshdはそれを読み取り、final.comに接続されているソケットに書き込みます。同様に、データはfinal.comからlocalhostに送信されます

8
basin