VPNアダプターが/32と表示しても、宛先が一つという意味ではない
VPNアダプターの255.255.255.255マスクはクライアント自身のアドレスであり、到達可能なホストの上限ではない。経路、ゲートウェイの範囲、戻り経路を別々に読む。
アダプターが255.255.255.255と表示しているのを見て、VPNで到達できるのは一つのアドレスだけだと結論づけることがよくある。その読み方は、クライアント自身のアドレスと、トンネルを通して経路制御される宛先の集合を混同している。ポイントツーポイントや経路制御されたインターフェースでは、この二つは別のオブジェクトであり、到達性を制限するのは片方だけだ。この俗説が生き残るのは、マスクがEthernetで習ったサブネットマスクに見えるからだ。
俗説:ホストマスクは到達できるホストが一つという意味だ
/32の割り当ては、このリンクのこちら側がどのアドレスなのかをインターフェースに伝えるもので、ポイントツーポイントのリンクではそれ以上の意味はない。相手のアドレスは別のフィールドであり、相手の先に何があるかを示す経路はまた別である。遠隔ネットワークはマスクで記述されるものではないので、マスクの中に遠隔ネットワークを記述するものは何もない。それを到達性の上限として読むのは、自分の家の番号を、訪れてよいすべての住所の一覧として読むようなものだ。
混同には実際の根がある:Ethernetではホストマスクは本当にそのセグメント上の一つのアドレスを意味した。トンネルはEthernetセグメントではなく、その中を何が通るかはマスクではなくクライアントの経路テーブルが決める。だから同じ/32がデータセンター全体の前に置かれることもある。
アドレスと経路を別のオブジェクトとして読む
インターフェースとテーブルを一緒に出力し、そのうえで二つの問いに対する二つの答えとして読む。アドレスはこちら側が誰かを答え、経路はトラフィックがどこへ行けるかを答える。三つ目の問い、ゲートウェイがどの宛先を許すかは、クライアント側にはまったく見えない。iproute2のアドレスリファレンスがローカルアドレス、相手、プレフィックス経路の各フィールドを分けて説明しているのは、まさにこの理由による。
ip addr show tun0
ip route show
ip route get 10.60.5.10
Windowsでもアドレス一覧と経路テーブルの間に同じ分離があり、特定の宛先でどちらが勝つかを見る最短の方法は検索コマンドだ。検索がトンネルのインターフェースを返せば、クライアントはパケットをそこへ送る。物理アダプターを返せば、クライアントはVPNに問い合わせず、サーバー側の許可をいくら足しても変わらない。確認すべきは実際に必要な宛先であり、一般的な公開アドレスではない。
Get-NetIPAddress -InterfaceAlias "VPN"
Find-NetRoute -RemoteIPAddress 10.60.5.10
検索が誤ったインターフェースを指すなら、そこで止まる。それはクライアントの経路の問題であり、クライアント側で直す。
マスクを広げるとたいてい悪化する理由
事務所のLANに似せるために割り当てを/24に変えると、リンク上のプレフィックスが生まれることがある:カーネルは/24全体がトンネルのインターフェースに直接つながっていると信じる。ゲートウェイ経由で経路制御されるべきアドレスへのトラフィックは、リンク上に隣人がいるかのように送られる。結果はサーバー障害に見えるブラックホールだ。
しかも本当の問題、つまり欠けている経路やゲートウェイ上の欠けている許可を隠してしまう。どちらも広いマスクが作るものではなく、どちらも変更後も残る。設計がインターフェースにもっと大きなプレフィックスを必要とするなら、それは使用中のインターフェースモデルに対する判断であり、ドキュメントを手元に置いて行うものだ。別製品のスクリーンショットからマスクを写すことは、その判断ではない。
遠隔プレフィックスの経路が欠けているなら、そのプロビジョニングを直す。経路があり、それでも接続が拒否されるなら、マスクは診断ではなかった。
経路が正しくても流れが失敗するとき
正しい経路は、クライアントがパケットを送ることだけを証明する。ゲートウェイは宛先を受け入れ、割り当てアドレスには戻り経路があり、サービスはその流れを許す必要がある。この三つを別々に試す:クライアントでの検索、ゲートウェイの許可範囲、必要なサーバー一台への要求だ。三つがそろう前に認証が成功するのは普通のことで、だから接続済みのクライアントが何にも届かないことがある。
ping -c1 10.60.5.10
traceroute -n 10.60.5.10
curl -sv https://app.internal.example/ -o /dev/null
ネットワークオブジェクトとグループ権限は、アプライアンスが管理するサービス上で所有者とともに保つ。クライアントに届けさせたい先と、使ってよい先は別の設定であり、しばしば別の画面にある。片方を変えてもう片方を試すのが、チケットが二つのチームの間を行き来する理由だ。
引退させるべき俗説は、マスクが到達性の上限だというものだ。アドレス、経路、ゲートウェイのポリシーを三つの別々の事実として読めば、/32は制限には見えなくなり、普通のトンネル割り当てに見え始める。