VPNのDNSの漏れを確かめる|PowerShellで問い合わせ先のリゾルバーを見る
VPNにつなぐと、通信の出口のIPアドレスは変わりますが、ドメイン名をIPアドレスに変える問い合わせ(DNS)が、VPNの外の、いつものDNSサーバーに流れ続けていることがあります。これを「DNSの漏れ(DNSリーク)」と呼びます。DNSの問い合わせからは、どのサイトを見ようとしたかが分かるため、外出先のWi-Fiで守りたい場合は確かめておきたい点です。この記事では、PowerShellで、PCが使っているDNSサーバーと、外から見た問い合わせ元を確かめる方法を、筆者のPC(VPNなし)で実行した結果とあわせて紹介します。
(確認:Microsoft Learn「Resolve-DnsName」「Get-DnsClientServerAddress」、NordVPNヘルプセンター「NordVPNのDNSサーバーアドレスとは」「保護されているかどうかを確認する方法」。筆者のWindows 11のPCで、2026年10月21日に実行。VPNには接続していない状態の結果です。IPアドレスは、記事では下2つを伏せています)
確かめる2つのこと
| 確かめること | 見る場所 | VPN接続後に期待すること |
|---|---|---|
| 1. PCに設定されているDNSサーバー | Get-DnsClientServerAddress |
VPNのアプリが、VPN用の接続にVPN事業者のDNSを設定する |
| 2. 外から見た「問い合わせてきたリゾルバー」 | 特別な名前への問い合わせの答え | いつものリゾルバー(回線の事業者など)から、VPN側のものに変わる |
2つ目の確かめ方には、o-o.myaddr.l.google.com(TXTレコード)と whoami.akamai.net(Aレコード)を使います。どちらも、問い合わせを受けた側から見た、問い合わせ元のリゾルバーのIPアドレスを返すものとして、DNSの運用者のメーリングリストなどで紹介されています。GoogleやAkamaiの公式の文書では確認できなかったため、この記事では、2つの答えが同じになるかで確かめています。
コード(PowerShell)
# DNSの問い合わせが、どのDNSサーバー(リゾルバー)を通っているかを確かめる(読み取りのみ)
# 1) このPCに設定されているDNSサーバー
# 2) 外のDNSから見た「問い合わせてきたリゾルバー」のIP(o-o.myaddr.l.google.com のTXTレコードと、whoami.akamai.net のAレコードの2つで照らす)
# VPNに接続した後に、2) がVPN事業者のものに変わっていれば、DNSの問い合わせもVPNを通っている
function Hide-Ip($ip) { if ($ip -match '^\d+\.\d+\.\d+\.\d+$') { 'x.x.x.x' } else { $ip } } # 記事用にすべて伏せる
"--- 1) 設定されているDNSサーバー(IPv4) ---"
Get-DnsClientServerAddress -AddressFamily IPv4 |
Where-Object { $_.ServerAddresses.Count -gt 0 } |
ForEach-Object { "{0,-24} {1}" -f $_.InterfaceAlias, (($_.ServerAddresses | ForEach-Object { Hide-Ip $_ }) -join ', ') }
"--- 2) 外から見たリゾルバー ---"
$txt = Resolve-DnsName -Name 'o-o.myaddr.l.google.com' -Type TXT -ErrorAction Stop
$txt | Where-Object { $_.Section -eq 'Answer' -and $_.Strings } | ForEach-Object { $_.Strings } | ForEach-Object { "google : " + (Hide-Ip $_) }
(Resolve-DnsName -Name 'whoami.akamai.net' -Type A -ErrorAction Stop | Where-Object { $_.Section -eq 'Answer' -and $_.IPAddress }).IPAddress | ForEach-Object { "akamai : " + (Hide-Ip $_) }
実行ポリシーで止まる場合は、powershell -NoProfile -ExecutionPolicy Bypass -File .\Test-DnsResolver.ps1 で、その場だけ実行できます。Resolve-DnsName の答えには、回答のほかに、ネームサーバーの情報などが一緒に返ることがあるため、回答(Section が Answer)だけに絞っています。最初に絞らずに実行した時は、Akamaiの側で10件ほどのIPアドレスが出ました。
筆者のPCの結果(VPNなし)
--- 1) 設定されているDNSサーバー(IPv4) ---
イーサネット 192.168.x.x
--- 2) 外から見たリゾルバー ---
google : x.x.x.x
akamai : x.x.x.x
- PCのDNSサーバーは、家庭のルーター(192.168.x.x)
- 外から見たリゾルバーは、Google・Akamaiの2つの方法とも同じ
x.x.x.x。伏せる前の値で、この回線のグローバルIPアドレス(ipifyで調べた値)と照らしたところ、一致した。つまり、回線の事業者のDNSサーバーを経由せず、この回線から直接、名前解決の問い合わせが出ている(家庭のルーターなどが自分で名前解決をしている)と考えられる
VPNにつないだ後に同じコードを実行して、2) のIPアドレスが変わらず x.x.x.x のままなら、DNSの問い合わせはVPNの外を通っている(漏れている)可能性があります。VPN事業者のものに変われば、DNSもVPNを通っていると読めます。筆者はこの記事でVPNに接続しての比較はしていないため、VPN接続後の結果は載せていません。
NordVPNの場合
NordVPNのヘルプセンターでは、NordVPNのアプリは、VPNに接続した時に自動でNordVPNのDNSサーバーを使う、と説明されています。DNSサーバーのアドレスは 103.86.96.100 と 103.86.99.100 と書かれています。アプリを使わず、ほかのOpenVPNクライアントなどで接続する場合は、手動でDNSを設定する方法が案内されています。
また、「保護されているかどうかを確認する方法」の記事では、アプリの「接続済み」の表示、NordVPNのウェブサイトの「保護済み」の表示を確かめ、追加の手順として、NordVPNのDNS漏えいテストを行う、と案内されています。外から見たリゾルバーが、上の2つのアドレスそのものになるとは限らないため(問い合わせを中継する仕組みによる)、この記事のコードでは「接続の前後で変わったか」を見るのが確かめやすい方法です。
あわせて確かめること
- 出口のIPアドレスの国が変わったか:VPNの前後でIPアドレスの国が変わったか確かめる方法
- IPv6の通信がVPNの外に出ていないか:自分の回線でIPv6が使えるかは自分の回線でIPv6が使えるか確かめる方法
- 公衆Wi-Fiで何を守るべきか:公衆Wi-Fiのリスクと確認項目、VPNが要る場合の考え方は外出先のWi-FiからMT5・VPSに入る時の守り方
この記事で確かめていないこと
- NordVPNなどのVPNに接続した後の、実際の結果(接続していません)
o-o.myaddr.l.google.comとwhoami.akamai.netの、提供元の公式な説明- IPv6のDNSサーバー(このコードはIPv4だけを表示)
まとめ
- DNSの漏れは、VPNにつないでも、DNSの問い合わせがいつものDNSサーバーに流れている状態
- PowerShellで、PCのDNSサーバーと、外から見た問い合わせ元のリゾルバーを確かめられる。筆者のPC(VPNなし)は、Google・Akamaiの2つの方法で同じリゾルバーを示した
- VPN接続の前後で、外から見たリゾルバーが変わったかを比べる。NordVPNのアプリは接続時に自社のDNSを使うと説明している
本記事は確かめ方の説明です。特定のVPNの安全性を保証するものではありません。


