要点まとめ
市販のVPNを単体で使うだけでは、「匿名」にはほど遠い状態です。本当の追跡対策はシステムエンジニアリングの課題です。IP層ではWebRTC / IPv6 / DNSリークを塞ぎ、DNSリゾルバーはVPNの出口と同じ国のものを使い、ブラウザーのフィンガープリントは「ごく普通に見える」ようにし(アンチフィンガープリント拡張機能を大量に入れるのではなく)、TLS / TCPのフィンガープリントはTUNモードでVPNサーバー側のスタックに処理を任せる必要があります。さらに、ノーログでプライバシー保護に有利な法域にあるVPN事業者を選び、ブラウザーの複数アカウントは厳密に分離しなければなりません。以下では、その8つの観点を一つずつ詳しく解説します。
はじめに:なぜVPNは「免罪符」にならないのか
よくある考え方はこうです。NordVPN / Surfshark / 自前のWireGuardを導入して出口IPを変えれば、「もう誰だか分からない」。しかし、それは2010年代の発想です。追跡技術はとうに「IP層」を超えています:
- 「VPNを使っていること」の検出は、リスク管理システムにとって基本的な機能です(IPがVPN事業者のASNに属するかを調べるだけで済み、主要な商用VPNのデータセンターのIPアドレス帯はほぼすべてフラグ付け済みです)
- 「以前の実際のIP」の特定はIP層だけで十分です。WebRTC / IPv6 / DNSリーク / CDNバイパスなどで一度でも失敗すれば、その後はCookieでずっとタグ付けされます
- 「具体的にどの人物か」の特定はIPにまったく依存しません。ブラウザーのフィンガープリント、行動パターン、アカウント間の関連付けによって行われます
- 極端なケースでは、法的な協力要請(召喚状 / 国境を越えた捜査)によって、VPN事業者がログの提出を強制されることがあります
つまり、あなたを追跡するのは単一の脆弱性ではなく、N個の観点の組み合わせです。あなたはすべての観点を守る必要がありますが、追跡する側はどれか1つで成功すれば十分です。だからこそ「完全な匿名性」はエンジニアリング的にほぼ不可能ですが、「関連付けられる可能性を大幅に下げる」ことは実現できます。この記事ではその方法を解説します。
① IP層のリーク — 実際のIPがそのまま露出
最も典型的で、最もよくあるケースです。VPNが処理するのはブラウザーのHTTP / TCP通信だけですが、次のような経路はVPNを完全に迂回し、自宅のグローバルIPを相手にそのまま渡してしまう可能性があります:
1.1 WebRTCリーク
ブラウザーに組み込まれたWebRTC(ビデオ通話用)は、STUNプロトコルを使って自分から見えるグローバルIPを能動的に取得し、JavaScriptはその値を直接読み取れます。HTTP / SOCKSプロキシが処理するのはTCPだけですが、STUNはUDPで通信するため、プロキシを完全に迂回して自宅のネットワークアダプターから直接送信され、実際のIPが露出します。
HTTP/SOCKSプロキシ + ブラウザー → WebRTCのUDPが自宅のNICから直接送出 → 実際のIPが露出対策:TUNモードのVPN(Mihomo / Clash Premium / WireGuard TUN / Tailscale)を使えば、仮想ネットワークアダプター上のTCP+UDP通信がすべて処理されます。ブラウザーのプロキシだけを使う場合は、WebRTCを削除するのではなくポリシーで制限します。Chrome / Edgeでは企業向けポリシーでWebRtcIPHandling = disable_non_proxied_udpを設定し、Braveでは「Disable Non-Proxied UDP」を有効にし、Firefoxではabout:config → media.peerconnection.ice.proxy_only_if_behind_proxy = trueに設定します。
実際に確認:当サイトの/leakのリーク検出ツールで、WebRTCのSTUNが返すグローバルIPがHTTPの出口と一致するかを確認できます。
1.2 IPv6デュアルスタックのリーク
VPNはIPv4だけをプロキシしているのに、自宅のブロードバンド回線にはIPv6もある — するとブラウザーはIPv6を優先して通信し、VPNを完全に迂回してしまいます。これはChina Telecomの家庭用回線ユーザーに非常によく見られる脆弱性です。
対策:IPv4とIPv6の両方をプロキシするVPNを使うか、またはシステム / ブラウザーのレベルでIPv6を無効化します。Windowsではレジストリを編集し、macOSではnetworksetupを使います。
1.3 DNSリーク(別項で解説、② DNS層を参照)
1.4 CDNバイパス(オリジンへの直接アクセス)
CloudflareなどのCDNを使っているサイトでは、アクセス先は実際にはCDNのエッジノードのIPです。しかし攻撃者がサイトの実際のオリジンサーバーのIPを入手すると、CDNを迂回して直接アクセスできてしまいます。逆に、追跡する側にとっても同じことが言えます。あなたがアクセスしたCDNノードが中国にあっても、同じセッション内のある静的リソースがオリジンから直接取得されていた(CDNでカバーされていない)場合、実際のIPがオリジンサーバーのアクセスログに残ります。
対策:このような特殊なケースは、主にアクセス先のサイト自体の設定が厳格かどうかに左右され、ユーザー側でできることは限られています。
② DNS層のリーク — 問い合わせたドメインから身元が露出
IP通信はVPNを通っていても、DNSクエリはローカルのISPを経由している可能性があります。リークの経路は2つあります:
2.1 リゾルバーの国の不一致
VPNの出口はオランダなのに、システムがDNSクエリを送るとき、スタブリゾルバーが使っているのは自宅のブロードバンド回線で設定されたDNS(China Telecom)です。権威ネームサーバーがクエリを受け取ると、送信元IPがChina Telecomであることが見えます。つまり、アクセスしたすべてのドメインの運営者に、あなたの実際の位置を知らせてしまうことになります。
2.2 ECSによるサブネットのリーク
パブリックな再帰リゾルバー(Googleの8.8.8.8はEDNS Client Subnetがデフォルトで有効)は、あなたの実際の/24サブネットを宛先の権威サーバーに転送し、「位置に基づくCDNルーティング」に利用します。しかしその瞬間、あなたのサブネットはリモートの権威サーバーに開示されています。これはリゾルバーの出口IPより精度が高く、自宅のある地域のサブネットまで特定されます。
ブラウザー → システムDNS → 8.8.8.8 → 権威NS(リゾルバーIP = Googleに見える)+ ECS = 自宅の/24サブネット対策:
- VPNクライアントでカスタムDNSを強制設定し、VPN事業者自身のDNSを使う(NordVPN / Mullvad / ProtonVPNはいずれも提供しています)
- DNSクエリをトンネルの外に出さないでください。漏れると、リゾルバーにはあなたの実際のIPが見え、Web通信と一致しないため、すぐに見破られます。なお、1.1.1.1 / 8.8.8.8はエニーキャストなので、クエリがトンネルを通っていればVPN出口の近くに着信し、何も明かしません。本当の問題は、システムがトンネルを迂回してそれらに直接接続してしまうことです
- パブリックな再帰リゾルバーを選ぶ場合は、少なくともVPNの出口と同じ国のものにしてください
- DoH(DNS-over-HTTPS)でDNSクエリを強制的に暗号化し、ISPによる中間者型の監視を防ぎます
実際に確認:当サイトの/leakのDNSリーク検出ツールは独自の権威ネームサーバーを運用しており、ブラウザーのクエリを実際に当サイトのサーバーへルーティングして、リゾルバーIPとECSサブネットを確認できるようにしています。仕組みの詳細はパブリックDNSリゾルバー完全ガイドをご覧ください。
③ TLSフィンガープリント(ja3 / ja4)— どのクライアントを使っているか
HTTPSのハンドシェイクでは、クライアントがサーバーにClientHelloパケットを送り、対応しているTLSバージョン、暗号スイート、拡張、楕円曲線などを伝えます。これらのフィールドの正確な順序と内容はクライアントごとに異なり(Chrome 124 vs Firefox 123 vs curl vs Python requests)、それらを組み合わせて生成したフィンガープリントが、業界で広くja3 / ja4と呼ばれているものです。
サイトは訪問者ごとのja3 / ja4フィンガープリントを記録し、User-Agentと照合できます。UAがChrome 124を名乗っているのに、ja3フィンガープリントがPython requestsと一致すれば、それはボットやスクリプトによる通信です。これはCloudflareやAkamaiなどのボット対策サービスが使う中核的なシグナルの1つでもあります。
| クライアント | 典型的なja3フィンガープリントの特徴 |
|---|---|
| Chrome 124+ | TLS 1.3 + GREASE + 拡張の完全なリスト |
| Firefox 123+ | TLS 1.3 + 拡張の順序が異なる、GREASEなし |
| curl 8.x | 拡張が少なく、GREASEなし |
| Python requests | 明らかに簡素化されたフィンガープリント |
| Go net/http | 特徴的な暗号スイートの順序 |
対策:
- 必ず本物の主要ブラウザー(Chrome / Firefox / Edge)を使ってください。Selenium / Puppeteerを素のまま使うのは避けましょう。これらのja3フィンガープリントは非常に特徴的です
- 自動化が必要な場合は、undetected-chromedriver / Playwright + curl-impersonateを使います
- 「アンチフィンガープリント」系のブラウザー拡張機能は入れない— かえってja3が通常のChromeより特徴的になり、「追跡対策ツールを使っている」と自ら示すことになります
④ HTTP / ブラウザーのフィンガープリント — Canvas / WebGL / フォント / タイムゾーン
アプリケーション層で露出するフィンガープリントはより多様で、防ぐのもさらに困難です:
| 項目 | 取得方法 | 一意性 |
|---|---|---|
| Canvasフィンガープリント | JSでテキストを描画し、描画結果をハッシュ化 | 非常に高い(GPUとフォントレンダリングの違い) |
| WebGLフィンガープリント | GPUのベンダー / レンダラーを照会 | 非常に高い |
| AudioContextフィンガープリント | JSで音声を生成し、戻り値を読み取る | 高い |
| インストール済みフォント | JSで描画できるフォントを調べる | 高い |
| 画面解像度 + 色深度 | window.screen | 中程度 |
| タイムゾーン | Intl.DateTimeFormat().resolvedOptions().timeZone | 中程度(ただしIPと照合すると非常に強力) |
| 言語(Accept-Language) | HTTP header | 中程度 |
| クライアントヒント(Sec-CH-UA-*) | HTTP header (Chrome) | 中程度 |
重要な落とし穴:タイムゾーン / 言語 / フォントがVPNの出口国と一致していないことは、「VPNを使っている」ことを示す非常に強いシグナルです。VPNでアメリカに接続しているのに、ブラウザーのタイムゾーンはAsia/Shanghaiのまま、言語はzh-CNという状態では、一目で見破られます。
対策:
- 「ごく普通に見える」ようにする— ブラウザーにアンチフィンガープリント拡張機能を入れないでください。それ自体が異常です。一般ユーザーの素のChromeのフィンガープリントこそが、最良の偽装です。
- 用途を分ける:本来の身元で使うときはメインのブラウザーを使い、プライバシーを重視する用途には別のブラウザープロファイル / VM / Tails / Whonixを使います
- VPNの出口国、システムのタイムゾーン、ブラウザーの言語の3つをすべて一致させます — 少なくとも「中国のユーザーがアメリカのVPN経由で接続している」と一目で分かるシグナルをリークさせないようにしてください
- Tor Browserはまさにこのために設計されています — すべてのユーザーがまったく同じに見えますが、その代償としてパフォーマンスが犠牲になります
実際に確認:当サイトの/fingerprintのブラウザーフィンガープリント検出ツールで、自分の14項目のフィンガープリントの一意性を確認できます。
⑤ TCP/IP層のフィンガープリント — Initial Window / TTL / MTU
アプリケーション層に届く前から、ネットワーク層にはすでにフィンガープリントが存在します。TCP/IPスタックの実装はOSごとにわずかに異なります:
- 初期TTL:Windowsのデフォルトは128、Linuxは64、macOSは64、iOSは64
- TCPの初期ウィンドウサイズ:Windowsは64KB、Linuxは14600、macOSは65535
- TCPオプションの順序:OSによって、MSS / SACK / Timestampオプションを送る順序が異なります
- MTU:一般的な家庭用ブロードバンド回線は1500、PPPoEは1492、VPNトンネルは通常1380-1450
p0fツール(パッシブOSフィンガープリンティング)はまさにこれらのフィールドを利用し、プローブパケットを一切送らずにピアのOSを判定します。サイトはこの情報を収集し、あなたが名乗っているUAと照合できます。UAはMac Safariなのに、TTLが128でInitial WindowもWindowsの値と一致していれば、実際にはWindowsでMacのUAを偽装していることになります。
MTUからも「VPNを使っている」ことがリークする可能性があります — VPNトンネルのMTUは通常1500未満なので、通信の特徴が直接接続のブロードバンド回線とは明らかに異なります。
対策:
- TUNモードのVPNを使う:VPNサーバー自身のスタックが処理を引き継ぐため、サイトから見えるTCP/IPフィンガープリントは、あなたのクライアントではなくVPNサーバーのものになります
- OpenVPN / WireGuardはデフォルトでTUNモードですが、HTTP/SOCKSプロキシはそうではありません — これが重要な違いです
- 「VPNっぽく見えないように」とトンネルのMTUを無理に1500まで上げないでください — トンネルのカプセル化自体が数十バイトを消費するため、上げすぎるとフラグメンテーションやPMTUDブラックホール(大きなパケットが詰まり、ページが途中までしか読み込まれない)を引き起こします。クライアントのデフォルト値(WireGuardは1420、OpenVPNは自動)のままにしてください
⑥ 行動分析 — 通信のタイミング + 入力の癖
これは最も防ぐのが難しい項目です。なぜなら技術的なフィンガープリントには一切依存せず、完全に機械学習に頼っているからです:
- アクセス時間の分布:毎日オンラインになる時間帯が複数のアカウントで一致していれば、同一人物と判断されます
- マウスの軌跡 / スクロール速度 / キー入力のリズム:一人ひとり固有のもので、銀行や不正検知システムが収集しています
- セッションの長さ / ページ遷移のパターン:閲覧の習慣は人それぞれ固有です
- 入力テキストの特徴:タイピングの誤り率、言葉選びの好み、文法
対策:
- アカウントごとに利用時間帯を厳密に分けます — 「アカウントA + アカウントB」に同時にログインせず、数時間ずらしてください
- 本当に匿名性が必要なときは、デバイスを切り替えます(ノートパソコンからスマートフォン / タブレットへ)
- 完全に防ぐことは不可能ですが、関連付けを大幅に難しくすることはできます
⑦ VPN事業者のログ + 法域
これはVPNの原罪です。VPN事業者がログを保存していないと信じていても、実際には:
- 商用VPN事業者は買収されることがあります(AvastがNortonLifeLockに買収された → プライバシーポリシーが変更された)
- 事業者がひそかにログを収集している場合があります(2017年、PureVPNは以前から「ノーログ」をうたっていたにもかかわらず、FBIにユーザーのログを提供しました)
- 法的な召喚状によって協力を強制されることがあります — アメリカ / イギリス / カナダ / オーストラリア / ニュージーランド(Five Eyes)はいずれも国境を越えた捜査に応じます
- Nine Eyes = Five Eyes + デンマーク / フランス / オランダ / ノルウェー
- Fourteen Eyes = Nine Eyes + ドイツ / ベルギー / イタリア / スペイン / スウェーデン
選び方の基準:
| VPN | 法域 | 第三者監査 | 評価 |
|---|---|---|---|
| Mullvad | スウェーデン(14 Eyes) | あり(Cure53 / Assured) | メールアドレス不要、支払い情報との紐付けなし、現金払いに対応 |
| ProtonVPN | スイス(中立国) | あり(Mozilla) | スイスの法律で保護されるが、登録にメールアドレスが必要 |
| IVPN | ジブラルタル(イギリス領) | あり | Mullvadと同様、XMRでの支払いに対応 |
| ExpressVPN | イギリス領ヴァージン諸島(BVI) | あり(PWC) | 2021年にKapeに買収され、信頼度が低下 |
| NordVPN | パナマ | あり(PWC / Deloitte) | 2018年にサーバー侵害事件があり、その後アーキテクチャを再構築 |
| Surfshark | オランダ(9 Eyes) | あり | NordVPNと同じ親会社で、法域はNine Eyesの範囲内 |
自前のVPNなら管理しやすくなりますが、VPS事業者(Vultr / Hetzner / DigitalOcean)も独自にログを保持しており、捜査に協力する可能性があります。本当の匿名性を得るには、現金 / 暗号資産でVPSを購入し、さらに偽の身元で登録する必要があり、かなりのエンジニアリング作業を伴います。
⑧ アカウント間の関連付け — 複数アカウントでCookie / フィンガープリントを共有
アカウントAでログインすると、ブラウザーにはCookie / localStorage / キャッシュが保存されます。同じブラウザーでアカウントBに切り替えると、サイトはすぐに同一人物だと見抜けます。
- 同じフィンガープリント + 短時間に複数アカウントへログイン = アカウント間の関連付け
- Cookieによるクロスサイト追跡(ただし、最近のブラウザーでは制限され始めています)
- サードパーティの追跡スクリプト(Google Analytics / Facebook Pixel)が、サイトをまたいで行動を結び付けます
対策:
- FirefoxのMulti-Account Containers拡張機能:アカウントごとにCookie / ストレージが分離されます
- Chromeの複数プロファイル(右上のアバター → ユーザーを追加)
- 究極の手段:アカウントごとに別々の仮想マシンを使い、VMごとに異なるVPN出口を使用します
対策のまとめ表
| 項目 | 露出の経路 | 対応する対策 | 検出ツール |
|---|---|---|---|
| IP | WebRTC / IPv6 / DNS / CDNバイパス(オリジンへの直接アクセス) | TUNモード + WebRTCを無効化 + IPv6を無効化 | /leak |
| DNS | リゾルバーの国が異なる / ECSによるサブネットの開示 | VPN事業者自身のDNS + DoH | /leak |
| TLSフィンガープリント | ja3 / ja4でクライアントが判明 | 本物の主要ブラウザーを使い、アンチフィンガープリントツールを入れない | 外部ツール(browserleaks) |
| HTTPフィンガープリント | Canvas/WebGL/フォント/タイムゾーン | タイムゾーン / 言語 / フォントをVPNの出口と一致させる | /fingerprint |
| TCP/IP層 | TTL / Window / MTU | TUNモードでVPNサーバー側のスタックに処理を任せる | 外部ツール(browserleaks tcp) |
| 行動パターン | 時間帯 / マウス / 入力の癖 | アカウントごとに時間帯をずらす + デバイスを切り替える | なし |
| VPNのログ | 事業者への召喚状 | ノーログ + プライバシー保護に有利な法域の事業者を選ぶ | 事業者の監査レポートを確認 |
| アカウント間の関連付け | 同じCookie / 同じフィンガープリント | Multi-Account Containers / VMによるアカウントの分離 | /headers |
実践的なアドバイス:本当はどこまで匿名である必要があるのか?
対策をどこまで深くするかを決める前に、まず考えるべきは実際に誰があなたを追跡しているのか:
- 広告主 + データブローカー(低強度):uBlock Origin + サードパーティCookieの拒否 + 一般的なVPNで、日常的な場面の大半には十分対応できます
- 不正対策のリスク管理(中強度):上記 + VPNのDNSを統一 + タイムゾーン / 言語を一致させる + ブラウザープロファイルの分離
- 競合企業 / Webスクレイパー(中〜高強度):上記 + TUNモード + 本物のブラウザー(Seleniumの痕跡なし) + 残ったCookieの削除
- 政府 / 国境を越えた捜査(極めて高い強度):上記はすべて最低限の前提にすぎません。Tor / Whonix / Tails / 現金で購入したVPS + XMR + 完全に分離したデバイスが必要です
ほとんどの人に必要なのはレベル1〜2までで、レベル3以上は専門家の領域です。実際には必要のない匿名性のために、日常の使い勝手を犠牲にしないでください。
参考資料
- browserleaks.com — 総合的なフィンガープリントテストWebRTC / Canvas / WebGL / TCP / ja3をまとめてチェック
- amiunique.org — ブラウザーフィンガープリントの一意性INRIAのデータベースの中で、自分のフィンガープリントがどれだけ一意かを確認できます
- salesforce/ja3 — TLSフィンガープリントの仕組み
- privacytools.io — 追跡対策ツール総覧
- Tor Project — 究極の匿名ネットワーク