【テクニカル・上級編】 DNSリーク(DNS Leak)の発生原因とクライアント側の設定不備 – サイバーセキュリティとプライバシー保護実践ガイド

VPNの「皮」を被ったザル:DNSリークが暴くネットワーク設計の甘さとその克服

VPNを接続していれば「匿名化は万全だ」と信じているのなら、それはネットワーク層のパケットが語る現実を知らない証拠だ。カフェのフリーWi-Fiでコーヒーを片手にVPNをONにし、満足げに業務をこなすエンジニアの背後で、DNSクエリが暗号化トンネルの脇をすり抜け、ISPのログサーバーへ直行している光景を想像してみてほしい。

これは単なる設定ミスではない。OSのルーティングスタックと、現代の複雑な名前解決メカニズムが引き起こす、極めて深刻な「情報の漏洩」だ。

DNSリークという「穴」の正体

DNSリークの本質は、OSのルーティングテーブルにおいて、デフォルトゲートウェイへの優先度がVPNインターフェース(tun0等)よりも物理インターフェース(eth0やwlan0)のDNS設定に置かれてしまうことにある。

多くのOSにおいて、DNSクエリはアプリケーションからのOS APIコール(getaddrinfo等)を通じて発行されるが、この際、どのDNSサーバーを使うかは、OSのネームサーバーリスト(/etc/resolv.conf)に依存する。VPNクライアントがトンネルを構築しても、このリストが適切に書き換えられない、あるいは「スプリットトンネリング」の設定が甘く、ローカルのDNSサーバーが優先されてしまう場合、パケットはVPNの暗号化の傘下に入ることなく、平文でISPへ流出する。

これは、あなたがどれほど強固なAES-256-GCMのトンネルを築こうが、宛先ドメイン名という「閲覧ログ」が筒抜けであることを意味する。

パケットレベルで紐解く「漏洩」の構造

パケットキャプチャを眺めれば、その挙動は残酷なまでに明らかだ。VPNトンネルの中を通るはずのUDP/53パケットが、突如として物理デバイス側のゲートウェイから送出される。

この事象を防ぐためには、単にVPNを繋ぐだけでは不十分だ。以下の3つのレイヤーで防御を固める必要がある。

1. systemd-resolved との格闘

現代のLinuxディストリビューションは、多くの場合 systemd-resolved が名前解決を管理している。これが厄介なのは、リンク固有のDNSサーバー設定を優先する傾向があることだ。

対策として、VPN接続時にDNSサーバーを強制的にトンネル内へ向ける設定を行う。以下は、NetworkManagerを利用した際の設定例だ。

# VPN接続時に、指定したDNSサーバーのみを使うよう設定(nmcli例)
nmcli connection modify "MyVPN" ipv4.dns "10.8.0.1"
# DNSの自動割り当てを無効にし、強制的にVPN経由のDNSを指定する
nmcli connection modify "MyVPN" ipv4.ignore-auto-dns yes

2. ルーティングテーブルの「要塞化」

次に、OSレベルで「VPNトンネル以外を通るDNSパケットを破棄する」というポリシーを適用する。iptables または nftables を使い、物理インターフェースからのUDP/53パケットを強制DROPするルールを追加する。

# 物理インターフェース(wlan0)からのDNSクエリを遮断する(緊急避難用)
iptables -A OUTPUT -o wlan0 -p udp --dport 53 -j REJECT
iptables -A OUTPUT -o wlan0 -p tcp --dport 53 -j REJECT

パフォーマンスとセキュリティの二律背反を解消する

DNSリークを防ぐだけでは、インフラアーキテクトとしては片手落ちだ。VPN利用時のRTT(往復遅延時間)の増大は、ユーザー体験を損なう最大の要因となる。

TLSハンドシェイクの最適化とMTUチューニング

VPNによるカプセル化は、IPヘッダーのオーバーヘッドを生む。これに起因するパケットの断片化(Fragmentation)を避けるために、MTU(最大転送単位)を最適化することは必須だ。

# インターフェースのMTUを調整し、断片化によるパフォーマンス低下を防ぐ
ip link set dev tun0 mtu 1360

また、TCPバッファのチューニングも重要だ。VPNトンネル内での通信では、デフォルトのTCPウィンドウサイズでは帯域を使い切れないことが多い。

# sysctlでのTCPバッファ最適化
# ネットワークの遅延が大きいVPN環境下でのスループット改善
sysctl -w net.ipv4.tcp_rmem="4096 87380 6291456"
sysctl -w net.ipv4.tcp_wmem="4096 16384 4194304"

結論:ゼロトラストの思想を個人の端末へ

DNSリークを「うっかりミス」で片付けてはならない。これは、ネットワークの境界が曖昧になった現代において、端末そのものが「信頼できないネットワーク」を前提に動くべきだという、ゼロトラストの原則を突きつけている。

もしあなたが技術者として、VPNを通したはずのDNSクエリが物理層へ漏れ出していることに気づいたなら、それは構成を見直す絶好のチャンスだ。DNS over HTTPS (DoH) の採用や、VPNトンネル内でのDNSリゾルバの構築など、レイヤーを跨いだ多層防御の検討を強く推奨する。

パケットは嘘をつかない。あなたのネットワークの安全性は、設定ファイルの1行、カーネルパラメータの小さな調整に宿っているのだ。

コメント

タイトルとURLをコピーしました