DNS詳細: CNAMEとDNSSEC
所要時間
約40分
学べること
- CNAMEレコードの詳細仕様と制約(RFC仕様ベース)
- CNAMEに関連する実践的な問題と対策
- DNSSEC(DNS Security Extensions)の基礎
- 一般的なDNSベストプラクティス
前提知識
- 01-dns-fundamentals.md の内容
- ネットワークとDNSの基本理解
1. CNAMEレコードの詳細
1.1 CNAMEの基本仕様
CNAME(Canonical Name)レコードは、一般的なDNS仕様として RFC 1034/1035 で定義されています。AWSやクラウド固有の機能ではなく、標準的なDNSレコードタイプです。
┌─────────────────────────────────────────────────────────────┐
│ CNAME の基本動作 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 【設定例】 │
│ www.example.com. IN CNAME example.com. │
│ example.com. IN A 93.184.216.34 │
│ │
│ 【名前解決の流れ】 │
│ クライアント: www.example.com のIPは? │
│ │ │
│ ├─► (1) www.example.com を問い合わせ │
│ │ 応答: CNAME → example.com │
│ │ │
│ ├─► (2) example.com を問い合わせ │
│ │ 応答: A → 93.184.216.34 │
│ │ │
│ └─► 最終結果: 93.184.216.34 │
│ │
│ ※ 通常、DNSリゾルバが自動的に(2)まで実行してくれる │
│ │
└─────────────────────────────────────────────────────────────┘
1.2 CNAMEの重要な制約
CNAMEには、RFC 1034 で定義された重要な制約があります。
制約1: 他のレコードとの共存禁止
┌─────────────────────────────────────────────────────────────┐
│ CNAME と他のレコードの共存禁止 │
├─────────────────────────────────────────────────────────────┤
│ │
│ ❌ 禁止例1: CNAMEとAレコードの共存 │
│ www.example.com. IN CNAME example.com. │
│ www.example.com. IN A 93.184.216.34 │
│ → 設定できない(DNSサーバーがエラー) │
│ │
│ ❌ 禁止例2: CNAMEとMXレコードの共存 │
│ example.com. IN CNAME other.com. │
│ example.com. IN MX 10 mail.example.com. │
│ → 設定できない │
│ │
│ ❌ 禁止例3: ゾーンAPEXにCNAME(後述) │
│ example.com. IN CNAME other.com. │
│ → 技術的に問題あり(NS, SOAレコードと競合) │
│ │
│ ✅ 正しい例: サブドメインにCNAME │
│ www.example.com. IN CNAME example.com. │
│ example.com. IN A 93.184.216.34 │
│ example.com. IN MX 10 mail.example.com. │
│ → サブドメイン(www)にCNAME、APEXに他のレコード │
│ │
└─────────────────────────────────────────────────────────────┘
制約2: CNAMEチェーンの問題
CNAMEが別のCNAMEを指すことは可能ですが、推奨されません。
# CNAMEチェーンの例
www.example.com. IN CNAME www-prod.example.com.
www-prod.example.com. IN CNAME lb.example.net.
lb.example.net. IN A 192.0.2.10
# 問題点:
# 1. DNS問い合わせが複数回発生(パフォーマンス低下)
# 2. TTL管理が複雑になる
# 3. デバッグが困難
# 4. RFC 1034では推奨されていない
1.3 ゾーンAPEXとCNAMEの問題
ゾーンAPEX(zone apex / naked domain / root domain)は、サブドメインを含まないドメイン名(例:example.com)のことです。
┌─────────────────────────────────────────────────────────────┐
│ ゾーンAPEXにCNAMEを設定できない理由 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 【問題となるシナリオ】 │
│ example.com. IN CNAME other.com. │
│ example.com. IN NS ns1.example.com. ← 必須 │
│ example.com. IN SOA ... ← 必須 │
│ │
│ → CNAMEが存在する名前には、他のレコードを共存させられない │
│ → しかしNS/SOAレコードはゾーンAPEXに必須 │
│ → 矛盾が発生! │
│ │
│ 【よくあるニーズ】 │
│ example.com にアクセスしたユーザーを │
│ ロードバランサー(lb.cloudprovider.com)に向けたい │
│ │
│ ❌ 解決策1: CNAMEを使う(RFC違反、動作不定) │
│ example.com. IN CNAME lb.cloudprovider.com. │
│ │
│ ✅ 解決策2: Aレコードを使う(推奨) │