読者です 読者をやめる 読者になる 読者になる

give IT a try

プログラミング、リモートワーク、田舎暮らし、音楽、etc.

サンプルストーリーで理解するDNSの設定方法と周辺知識(改)

UNIX/Linux ネットワーク

2013.4.20 追記

CNAMEの間違った使い方を書いていたので、「3. DNSレコードでCNAMEやAレコードを設定する」の項を一部修正しました。
というか、実際に痛い目に遭いました・・・(T T)。
詳しくは本文にて。

2014.10.10 追記

結局Herokuでは「Aレコード + ネイキッドドメイン」の設定を使うことはできなくなりました。
ネイキッドドメインを使う場合は、かわりに「CNAME flattening」という仕組みを使います。
詳しくは以下の記事で説明しているので、参考にしてみてください。

妻のパン屋のwebサイトをいろいろ更新した話 ~Rails 4アップデートとかサイトの高速化とか~ - give IT a try


はじめに

みなさん、DNS、ネームサーバー(NS)、Aレコード、CNAME、と言われて、「ああ、アレね」ってすぐに頭の中にイメージが浮かびますか?


はい、しっかりしたイメージが浮かぶ人は、この先は読まなくてもいいです。


「んー、聞いたことはあるけど、実はよくわかってないなあ・・・」という人は続けて読んでください。


実は僕も最近まで「良くわかってない方の人」でした。お恥ずかしいことに。


一応このブログや妻の店のWebサイトは独自ドメインで運用しているので、多少は設定を触ったことがあるのですが、その時はネットのHow toページに従っていただけなので、本質は理解できていないままでした。


しかし、ソニックガーデンのプログラマはプログラミングだけでなく、サーバーやネットワーク関連の知識も要求されます。
いつまでも「教えて教えて君」じゃダメなので、色々調べて自分の頭で理解しようとしました。
そしてようやく、頭の中でしっかりしたイメージが浮かぶようになりました。


今回はそんな「よくわかってない人」向けに、サンプルストーリーを使ってできるだけわかりやすく、DNS設定やその周辺知識を説明してみようと思います。


なお、サンプルストーリーの構成は以下のようになっています。
 

  1. 新しいWebサービスをリリースするぞー!
  2. ドメインを取ったぞー!・・・で、それからどうする?
  3. DNSレコードでCNAMEやAレコードを設定する
  4. レジストラ標準ではない、外部DNSサービスを使ってみる

 

1. 新しいWebサービスをリリースするぞー!

学生プログラマのイトーくん(仮名)は、忙しい学業の合間を縫って「awesome-sns」という名前の素晴らしいWebサービスを開発しました。


気合いを入れて作ったWebサービスなので、そのサービスに関するブログも毎日付けていこうと思いました。
また、このサービス用の詳しいヘルプサイトも作りました。


WebサービスはHeroku上に、ブログははてなブログで、ヘルプサイト(静的HTMLページ)はさくらインターネットのVPS上に、それぞれ作りました。


現時点ではブラウザに「http://awesome-sns.herokuapp.com」、「http://awesome-sns.hatenablog.com」、「http://182.48.xxx.xxx/index.html」とURLを入力すれば、各サイトにアクセスできる状態になっています。


f:id:JunichiIto:20130417071130j:plain


しかし、今のままではドメインがバラバラです。
独自ドメインを取って一貫性のあるURLにしないと格好悪いですよね。
なので「awesome-sns.com」というドメインを取得して、こんな感じのURLを付けたいとイトーくんは考えました。


f:id:JunichiIto:20130417053907j:plain


Webサービスは「http://awesome-sns.com」で、ブログは「http://blog.awesome-sns.com」で、ヘルプサイトは「http://help.awesome-sns.com」で表示されるのが今回のゴールです。


メモ: サブドメインとは

ブログやヘルプサイトのURLにはそれぞれ先頭に「blog」「help」が付いています。
このように同一ドメイン内でサイトやコンテンツを区別するために付けられる名前をサブドメインと呼びます。


メモ: ネイキッドドメインとは

反対に、サブドメインが付いていない「素のドメイン」をネイキッドドメイン(Naked domain)と呼びます。
上の例で言うと、Webサービスの「http://awesome-sns.com」がネイキッドドメインのURLです。


ネイキッドドメインは、裸のドメイン、ルートドメイン、Apexドメイン、といった呼び方をする場合もあります。


2. ドメインを取ったぞー!・・・で、それからどうする?

ドメインは早い者勝ち!
イトーくんは急いでドメインを取りにいきました。
「awesome-sns.com」というドメイン名は運良くまだ残っていたので、イトーくんはそのドメインをVALUE DOMAINで取得しました。


しかし、ドメインは無事に取得したものの、どうすればWebサービスやブログに独自ドメインを使ったURLでアクセスできるようになるんでしょうか?


f:id:JunichiIto:20130417055622j:plain


3. DNSレコードでCNAMEやAレコードを設定する

Webサービスやブログに独自ドメインを使ったURLでアクセスするようにするためには、それに対応するDNSレコードを設定します。


VALUE DOMAINの場合、設定メニューの中に「DNSレコード/URL転送の変更」という項目があるので、ここでDNSレコードの設定を変更します。
設定すべき情報を文章で表すとこんな感じです。
 

  • ネイキッドドメインなら「awesome-sns.herokuapp.com」へ行け
  • サブドメインがblogなら「awesome-sns.hatenablog.com」へ行け
  • サブドメインがhelpなら「182.48.xxx.xxx」へ行け

 

ヘルプサイトはIPアドレス(182.48.xxx.xxx)を直接指定していますが、それ以外は別のドメインをエイリアスとして指定しているだけです。
このように、IPアドレスを直接指定する場合はAレコードを、別のドメインをエイリアスとして指定する場合はCNAMEをそれぞれ設定します。


上の文章をVALUE DOMAINの記法で表すとこのようになります。
(注: DNSレコードの記法や設定方法は利用しているサービスによって異なります)
 

  • cname @ awesome-sns.herokuapp.com.
  • a @ 75.101.145.87
  • a @ 75.101.163.44
  • a @ 174.129.212.2
  • cname blog hatenablog.com.
  • a help 182.48.xxx.xxx

 

2013.4.20 訂正
Heroku上のWebサービスにネイキッドドメインを割り振るために、最初はCNAMEを使って「cname @ awesome-sns.herokuapp.com.」と書いていましたが、それをやめてAレコード(HerokuのIPアドレス)を3つ指定する方法に訂正しました。
なぜなら、ネイキッドドメインをCNAMEで指定すると、予期せぬ問題が発生するからです。
実際僕の場合、独自ドメインのメールが届かなくなるトラブルが発生しました。(ToT)


ただし、HerokuはAレコードを直接指定することも推奨していません。
Herokuが推奨するのはサブドメイン(例: www)とCNAMEを指定する方法です。
 

  • cname www awesome-sns.herokuapp.com.


なので、Heroku上のWebサービスは「http://www.awesome-sns.com」といったサブドメイン付きのURL + CNAMEで運用するのがベストです。


詳しくはこちらのHerokuの説明ページ(英語)を参照してください。
The Limitations of DNS A-Records | Heroku Dev Center


また、CNAMEを指定する場合の注意点はこちらのページに詳しく書いてあります。
livedoor Techブログ : CNAMEの間違った使い方

 

ちなみに「awesome-sns.hatenablog.com」ではなく「hatenablog.com」を指定しているのは、はてなブログの仕様です。


この設定を図で表すとこういうイメージになります。


f:id:JunichiIto:20130420051414j:plain


設定が反映されるまでにはしばらく時間がかかりますが、数時間〜1日ぐらい待つと独自ドメインのURLでWebサービスやブログにアクセスできるようになります。


これでめでたくゴール達成です!


メモ: サービス側の設定も必要になる場合がある

上の説明では省略しましたが、独自ドメインでHerokuやはてなブログを使う場合は、サービス側の設定も必要になります。

また、はてなブログを独自ドメインで使う場合は有料の「はてなブログ Pro」に申込む必要があります。


メモ: 独自ドメインのメールアドレスを使用する場合はMXレコードを設定する

独自ドメインのメールアドレスを使う場合は、DNSレコードにMXレコードを設定します。
以下はGoogleApps(Gmail)を使う場合設定例です。(VALUE DOMAINの記法で書いた場合)

mx aspmx.l.google.com. 10
mx alt1.aspmx.l.google.com. 20
mx alt2.aspmx.l.google.com. 20

ちなみに10や20という数字は配送先メールサーバーの優先度を表します。(値が小さいほど優先度高)


メモ: DNS、Aレコード、CNAME、MXレコードって何の略?

はい、それぞれ以下の略になります。

DNS
Domain Name Systemの略。
Aレコード
AはAddressの略。
CNAME
Canonical Nameの略。Canonicalには「正規の」という意味があるようです。
MXレコード
MXはMail Exchangerの略。

 

メモ: ターミナルから設定状況を確認してみる

UNIXのhostコマンドを使うとDNSレコードの設定がちゃんと反映されているかどうかがわかります。

$ host awesome-sns.com
awesome-sns.com has address 75.101.145.87
awesome-sns.com has address 75.101.163.44
awesome-sns.com has address 174.129.212.2

$ host blog.awesome-sns.com
blog.awesome-sns.com is an alias for hatenablog.com.
hatenablog.com has address 54.249.xxx.xxx

$ host help.awesome-sns.com
help.awesome-sns.com has address 182.48.xxx.xxx

 

4. レジストラ標準ではない、外部DNSサービスを使ってみる

ここまでの設定で、Webサービスやブログには独自ドメインを使ったURLでアクセスできるようになっています。


しかし、イトーくんはネットの記事で「Amazon Route 53」というDNSサービスがあることを知りました。
何やら記事によると、Route 53には「レスポンスが高速で信頼性が高い」という特徴があるそうです。


新しいもの好きでミーハーなイトーくんは「Amazon Route 53」を使ってみたいと思いました。
・・・でもどうやって??


VALUE DOMAINやお名前.comなど、大手のレジストラ(ドメイン登録業者)は自社のネームサーバー(NS)を持っているので、レジストラの内部サービスのひとつとしてDNSレコードが設定できます。
しかし、必要であればRoute 53のような外部のサービスを使ってDNSレコードを設定することもできます。


その場合はレジストラで登録されているネームサーバーをデフォルトのものから外部のサービスのものに変更します。

# 変更前
# 注: 以下はデフォルトで設定されているネームサーバー
ネームサーバー1 = ns1.value-domain.com
ネームサーバー2 = ns2.value-domain.com

# 変更後
# 注: 以下はRoute 53から払い出されたネームサーバー
ネームサーバー1 = ns-999.awsdns-99.org
ネームサーバー2 = ns-999.awsdns-99.net
ネームサーバー3 = ns-999.awsdns-99.com
ネームサーバー4 = ns-999.awsdns-99.co.uk


図で表すとこんなイメージです。


f:id:JunichiIto:20130417074710j:plain


こうしてイトーくんはDNSレコードの設定(ネームサーバー)をレジストラ標準のものから、Amazon Route 53に移行させることができました。


サンプルストーリーはこれでおしまいです!


メモ: 設定を変更する際は順番に注意する

図の矢印を見ればわかりますが、ブラウザから目的のサービス(Herokuやはてなブログ)に到達する順番は「ブラウザ → ネームサーバー → DNSレコード → 目的のサービス」になっています。


なので、DNSレコードの設定が完了していない状態でネームサーバーを切り替えてしまうと、「ネームサーバー → DNSレコード」の問い合わせが迷子になって目的のサービスにアクセスできなくなります。


サーバーを切り替えたり、DNSレコードの設定を変更したりする場合は、図の矢印とは逆の順番(目的のサービス ← DNSレコード ← ネームサーバー)で進める必要があります。


メモ: ターミナルから設定状況を確認してみる

UNIXのdigコマンドを使うとネームサーバーがちゃんと変更されているかどうかがわかります。

$ dig awesome-sns.com ns
(省略)
;; ANSWER SECTION:
awesome-sns.com. 172800 IN NS ns-999.awsdns-99.com.
awesome-sns.com. 172800 IN NS ns-999.awsdns-99.net.
awesome-sns.com. 172800 IN NS ns-999.awsdns-99.org.
awesome-sns.com. 172800 IN NS ns-999.awsdns-99.co.uk.
(省略)

 

まとめ

というわけで、今回はネームサーバー(NS)、DNS、Aレコード、CNAMEといった専門用語の意味や役割をできるだけ噛み砕いて説明してみました。


サンプルストーリーの中ではVALUE DOMAINやHerokuなど、特定のサービスを題材にしましたが、本質が理解できれば他のサービスでも考え方は同じです。
レジストラがお名前.comになったり、アクセスする先がAmazon S3やGitHub Pagesになった場合でも、ちょっと調べれば独自ドメインでアクセスする方法がわかるはずです。


もっと詳しい知識を持っている方からは「そんな大雑把な説明じゃいかん」「そこはなんか違う」と怒られそうな気もしますが、今回のエントリは「半年前の僕が読んでいたら非常に助かってそうな内容」にしてあります。


とりあえず今はこれをベースにして、僕もこれからもっと詳しくて正確な知識を身に付けていこうと思います。
がんばりまーす!!