接続が上がり、アダプターにオフィスの範囲のアドレスが表示されるので、VPNがLANアドレスを与えてLAN上に置いたと結論しがちです。そのどちらの半分も、まったく正しいわけではありません。 L2TP PPPセッションを運び、PPPがIPCPで内部のIPv4アドレスを交渉します。このアドレスは二者間で合意されるセッションのパラメーターであり、オフィスのDHCPサーバーが配るリースではなく、それを持っているからといってオフィスの配線上の隣人になるわけでもありません。

一つの接続に二つのアドレス

L2TP接続には独立した二つの交渉があります。外側の交渉は、すでに持っているネットワークの上で、端末とVPNエンドポイントの間に保護された経路を確立します。内側の交渉がPPPセッションで、自分のセッションアドレスと相手側のアドレスがここで合意されます。インターネット通信はまったく三つ目のアドレス、つまりエンドポイントの公開アドレスで出ていくことがあり、VPNチェックページとアダプターのアドレスが一致しないのはそのためです。

この三つの役割を分けておけば、人がこの層に持ち込む疑問のほとんどに答えが出ます。VPNインターフェース上のプライベートな番号は正常であり、想定どおりです。それはエンドポイントが公開の出口を変えたかどうかを何も語らず、通信がどの宛先に届くかを単独で決めるものでもありません。

IPCPが正確に何をするか

IPCPはPPPのためのIPv4制御プロトコルです。双方が希望するオプションを記したConfigure-Requestメッセージを送り、アドレスオプションはその一つです。まだアドレスを持たないクライアントは通常0.0.0.0で要求し、サーバーはクライアントに使わせたいアドレスを載せたConfigure-Nakで応答します。次にクライアントがそのアドレスを要求し、セッションはローカルアドレスとリモートアドレスを伴って上がります。

このやり取りはPPPとIPCPの仕様に記述されており、バグのように見える細部を説明します:アドレスはサーバーが独自のポリシーで選び、それはプール、ユーザーごとの設定、認証済みの身元に結び付いたアドレスのいずれかであり得ます。プールが枯渇したとき、あるいはポリシーが要求と衝突したとき、認証は成功してもアドレスの交渉が失敗し、クライアントはいつまでも落ち着かない接続を報告します。

ip addr show ppp0
ip route show default
dmesg | grep -i pppd

pppdのログでローカルアドレスとリモートアドレスを示す行は、その交渉が成功した終わりです。認証の成功の隣にその行がないことは、資格情報ではなくアドレスの段階を指します。

LANがあなたに応答できない理由

遠い側の範囲のアドレスは、そのLAN上のホストがあなたに届くという期待を生みますが、サーバーがセッションアドレスをトンネルへ戻す経路を持たない限りほとんど届きません。プールの内側にいることは割り当てについての話であり、トポロジーについての話ではありません。オフィスのファイルサーバーは、VPNサーバーが転送しない限りセッションアドレスへの経路を持たず、転送したとしても許可されていない場合があります。

範囲が重なると、見た目の大きさに見合わない問題が起きるのも同じ理由です。プールがクライアントのすでに使っているLANと重なると、クライアントの経路表には同じプレフィックスへの主張が二つでき、トンネルとは何の関係もない理由で誤った方が勝つことがよくあります。

セッションを確認し、次に経路を確認する

まずインターフェース、次に経路、その次に重要な宛先を一つ確認します。各段階にはそれぞれの失敗の仕方があり、三つを同時に試すと後で弁明できない結論になります。

curl -sS --max-time 5 https://ifconfig.me
ping -c 3 10.50.30.20
ip route get 10.50.30.20

公開チェックがエンドポイントのアドレスを示すのにプライベートな宛先がタイムアウトするなら、トンネルは既定の経路を運んでおり、遠い側はその宛先に応答していません。プライベートな宛先が応答するのに公開チェックが変わらないなら、プロファイルは分割トンネルで、一部の通信だけがセッションを使っています。

三つの段階を分けておく

認証、アドレスの交渉、転送はそれぞれ違う形で失敗する、そしてそれぞれ担当が違います。資格情報は身元の問題、IPCPの枯渇はサーバーのポリシーの問題、戻り経路の欠如はネットワーク設計の問題です。三つとも「VPNが壊れている」と報告すれば、遅い修正が保証されます。

割り当てられたアドレス、それが来たプール、LANがそこへ届くべきかどうかを記録します。その一つのメモが、次の人がDHCPリースだと決めつけて、関与していないスコープを探すのを防ぎます。

関連記事