2026年6月14日
2026年6月14日
SRVレコードとAAAAレコードを併用する設定|SRVの向け先をIPv6でも接続できるようにする手順
SRVレコードをIPv6に対応させるときは、SRVそのものにIPv6アドレスを書くのではなく、SRVの「向け先(ターゲット)」に指定したホスト名にAAAAレコードを追加します。SRVはサービスの置き場所をホスト名とポート番号で示すだけで、IPアドレスは向け先のA・AAAAレコードから引かれるためです。この記事では、SRVとAAAAの関係、ゾーンの書き方、よくある誤り、IPv6で実際に接続できるかの確かめ方を説明します。
SRVとAAAAの関係
SRVレコードは、メールクライアントの自動設定(RFC 6186)、CalDAV・CardDAV(RFC 6764)、XMPP、SIPなど、「このドメインの○○サービスはどのサーバーの何番ポートか」をクライアントに教えるために使われます。クライアントは次の順で名前を解決します。
_サービス名._プロトコル.ドメインのSRVレコードを引き、向け先のホスト名とポート番号を得る- 向け先のホスト名のA(IPv4)とAAAA(IPv6)を引く
- 得られたアドレスに、SRVで指定されたポート番号で接続する
つまり、SRVとAAAAを「併用する」というのは、同じ名前に2つのレコードを並べることではなく、SRVの向け先となるホスト名にAAAAを持たせることを指します。AAAAを置く場所を間違えると、IPv6では接続されません。
ゾーンの書き方
IMAPS(993番ポート)とメール送信(587番ポート)のサーバーを mail.example.com に置き、IPv4とIPv6の両方で受け付ける例です。
; SRV: 優先度 重み ポート 向け先
_imaps._tcp.example.com. 3600 IN SRV 0 1 993 mail.example.com.
_submission._tcp.example.com. 3600 IN SRV 0 1 587 mail.example.com.
; 向け先のホスト名にAとAAAAを置く
mail.example.com. 3600 IN A 203.0.113.25
mail.example.com. 3600 IN AAAA 2001:db8::25
SRVの4つの値は、左から優先度(小さいほど優先)、重み(同じ優先度の中での振り分け比率)、ポート番号、向け先です。向け先が1台なら、優先度0・重み1のように単純な値で問題ありません。
マネージドDNSの管理画面では、サービス名・プロトコル・優先度・重み・ポート・向け先を別々の欄に入力する形式が多く、欄の名前や並び順はサービスによって異なります(2026年10月現在)。ゾーンファイルの1行をそのまま貼り付ける形式ではないことが多いので、各欄に何を入れるかをサービスの資料で確かめてから入力します。
よくある誤り
1. AAAAをSRVの名前の側に置いている
_imaps._tcp.example.com にAAAAを追加しても、クライアントはこの名前ではSRVしか引かないため、意味がありません。AAAAは向け先のホスト名(上の例では mail.example.com)に置きます。
2. 向け先がCNAMEになっている
SRVの向け先は、AやAAAAを直接持つホスト名でなければならないと決められています(RFC 2782)。mail.example.com が別名(CNAME)になっていると、クライアントによって解決できたりできなかったりします。向け先にはCNAMEではないホスト名を指定し、そこにAとAAAAを置きます。
3. 向け先にIPアドレスを書いている
SRVの向け先にはホスト名しか書けません。2001:db8::25 のようなアドレスを直接書くことはできないので、AAAAを持つホスト名を用意して指定します。なお、向け先に .(ドット1文字)を書くと「このサービスは提供していない」という意味になります。
4. 末尾のドットが無い
BINDのゾーンファイルでは、末尾にドットの無い名前にはゾーン名が付け足されます。向け先を mail.example.com と書くと mail.example.com.example.com. として扱われるため、末尾にドットを付けるか、ゾーン内の名前なら mail とだけ書きます。
5. DNSは正しいがサーバーがIPv6で待ち受けていない
いちばん気付きにくいのがこれです。AAAAを追加すると、IPv6を使える環境のクライアントはIPv6のアドレスに接続しようとします。サーバーのプロセスがIPv6で待ち受けていない、ファイアウォールやクラウドのセキュリティグループでIPv6の通信を許可していない、といった状態だと、接続に失敗したり、IPv4に切り替わるまで待たされたりします。
最近のクライアントの多くは、IPv6とIPv4を並行して試し、早くつながった方を使う仕組み(Happy Eyeballs、RFC 8305)を持っていますが、すべてのクライアントが実装しているわけではありません。AAAAを追加する前に、サーバー側のIPv6の受け付けを整えておきます。
IPv6で接続できるかの確かめ方
DNSの確認とサーバーへの接続確認を分けて行います。まず、SRVと向け先のAAAAが権威サーバーから正しく返るかを確かめます。
# SRVを引く
dig +short _imaps._tcp.example.com SRV
# 向け先のホスト名のAとAAAAを引く
dig +short mail.example.com A
dig +short mail.example.com AAAA
次に、IPv6のアドレスを指定してポートに接続できるかを試します。手元の回線がIPv6に対応していない場合は、IPv6を使えるサーバーなど別の環境から実行します。
# IPv6でポートが開いているかを確認
nc -6 -vz mail.example.com 993
# IPv6のアドレスでTLS接続し、証明書の内容を確認
openssl s_client -connect '[2001:db8::25]:993' -servername mail.example.com
openssl s_client では、証明書のエラーが出ないことと、証明書に記載された名前を確かめます。SRVを使うサービスでは、クライアントが証明書の名前を「元のドメイン(example.com)」と「向け先のホスト名(mail.example.com)」のどちらで照合するかがサービスやクライアントによって異なります。使っているサービスの仕様に合わせて、必要な名前が証明書に含まれているかを確認します。
サーバー側で待ち受けの状態を見るには、ss -tlnp で該当ポートが [::] やIPv6のアドレスで待ち受けているかを確かめます。
段階的に切り替える手順
すでにIPv4だけで運用しているSRVをIPv6にも対応させる場合は、次の順で進めると影響を抑えられます。DNSを変更する前に、現在のレコードをエクスポートなどで控えておきます。
- サーバーのIPv6アドレスを決め、OSのネットワーク設定とサービスの待ち受けをIPv6に対応させる
- ファイアウォールとセキュリティグループで、IPv6の該当ポートを許可する
- 上の
nc -6とopenssl s_clientで、アドレスを直接指定して接続を確かめる - 向け先のホスト名にAAAAを追加する。最初はTTLを短め(300秒程度)にしておく
- 実際のクライアントでの接続と、サーバーのログにIPv6からの接続が記録されることを確かめ、問題がなければTTLを元に戻す
問題が出た場合は、AAAAを削除すればIPv4だけの状態に戻せます。ただし、削除してもAAAAのTTLの間は古い答えがキャッシュに残る点に注意します。
WordPressサイトとの関係
WordPress自体はSRVレコードを使いませんが、同じドメインでメールやカレンダーなどのサービスを運用していると、SRVと一緒にWebサイト用のAAAAを追加することがあります。ドメインの頂点や www にAAAAを追加すると、WordPressサイトにもIPv6で接続されるようになるため、Webサーバー(Nginxなら listen [::]:443 ssl; のような設定)がIPv6で待ち受けているか、証明書がIPv6側でも同じものを返すかもあわせて確かめます。
まとめ
- SRVはIPアドレスを持たず、向け先のホスト名のA・AAAAからアドレスが引かれる
- AAAAはSRVの名前ではなく、SRVの向け先のホスト名に置く
- 向け先はCNAMEやIPアドレスにせず、AとAAAAを直接持つホスト名にする
- AAAAを追加する前に、サーバーの待ち受けとファイアウォールをIPv6に対応させる
digでDNSを、nc -6とopenssl s_clientで実際の接続を分けて確かめる