1 分で読了 #devops
このページの目次

DNS 運用マニュアル

dig

dig example.com                                     # 基本的な A レコードの照会
dig example.com +short                              # IP アドレスのみを出力
dig example.com A                                   # タイプを指定
dig example.com AAAA                                # IPv6
dig example.com MX                                  # メールサーバー
dig example.com NS                                  # 権威 DNS サーバー
dig example.com ANY                                 # すべてのレコード (一部のサーバーでは無視される)
dig @8.8.8.8 example.com                            # DNS サーバーを指定

dig +trace example.com                              # ルートから再帰的に解決 (解決チェーン全体を確認)
dig -x 8.8.8.8                                      # PTR: IP → ホスト名
dig example.com +dnssec                             # DNSSEC RRSIG を含む

# 出力の解釈:
# ;; ANSWER SECTION:     実際の回答
# ;; AUTHORITY SECTION:  NS レコード (誰が回答する権限を持っているか)
# ;; ADDITIONAL SECTION: NS の IP (グルーレコード)
# ;; Query time: 12 msec
# ;; SERVER: 127.0.0.1#53

レコードタイプ早見表

A:      IPv4
AAAA:   IPv6
CNAME:  別名 (canonical name) — 注意: CNAME は他のタイプと共存できない
MX:     メールサーバー (優先度 + ホスト名)
NS:     権威 DNS サーバー
SOA:    権威開始 (ゾーンシリアル番号、更新/再試行/有効期限、管理者メールアドレス)
TXT:    テキスト (SPF, DKIM, DMARC、検証トークン)
SRV:    サービスロケーション (_service._proto.name → ホスト:ポート)
PTR:    逆引き照会 (IP → 名前)
CAA:    CA の発行を制限 (0 issue "letsencrypt.org")

クラウド API 操作

# Alibaba Cloud (aliyun CLI)
aliyun alidns DescribeDomainRecords --DomainName example.com
aliyun alidns AddDomainRecord --DomainName example.com --RR www --Type A --Value 1.2.3.4
aliyun alidns UpdateDomainRecord --RecordId <id> --RR www --Value 2.3.4.5
aliyun alidns DeleteDomainRecord --RecordId <id>

# Cloudflare (API)
curl -X GET "https://api.cloudflare.com/client/v4/zones/<zone_id>/dns_records?type=A" \
  -H "Authorization: Bearer <api_token>"

DNSSEC

# DNSSEC 信頼チェーンの確認
delv @8.8.8.8 example.com                          # 完全な検証 (失敗理由を含む)
dig +dnssec example.com | grep RRSIG               # 署名レコードを確認
# DS レコードの確認 (親ゾーン内)
dig DS example.com

暗号化 DNS テスト

# DoT (DNS over TLS, ポート 853)
kdig @1.1.1.1 +tls-ca example.com

# DoH (DNS over HTTPS, ポート 443)
kdig @1.1.1.1 +https example.com
curl -H 'Accept: application/dns-json' 'https://1.1.1.1/dns-query?name=example.com&type=A'

# DoQ (DNS over QUIC, ポート 853)
kdig @1.1.1.1 +quic example.com

トラブルシューティング

# 解決できない / 間違った IP に解決される場合
dig example.com +short                              # まず応答内容を確認
dig +trace example.com                              # どの段階で失敗しているか?
dig @8.8.8.8 example.com vs dig @223.5.5.5 example.com  # 国内外の比較

# DNS ポイズニング (GFW による投毒)
# → 異なるリゾルバーの応答を比較
# → @8.8.8.8 が正常な応答を返すが、ローカルが偽の IP を返す場合 → ローカル DNS がハイジャックされている

# ローカルキャッシュ
systemd-resolve --statistics                       # systemd-resolved のキャッシュ
systemd-resolve --flush-caches                      # キャッシュのクリア

# 本体の DNS 設定を確認
cat /etc/resolv.conf
resolvectl status