DNSリゾルバーとは?
DNSリゾルバー(再帰的リゾルバーまたは再帰的DNSサーバーとも呼ばれる)は、クライアントデバイスからDNSクエリを受け取り、ドメイン名のIPアドレスを追跡することで答えを取得するサーバーです。リゾルバーはクライアントとDNS階層の仲介役として機能し、ルート、TLD、および権威nameserverを通じた再帰を処理します。
DNSリゾルバーの仕組み
解決プロセス
ブラウザに「example.com」と入力すると:
1. クライアント → リゾルバー: "example.comのIPアドレスは?"
2. リゾルバーがキャッシュをチェック
→ キャッシュヒット: キャッシュされた結果を返す
→ キャッシュミス: 再帰を開始
3. リゾルバー → ルートサーバー: ".comはどこにある?"
ルート → リゾルバー: "これらの.comのnameserversに聞いてください"
4. リゾルバー → .com TLD: "example.comはどこにある?"
.com → リゾルバー: "これらのnameserversに聞いてください"
5. リゾルバー → 権威NS: "example.comのIPアドレスは?"
権威NS → リゾルバー: "203.0.113.50"
6. リゾルバー → クライアント: "203.0.113.50"
(TTLに基づいて結果もキャッシュ)
再帰的クエリと反復的クエリ
再帰的クエリ(クライアント → リゾルバー):クライアント: "example.comの最終的な答えを与えてください"
リゾルバー: "ここにIPアドレス: 203.0.113.50"
(リゾルバーがすべての作業を行う)
反復的クエリ(リゾルバー → nameservers):
リゾルバー: "example.comは?"
ルート: "わかりません。.comサーバーに聞いてください"
リゾルバー: "example.comは?"
.com: "わかりません。ns1.example.comに聞いてください"
リゾルバー: "example.comは?"
ns1: "203.0.113.50"
リゾルバーのタイプ
スタブリゾルバー
オペレーティングシステムとアプリケーションに組み込まれています:
- 設定されたDNSサーバーにクエリを転送
- 最小限のロジック
- 再帰を実行しない
再帰的リゾルバー
完全なDNS解決を実行する機能を備えたサーバー:
- 結果をキャッシュ
- リファレルに従う
- セキュリティ機能を実装
フォワーディングリゾルバー
再帰を実行する代わりに、別のリゾルバーにクエリを転送します:
- コーポレートネットワークで一般的
- 中央ポリシー実装
- 外部クエリを削減
クライアント → コーポレートリゾルバー(フォワーディング) → ISPリゾルバー(再帰的) → インターネット
人気のあるパブリックリゾルバー
| プロバイダー | IPv4 | IPv6 | 特徴 |
|---|---|---|---|
| Cloudflare | 1.1.1.1, 1.0.0.1 | 2606:4700:4700::1111 | 高速、プライバシー重視、ログなし |
| 8.8.8.8, 8.8.4.4 | 2001:4860:4860::8888 | 信頼できる、グローバルanycast | |
| Quad9 | 9.9.9.9 | 2620:fe::fe | セキュリティフィルタリング、脅威ブロック |
| OpenDNS | 208.67.222.222 | 2620:119:35::35 | コンテンツフィルタリング、フィッシング保護 |
リゾルバーの変更
Windows:コントロールパネル → ネットワーク → アダプター設定
→ プロパティ → IPv4 → これらのDNSサーバーを使用:
優先: 1.1.1.1
代替: 8.8.8.8
macOS:
システム環境設定 → ネットワーク → 詳細 → DNS
→ 追加: 1.1.1.1, 8.8.8.8
Linux (/etc/resolv.conf):
nameserver 1.1.1.1
nameserver 8.8.8.8
リゾルバー機能
キャッシング
リゾルバーはTTLに基づいてDNS応答をキャッシュします:
最初のクエリ: example.com
→ 完全な再帰(50ms)
→ 300秒間キャッシュされます(TTL)
後続のクエリ: example.com
→ キャッシュヒット(1ms)
→ TTLが有効期限切れになるまで提供
キャッシュ統計: ヒット率は通常80~90%を超えます。
負のキャッシング
リゾルバーは否定応答(NXDOMAIN)もキャッシュします:
クエリ: nonexistent.example.com
応答: NXDOMAIN
キャッシュ: SOA最小TTLに基づく
これは、存在しないドメインの繰り返しクエリを防止します。
クエリの最小化
モダンなリゾルバーは情報開示を最小化します:
従来的:.comへのクエリ: "www.blog.example.comは?"
→ サブドメイン構造全体を公開
クエリ最小化(RFC 7816):
.comへのクエリ: "example.comは?"
example.com NSへのクエリ: "blog.example.comは?"
blog.example.com NSへのクエリ: "www.blog.example.comは?"
→ 各レベルで必要な情報だけを公開
DNSSEC検証
セキュリティを意識したリゾルバーはDNSSEC署名を検証します:
クエリ: example.com(DNSSECで署名)
→ リゾルバーが署名を検証
→ 有効な場合、AD(正真のデータ)フラグを返す
→ 署名が無効な場合、SERVFAILを返す
リゾルバーセキュリティ機能
HTTPS上のDNS(DoH)
HTTPS上のDNSクエリを暗号化します:
従来のDNS:
クライアント → リゾルバー(UDP 53ポート、平文)
DNS over HTTPS:
クライアント → リゾルバー(TCP 443ポート、暗号化)
プロバイダー: Cloudflare(https://cloudflare-dns.com/dns-query)、Google
TLSでのDNS(DoT)
TLS上のDNSクエリを暗号化します:
クライアント → リゾルバー(TCP 853ポート、暗号化)
利点: ISPはDNSクエリを見たり変更したりできません
マルウェア/フィッシングフィルタリング
一部のリゾルバーは既知の悪意あるドメインをブロックします:
Quad9(9.9.9.9): マルウェア、フィッシングに関連するドメインをブロック Cloudflare for Families: マルウェア(1.1.1.2)またはマルウェア+成人向けコンテンツ(1.1.1.3)をブロックレート制限
DNS増幅攻撃から保護します:
送信元IPが閾値を超えるクエリを送信する場合:
→ 一時的にレート制限またはブロック
現在のリゾルバーをチェック
Windows:ipconfig /all | findstr "DNS Servers"
macOS/Linux:
cat /etc/resolv.conf
オンラインツール: browserleaks.com/dnsはブラウザが使用するリゾルバーを表示
テスト解決:
dig example.com
# 出力の「SERVER:」を確認
リゾルバーパフォーマンス
レイテンシーが重要
リゾルバーの応答時間はウェブパフォーマンスに影響を与えます:
| リゾルバー | 平均レイテンシー | 影響 |
|---|---|---|
| ローカルISP | 10~30ms | 高速だが変動する |
| Cloudflare | 10~20ms | 一貫して高速(anycast) |
| 20~40ms | 信頼できる、グローバル | |
| 遅いリゾルバー | 100~200ms | ページロード遅延に影響 |
anycastルーティング
主なリゾルバーはanycastを使用します:
1.1.1.1 anycast IP
→ 最も近いCloudflareデータセンターにルーティング
→ ニューヨークのクエリ → ニューヨークデータセンター
→ ロンドンのクエリ → ロンドンデータセンター
→ 結果: グローバル低レイテンシー解決
リゾルバーパフォーマンスの測定
Namebench使用(自動テスト):# 複数のリゾルバーを実際のクエリパターンでテスト
namebench
手動テスト:
# Cloudflareをテスト
time dig @1.1.1.1 example.com
# Googleをテスト
time dig @8.8.8.8 example.com
# ISP(現在)をテスト
time dig example.com
一般的なリゾルバー問題
DNSポイズニング
攻撃者がリゾルバーキャッシュに偽のレコードを挿入します:
対策:- DNSSEC検証を使用するリゾルバーを使用
- 送信元ポートランダム化を有効化
- DoH/DoTを使用して中間者攻撃を防止
リゾルバーハイジャック
ISPまたはマルウェアがDNSクエリをリダイレクトします:
症状: 検索結果にISP広告が表示される、予期しないリダイレクト 解決策:- パブリックリゾルバー(1.1.1.1、8.8.8.8)に変更
- DoH/DoTを使用してISP干渉を防止
- マルウェアをチェック
スタイルキャッシュ
リゾルバーが古いレコードをキャッシュしています:
症状: DNS変更が反映されない 解決策:- TTLが有効期限切れになるまで待機
- 一時的に別のリゾルバーを使用
- ローカルキャッシュをクリア
リゾルバーブロック
一部のネットワークが外部リゾルバーをブロックします:
症状: 8.8.8.8、1.1.1.1に到達できない 解決策:- DoHTを使用(より難しくブロック)
- リゾルバーのDoHエンドポイントを使用
ローカルリゾルバーの構成
Unboundの使用
# Unboundをインストール(Linux)
sudo apt install unbound
# 基本的な設定(/etc/unbound/unbound.conf)
server:
interface: 127.0.0.1
do-ip4: yes
do-udp: yes
do-tcp: yes
# DNSSECを有効化
auto-trust-anchor-file: "/var/lib/unbound/root.key"
# プライバシー(クエリ最小化)
qname-minimisation: yes
# サービスを開始
sudo systemctl start unbound
sudo systemctl enable unbound
Pi-hole使用
ネットワーク全体の広告ブロック DNS リゾルバー:
# Pi-holeをインストール
curl -sSL https://install.pi-hole.net | bash
# Pi-hole IPをDNSとして使用するようルーターを設定
ベストプラクティス
1. 信頼できるパブリックリゾルバーを使用: 信頼性のためCloudflare、Google、またはQuad9
2. DoH/DoTを有効化: プライバシーとセキュリティのためクエリを暗号化
3. リゾルバー機能を検討: プライバシー、速度、またはセキュリティのニーズに基づいて選択
4. リゾルバーパフォーマンスを監視: 定期的にレイテンシーをテスト
5. バックアップリゾルバーを持つ: 冗長性のためセカンダリDNSを設定
6. DNSSEC検証リゾルバーを使用: キャッシュポイズニングから保護
7. リゾルバーのポリシーを理解: 一部のリゾルバーはコンテンツをフィルタリングするか、クエリをログします
8. 変更後にテスト: DNS解決が正しく機能することを確認
9. リゾルバー選択を文書化: 特定のリゾルバーを選択した理由を記録
10. resolv.confを慎重に更新: 不正な設定はDNS全体を破損
リゾルバー vs 権威nameserver
| 機能 | リゾルバー | 権威NS |
|---|---|---|
| 役割 | クライアントクエリに応答 | 実際のDNSレコードを保持 |
| 再帰 | はい、他のサーバーをクエリ | いいえ、自分のゾーンのみ応答 |
| キャッシング | はい、応答をキャッシュ | いいえ(権威データ) |
| 使用者 | クライアント、エンドユーザー | 再帰中のリゾルバー |
| 例 | 8.8.8.8、1.1.1.1 | ns1.example.com |
DNSリゾルバーはDNSシステムの主要な部分です。高速で、セキュアで、プライバシーを尊重するリゾルバーを選択することで、ブラウジング体験とオンラインセキュリティに大きな影響を与えます。