- Published on
DNS完全攻略:ネームサーバー、DDNS、nslookup実践ガイド — ドメイン登録からトラブルシューティングまで
- Authors

- Name
- Youngju Kim
- @fjvbn20031
- 1. DNSの動作原理(どうさげんり)を完全理解(かんぜんりかい)
- 2. ネームサーバー深堀(ふかぼ)り
- 3. DNSレコードタイプ総整理(そうせいり)
- 4. ドメイン登録(とうろく)・移管(いかん)実践ガイド
- 5. DDNS(Dynamic DNS)完全(かんぜん)ガイド
- 6. nslookup完全活用法(かつようほう)
- 7. digコマンドマスタリー
- 8. DNSセキュリティ
- 9. 実践トラブルシューティング10シナリオ
- シナリオ1:ドメインを登録したのにアクセスできない(伝播遅延(でんぱちえん))
- シナリオ2:SSL証明書の発行失敗(はっこうしっぱい)(CAAレコード)
- シナリオ3:メールが迷惑(めいわく)メールフォルダに入(はい)る(SPF/DKIM/DMARC)
- シナリオ4:サブドメインが動作(どうさ)しない
- シナリオ5:DNS変更後、一部(いちぶ)のユーザーだけアクセスできない(TTLキャッシュ)
- シナリオ6:nslookupは成功(せいこう)するがブラウザでアクセスできない
- シナリオ7:ドメイン移管後(いかんご)にDNSが途切(とぎ)れる
- シナリオ8:K8s内部(ないぶ)DNS解決失敗(しっぱい)(CoreDNS、ndots)
- シナリオ9:CDN連携後(れんけいご)にオリジンサーバーIPが漏洩(ろうえい)(DNS Leak)
- シナリオ10:DDNSの更新(こうしん)が反映(はんえい)されない
- 10. DNSサービス比較表(ひかくひょう)
- 実践クイズ
- 参考資料(さんこうしりょう)
1. DNSの動作原理(どうさげんり)を完全理解(かんぜんりかい)
DNSとは? インターネットの電話帳(でんわちょう)
DNS(Domain Name System)は、人間(にんげん)が読(よ)めるドメイン名(めい)(例(れい):www.example.com)を、コンピュータが理解(りかい)できるIPアドレス(例:93.184.216.34)に変換(へんかん)するシステムです。1983年(ねん)にPaul MockapetrisがRFC 882、883で初(はじ)めて提案(ていあん)し、現在(げんざい)はRFC 1034、1035が基本仕様(きほんしよう)です。
DNSがなければ、すべてのWebサイトにアクセスする際(さい)にIPアドレスを直接(ちょくせつ)入力(にゅうりょく)する必要(ひつよう)があります。DNSはインターネットインフラの最(もっと)も基本的(きほんてき)でありながら、最も重要(じゅうよう)な構成要素(こうせいようそ)です。
ユーザー入力: www.example.com
|
DNS Resolution(名前解決)
|
IPアドレス: 93.184.216.34
|
サーバーにHTTPリクエスト
DNS階層構造(かいそうこうぞう):RootからSubdomainまで
DNSはツリー構造(こうぞう)の階層的(かいそうてき)分散(ぶんさん)データベースです。最上位(さいじょうい)から下位(かい)へ:
. (Root)
/ \
com org net kr jp ... (TLD - Top Level Domain)
|
example (SLD - Second Level Domain)
/ \
www mail api (Subdomain)
各階層(かくかいそう)の役割(やくわり):
| 階層 | 例 | 管理主体(かんりしゅたい) |
|---|---|---|
| Root (.) | . | ICANN / IANA |
| TLD | .com, .jp, .org | レジストリ(Verisign、JPRSなど) |
| SLD | example.com | ドメイン所有者(しょゆうしゃ) |
| Subdomain | www.example.com | ドメイン所有者 |
FQDN(Fully Qualified Domain Name)は末尾(まつび)にドット(.)を含(ふく)みます:www.example.com.
DNSクエリフロー:再帰的(さいきてき) vs 反復的(はんぷくてき)
DNS名前解決(なまえかいけつ)は2つの方式(ほうしき)を組(く)み合(あ)わせて動作(どうさ)します。
再帰的クエリ(Recursive Query): クライアントが再帰リゾルバに「最終回答(さいしゅうかいとう)を教(おし)えて」と要求(ようきゅう)します。リゾルバがすべてを代行(だいこう)します。
反復的クエリ(Iterative Query): 再帰リゾルバが各ネームサーバーに「このドメインを知(し)っている人(ひと)は?」と尋(たず)ね、ネームサーバーは「私(わたし)は知(し)らないけど、あちらに聞(き)いて」と次(つぎ)のサーバーを案内(あんない)します。
[ユーザーPC] -- 再帰的クエリ --> [再帰リゾルバ (ISP/8.8.8.8)]
|
反復的クエリ開始
|
+---------------+---------------+
v v v
[Root Server] [TLD Server] [Authoritative NS]
"comはここ" "example.com "IPは93.x.x.x"
はここ"
詳細(しょうさい)フロー:
- ユーザーがブラウザに
www.example.comを入力 - ブラウザキャッシュ確認(かくにん) → OSキャッシュ確認 → hostsファイル確認
- OSが設定(せってい)された再帰リゾルバ(例:8.8.8.8)に再帰的クエリを送信(そうしん)
- 再帰リゾルバがキャッシュ確認 → なければRootサーバーに反復的クエリ
- Rootサーバー:「
.comTLDサーバーはa.gtld-servers.net」 - 再帰リゾルバがTLDサーバーにクエリ
- TLDサーバー:「
example.comのネームサーバーはns1.example.com」 - 再帰リゾルバが権威ネームサーバーにクエリ
- 権威ネームサーバー:「
www.example.comのIPは93.184.216.34」 - 再帰リゾルバが結果(けっか)をキャッシュしてクライアントに応答(おうとう)
13個(こ)のRootサーバーとAnycast
全世界(ぜんせかい)のDNSの起点(きてん)であるRootサーバーは名目上(めいもくじょう)13個(A~M)ですが、Anycast技術(ぎじゅつ)のおかげで実際(じっさい)には1,700以上(いじょう)のインスタンスが世界中(せかいじゅう)に分散されています。
| Rootサーバー | 運営機関(うんえいきかん) | インスタンス数(すう)(概算(がいさん)) |
|---|---|---|
| A | Verisign | 10+ |
| B | USC-ISI | 6+ |
| C | Cogent | 10+ |
| D | University of Maryland | 200+ |
| E | NASA | 300+ |
| F | ISC | 300+ |
| J | Verisign | 200+ |
| K | RIPE NCC | 100+ |
| L | ICANN | 200+ |
| M | WIDE Project | 10+ |
Anycastとは? 同(おな)じIPアドレスを複数(ふくすう)の物理(ぶつり)サーバーに割(わ)り当(あ)てる技術です。ユーザーのクエリはBGPルーティングを通(つう)じて最(もっと)も近(ちか)いインスタンスに自動転送(じどうてんそう)されます。これにより、RootサーバーのIPは13個だけでも世界中で高速(こうそく)な応答が可能(かのう)です。
DNSキャッシング:パフォーマンスの鍵(かぎ)
DNSキャッシングは複数レベルで行(おこな)われます:
[ブラウザキャッシュ] -> [OSキャッシュ] -> [再帰リゾルバキャッシュ] -> [各NSのTTL]
Chrome: chrome://net-internals/#dns で確認可能
Windows: ipconfig /displaydns
Linux: systemd-resolve --statistics
macOS: sudo dscacheutil -flushcache
TTL(Time To Live)の理解(りかい):
example.com. 3600 IN A 93.184.216.34
^
TTL = 3600秒(1時間)
TTL値(ち)による戦略(せんりゃく):
| TTL値 | 用途(ようと) | メリット | デメリット |
|---|---|---|---|
| 60秒 | DNS変更予定時(へんこうよていじ) | 高速伝播(こうそくでんぱ) | クエリ増加(ぞうか)、応答遅延(ちえん) |
| 300秒(5分) | 一般的(いっぱんてき)なサービス | バランスの取(と)れた選択(せんたく) | - |
| 3600秒(1時間) | 安定(あんてい)したサービス | 高速応答、クエリ削減(さくげん) | 変更反映(はんえい)が遅(おそ)い |
| 86400秒(1日) | ほとんど変(か)わらないレコード | 最高(さいこう)パフォーマンス | 緊急変更(きんきゅうへんこう)が困難(こんなん) |
実践(じっせん)ヒント: DNS変更前にTTLを60秒に下(さ)げ、変更が完全(かんぜん)に伝播した後(あと)に元(もと)に戻(もど)しましょう。
2. ネームサーバー深堀(ふかぼ)り
権威(けんい)(Authoritative)vs 再帰(Recursive)ネームサーバー
| 区分(くぶん) | Authoritative NS | Recursive Resolver |
|---|---|---|
| 役割 | 特定ドメインの最終情報(じょうほう)を保持(ほじ) | クライアントに代わりDNSツリーを巡回(じゅんかい) |
| データ | ゾーンファイルの原本(げんぽん)データ | キャッシュされたデータ |
| 例 | ns1.cloudflare.com | 8.8.8.8(Google DNS) |
| 運営主体 | ドメイン所有者/ホスティング業者(ぎょうしゃ) | ISP、Google、Cloudflare |
| 応答フラグ | AA(Authoritative Answer)ビット設定(せってい) | AAビットなし |
Primary(Master)vs Secondary(Slave)ネームサーバー
権威ネームサーバーはさらにPrimaryとSecondaryに分(わ)かれます。
[Primary NS] --ゾーン転送--> [Secondary NS]
(読み書き) (読み取り専用)
原本ゾーンファイル管理 Primary障害時のバックアップ
レコード追加/変更/削除 負荷分散の役割
なぜSecondaryが必要(ひつよう)か?
- 高可用性(こうかようせい):Primary障害(しょうがい)時にSecondaryが応答
- 負荷分散(ふかぶんさん):クエリを分散処理(しょり)
- 地理的(ちりてき)分散:ユーザーに近(ちか)い場所(ばしょ)に配置(はいち)
- RFC 2182推奨(すいしょう):最低(さいてい)2つのネームサーバー運用(うんよう)
ゾーン転送(てんそう):AXFR vs IXFR
PrimaryからSecondaryへゾーンデータを複製(ふくせい)する方式です。
| 方式 | 説明(せつめい) | 用途 |
|---|---|---|
| AXFR | 全体(ぜんたい)ゾーンファイル転送 | 初期同期(しょきどうき)、データ不整合(ふせいごう)時 |
| IXFR | 変更分(へんこうぶん)のみ転送 | 通常(つうじょう)の増分(ぞうぶん)アップデート |
# AXFRテスト(セキュリティ上、外部からはブロックされるべき)
dig @ns1.example.com example.com AXFR
# SOAレコードのSerialで同期状態を確認
dig @ns1.example.com example.com SOA +short
# 2024032301 ns1.example.com. admin.example.com. ...
SOAレコードのシリアル番号(ばんごう):
慣習的(かんしゅうてき)にYYYYMMDDNN形式(けいしき)を使用(しよう)します(例:2026032301)。Serialが増加(ぞうか)するとSecondaryがゾーン転送を開始(かいし)します。
グルーレコード(Glue Record)の必要性(ひつようせい)
ドメインexample.comのネームサーバーがns1.example.comの場合(ばあい)、循環参照(じゅんかんさんしょう)問題(もんだい)が発生(はっせい)します:
Q: example.comのIPは?
-> example.comのネームサーバーはns1.example.com
-> ns1.example.comのIPは?
-> example.comのネームサーバーに聞く必要があるが...
-> 循環参照発生!
解決(かいけつ):グルーレコード
上位(じょうい)TLDサーバーにネームサーバーのIPを直接登録(とうろく)します:
;; .com TLDサーバーの委任レコード
example.com. IN NS ns1.example.com.
example.com. IN NS ns2.example.com.
;; グルーレコード(Additional Section)
ns1.example.com. IN A 203.0.113.1
ns2.example.com. IN A 203.0.113.2
主要(しゅよう)DNSソフトウェア
| ソフトウェア | 種類(しゅるい) | 特徴(とくちょう) |
|---|---|---|
| BIND9 | 権威/再帰兼用(けんよう) | 最(もっと)も古(ふる)いDNSサーバー。全機能(きのう)サポート |
| PowerDNS | 権威専用(せんよう) | DBバックエンド対応(MySQL, PostgreSQL) |
| CoreDNS | 権威/再帰 | Go言語ベース、プラグインアーキテクチャ、K8sデフォルトDNS |
| Unbound | 再帰専用 | 軽量(けいりょう)でセキュリティ重視(じゅうし)、DNSSEC検証(けんしょう)がデフォルト |
| Knot DNS | 権威専用 | 高性能(こうせいのう)、モダンな設計(せっけい) |
| dnsmasq | 軽量キャッシング | 小規模(しょうきぼ)ネットワーク/ホームルーター向(む)け |
Kubernetes内(ない)のCoreDNS
Kubernetes 1.13からCoreDNSがデフォルトDNSサーバーです。Pod内でサービス名(めい)で通信(つうしん)できるのはCoreDNSのおかげです。
# CoreDNS Corefile例
.:53 {
errors
health {
lameduck 5s
}
ready
kubernetes cluster.local in-addr.arpa ip6.arpa {
pods insecure
fallthrough in-addr.arpa ip6.arpa
ttl 30
}
prometheus :9153
forward . /etc/resolv.conf
cache 30
loop
reload
loadbalance
}
K8s DNS解決(かいけつ)ルール:
# Podからサービスへのアクセス
my-service -> my-service.default.svc.cluster.local
my-service.other-ns -> my-service.other-ns.svc.cluster.local
my-service.other-ns.svc.cluster.local -> 完全なFQDN
# Podの/etc/resolv.conf
nameserver 10.96.0.10 # CoreDNS ClusterIP
search default.svc.cluster.local svc.cluster.local cluster.local
options ndots:5 # ドット(.)5個未満ならsearchドメインを追加
ndots:5の意味(いみ):
api.example.comはドットが2個(5未満(みまん))なので、K8sはまずapi.example.com.default.svc.cluster.localなどを試(こころ)みます。これが外部(がいぶ)DNS解決を遅(おそ)くする原因(げんいん)になるため、外部ドメインはFQDN(末尾に.を追加)で指定(してい)することが推奨されます。
3. DNSレコードタイプ総整理(そうせいり)
主要レコードタイプ
| タイプ | 用途 | 例 |
|---|---|---|
| A | IPv4アドレスマッピング | example.com. IN A 93.184.216.34 |
| AAAA | IPv6アドレスマッピング | example.com. IN AAAA 2606:2800:220:1:: |
| CNAME | エイリアス(別ドメインへポインティング) | www.example.com. IN CNAME example.com. |
| MX | メールサーバー指定(してい) | example.com. IN MX 10 mail.example.com. |
| TXT | テキスト情報(SPF, DKIMなど) | example.com. IN TXT "v=spf1 ..." |
| NS | ネームサーバー指定 | example.com. IN NS ns1.example.com. |
| SOA | ゾーン権限(けんげん)情報 | シリアル、リフレッシュ、有効期限(ゆうこうきげん)など |
| SRV | サービスの場所(ばしょ) | _sip._tcp.example.com. IN SRV 10 60 5060 sip.example.com. |
| CAA | 証明書発行権限(しょうめいしょはっこうけんげん) | example.com. IN CAA 0 issue "letsencrypt.org" |
| PTR | 逆引(ぎゃくひ)き(IP→ドメイン) | 34.216.184.93.in-addr.arpa. IN PTR example.com. |
| NAPTR | URI変換規則(へんかんきそく) | SIP、ENUMで使用 |
CNAMEの制約(せいやく)
# OK - サブドメインにCNAME
www.example.com. IN CNAME example.com.
# NG - ルートドメイン(Apex)にCNAME使用不可!
# example.com. IN CNAME other.com. (RFC違反)
# 解決策: ALIAS/ANAME(非標準)またはCloudflareのCNAME Flattening
なぜApexにCNAMEを使(つか)えないのか? CNAMEは同名(どうめい)の他(ほか)のすべてのレコードと共存(きょうぞん)できません。しかしApexドメインには必(かなら)ずSOA、NSレコードが存在(そんざい)しなければならず、CNAMEと衝突(しょうとつ)します。
メール認証(にんしょう)の三銃士(さんじゅうし):SPF、DKIM、DMARC
メールスパムとフィッシングを防止(ぼうし)するための3つのDNSベース認証体系(たいけい)です。
SPF(Sender Policy Framework):
example.com. IN TXT "v=spf1 include:_spf.google.com include:sendgrid.net ip4:203.0.113.0/24 -all"
| メカニズム | 意味(いみ) |
|---|---|
include:domain | そのドメインのSPFも許可(きょか) |
ip4:CIDR | そのIP帯域(たいいき)を許可 |
a | ドメインのAレコードIPを許可 |
mx | MXレコードのIPを許可 |
-all | 上記以外(いがい)すべて拒否(きょひ) |
~all | 上記以外ソフト失敗(しっぱい) |
DKIM(DomainKeys Identified Mail):
selector1._domainkey.example.com. IN TXT "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEB..."
メールサーバーがメールに電子署名(でんししょめい)を追加(ついか)し、受信(じゅしん)サーバーがDNSの公開鍵(こうかいかぎ)で検証します。
DMARC(Domain-based Message Authentication, Reporting, and Conformance):
_dmarc.example.com. IN TXT "v=DMARC1; p=reject; rua=mailto:dmarc-reports@example.com; pct=100"
| ポリシー | 意味 |
|---|---|
p=none | 監視(かんし)のみ(レポート収集(しゅうしゅう)) |
p=quarantine | 疑(うたが)わしいメールを迷惑(めいわく)メールフォルダへ |
p=reject | 認証失敗メールを拒否 |
実践ゾーンファイル例(BIND形式)
$TTL 3600
$ORIGIN example.com.
@ IN SOA ns1.example.com. admin.example.com. (
2026032301 ; Serial (YYYYMMDDNN)
3600 ; Refresh(1時間)
900 ; Retry(15分)
1209600 ; Expire(2週間)
86400 ; Minimum TTL(1日)
)
; ネームサーバー
@ IN NS ns1.example.com.
@ IN NS ns2.example.com.
; Aレコード
@ IN A 203.0.113.10
www IN A 203.0.113.10
api IN A 203.0.113.20
; AAAAレコード
@ IN AAAA 2001:db8::10
; CNAME
blog IN CNAME example.github.io.
docs IN CNAME readthedocs.io.
; MXレコード(数値が小さいほど優先度が高い)
@ IN MX 10 mail.example.com.
@ IN MX 20 mail2.example.com.
mail IN A 203.0.113.30
; TXTレコード
@ IN TXT "v=spf1 include:_spf.google.com -all"
_dmarc IN TXT "v=DMARC1; p=reject; rua=mailto:dmarc@example.com"
; SRVレコード
_sip._tcp IN SRV 10 60 5060 sip.example.com.
; CAAレコード
@ IN CAA 0 issue "letsencrypt.org"
@ IN CAA 0 issuewild "letsencrypt.org"
4. ドメイン登録(とうろく)・移管(いかん)実践ガイド
ドメイン登録の仕組(しく)み
[ICANN] --管理--> [レジストリ] --委任--> [レジストラ] --販売--> [リセラー]
(Verisignなど) (お名前.com等) (ホスティング業者等)
レジストリ(Registry): TLD全体を管理(例:.comはVerisign)
レジストラ(Registrar): ICANNの認定を受けてドメイン登録を代行
リセラー(Reseller): レジストラの再販パートナー
日本(にほん)のレジストラ比較(ひかく)
| レジストラ | .com年間費用(ねんかんひよう) | .jp年間費用 | 特徴 |
|---|---|---|---|
| お名前.com | 約(やく)1,408円 | 約3,124円 | 国内最大(こくないさいだい)、セール頻繁(ひんぱん) |
| ムームードメイン | 約1,728円 | 約3,344円 | GMOグループ、シンプル |
| さくらインターネット | 約1,886円 | 約3,982円 | ホスティング連携(れんけい)が便利(べんり) |
| Xserver Domain | 約1,298円 | 約2,508円 | Xserver利用者(りようしゃ)に最適(さいてき) |
海外(かいがい)レジストラ比較
| レジストラ | .com年間費用 | 特徴 |
|---|---|---|
| Cloudflare Registrar | 約10.11 USD | 原価(げんか)販売、マークアップなし |
| Namecheap | 約8.88 USD(初年度(しょねんど)) | 更新価格(こうしんかかく)の上昇(じょうしょう)に注意(ちゅうい) |
| Porkbun | 約9.73 USD | コストパフォーマンスが良(よ)い |
| Google Domains | サービス終了 → Squarespace移管 | 2023年終了 |
Cloudflare Registrarをお勧(すす)めする理由(りゆう):
- 卸値(おろしね)(原価)そのまま販売(マークアップ0)
- 更新価格も同(おな)じ
- 無料(むりょう)DNSSEC、Whois Privacy
- Cloudflare CDN/セキュリティとの統合(とうごう)が容易(ようい)
ドメイン移管(Transfer)手順(てじゅん)
1. 現在のレジストラでTransfer Lock(ドメインロック)を解除
2. Auth Code(認証コード / EPPコード)を取得
3. 新しいレジストラでTransfer申請 + Auth Code入力
4. 旧レジストラからの承認メール確認(5~7日待機)
5. 移管完了後、DNS設定を確認
注意事項:
- 登録/移管後60日間は再移管不可(ICANN 60-Day Lock)
- 有効期限15日以内のドメインは移管不可
- .jpドメインはJPRS規定による別途手続き
WhoisとRDAP
# Whois検索
whois example.com
# RDAP(Whois後継、JSONベース)
curl -s "https://rdap.verisign.com/com/v1/domain/example.com" | jq .
RDAP(Registration Data Access Protocol)の利点(りてん):
- 標準化(ひょうじゅんか)されたJSON応答
- HTTPSによるセキュアな転送
- 国際化(こくさいか)(IDN)サポート
- 差別化(さべつか)されたアクセス制御(せいぎょ)
5. DDNS(Dynamic DNS)完全(かんぜん)ガイド
DDNSが必要な理由
家庭用(かていよう)インターネットは通常(つうじょう)、動的(どうてき)IPアドレスを割(わ)り当(あ)てられます。ISPが定期的(ていきてき)に(またはルーター再起動時(さいきどうじ)に)IPを変更するため、固定(こてい)IPなしでは自宅(じたく)サーバーの運用が困難(こんなん)です。
問題:
自宅サーバーIP: 211.xxx.xxx.100(昨日)
自宅サーバーIP: 211.xxx.xxx.200(今日) <- IP変更!
DNS: myserver.example.com -> 211.xxx.xxx.100(昨日登録)
-> 接続不可!
解決(DDNS):
IP変更検知 -> 自動的にDNSレコード更新
myserver.example.com -> 211.xxx.xxx.200(自動更新)
DDNSサービス比較
| サービス | 無料 | カスタムドメイン | 更新間隔(こうしんかんかく) | 特徴 |
|---|---|---|---|---|
| DuckDNS | 無料 | 不可(*.duckdns.orgのみ) | リアルタイム | 完全無料、オープンソース |
| No-IP | 無料(30日更新) | 有料 | 5分 | 3つの無料ホスト名 |
| Cloudflare DDNS | 無料 | 可能(自身のドメイン) | リアルタイム | APIで自作(じさく)が必要 |
| Synology DDNS | 無料 | 不可(*.synology.me) | リアルタイム | Synology NAS専用 |
| Dynu | 無料 | 可能(4つまで) | リアルタイム | IPv6対応(たいおう) |
実践セットアップ1:ddclient(Linux)
# インストール
sudo apt install ddclient
# /etc/ddclient.conf設定(Cloudflare例)
protocol=cloudflare
use=web, web=https://api.ipify.org
zone=example.com
login=your-email@example.com
password=your-cloudflare-api-token
myserver.example.com
# サービス開始
sudo systemctl enable ddclient
sudo systemctl start ddclient
# 状態確認
sudo systemctl status ddclient
sudo ddclient -query
実践セットアップ2:Cloudflare APIでDDNSを自作
#!/bin/bash
# cloudflare-ddns.sh
# 設定
CF_API_TOKEN="your-api-token-here"
CF_ZONE_ID="your-zone-id-here"
CF_RECORD_NAME="myserver.example.com"
CF_RECORD_ID="your-record-id-here"
# 現在のグローバルIPを確認
CURRENT_IP=$(curl -s https://api.ipify.org)
# DNSに登録されているIPを確認
DNS_IP=$(dig +short "$CF_RECORD_NAME" @1.1.1.1)
# IPが変更されていれば更新
if [ "$CURRENT_IP" != "$DNS_IP" ]; then
echo "IP changed: $DNS_IP -> $CURRENT_IP"
curl -s -X PUT \
"https://api.cloudflare.com/client/v4/zones/$CF_ZONE_ID/dns_records/$CF_RECORD_ID" \
-H "Authorization: Bearer $CF_API_TOKEN" \
-H "Content-Type: application/json" \
--data "{\"type\":\"A\",\"name\":\"$CF_RECORD_NAME\",\"content\":\"$CURRENT_IP\",\"ttl\":60,\"proxied\":false}"
echo "DNS updated successfully"
else
echo "IP unchanged: $CURRENT_IP"
fi
# crontabに登録(5分ごとに実行)
crontab -e
# */5 * * * * /home/user/cloudflare-ddns.sh >> /var/log/ddns.log 2>&1
実践セットアップ3:Docker + DDNS自動更新
# docker-compose.yml
version: '3'
services:
cloudflare-ddns:
image: oznu/cloudflare-ddns:latest
restart: always
environment:
- API_KEY=your-cloudflare-api-token
- ZONE=example.com
- SUBDOMAIN=myserver
- PROXIED=false
- RRTYPE=A
- DELETE_ON_STOP=false
- DNS_SERVER=1.1.1.1
docker-compose up -d
自宅サーバー運用:DDNS + Let's Encrypt + Nginx Proxy Manager
[インターネット] -> [ルーターポートフォワーディング] -> [Nginx Proxy Manager] -> [サービス]
|
Let's Encrypt
自動SSL発行
# docker-compose.yml - 自宅サーバースタック
version: '3'
services:
nginx-proxy-manager:
image: jc21/nginx-proxy-manager:latest
restart: unless-stopped
ports:
- '80:80'
- '443:443'
- '81:81' # 管理パネル
volumes:
- ./npm-data:/data
- ./npm-letsencrypt:/etc/letsencrypt
cloudflare-ddns:
image: oznu/cloudflare-ddns:latest
restart: always
environment:
- API_KEY=your-cf-token
- ZONE=example.com
- SUBDOMAIN=home
ポートフォワーディング + ファイアウォール設定
ルーター設定:
外部 80 -> 内部 192.168.1.100:80
外部 443 -> 内部 192.168.1.100:443
Linux ファイアウォール(UFW):
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable
セキュリティ注意事項(ちゅういじこう):
- 22番(SSH)ポートは外部に絶対(ぜったい)公開(こうかい)しないこと(VPNまたはTailscaleを使用)
- 管理パネル(81番)も外部からブロック
- fail2banでブルートフォース攻撃(こうげき)を防御(ぼうぎょ)
- Cloudflare Proxyを有効(ゆうこう)にしてオリジンIPの漏洩(ろうえい)を防止
6. nslookup完全活用法(かつようほう)
基本的(きほんてき)な使(つか)い方(かた)
# 基本検索
nslookup example.com
# Server: 8.8.8.8
# Address: 8.8.8.8#53
#
# Non-authoritative answer:
# Name: example.com
# Address: 93.184.216.34
# 特定のDNSサーバーで検索
nslookup example.com 1.1.1.1
レコードタイプ別(べつ)検索(けんさく)
# MXレコード(メールサーバー)
nslookup -type=mx gmail.com
# gmail.com mail exchanger = 5 gmail-smtp-in.l.google.com.
# gmail.com mail exchanger = 10 alt1.gmail-smtp-in.l.google.com.
# AAAAレコード(IPv6)
nslookup -type=aaaa google.com
# TXTレコード(SPF, DKIMなど)
nslookup -type=txt example.com
# NSレコード(ネームサーバー)
nslookup -type=ns example.com
# SOAレコード(ゾーン情報)
nslookup -type=soa example.com
# CAAレコード(証明書発行権限)
nslookup -type=caa example.com
# SRVレコード(サービスの場所)
nslookup -type=srv _sip._tcp.example.com
# ANY(すべてのレコード - 一部サーバーはブロック)
nslookup -type=any example.com
対話(たいわ)モード
nslookup
> server 8.8.8.8 # DNSサーバー変更
> set type=mx # レコードタイプ設定
> gmail.com # 検索
> set type=txt
> example.com
> set debug # デバッグモードON
> example.com # 詳細情報出力
> set d2 # さらに詳細なデバッグ
> exit
逆引(ぎゃくひ)き検索(PTR)
# IP -> ドメイン検索
nslookup 8.8.8.8
# 8.8.8.8.in-addr.arpa name = dns.google.
nslookup 1.1.1.1
# 1.1.1.1.in-addr.arpa name = one.one.one.one.
実践例(じっせんれい)10選(せん)
# 1. ドメインのネームサーバーを確認
nslookup -type=ns example.com
# 2. メールサーバーを確認(メール問題のデバッグ)
nslookup -type=mx company.com
# 3. SPFレコードを確認(メールスパム問題)
nslookup -type=txt example.com
# 4. Google DNS vs Cloudflare DNS比較
nslookup example.com 8.8.8.8
nslookup example.com 1.1.1.1
# 5. IPv6アドレスを確認
nslookup -type=aaaa facebook.com
# 6. ワイルドカードサブドメインをテスト
nslookup nonexistent-sub.example.com
# 7. CAAレコードを確認(SSL証明書発行前)
nslookup -type=caa example.com
# 8. 逆引きDNS確認(IP所有者の特定)
nslookup 203.0.113.1
# 9. CNAMEチェーンを追跡
nslookup -type=cname www.example.com
# 10. SOAレコードでDNS管理者を確認
nslookup -type=soa example.com
7. digコマンドマスタリー
dig vs nslookupの違(ちが)い
| 項目(こうもく) | dig | nslookup |
|---|---|---|
| 出力(しゅつりょく) | 詳細(しょうさい)(セクション別) | 簡潔(かんけつ) |
| DNSSEC | 対応(+dnssec) | 非対応(ひたいおう) |
| トレース | 対応(+trace) | 非対応 |
| バッチモード | 対応(-f) | 非対応 |
| インストール | bind-utils/dnsutils | ほとんどプリインストール |
| 推奨用途 | DevOps/SRE | 簡単な確認 |
基本的な使い方
# 基本検索
dig example.com
# 出力構造:
# ;; QUESTION SECTION: <- 質問
# ;example.com. IN A
#
# ;; ANSWER SECTION: <- 回答
# example.com. 3600 IN A 93.184.216.34
#
# ;; AUTHORITY SECTION: <- 権威ネームサーバー
# example.com. 3600 IN NS a.iana-servers.net.
#
# ;; ADDITIONAL SECTION: <- 追加情報
# a.iana-servers.net. 3600 IN A 199.43.135.53
#
# ;; Query time: 23 msec
# ;; SERVER: 8.8.8.8#53(8.8.8.8)
よく使(つか)うオプション
# 短い出力(IPのみ)
dig +short example.com
# 93.184.216.34
# 特定のレコードタイプ
dig example.com MX
dig example.com AAAA
dig example.com TXT
dig example.com NS
dig example.com SOA
dig example.com CAA
# DNSサーバーを指定
dig @8.8.8.8 example.com
dig @1.1.1.1 example.com
# 応答時間のみ確認
dig example.com | grep "Query time"
# ;; Query time: 23 msec
Rootからトレース:+trace
# Rootから全DNS解決プロセスをトレース
dig +trace example.com
# 出力(要約):
# . 518400 IN NS a.root-servers.net. <- Root
# com. 172800 IN NS a.gtld-servers.net. <- TLD
# example.com. 86400 IN NS a.iana-servers.net. <- Authoritative
# example.com. 3600 IN A 93.184.216.34 <- 最終回答
DNSトラブルシューティングで最も有用(ゆうよう)なコマンドの一(ひと)つです。どの段階(だんかい)で問題が発生しているかを正確(せいかく)に把握(はあく)できます。
DNSSEC検証
# DNSSEC署名情報を確認
dig +dnssec example.com
# DNSSEC有効性の検証
dig +sigchase +trusted-key=/etc/trusted-key.key example.com
# DNSSEC関連レコードを直接検索
dig example.com DNSKEY
dig example.com DS
dig example.com RRSIG
dig example.com NSEC
バッチ検索
# ファイルのすべてのドメインを一括検索
cat domains.txt
# example.com
# google.com
# github.com
dig -f domains.txt +short
# 特定レコードタイプでバッチ検索
dig -f domains.txt MX +short
高度(こうど)なオプション
# TCPモードで検索(UDP代わり)
dig +tcp example.com
# 特定セクションのみ出力
dig +noall +answer example.com # 回答のみ
dig +noall +authority example.com # 権限セクションのみ
dig +noall +stats example.com # 統計のみ
# TTL付き省略出力
dig +nocmd +noall +answer +ttlid example.com
# 逆引き検索
dig -x 8.8.8.8
# 8.8.8.8.in-addr.arpa. IN PTR dns.google.
# CHAOSクラスでDNSサーバーバージョンを確認
dig @ns1.example.com version.bind CHAOS TXT
# EDNS Client Subnetテスト
dig +subnet=203.0.113.0/24 example.com @8.8.8.8
実践例15選
# 1. 特定ネームサーバーから権威ある応答を確認
dig @ns1.example.com example.com +norecurse
# 2. DNS伝播確認(複数DNSサーバーを比較)
for dns in 8.8.8.8 1.1.1.1 9.9.9.9 208.67.222.222; do
echo "=== $dns ==="
dig @$dns example.com +short
done
# 3. CNAMEチェーン全体をトレース
dig +trace +nodnssec www.example.com CNAME
# 4. MXレコードの優先順位を確認
dig example.com MX +short | sort -n
# 5. SPFレコードを確認
dig example.com TXT +short | grep spf
# 6. DKIMレコードを確認
dig selector1._domainkey.example.com TXT +short
# 7. DMARCポリシーを確認
dig _dmarc.example.com TXT +short
# 8. CAAレコードを確認(SSL発行前)
dig example.com CAA +short
# 9. SOAのシリアル番号を確認(ゾーン転送の同期)
dig example.com SOA +short
# 10. 応答時間を比較(DNSパフォーマンステスト)
for i in $(seq 1 10); do
dig example.com @8.8.8.8 | grep "Query time"
done
# 11. IPv6レコードを確認
dig example.com AAAA +short
# 12. ワイルドカードDNSを確認
dig random-subdomain.example.com +short
# 13. NSEC/NSEC3でDNSSEC認証された不存在証明
dig nonexistent.example.com NSEC
# 14. DNS応答サイズを確認(DDoS増幅テスト)
dig example.com ANY +bufsize=4096
# 15. 全ゾーンエクスポートを試行(セキュリティ監査)
dig @ns1.example.com example.com AXFR
8. DNSセキュリティ
DNS攻撃(こうげき)の種類(しゅるい)
1. DNSキャッシュポイズニング(Cache Poisoning)
正常: リゾルバ -> Authoritative NS -> 正確なIP
攻撃: 攻撃者が偽の応答をリゾルバキャッシュに注入
結果: ユーザーがフィッシングサイトに誘導される
防御: DNSSEC、ランダムソースポート、0x20エンコーディング
2. DNS増幅(ぞうふく)DDoS
攻撃方式:
1. 攻撃者がソースIPを被害者のIPに偽装(IP Spoofing)
2. オープンリゾルバに大きな応答を生成するクエリを送信(ANYタイプ)
3. 小さなクエリ -> 大きな応答 = 増幅効果(50~70倍)
4. すべての応答が被害者に集中
防御: BCP38(ソースアドレス検証)、RRL(Response Rate Limiting)
3. DNSハイジャック
方法1: ルーター/ISPレベルでDNS応答を改ざん
方法2: レジストラアカウントを乗っ取り -> ネームサーバー変更
方法3: マルウェアがシステムDNS設定を変更
防御: DNSSEC、レジストラアカウント2FA、DNS監視
4. DNSトンネリング
目的: DNSプロトコルを悪用してデータ漏洩/リモート制御
方式: DNSクエリ/応答にエンコードされたデータを隠す
例: malicious-data.encoded.evil.com にTXTクエリ
-> ファイアウォールは正常なDNSトラフィックと認識
防御: DNSクエリ長/頻度の監視、DNSファイアウォール
DNSSECの動作原理(どうさげんり)
DNSSECはDNS応答の完全性(かんぜんせい)と出所(しゅっしょ)を暗号学的(あんごうがくてき)に検証します。
信頼の連鎖(Chain of Trust):
Root (.) -> .com -> example.com
各レベルで:
1. DNSKEY: ゾーンの公開鍵
2. RRSIG: 各レコードの電子署名
3. DS: 子ゾーンの公開鍵ハッシュ(親ゾーンに保存)
4. NSEC/NSEC3: 「この名前は存在しない」の証明
# DNSSEC検証を確認
dig +dnssec example.com
# 応答に'ad'フラグがあればDNSSEC検証成功
# flags: qr rd ra ad; QUERY: 1, ANSWER: 2
# DNSKEYを検索
dig example.com DNSKEY +short
# DSレコードを検索(親ゾーンから)
dig example.com DS +short
DNS over HTTPS(DoH)/ DNS over TLS(DoT)
従来(じゅうらい)のDNSは平文(ひらぶん)のUDP/TCPで送信されるため、ISPやネットワーク管理者(かんりしゃ)がDNSクエリを閲覧(えつらん)/改(かい)ざんできます。
| プロトコル | ポート | 暗号化(あんごうか) | 特徴 |
|---|---|---|---|
| 通常DNS | 53(UDP/TCP) | なし | 盗聴(とうちょう)/改ざん可能 |
| DoT | 853(TCP) | TLS | 専用ポートでブロック可能 |
| DoH | 443(HTTPS) | HTTPS | HTTPSトラフィックに紛(まぎ)れ、ブロック困難 |
| DoQ | 853(QUIC) | QUIC | 最新(さいしん)、低遅延(ていちえん) |
# DoHでDNS検索(curl)
curl -s -H "accept: application/dns-json" \
"https://1.1.1.1/dns-query?name=example.com&type=A" | jq .
# DoHサービス
# Cloudflare: https://1.1.1.1/dns-query
# Google: https://dns.google/dns-query
# Quad9: https://dns.quad9.net/dns-query
# DoTテスト(kdig使用)
kdig -d @1.1.1.1 +tls-ca +tls-host=cloudflare-dns.com example.com
DNSフィルタリング:Pi-hole、NextDNS、AdGuard Home
[デバイス] -> [DNSフィルター] -> [許可されたクエリのみ通過] -> [インターネット]
|
広告/悪意あるドメインをブロック
トラッカーをブロック
成人コンテンツフィルタリング
| ソリューション | 種類 | 特徴 |
|---|---|---|
| Pi-hole | セルフホスティング | Raspberry Piで運用、ネットワーク全体に適用 |
| NextDNS | クラウド | 月30万クエリ無料、設定が簡単 |
| AdGuard Home | セルフホスティング | DoH/DoTサポート、Web UI |
エンタープライズ:DNSファイアウォールとRPZ
RPZ(Response Policy Zone):
DNSファイアウォールで特定ドメインの応答を上書きする技術
例(BIND RPZ):
; rpz.db
evil-domain.com CNAME . ; NXDOMAIN応答
malware-c2.com CNAME . ; ブロック
phishing-site.com A 10.0.0.1 ; 警告ページにリダイレクト
9. 実践トラブルシューティング10シナリオ
シナリオ1:ドメインを登録したのにアクセスできない(伝播遅延(でんぱちえん))
症状(しょうじょう): ドメインを登録してAレコードを設定したが、ブラウザからアクセスできない。
原因: DNS伝播(Propagation)は全世界のDNSサーバーのキャッシュが更新されるまで最大48時間かかります。
# 診断
# 1. 権威ネームサーバーから直接確認(これが成功すれば設定は正常)
dig @ns1.your-dns-provider.com yourdomain.com A +short
# 2. 複数のパブリックDNSで伝播状態を確認
dig @8.8.8.8 yourdomain.com +short
dig @1.1.1.1 yourdomain.com +short
dig @9.9.9.9 yourdomain.com +short
# 3. オンラインツールで全世界の伝播を確認
# https://www.whatsmydns.net/
解決:
- 待(ま)ちます(最大48時間、通常1~4時間)
- ローカルDNSキャッシュを強制削除(きょうせいさくじょ):
ipconfig /flushdns(Windows)またはsudo dscacheutil -flushcache(macOS) - 事前(じぜん)にTTLを低(ひく)く設定していれば、より速(はや)く伝播します
シナリオ2:SSL証明書の発行失敗(はっこうしっぱい)(CAAレコード)
症状: Let's EncryptでSSL証明書を発行しようとしたが失敗する。
# 診断: CAAレコードを確認
dig yourdomain.com CAA +short
# 0 issue "digicert.com" <- Let's Encryptが許可リストにない!
# 解決: CAAレコードを追加または修正
# yourdomain.com. IN CAA 0 issue "letsencrypt.org"
# yourdomain.com. IN CAA 0 issuewild "letsencrypt.org"
# CAAレコードがなければすべてのCAが発行可能(デフォルト)
dig yourdomain.com CAA +short
# (空の応答 = 制限なし)
シナリオ3:メールが迷惑(めいわく)メールフォルダに入(はい)る(SPF/DKIM/DMARC)
症状: 送信(そうしん)したメールが受信者(じゅしんしゃ)の迷惑メールフォルダに入る。
# 診断1: SPFレコードを確認
dig yourdomain.com TXT +short | grep spf
# "v=spf1 include:_spf.google.com -all"
# 診断2: DKIMレコードを確認(selectorはメールヘッダーで確認)
dig google._domainkey.yourdomain.com TXT +short
# 診断3: DMARCポリシーを確認
dig _dmarc.yourdomain.com TXT +short
# "v=DMARC1; p=none; rua=mailto:dmarc@yourdomain.com"
# 解決チェックリスト:
# 1. SPFにメール送信サーバーのIP/ドメインが含まれているか確認
# 2. DKIM署名キーの登録を確認
# 3. DMARCポリシーを設定(最初はp=noneで監視)
# 4. DMARCレポートを分析後、p=quarantine -> p=reject の順で強化
シナリオ4:サブドメインが動作(どうさ)しない
症状: api.example.comは動(うご)くがstaging.example.comは動かない。
# 診断: サブドメインのレコードが存在するか確認
dig staging.example.com A +short
# (空の応答 = レコードなし)
dig api.example.com A +short
# 203.0.113.20(正常)
# ワイルドカードレコードを確認
dig *.example.com A +short
解決:
- 該当(がいとう)サブドメインのA/CNAMEレコードを明示的(めいじてき)に追加
- またはワイルドカード(
*.example.com)レコードを設定 - ワイルドカードは明示的レコードより優先度(ゆうせんど)が低(ひく)いことを覚(おぼ)えておきましょう
シナリオ5:DNS変更後、一部(いちぶ)のユーザーだけアクセスできない(TTLキャッシュ)
症状: DNSレコードを変更したが、あるユーザーは新(あたら)しいサーバーに、あるユーザーは以前(いぜん)のサーバーにアクセスする。
# 診断: 各DNSサーバーのキャッシュ状態を確認
dig @8.8.8.8 example.com +short # Google DNS
dig @1.1.1.1 example.com +short # Cloudflare DNS
dig @9.9.9.9 example.com +short # Quad9
# TTLを確認
dig example.com | grep -A1 "ANSWER SECTION"
# example.com. 1800 IN A 203.0.113.10
# ^ 残りTTLがまだ高い
解決:
- TTL時間分(じかんぶん)だけ待ちます
- 次回(じかい)からはDNS変更の24時間前にTTLを60秒に下げましょう
- 変更完了後、TTLを元の値に復元(ふくげん)
シナリオ6:nslookupは成功(せいこう)するがブラウザでアクセスできない
症状: nslookup example.comは正常に応答するが、Chromeでアクセスできない。
# 診断1: hostsファイルを確認
cat /etc/hosts # Linux/macOS
type C:\Windows\System32\drivers\etc\hosts # Windows
# 診断2: ブラウザDNSキャッシュを確認
# Chrome: chrome://net-internals/#dns -> Clear host cache
# 診断3: HSTS問題を確認
# Chrome: chrome://net-internals/#hsts
# ドメインを削除して再試行
# 診断4: プロキシ/VPN設定を確認
# ブラウザのプロキシ設定がDNSをバイパスする可能性
# 診断5: DNS over HTTPS設定を確認
# Chrome設定 -> プライバシーとセキュリティ -> セキュアDNSを使用
シナリオ7:ドメイン移管後(いかんご)にDNSが途切(とぎ)れる
症状: ドメインを別のレジストラに移管した後、サイトがダウンした。
# 診断: 現在のネームサーバーを確認
dig example.com NS +short
# 旧レジストラのネームサーバーが見えれば、まだ更新されていない
# 解決手順:
# 1. 新しいレジストラでDNSレコードを先に設定
# 2. 移管前にすべてのレコードを新しい場所に複製
# 3. ネームサーバーを変更
# 4. 旧ネームサーバーは最低48時間維持
予防法(よぼうほう): 移管前に必ず新しいレジストラにすべてのDNSレコードを先に設定しましょう。
シナリオ8:K8s内部(ないぶ)DNS解決失敗(しっぱい)(CoreDNS、ndots)
症状: Podから外部ドメイン(api.external.com)にアクセスできない、または非常(ひじょう)に遅い。
# 診断1: Pod内からDNS解決をテスト
kubectl exec -it debug-pod -- nslookup api.external.com
# 診断2: resolv.confを確認
kubectl exec -it debug-pod -- cat /etc/resolv.conf
# nameserver 10.96.0.10
# search default.svc.cluster.local svc.cluster.local cluster.local
# options ndots:5
# 診断3: CoreDNSログを確認
kubectl logs -n kube-system -l k8s-app=kube-dns
# 問題: ndots:5のため、api.external.com(ドット2個)は
# api.external.com.default.svc.cluster.local等を先に試行
解決:
# 方法1: FQDNを使用(末尾にドットを追加)
# コードで api.external.com. と呼び出す
# 方法2: PodのdnsConfigを設定
apiVersion: v1
kind: Pod
spec:
dnsConfig:
options:
- name: ndots
value: '2'
シナリオ9:CDN連携後(れんけいご)にオリジンサーバーIPが漏洩(ろうえい)(DNS Leak)
症状: Cloudflareを使用中だがオリジンサーバーIPが露出(ろしゅつ)し、DDoS攻撃(こうげき)を直接受(う)けている。
# 診断: プロキシされていないレコードを確認
# Cloudflareダッシュボードでオレンジ色の雲(プロキシ有効)ではなく
# 灰色の雲(DNS Only)のレコードがないか確認
# サブドメインスキャンで漏洩を確認
dig direct.example.com +short # オリジンIP漏洩?
dig mail.example.com +short # MX用AレコードにオリジンIP?
dig ftp.example.com +short # FTPサブドメインにオリジンIP?
解決:
- すべてのA/AAAAレコードにCloudflareプロキシを有効化
- MXに必要なAレコードは別のIPを使用
- オリジンIPが既(すで)に漏洩している場合はサーバーIPを変更
- 過去(かこ)のDNS記録を確認:SecurityTrails、DNS Historyなどに元のIPが残っている可能性
シナリオ10:DDNSの更新(こうしん)が反映(はんえい)されない
症状: DDNSサービスを設定したが、IP変更時にDNSが更新されない。
# 診断1: 現在のグローバルIPを確認
curl -s https://api.ipify.org
# 診断2: DNSに登録されているIPを確認
dig myserver.example.com +short
# 診断3: DDNSクライアントのログを確認
sudo journalctl -u ddclient -n 50
# 診断4: APIトークンの有効性を確認
curl -s -X GET "https://api.cloudflare.com/client/v4/user/tokens/verify" \
-H "Authorization: Bearer YOUR_TOKEN" | jq .
# 一般的な原因:
# 1. APIトークンの期限切れまたは権限不足
# 2. Zone IDまたはRecord IDの誤り
# 3. ファイアウォールがDDNSクライアントの外部通信をブロック
# 4. cronジョブが無効化されている
# 5. IP確認サービス(ipifyなど)にアクセスできない
10. DNSサービス比較表(ひかくひょう)
マネージドDNSサービス
| サービス | 無料プラン | マネージドDNS | DDNS | DNSSEC | DDoS防御(ぼうぎょ) | 料金(りょうきん)(有料) |
|---|---|---|---|---|---|---|
| Cloudflare | あり(無制限) | あり | APIで実装 | あり(無料) | あり | 無料~エンタープライズ |
| AWS Route 53 | なし | あり | なし | あり | あり(Shield) | 月0.50 USD/ゾーン |
| Google Cloud DNS | なし | あり | なし | あり | あり | 月0.20 USD/ゾーン |
| Azure DNS | なし | あり | なし | あり(プレビュー) | あり | 月0.50 USD/ゾーン |
| NS1 | 無料ティア | あり | あり | あり | あり | カスタム |
| Dyn(Oracle) | なし | あり | あり | あり | あり | カスタム |
パブリックDNSリゾルバ
| サービス | プライマリ | セカンダリ | DoH | DoT | DNSSEC検証 | 特徴 |
|---|---|---|---|---|---|---|
| Google DNS | 8.8.8.8 | 8.8.4.4 | あり | あり | あり | 最も広(ひろ)く使用 |
| Cloudflare | 1.1.1.1 | 1.0.0.1 | あり | あり | あり | 最速(さいそく) |
| Quad9 | 9.9.9.9 | 149.112.112.112 | あり | あり | あり | 悪意あるドメインブロック |
| OpenDNS | 208.67.222.222 | 208.67.220.220 | あり | なし | あり | フィルタリングオプション |
| AdGuard DNS | 94.140.14.14 | 94.140.15.15 | あり | あり | あり | 広告ブロック |
シナリオ別(べつ)おすすめ
| シナリオ | おすすめサービス | 理由 |
|---|---|---|
| 個人ブログ/サイト | Cloudflare(無料) | 無料DNS + CDN + SSL |
| スタートアップ | Cloudflare ProまたはRoute 53 | 拡張性(かくちょうせい) + 安定性 |
| 大企業(だいきぎょう) | Route 53 + Cloudflare | マルチDNS + レイテンシベースルーティング |
| 自宅サーバー | Cloudflare + DDNS | 無料 + 動的IPサポート |
| K8sクラスター | CoreDNS + External-DNS | 自動化されたDNS管理 |
実践クイズ
Q1:DNS検索における再帰的(Recursive)クエリと反復的(Iterative)クエリの違いは?
再帰的クエリ: クライアントが再帰リゾルバに最終回答を要求します。リゾルバがすべての中間プロセスを代行し、最終的なIPアドレスを返します。
反復的クエリ: 再帰リゾルバが各段階のネームサーバー(Root、TLD、Authoritative)に順番に問い合わせます。各サーバーは最終回答ではなく「次に問い合わせるべきサーバー」を案内します。
一般的にクライアント→リゾルバは再帰的、リゾルバ→ネームサーバーは反復的クエリを使用します。
Q2:ルートドメイン(Apex)にCNAMEレコードを設定できない理由は?
RFCによると、CNAMEはその名前の唯一(ゆいいつ)のレコードでなければなりません。つまり、CNAMEがある場合、同じ名前に他のレコード(A、MX、NS、SOAなど)は存在できません。
しかし、ルートドメインには必ずSOAとNSレコードが存在しなければならず、CNAMEと共存できないため設定が不可能です。
代替手段(だいたいしゅだん)としてCloudflareのCNAME Flatteningや一部のDNSプロバイダーのALIAS/ANAMEレコードを使用できます。
Q3:TTLを60秒に設定したのに、48時間経ってもDNS変更が反映されない理由は?
考(かんが)えられる原因:
- TTLを下げる前のキャッシュがまだ残っている可能性があります。TTL変更自体も以前のTTL時間分の伝播が必要です。
- 一部のISP DNSサーバーは最低TTLを強制します(例:最低300秒)。
- クライアントのOSやブラウザキャッシュもDNSを独自にキャッシュします。
- ネームサーバー自体を変更した場合、TLDレベルでの伝播に最大48時間かかります。
解決: DNS変更の24時間前にTTLを事前に下げておき、変更後はipconfig /flushdnsなどでローカルキャッシュを削除します。
Q4:DNSSECはDNSクエリを暗号化する技術か?
いいえ。DNSSECはDNS応答の**完全性(Integrity)と出所(Authenticity)**を検証する技術であり、**暗号化(Encryption)**技術ではありません。
DNSSECで保護されたDNS応答も依然(いぜん)として平文で送信されます。つまり、DNSクエリの内容はネットワーク上で見ることができます。
DNSクエリの暗号化(プライバシー)が必要な場合は、DNS over HTTPS(DoH)またはDNS over TLS(DoT)を使用する必要があります。
まとめ:
- DNSSEC = 応答の改ざん防止(完全性)
- DoH/DoT = クエリの暗号化(プライバシー)
- 両方を使用すれば最適なセキュリティ
Q5:K8s Podから外部ドメインapi.external.comへのアクセスが遅い理由と解決方法は?
原因: Kubernetesのデフォルトのndots:5設定により、ドット(.)が5個未満のドメインはsearchドメインが先に追加されます。
api.external.comはドットが2個なので、実際のクエリ順序は:
api.external.com.default.svc.cluster.local(NXDOMAIN)api.external.com.svc.cluster.local(NXDOMAIN)api.external.com.cluster.local(NXDOMAIN)api.external.com.(成功)
3回の不要なクエリの後にようやく実際の解決が行われます。
解決方法:
- FQDNを使用:
api.external.com.(末尾にドットを追加) - PodのdnsConfigでndotsを低い値(例:2)に設定
- 頻繁にアクセスする外部ドメインはCoreDNSにキャッシュルールを追加
参考資料(さんこうしりょう)
RFCドキュメント
- RFC 1034 - Domain Names - Concepts and Facilities
- RFC 1035 - Domain Names - Implementation and Specification
- RFC 2136 - Dynamic Updates in the DNS (DDNS)
- RFC 2181 - Clarifications to the DNS Specification
- RFC 2308 - Negative Caching of DNS Queries
- RFC 4033, 4034, 4035 - DNS Security Extensions (DNSSEC)
- RFC 6698 - DNS-Based Authentication (DANE/TLSA)
- RFC 7208 - SPF (Sender Policy Framework)
- RFC 7489 - DMARC
- RFC 8484 - DNS over HTTPS (DoH)
- RFC 7858 - DNS over TLS (DoT)
- RFC 8659 - DNS Certification Authority Authorization (CAA)
ツールとサービス
- dig / nslookup - DNSクエリコマンドラインツール
- whatsmydns.net - グローバルDNS伝播チェッカー
- dnschecker.org - DNSレコードチェッカー
- mxtoolbox.com - メールDNS診断(SPF, DKIM, DMARC)
- securitytrails.com - DNS履歴検索
- dnsviz.net - DNSSEC可視化と検証
DNSソフトウェア
- BIND9 - https://www.isc.org/bind/
- CoreDNS - https://coredns.io/
- PowerDNS - https://www.powerdns.com/
- Unbound - https://nlnetlabs.nl/projects/unbound/
- Knot DNS - https://www.knot-dns.cz/
学習(がくしゅう)リソース
- Cloudflare Learning Center - DNSの概念(learning.cloudflare.com)
- howdns.works - DNSの動作を視覚的(しかくてき)に説明
- messwithdns.net - DNS実習環境(じっしゅうかんきょう)
- Julia Evans - DNS関連ブログとzines