DNSの「優先度」は、すべてのレコードにあるわけではありません。
この言葉が関係するのは、主に MXレコード と SRVレコード です。
まず結論から言うと、DNSで優先度が明確に定義されている代表例は次の2つです。
一方で、Aレコード、AAAAレコード、CNAMEレコード、NSレコードには、通常MXのような優先度フィールドはありません。
MXレコードは、ドメイン宛てのメールをどのメールサーバーに届けるかを示すためのレコードです。
ここで設定する数値は、メールサーバーの優先順位を意味します。
たとえば、次のような設定があったとします。
example.com. IN MX 10 mail1.example.com.
example.com. IN MX 20 mail2.example.com.
この場合は、数値の小さい 10 のほうが優先されます。
つまり、通常は mail1.example.com に配送され、そこが使えない場合に mail2.example.com が使われます。
DNSの優先度という話で最もよく出てくるのがこのMXレコードで、数値が小さいほど優先度が高い と覚えておけば基本は問題ありません。
MXレコードは、同じ優先度の値を複数設定することもできます。
example.com. IN MX 10 mail1.example.com.
example.com. IN MX 10 mail2.example.com.
この場合、2つのメールサーバーは同順位です。
どちらを先に試すかは、送信側メールサーバーの実装に依存します。
そのため、実務上は冗長化や分散のような目的で使われることがありますが、必ずしも完全に均等な分散になるとは限りません。
MXレコードの説明では、いくつか誤解されやすいポイントがあります。
「数値が大きいほうが優先」と思われることがありますが逆です。
小さい数値ほど優先されます。
10、20、30 のように設定されることが多いですが、これは慣習的なものです。
重要なのは数字の大小関係であり、1 と 5 でも問題ありません。
MXレコードの向き先は、通常IPアドレスではなくホスト名です。
example.com. IN MX 10 mail.example.com.
mail.example.com. IN A 192.0.2.10
このように、MXはメールサーバーのホスト名を指し、そのホスト名に対応するAレコードやAAAAレコードが別途存在する形になります。
ここは特に重要です。
MXレコードの向き先にCNAMEを使うのは不適切です。
MXのターゲットには、別名ではなく、アドレスレコードを持つ正規のホスト名を設定する必要があります。
実務上の注意点というより、仕様上そう考えるべきポイントです。
SRVレコードは、特定サービスの接続先サーバーを指定するためのレコードです。
主に、SIP、XMPP、LDAPなどで使われます。
SRVレコードには、通常次の情報があります。
priorityweightporttargetたとえば次のような設定です。
_service._tcp.example.com. IN SRV 10 60 5060 sip1.example.com.
_service._tcp.example.com. IN SRV 10 20 5060 sip2.example.com.
_service._tcp.example.com. IN SRV 20 0 5060 sip-backup.example.com.
この場合、まず見るべきなのは priority です。
priority は小さい数値ほど優先されます。
そのため、最初に利用対象になるのは priority が 10 の sip1.example.com と sip2.example.com です。
20 の sip-backup.example.com は、それらが使えない場合の予備という位置づけになります。
SRVレコードでは、同じ priority の中で weight が使われます。
これは、同順位の接続先の中で、どれをどの程度選びやすくするかを決めるための値です。
先ほどの例では、priority が 10 の中に2つの候補があります。
sip1.example.com の weight は 60sip2.example.com の weight は 20この場合、sip1.example.com のほうが sip2.example.com より選ばれやすくなります。
つまり、SRVでは次のように理解するとわかりやすいです。
この2つは役割が違うため、混同しないことが大切です。
AレコードやAAAAレコードには、MXのような優先度フィールドはありません。
たとえば次のように、同じ名前に対して複数のAレコードを設定することはできます。
example.com. IN A 192.0.2.10
example.com. IN A 192.0.2.20
この場合、複数のIPアドレスが返されますが、どちらが先に使われるかは、DNSの「優先度」で決まるわけではありません。
実際の接続順や選択結果には、次のような要素が関係します。
そのため、Aレコードを複数登録しても、MXレコードのように「10が優先、20が予備」といった明確な意味にはなりません。
CNAMEレコードには、優先度の概念はありません。
CNAMEは「この名前は別の名前の別名である」と示すためのレコードです。
www.example.com. IN CNAME app.example.net.
このような設定は、接続先の順位を表しているわけではなく、単に参照先の名前を別名化しているだけです。
そのため、MXやSRVのような priority の考え方はありません。
NSレコードにも、通常の意味での優先度はありません。
NSレコードは、そのゾーンを管理するネームサーバーを示すものです。
複数のNSレコードを設定することは一般的ですが、
MXレコードのように「小さい数値のほうが優先される」といった仕組みはありません。
また、NSレコードの向き先についても、CNAMEではなく正規のホスト名を使うべきです。
DNSを扱っていると、TTLと優先度が混同されることがありますが、両者は別物です。
TTLは、DNSの応答をどのくらいキャッシュしてよいかを示す値です。
たとえば、次のような設定では 300 がTTLです。
example.com. 300 IN MX 10 mail.example.com.
この 300 は「5分間キャッシュしてよい」という意味であり、どのサーバーを優先するかとは無関係です。
つまり、
という違いがあります。
実務で「DNSの優先度」と言われた場合、最も多いのは MXレコードの優先度 です。
特にメール関連の設定では、この意味で使われることがほとんどです。
一方で、音声系サービスや一部の業務システムでは、SRVレコードの priority / weight を指している場合があります。
また、Webサイトの表示先やサーバー切り替えの話で「優先度」と言われることがありますが、その場合は純粋なDNS仕様の話ではなく、次のような別の仕組みを含んでいることもあります。
そのため、「DNSの優先度」という言葉を見たら、どのレコードの話なのかを最初に切り分けることが重要です。
DNSにおける「優先度」は、主にMXレコードとSRVレコードで使われる概念です。
priority が優先順位、weight が同順位内での振り分けつまり、DNSの優先度とは、複数の接続先候補があるときに、どれを先に利用するかを示す情報です。
ただし、その考え方が適用されるのは主にMXとSRVであり、すべてのDNSレコードに共通する仕組みではありません。
以上、DNSの優先度についてでした。
最後までお読みいただき、ありがとうございました。