HTTP CONNECT ヘルパーが目的の SSH サーバーへのトンネルを返したら、そのストリームを Paramiko に渡します:

with paramiko.SSHClient() as client:
    client.load_system_host_keys()
    client.connect('ssh.example.com',
                   username='operator',
                   sock=tunnel,
                   banner_timeout=10,
                   auth_timeout=10)
    # Use the verified SSH connection.

例のホストを置き換え、デプロイの正しい known-hosts データを読み込みます。tunnel はすでに同じサーバーへ通じている必要があります。connect に渡すホスト名は SSH ホスト鍵を識別するものであり、プロキシを識別するものではありません。

sock インターフェースは、開いたソケットまたはソケット類似のオブジェクトを受け取ります。HTTP のネゴシエーションは行いません。返す前に、コネクターは次を行う必要があります:

  1. プロキシに接続し、宛先への有効な CONNECT リクエストを送信する。
  2. サポートされているプロキシ認証を完了し、トンネルの成功ステータスを検証する。
  3. プロキシヘッダーセクション全体を読み取り、部分読み取りを処理し、境界を超えたバイトを保持する。
  4. セットアップを制限し、拒否された/エラーのソケットをクリーンアップ経路で閉じる。

その作業には保守されているコネクターを使用してください。1 つの受信バッファーで英語の成功フレーズを探すと、分割されたステータス行、可変の理由テキスト、不完全なヘッダーを見逃します。プロキシの TCP 接続が成功しても、それは受け入れられた SSH トンネルではありません。

プロキシは要求された SSH ポートを許可する必要があります。Web ブラウジングの許可はポート 22 への CONNECT アクセスを確立しません。407 は SSH ログインの前に発生しますが、SSH アカウントの失敗はトンネルの後に発生します。これらのアカウントは分けてください。

終了したら、SSH クライアントとコネクターが所有するリソースを閉じます。タスクが読み取りを停止しても、それ自体で接続が閉じられるわけではありません。

関連記事