暗号化は境界から始まります。その境界とは、パケットがカプセル化される前にエンドポイントが下すルーティングの判断です。あなたの鍵を決して見ないネットワークでも、トンネル自身のルートより好ましいと判断したルートをマシンに渡すことはできます。ここで混同されがちな二つの失敗があります。すでにトンネル内にあるパケットを読むことと、そこに一度も置かれなかったパケットを誘導することです。

この区別が重要なのは、二つ目の失敗のほうが仕掛けやすく、見落としやすいからです。クライアントが健全な接続を報告している間に、間違ったインターフェースから出ていったリクエストとして現れます。

ネットワークがあなたに影響する二つの方法

トンネルに届いたパケットは、通過するすべてのホップからペイロードが隠され、その保護は経路が予想外でも保たれます。トンネルに決して届かないパケットは、あなたのアドレスからの普通のリクエストであり、ルートテーブルが指した先へ送られます。一つ目の失敗には壊れた暗号か侵害されたピアが必要ですが、二つ目はマシンが信頼を選んだ設定メッセージだけで足ります。この非対称性こそ、ルーティングの側に独自の点検が必要な理由です。

経路上の機器は、二つ目のケースに影響するのにあなたの鍵を必要としません。必要なのは、エンドポイントがルート、リゾルバ、またはそれを生み出すポリシールールを受け入れることだけです。

expected:  app -> tunnel device -> encapsulation -> internet
observed:  app -> wlan0        -> plaintext     -> internet

トンネルが存在する前にルートはどこから来るのか

DHCPが配るのはアドレスの貸与だけではありません。クラスレス静的ルートのオプションは宛先プレフィックスと次のホップを運ぶことができ、RFC 3442は、誤ったルーターアドレスのセキュリティ上の帰結を論じています。誤った方向へ送られるトラフィック、サービス拒否、経路上に居座る観測者です。トンネルが上がる前にこうしたルートを受け入れたクライアントは、プロバイダーとは何の関係もない優先経路を持つことになりかねません。

それでもルート注入が万能になるわけではありません。クライアントがオプションを受け入れ、プレフィックスが気にしているトラフィックを覆い、選ばれた次のホップに到達でき、強制ポリシーがその経路での送出を許す必要があります。どれか一つを外せば、同じ応答は無害になります。同じネットワーク上の二台が違う挙動をするのも同じ理由で、同じクライアント、同じポリシー、ましてや同じアドレスファミリーを動かしているわけではないからです。

IPv6には独自の確認が必要です。ルーター広告は、DHCPv4のオプションとは別のコードでデフォルトルートを運ぶからです。v4のテーブルだけを見るテストでは、それを覆えていません。

カーネルが実際に選ぶ経路を確認する

ルート検索には答えがあるので、ステータスランプから推測するのではなく尋ねてください。以下のコマンドは、ある宛先に対して選ばれたルートと送信元、そしてメインテーブルを上書きしうるルールを示します。接続中に実行し、再接続の後にもう一度実行してください。貸与の更新で答えが変わりうるからです。

ip route get 203.0.113.10
ip route show table all | grep -E '^(default|203\.0\.113)'
ip rule show
resolvectl query example.com

出力では二点を見ます。ルートに示されたインターフェースと、選ばれた送信元アドレスです。トンネルのルートはトンネルデバイスを指し、漏れたルートは物理デバイスを指し、その違いは何も復号せずに見えます。実行の間で答えが変わるなら、両方の出力を保存し、それらを生んだルールを比較してください。

デフォルトルートで止まらないでください。アプリケーションの例外、分割トンネルのプレフィックス、二つ目のポリシールールは、デフォルトがまだ内側を指している間に、特定の宛先をトンネルの外へ運ぶことができます。

強制をどこに置くかを決める

三つの条件が、クライアント側の強制で足りるか、その外に何かが必要かを決めます。使うすべてのアドレスファミリーについてクライアントがルートを導入し守るなら、デフォルトを持つトンネルで通常は足ります。ローカル資源には届きつつ他はすべてトンネル内に保つ必要があるなら、その例外は列挙して所有するべきで、アクセスネットワークが広告したものに任せてはいけません。プラットフォームがアプリごとにトラフィックをインターフェースへ束縛できるなら、その束縛は何にでも上書きされるルートより強い保証です。

どちらを選んでも、判断は設定が置かれている場所に書いてください。インシデントの最中に誰かが打ち込んだから存在するルールは、次の再起動を生き延びません。ローカルとブートストラップの例外は狭く保ち、それぞれがなぜ存在するのかを記録してください。

クライアントの更新とネットワークの変更のたびに検索コマンドを再実行し、最後に記録した出力と比較してください。ルートテーブルは強制の境界なのですから、そう扱ってください。

関連記事