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つのアドレスそのものになるとは限らないため(問い合わせを中継する仕組みによる)、この記事のコードでは「接続の前後で変わったか」を見るのが確かめやすい方法です。

あわせて確かめること

この記事で確かめていないこと

  • 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の安全性を保証するものではありません。