毎回忘れるのでメモ.

A レコードと CNAME レコードの違いは?

  • A レコードドメイン名 (ex. blog.annpin.com) と IP アドレス (ex. 35.185.44.232) の対応付け を行うもの.

  • CNAME レコードドメイン名 (ex. howm.annpin.com) と既に存在している他のドメイン名 (ex. annpin.gitlab.io) の対応付け を行うもの.

ドメイン名 : IP アドレス = 1 : 1 の関係となるケース

基本的に DNS はドメイン名を IP アドレスに変換するものなので、ドメイン名と IP アドレスが 1 : 1 対応するという関係は特に不思議ではない.

例えば、 dig コマンドを使ってみると blog.annpin.com35.185.44.232 という IP アドレスと 1 : 1 で対応していることがわかる.

$ dig blog.annpin.com

; <<>> DiG 9.10.6 <<>> blog.annpin.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 13977
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;blog.annpin.com.               IN      A

;; ANSWER SECTION:
blog.annpin.com.        3600    IN      A       35.185.44.232

;; Query time: 135 msec
;; SERVER: 218.219.82.240#53(218.219.82.240)
;; WHEN: Wed Nov 16 23:04:59 JST 2022
;; MSG SIZE  rcvd: 60

ドメイン名 : IP アドレス = 1 : n の関係となるケース

例えば google.com のような大量のトラフィックを捌かなければならないサイトでは、 google.com というドメイン名を使ってブラウザからアクセスした場合に実際に応答するコンピュータが 異なる (= 異なる IP アドレスを持っているコンピュータが応答する) というケースが生じるのは 負荷分散の観点から理にかなっている.

実際、 dig を使うと GitHub Pages を使っている annpin.com では以下の 4 つの IP アドレスが登録されていることがわかる.

$ dig annpin.com

; <<>> DiG 9.10.6 <<>> annpin.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 34608
;; flags: qr rd ra; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;annpin.com.                    IN      A

;; ANSWER SECTION:
annpin.com.             3600    IN      A       185.199.110.153
annpin.com.             3600    IN      A       185.199.109.153
annpin.com.             3600    IN      A       185.199.111.153
annpin.com.             3600    IN      A       185.199.108.153

;; Query time: 32 msec
;; SERVER: 218.219.82.240#53(218.219.82.240)
;; WHEN: Wed Nov 16 23:04:51 JST 2022
;; MSG SIZE  rcvd: 103

ドメイン名 : IP アドレス = n : 1 の関係となるケース

nginx などでバーチャルサーバ機能を使っている場合、複数のドメイン名が単一の IP アドレスに 解決されることとなる. その場合、ドメイン名と IP アドレスは n : 1 の関係ということとなる.

A レコード

A レコードはドメイン名と実際の IP アドレスの対応関係を定義する. 1 つのドメイン名に複数の IP アドレスを登録することができるため、ドメイン名と IP アドレスの関係は 1 : 1 あるいは 1 : n となる.

CNAME レコード

CNAME レコードは既に A レコードとして定義されているドメイン名の別名を定義するもの. つまり、 新たなドメイン名が既存のどのドメインの別名として定義するのかを規定する.

これにより、ドメイン名と IP アドレスの関係として n : 1 の関係を定義することができる.

例えば howm.annpin.comannpin.gitlab.io の別名として CNAME レコードで定義されている.

$ dig howm.annpin.com

; <<>> DiG 9.10.6 <<>> howm.annpin.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 34840
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;howm.annpin.com.               IN      A

;; ANSWER SECTION:
howm.annpin.com.        3600    IN      CNAME   annpin.gitlab.io.
annpin.gitlab.io.       300     IN      A       35.185.44.232

;; Query time: 41 msec
;; SERVER: 218.219.82.240#53(218.219.82.240)
;; WHEN: Wed Nov 16 23:05:03 JST 2022
;; MSG SIZE  rcvd: 90

リソースレコードの種類まとめ

DNS ネームサーバにはドメイン名 (ホスト名) と IP アドレスの対応関係 リソースレコード がデータベースとして収められている.

リソースレコードには以下のような種類が存在する.

  • A (アドレス) レコード

    • DNS で最も基本となるレコード. ドメイン名と対応する IP アドレスを記述する.

    • DNS の "ドメイン名と IP アドレスを変換する" 役割を果たすための中心的なレコード.

    • ドメイン名と IP アドレスの対応関係は 1 : 1 である必要はなく、1 つのドメイン名に複数の IP アドレスを対応させることができる.

    • その場合、1 つの A レコードに複数の IP アドレスが登録されることとなる.

  • CNAME (カノニカルネーム) レコード

    • 別の A レコードで使用されている IP アドレスに別名を与える場合に使用する.

    • CNAME レコードを使うことで 1 つの IP アドレスに複数のドメイン名を割り当てることができる.

  • MX (メールエクスチェンジ) レコード

    • メールアドレスにもドメイン名が使われるが、メールアドレスのドメイン名は特定のホスト (コンピュータ) に割り当てられている名前ではない場合が多い.

    • example.com のメールサーバが mail.example.com というホスト名だったとしても、メールアドレスは [email protected] のように @ の右側にはドメイン名が来る.

    • メールアドレスの右側がホスト名ではなくドメイン名であるのには理由があり、メールサーバとなっている特定のホストに障害が生じ変更する必要が生じた場合にメールアドレスを変更する必要なくメールの送受信を継続できるようにしている.

    • MX レコードはこの仕組みを実現するために用いられており、 MX レコードは 組織のドメイン名と、その組織のメールサーバのホスト名を結びつけるためのレコード である.

    • メールを受信するメールサーバは、宛先メールアドレス中のドメイン名の MX レコードを調べ、実際にメールを送るメールサーバのドメイン名を入手する.

    • その後、メールサーバのドメイン名から A レコードを使用してメールサーバの IP アドレスを取得しメールを送信する.

    • メールサーバの障害に対応するため、 MX レコードには プリファレンス と呼ばれる優先度の値が書かれている. これにより、複数のメールサーバが組織内に存在する場合に優先度の順に各メールサーバに対してメールの送信を試みようとするのでメールサーバがいくつかダウンしている場合でもメールの送受信は問題なく行えるようになっている.

  • NS (ネームサーバ) レコード

    • 組織のネームサーバについての情報を記述するためのレコード. ゾーンファイルには最低 1 つ以上の NS レコードが記述される.

    • ドメインにサブドメインが存在する場合、通常はネームサーバはサブドメインのネームサーバにサブドメインの権限を委譲することになるが、その権限を委譲したネームサーバを NS レコードとして記述する.

    • これにより、 NS レコードを調べることで管理するサーバがわかる. また、ドメイン名から IP アドレスを入手したいホストは知りたいホストを管理しているネームサーバがわかる.

  • SOA (スタートオブオーソリティ) レコード

    • 特殊な情報を記述をするレコードで、ネームサーバに必ず 1 つ記述する.

    • オーソリティの範囲や情報の新しさなど、ネームサーバが持つオーソリティの情報が記述されている.