地理的 DNS とエニーキャスト: 受け取る VPN 入口の確認
地理的 DNS とエニーキャストは異なる規則で入口を選ぶ。応答がどのリゾルバを反映しているかを確認し、次にセッションがノード変更を生き延びるかを見る。
近い DNS 応答は、接続が別の場所に着地するまでは解決済みの問題のように感じられる。地理的 DNS とエニーキャストはどちらも経路を短くしようとし、その判断を異なる情報から下す。どちらも、到達したゲートウェイが到達可能であること、クライアントが期待する識別情報を提示すること、セッションがノード変更を生き延びることを保証しない。以下の確認はその四つの問いを切り分ける。
リゾルバが実際に誰の位置を報告しているかを確認する
トポロジーに敏感な問い合わせに答える権威サーバーは、通常、問い合わせた再帰リゾルバのアドレスを見ており、名前を入力した人のアドレスではない。集中型リゾルバは、サービス対象のクライアントから遠くにあることがあり、応答はそのクライアントではなくリゾルバを反映する。これは欠陥ではなく、追加情報が与えられない限りプロトコルはそう振る舞う。EDNS クライアントサブネット仕様は制限と任意の対処の両方を説明する。
EDNS クライアントサブネットは、すべての参加者が対応し有効にした場合に、起源ネットワークの情報を運べる。任意であり、プライバシーとキャッシュに影響し、公開リゾルバがユーザーの正確な位置を報告すると仮定する許可ではない。それを前提に設計する前に、リゾルバの運用者に尋ねること。
dig +short vpn.example.com @1.1.1.1
dig +short vpn.example.com @9.9.9.9
dig +subnet=203.0.113.0/24 +short vpn.example.com
エニーキャスト経路制御が何を決めたかを確認する
エニーキャストでは、複数の拠点が一つのサービスアドレスの到達可能性を広告し、ネットワークは各クライアントをその経路制御が好むノードへ届ける。その選択は地図上の距離ではなく、BGP と周囲のポリシーが行う。トポロジー的な近さも、短く見える経路が混雑していたり非対称であったりしうるため、一般には良好な往復性能を意味しない。与えられたアドレスは、どのノードが応答したかを何も語らない。
サービスの位置は、DNS 応答だけでなく、サービスの側から、またはそれを名指す応答から確認する。traceroute -n 198.51.100.20 は通った経路を示すが、その末端のホストは依然として名指さないので、応答ではなく経路として読むこと。
セッションがノード変更を生き延びることを確認する
DNS 問い合わせは短く、VPN セッションは長く、両者の状態要件はまったく異なる。経路制御はセッションの途中で移ることがあり、そうなると後続のパケットがあなたのトンネルを見たことのないノードに届くことがある。それが耐えられるかは実装次第で、共有状態、意図的な再接続、文書化された失敗のいずれかである。アドレスだけではそのどれも与えない。
移り変わりを仮定せず観察する。sudo tcpdump -ni any -c 20 esp は経路が変わるにつれて外側のパケットを示し、ピアアドレスの急な変化がその移り変わりそのものである。実行する実装に対して意図する振る舞いを明示し、経路変更を強制して試すこと。設計がセッション複製を前提とするなら、その仕組みを名指しし、それが覆わない失敗を名指しすること。
識別情報が依然として一致することを確認する
どの入口も、クライアントプロファイルが期待する識別情報を提示しなければならない。サービス名に対して発行された証明書はノードをまたいで機能するが、ノードごとの証明書はクライアントに新しいものの受け入れを強いるので、そこで利用者は警告を押し切ることを覚える。期待する識別情報とプロファイルを入口モデルと一致させておくこと。
ノードごとの証明書が見えるようになるのは珍しいノードに到達したクライアントの場合なので、そこから確認する。openssl s_client -connect vpn.example.com:443 -servername vpn.example.com はチェーンと名前を出力し、クライアントが比較するのはまさにそれである。その後、プロファイルを狭めるべきか証明書モデルを変えるべきかを決める。
最初の応答だけでなく記録を確認する
三つのシナリオを評価し、それぞれに四つの事実を書く。通常の入口、一つの拠点が利用できない場合、合意した復旧の場合である。四つの事実とは、使ったリゾルバ、返されたアドレス、サービスした拠点、新しいアプリケーション結果だ。この記録が、DNS 選択の問題をゲートウェイの問題、経路制御の問題、セッション状態の問題から切り分けるので、これがなければ四つはクライアントから見て同じに見える。
dig +short vpn.example.com
getent hosts vpn.example.com
curl -s -o /dev/null -w "%{http_code}
" https://vpn.example.com/health
シナリオは事務所からだけでなく代表的なアクセスネットワークから実行すること。問いの全体は、異なるクライアントが実際にどの入口に到達するかにあるので、一つのネットワークは一つの標本にすぎない。