Windows VPN の既定ルートから特定のホストを除外する
フル トンネルのプロファイルは既定ルートを占有します。あるホストだけは物理インターフェース側のより狭いプレフィックスを必要とし、接続のたびに追加し直す必要があります。
ノート PC は社内 VPN に接続し、プリンターの Web ページや、ローカル ネットワークでしか応答しないイントラネットまで、あらゆる通信がそのトンネルを通ります。手作業で作ったルートは一時間だけそれを解決し、その後で接続が切れて戻ってくると、例外は消えています。トンネル自体に問題はありません。Windows は単一のルーティング テーブルを保持し、VPN アダプターは接続のたびにそのテーブルの自分の持ち分を書き換えます。生き残るのは、アダプター自身のエントリの外側にあるものだけです。
トンネルが引き継ぐエントリ
テーブルを二度記録します。一度はトンネルを切断した状態、もう一度は接続した状態で、既定の行を比較します。プロファイルが既定プレフィックスを要求すると、アダプターのエントリはテーブルで最も広い行になるため、例外はそれより狭くなければなりません。これはプレフィックス長についての算術であり、信頼やポリシーについての主張ではありません。どのインターフェースを例外が名指しすべきかも、これで決まります。
先に進む前に、インターフェース インデックスとローカル ゲートウェイを書き留めてください。マシンが別のネットワークに参加すると両方とも変わるからです。以下のコマンドは、記憶からではなくマシンからそれらを読み取ります。
route print -4
Find-NetRoute -RemoteIPAddress 198.51.100.30
二番目のコマンドは、そのアドレスが今使うインターフェースとネクスト ホップを報告します。四十行を読んで推測するより確実です。接続の前後で実行すれば、変更記録に添える価値のある組が得られます。どちらの出力も、このページの残りで使う数値を提供します。
ホスト ルートは具体性で勝つ
最長プレフィックス一致が勝者を決めるため、物理ゲートウェイ経由の /32 は、トンネルに触れずにトンネル経由の既定ルートを破ります。そのアドレスへの通信はローカル インターフェースから出て、ほかのすべては既存の経路を保ちます。トンネルは既定ルートを運んだまま、その宛先の唯一の候補ではなくなるだけです。プレフィックス長はテーブルが示す唯一のレバーであり、この作業にはそれで足ります。
具体性は、ドメイン名を除外するという安易な近道も退けます。テーブルはアドレスを照合し、一つの名前が複数のアドレスに解決されうるからです。先にホストを解決し、そのどのアドレスが例外に値するかを決めます。
以下では、Office という名前の接続、ローカル ゲートウェイ 10.0.0.1、インターフェース 7、宛先 198.51.100.30 を前提とします。これらは既定値ではなくプレースホルダーで、上のコマンドは実際にそのマシンが使う値を出力します。この置き換えのメモを変更と一緒に残し、次の読み手が数値をそのまま写さないようにしてください。
ルートを次の再接続より長生きさせる
Windows は VPN 接続に除外命令を用意していないため、例外はアダプターが書き換えない物理インターフェース上に置く必要があります。答えのように見えるコマンドレットは逆を行います。Add-VpnConnectionRoute はプレフィックスをトンネル内へ移すもので、これは分割プロファイルがある宛先だけを運び、残りをローカルに残すべき逆のケースです。ここでそれに手を伸ばすと、外に出しておきたい通信が必ず中に入ります。
手動の形はコマンド一つです。弱点は再接続ではなく、ネットワークの変更にあります。
route -p add 198.51.100.30 mask 255.255.255.255 10.0.0.1 metric 1 if 7
これは -p のおかげで再起動を生き延び、トンネルがほかを運ぶ間に一つのアドレスをインターフェース 7 から出します。別のネットワークにノート PC を移すと、ゲートウェイもインデックスも古くなり、エントリは静かに失敗します。誰が所有し、いつ削除すべきかを記録してください。
接続スクリプトはより堅牢な版です。エントリが生き残ったことに期待するのではなく、接続のたびに例外を追加し直すからです。以下の二行は、トンネルを起動するものに属し、ログオン スクリプトに属しません。
rasdial Office
route add 198.51.100.30 mask 255.255.255.255 10.0.0.1 metric 1 if 7
トンネルを立ち上げるものが何であれ、そこが二行目の正しい場所です。そしてrasdial は接続が確立してから初めて戻るため、ルートはアダプター自身のエントリの後ろに置かれます。スリープ復帰後にもう一度実行してください。中断はルートを落とし、トンネルだけを上げたままにすることがあります。逆の作業、つまり一つのプレフィックスをトンネルに押し込み、残りをローカルに残すのであれば、Add-VpnConnectionRoute が正しい道具です。
ルーティングはプロセスを選べない
要件が宛先より狭いことがあります。あるプログラムだけローカルの経路を通り、ほかはトンネル内に留まるべき場合です。 ルーティングはそれを表現できません。アドレスを照合するのであって、プロセスを照合するわけではないからです。実用的なパターンは、問題をランチャー側へ押しやります。
プロファイルを既定ルートから外し、その一つのプログラムをローカル インターフェースのアドレスに束縛して起動します。すると例外は起動コマンドになり、トンネルはすでに扱っていたものを保ちます。ルーティング テーブルは何も変わらないので、これが再接続に耐える理由です。これはトンネルがそもそも既定ルートを持つべきでないことも意味し、前の設計への当て布ではなく別の設計です。
弱点は技術的ではなく運用的です。プログラムは常にラッパー経由で起動しなければならず、復帰後に束縛が欠けていると、テーブルが示す経路を静かに使ってしまいます。意図して開くブラウザーなら許容できますが、トンネルから決して出てはならないものには許容できません。
ユーザーごとの接続もこれを解決しません。Windows は接続をアカウントに限定できますが、ルーティング テーブルはマシン全体のままなので、既定ルートを持つアカウント限定の接続は、他のセッションを含むマシン上のすべてのプロセスを依然として転送します。スコープが現実になるのは、ルートのスコープがアカウントと一致したときだけです。したがって同じノート PC を共有する二人は一つのテーブルを共有し、二人目は一人目が開始したトンネルを引き継ぎます。
例外が再接続を生き延びたことを確認する
失敗するときと同じやり方で変更を試します。切断し、再接続し、新しいアプリケーションを開き、ローカルに留まるべきアドレスとトンネルを使うべきアドレスを一つずつ要求します。どちらも接続状態のFind-NetRoute と比較してください。
再接続後にテーブルからプレフィックスが消えているなら、それは書式が悪いのではなく、置き場所が悪いのです。物理インターフェースへ移してテストを繰り返してください。両方のコマンド出力を変更記録と一緒に残してください。動作している状態のスナップショットは、後から説明の一段落よりも多くの問いに答えます。次の人は、接続が何を生んだのかを知りたく、あなたが何を生むつもりだったのかを知りたいわけではありません。