VPNクライアントを二つ同時に動かすと、デフォルトルートを取るのはどちらか?
二つのVPNクライアントがデフォルトルートを奪い合い、勝つのは一つだけです。トンネルの順序を決める前に、メトリック、/1ペア、リゾルバの分割を確認してください。
VPNクライアントを二つ同時に動かすのは、プライバシー設定ではなくルーティングの議論です。より具体的なルートを持つトンネルが通信を受け取り、もう一方は接続したまま待機します。 すると社内ゲートウェイには個人用出口から届く接続が見えますが、端末上の社内クライアントはすべてのアダプターを依然として見ています。この二つの事実のどちらが重要かを決めることが、この作業のすべてです。
ルートテーブルが勝者を一つ選ぶ
社内クライアントの起動前と起動後にテーブルを取得し、宛先だけでなくインターフェース列を読みます。外側トンネルの単純なデフォルトルートは押しのけられやすく、/1ペアは/0より具体的です。リテラルの0.0.0.0/1と128.0.0.0/1のペアは、IPv4空間全体を二つの半分で覆い、単一のデフォルトを上回ります。インストールされると、外側トンネルは接続中と表示されたまま何も運びません。
ip route show default
ip route show | grep -E '^(0.0.0.0/1|128.0.0.0/1)'ポリシールーティングはメインテーブルを完全に上書きできるため、ルートだけでなくルールも読みます。マークされた通信を別のテーブルへ送るルールは、メインテーブルが参照される前に勝ちます。こうして一つのアプリだけを物理リンクに残し、他はすべてトンネルを使えます。
ip rule showWindowsではメトリックで決まる
Windowsでは、宛先に対するメトリックが最も低いルートが勝者で、二つのクライアントが異なるメトリックでデフォルトルートを入れられます。メトリックの低いアダプターが期待したほうとは限らないため、テーブルとインターフェース構成を一緒に読みます。インターフェースメトリックも設定するクライアントは、ルートを一本も追加せずにデフォルトを動かせます。負けたアダプターは上がったまま何も受け取りません。
route print -4
Get-NetIPConfiguration | Select-Object InterfaceAlias, IPv4DefaultGateway二つの出力を比較し、0.0.0.0/0を持つインターフェースを特定します。両方のクライアントが主張するならメトリックが決め手で、接続順のテストがマシンによって一貫しないように見えるのはそのためです。どちらの出力にもデフォルトゲートウェイがなければ、クライアントはフルトンネルで動いておらず、連鎖の議論は意味をなしません。
二人の観測者、二つの異なる見え方
リモートゲートウェイには、外側出口から届く一本の接続に加え、クライアントがトンネルへ転送するものすべてが見えます。ローカルクライアントは、それらを作る権限で動いているため、アダプター、ルート、別トンネルの存在が見えます。この見え方を分けることが要点で、クライアントは気づけないと主張することではありません。
クライアントは好きなだけ列挙できると仮定し、代わりにゲートウェイ側の見え方に向けて設計します。クライアントが見えないことを前提にした設計は、一回の更新で壊れます。
DNSとIPv6が連鎖の漏れる場所
DNSは勝ったリゾルバ設定に従い、それがパケットの通る経路とは限りません。社内トンネル経由で到達する社内リゾルバは設計と整合しますが、その外で到達するローカルリゾルバは整合せず、トンネルが隠すはずだった名前を露出します。IPv6は二つ目の漏れで、デュアルスタックのホストは、トンネルがIPv4でしか運ばない宛先へIPv6を使い続けます。IPv4専用のトンネルはIPv6のルートやリゾルバについて何も語らないため、ファミリーは別々に確認します。
ip -6 route show default
resolvectl status | grep -A2 'DNS Servers'リゾルバとIPv6ルートを意識して直し、その上に二つ目のトンネルを積まないようにします。二重カプセル化はMTUも食うため、連鎖が立ち上がった後にページが止まるときは、より小さな内側MTUをまず試します。速く答えるリゾルバが正しいリゾルバだという証拠にはなりません。