ローカル SOCKS リスナーは一部のネットワークでは有用ですが、ないネットワークもあります。OpenSSH はプロキシコマンドを条件付きで選べるため、その選択を全ホストに適用せずに済みます。

OpenBSD 形式の nc を使う OpenSSH では、クライアント設定の例は次のとおりです。

Host work-server
    HostName ssh.example.net
    User alex

Match originalhost work-server exec "nc -z -w 1 127.0.0.1 1080"
    ProxyCommand nc -X 5 -x 127.0.0.1:1080 %h %p

Match all

originalhost はチェックを SSH コマンドラインで指定した名前に限定します。exec はそのコマンドが正常終了したとき一致します。最後の Match all が、以降の設定に対するその条件付き範囲を終了します。

これは、以前に適用された設定がすでに競合するプロキシコマンドやジャンプ経路を選んでいないことを前提としています。SSH は通常、ある設定項目について最初に得られた値を使うため、先頭寄りの広いデフォルトがあると、後続の条件が期待どおりの効果を発揮できないことがあります。

待ち受けソケットは控えめな約束

この検査はローカルポートへの TCP 到達性を確認します。SOCKS のネゴシエーションを完了するわけでも、目的の宛先への接続を確立するわけでも、どのプログラムがそのポートを所有しているかを証明するわけでもありません。検査の後にリスナーが消えることもあります。

タイムアウトにより、失敗した検査は一定の範囲に収まります。示したオプションは OpenBSD の nc インターフェースのもので、同じファイル名の別プログラムでは異なるオプションが使える場合があります。

条件に一致しない場合、この例では接続にこの ProxyCommand を適用せず、通常の経路を許します。それが適切なのは直接アクセスが許可されている場合だけです。必須のプロキシ運用では、可用性チェックを別経路へ逃れる許可として使うべきではありません。

接続先 SSH ホスト名とホスト鍵の検証は引き続き宛先サーバーを特定します。転送補助を選ぶことは、想定外のホスト鍵を受け入れる理由にはなりません。

関連記事