SSH のローカル転送が TCP OpenVPN セッションをどう運ぶか
ローカルポートは一つ、認証された関係は二つ、トランスポートは三層。SSH 転送が何を運び、ループと証明書検証がどこでなお効くのか。
ここでは三つのトランスポートが重なり、それぞれに独自のフレーミングがある。VPN のペイロードは TLS セッションの内部を流れ、その TLS セッションはループバックポートへの TCP 接続の内部を流れ、その接続のバイト列は SSH の内部でリレーホストへ流れ、リレーホストが VPN リスナーへの実際の TCP 接続を開く。この構成は、OpenVPN が認証する内容を何も変えず、UDP リスナーを TCP 経由で到達可能にすることもない。残りはバイト経路の説明として読み、ネットワーク制御を回避するレシピとして読まないでほしい。
ローカル転送が実際に運ぶもの
SSH クライアントはローカルポートで待ち受ける。ローカルのプロセスが接続すると、クライアントはバイト列を暗号化されたチャネルに詰め、サーバ側が転送要求で示された宛先への新しい TCP 接続を開く。
その宛先を解決するのはリレーであり、あなたのマシンではないため、リモートネットワークの内部にしか存在しない名前でも機能する。これはリレーが VPN リスナーに到達でき、そこへの戻り経路を持つ必要があることも意味する。ノート PC で解決できる名前は、リレーから何が見えるかを何も教えてくれない。
SSH セッションを開始しても、リレーに到達でき認証されたことしか分からない。次のリスナーが動いているか、リレーとリスナーの間のファイアウォールが接続を受け入れるか、VPN がプロファイルを受け入れるかは分からない。
クライアントをローカルリスナーに向ける
明示された例では、リレーは gw.internal.example:443 の TCP リスナーに到達でき、高位のローカルポートがその経路をこのマシンだけに公開する。
ssh -N -L 127.0.0.1:24011:gw.internal.example:443 [email protected]OpenSSH のマニュアル は、ローカル転送を TCP 接続をローカルで受け入れ、先の接続をリモート側から開くものと説明している。ネットワークから到達できる転送はあなたの名前が付いた開いたリレーだから、リスナーは全インターフェースではなくループバックに束縛する。ワイルドカード束縛は共有マシンの他のローカルアカウントにもポートを公開する。
次に VPN クライアントを TCP モードにし、127.0.0.1:24011 に向ける。プロファイルが UDP を使う場合、転送はバイトストリームを運びデータグラムの経路がないため、この設計は役に立たない。
二つの認証を分けたままにする
SSH がリレーホストを認証する。OpenVPN は今も VPN ピアを認証し、ループバックの宛先はその要件を変えない。ソケットが localhost を指すようになったからと証明書検証を切るのは、この設計で最悪の近道だ。それはトランスポートの取り決めを信頼の取り決めに変えてしまい、二つ目については誰も承認していない。
プロファイルの信頼アンカー、サーバロールの検証、名前の検証をそのまま保つ。クライアントがサーバ名を接続先アドレスと比較する場合、ループバックでは検証を切るのではなく明示的な名前設定が必要になることがあり、どのフィールドが比較されるかはプロファイルの文書で確認する。
リレーは信頼の話の第二の当事者であり、その管理者は接続メタデータを見て、設定が変われば転送を別へ向けられる。この構成にはリレーと VPN サービスの所有者の両方の承認が要り、今日それを必要とする人だけの承認では足りない。
トンネルの下にループを作らない
VPN が経路を設定した後も、それを運ぶ SSH 接続にはトンネルを通らないリレーへの経路が要る。既定経路が VPN に移り、リレーが同じトンネル経由でしか到達できないと、トランスポートは崩壊し VPN も一緒に落ちる。障害は経路の誤りではなく切れたトンネルのように見えるため、誤診されやすい。
通常の修正は、トンネルが上がる前に物理インターフェースへ固定したリレーアドレスへのホスト経路と、再接続後も経路が残ることの確認だ。順序が正しかったと仮定せず、リレーアドレスの経路検索で確かめる。
順序付けられたトランスポートが二つになり保守すべき端点も増えたため、この積み重ねは直接接続より遅く脆いと予想しておく。ネットワークの境界を越える方法であって、性能の手法ではない。
終わったらリスナーを閉じる
トンネルが不要になったら SSH セッションを止め、ローカルポートが解放されたことを確認する。忘れられた転送は、共有されるかもしれないマシンに認証済みの経路を開いたままにする。
寛容な設定は侵害されたどのアカウントも汎用の足場に変えてしまうため、リレーの許可された転送先も見直す。ポート、リレー、宛先をまとめて記録し、次に触る人が転送の目的と承認の有無を判断できるようにする。