VPNの匿名性を破る可能性がある「TunnelVision」とは?仕組みと対策
ここ数日、「TunnelVision」によってVPNの匿名性が崩されるというネット記事を見て不安になっている方から多くのご相談を受けています。
TunnelVisionはネットワーク技術に絡む話のため一般ユーザーの方には理解が難しく、不安になっている方が多いようです。
TunnelVisionで取り上げられている内容自体はネットワーク技術としては一般的なものであって、特別なものではありません。
その仕組みを理解していれば怖いものではありませんので、本記事ではネットワーク技術について詳しくない方に向けて仕組みと対策を解説します。
TunnelVisionで語られている仕組み
TunnelVisionで問題となっているのはDHCPのオプション番号121で設定される「Classless Static Route Option」です。
これは名前の通りスタティックルート(静的ルート)を配布するオプションです。
TunnelVisionの本質はDHCPサーバーになりすましてルーティング設定を注入できる、という点です。
その結果何が起きるのかというと、本来VPNトンネルを通るはずの通信がVPNトンネル外で通信する可能性があります。
そのような状態となった場合、IPアドレスが漏洩します。
DHCPとは?
DHCPというのはIPアドレスなどのネットワーク設定を自動的に構成する仕組みで、実は皆さんは知らぬうちに日々利用しています。
たとえば自宅や外出先でWi-Fiに接続した際、ネットワーク設定をしなくてもインターネットに接続できているはずです。これはDHCPによってIPアドレスやDNSサーバー、ルーティングなどの設定が自動的に構成されているためです。
今回問題となっているのは「ルーティング」です。多くの場合、ルーティング設定は「デフォルトルート」といってインターネットに向かう通信をすべて特定のIPアドレスに転送するように設定されています。
ルーティングとは?
皆さんのスマホやパソコンだけでなく、サーバーやネットワーク機器などネットワークに接続されている機器はすべて「ルーティングテーブル」という情報を内部に持っています。
ルーティングテーブルというのは、ある宛先へ到達するために次にどこへ向かえば良いのかという情報が格納されているテーブルです。
皆さんが今この記事を読むことができているのは、スマホやパソコンが持っているルーティングテーブルに従ってnote.comというサーバーにアクセスしているからです。
しかしスマホやパソコンがすべての通信先のルーティングテーブルを持っているわけではありません。それは膨大な量になるので現実的ではないからです。
通常は、次にどこへ向かえば良いのか分からない場合の転送先として「デフォルトルート(デフォルトゲートウエイ)」というルーティングテーブルを持っており、これがインターネットへ接続するための出入り口となります。
VPN接続していないときのルーティングテーブル
それでは実際にルーティングテーブルを見てみましょう。
以下はわたしの自宅のLinuxマシンでルーティングテーブルを表示させたときのものです。すべての通信が192.168.0.1へ向かうように設定されています。
これが先ほど解説した「デフォルトルート」です。
$ ip r
default via 192.168.0.1 dev ens33 proto dhcp src 192.168.0.55 metric 100
192.168.0.0/24 dev ens33 proto kernel scope link src 192.168.0.55 metric 100
$
このルーティングテーブルは、自宅のブロードバンドルーターのDHCP機能によって自動的に構成されたものです
VPN接続しているときのルーティング
次にVPN接続した状態でルーティングテーブルを見てみましょう。
VPN接続すると、インターネットへ向かうすべての通信がVPNトンネルを通るようにVPNクライアントによって再設定されます。
以下はさきほど同じLinuxマシンでPrivate Internet Accessを使いVPN接続しているときにルーティングテーブルを表示させたものです。
「0.0.0.0/1」と「128.0.0.0/1」がVPNクライアントによって追加されたデフォルトルートで、これによってインターネットへ向かう通信がすべてVPNトンネル経由となります。
$ ip r
0.0.0.0/1 via 10.6.11.1 dev tun0
default via 192.168.0.1 dev ens33 proto dhcp src 192.168.0.55 metric 100
10.0.0.243 via 10.6.11.1 dev tun0
10.6.11.0/24 dev tun0 proto kernel scope link src 10.6.11.14
128.0.0.0/1 via 10.6.11.1 dev tun0
188.215.235.104 via 192.168.0.1 dev ens33
192.168.0.0/24 dev ens33 proto kernel scope link src 192.168.0.55 metric 100
212.102.47.198 via 192.168.0.1 dev ens33
$
通常、デフォルトルートは「0.0.0.0/0」で設定されるのですが、VPNクライアントは「0.0.0.0/1」と「128.0.0.0/1」の2つに分けて設定しています。
この理由は、「0.0.0.0/0」よりも「0.0.0.0/1」と「128.0.0.0/1」の方が優先度が高くなりるからです。これはロンゲストマッチという仕組みなのですが、ロンゲストマッチについては後で改めて触れます。
元々設定されていた192.168.0.1もデフォルトルートとして設定されていますが「metric 100」によって優先度が下げられています(metricは同じ宛先へのルーティング情報がある場合にどちらを優先するか決める値です)。
TunnelVisionでIPアドレスが漏洩する仕組み
TunnelVisionで語られているのは、先ほど表示したVPN接続時のルーティングテーブルに優先度の高い別のルーティング設定を注入しVPNトンネル外で通信させることによってIPアドレスを漏洩させる、という話です。
先ほど少し触れましたが、ルーティングには「ロンゲストマッチ」というルールがあります。
簡単に言と、宛先を広く設定するよりも狭く設定した方が優先されるというルールです。
VPN接続時は「0.0.0.0/1」と「128.0.0.0/1」の2つのルーティング設定が追加されましたが、これよりも宛先を狭く設定すると、そちらが優先されます。
たとえば1.1.1.1を宛先とする通信を192.168.0.1経由で通信するようにスタティックルートを追加すると、ロンゲストマッチによってVPNトンネル外で通信するようになってしまいます。
この辺りの話はネットワークの知識がないと理解が難しいと思いますので、TunnelVisionによって注入されるルーティング設定がVPNトンネルを通るデフォルトルートよりも優先されてしまう、とだけ知っておいてください。
VPN接続時にIPアドレスの漏洩ができるか試してみよう
TunnelVisionで問題となっている「Classless Static Route Option」は特別なものではありません。
この記事が気に入ったらチップで応援してみませんか?