こんにちは、インフラエンジニアのryuです。
今回の記事では、BINDでMXレコードを設定する方法を、Linux・DNS初心者向けにわかりやすく解説します。
MXレコードは、指定したドメイン宛てのメールを、どのメールサーバーへ配送するかを表すDNSレコードです。
たとえば、user@example.com宛てに送られたメールは、example.comのMXレコードを基に配送先が決まります。
「MXレコードの10や20は何を表しているの?」 「メールサーバーのIPアドレスを直接書いてはいけないの?」 「ゾーンファイルを編集した後は、どうやって反映するの?」
このような疑問を、設定例と確認コマンドを使いながら順番に解説します。
MXレコードとは?¶
MXは、Mail Exchangeの略です。
MXレコードには、メールを受け取るサーバーのホスト名と優先度を登録します。
example.com. IN MX 10 mail1.example.com.
example.com. IN MX 20 mail2.example.com.
この例では、mail1.example.comが第1候補、mail2.example.comが第2候補です。
MXレコードの数字は優先度を表し、値が小さいメールサーバーほど先に選ばれます。
送信側のメールサーバーは、最初に優先度10のmail1.example.comへSMTPで接続します。接続できない場合は、優先度20のmail2.example.comを試します。
同じ優先度のMXレコードを複数登録した場合は、送信側が候補の中から配送先を選びます。
MXレコードを使ってメールが届く流れ¶
Aさんがa@test.netから、Bさんのb@example.comへメールを送る場合を考えてみましょう。
大まかな流れは次のとおりです。
- Aさんのメールソフトが、送信メールサーバーへメールを渡す
- 送信メールサーバーが、
example.comのMXレコードを問い合わせる - DNSサーバーが、
mail1.example.comなどの配送先を返す - 送信側が、配送先のA・AAAAレコードを問い合わせる
- 取得したIPアドレスのメールサーバーへSMTPで接続する
- 受信側のメールサーバーが、Bさんのメールボックスへ配送する
MXレコードは、@より後ろのドメインに対して問い合わせられます。
MXレコードにはホスト名を指定する¶
MXレコードの参照先には、メールサーバーのホスト名を指定します。
次のようにIPアドレスを直接書くことはできません。
@ IN MX 10 192.0.2.20
正しくは、MXレコードへホスト名を設定し、そのホスト名に対応するAレコードまたはAAAAレコードを登録します。
@ IN MX 10 mail.example.com.
mail IN A 192.0.2.20
また、MXレコードの参照先には、CNAMEではなくA・AAAAレコードを持つ正式なホスト名を使います。
example.com. IN MX 10 mail.example.com.
mail.example.com. IN A 192.0.2.20
BINDをインストールする¶
Ubuntu・Debian系Linuxでは、次のコマンドでBINDをインストールできます。
sudo apt update
sudo apt install bind9 bind9-utils dnsutils
各パッケージの主な役割は次のとおりです。
bind9:DNSサーバー本体bind9-utils:設定確認や管理に使うコマンドdnsutils:digやnslookupなどの確認コマンド
BINDの基本設定から確認したい方は、次の記事も参考にしてください。
BINDへゾーンを登録する¶
今回は、example.comを管理するプライマリーDNSサーバーを構築する例で説明します。
Ubuntuでは、一般的に次のファイルへゾーンを登録します。
/etc/bind/named.conf.local
ファイルを開きます。
sudo vi /etc/bind/named.conf.local
次のゾーン設定を追加します。
zone "example.com" {
type primary;
file "/etc/bind/zones/db.example.com";
};
古い設定例ではtype masterが使われる場合もあります。
ゾーンファイルを保存するディレクトリを作成します。
sudo mkdir -p /etc/bind/zones
既存のゾーンファイルがある場合は、そのファイルへMXレコードを追加します。
ゾーンファイルへMXレコードを登録する¶
ゾーンファイルを編集します。
sudo vi /etc/bind/zones/db.example.com
設定例は次のとおりです。
$TTL 3600
@ IN SOA ns1.example.com. admin.example.com. (
2026080601 ; Serial
3600 ; Refresh
900 ; Retry
1209600 ; Expire
300 ) ; Negative Cache TTL
IN NS ns1.example.com.
IN NS ns2.example.com.
ns1 IN A 192.0.2.10
ns2 IN A 192.0.2.11
mail1 IN A 192.0.2.20
mail2 IN A 192.0.2.21
@ IN MX 10 mail1.example.com.
@ IN MX 20 mail2.example.com.
ゾーンファイル内の@は、ゾーン名であるexample.comを表します。
次の2つは同じ意味です。
@ IN MX 10 mail1.example.com.
example.com. IN MX 10 mail1.example.com.
完全修飾ドメイン名には、末尾の.を付けます。
mail1.example.com.
末尾の.がない場合、BINDはゾーン名を補って解釈します。書き方によっては、mail1.example.com.example.comのような意図しない名前になるため注意してください。
SOAレコードのシリアル番号を更新する¶
ゾーンファイルを変更したら、SOAレコードのSerialも更新します。
2026080601
シリアル番号は、セカンダリーDNSサーバーがゾーンの更新を判断するために使います。
よく使われる形式は次のとおりです。
YYYYMMDDNN
2026年8月6日の1回目の更新なら2026080601、同じ日の2回目なら2026080602とします。
セカンダリーDNSサーバーを利用していない場合でも、変更時にシリアル番号を増やす習慣をつけましょう。
設定ファイルとゾーンファイルを確認する¶
BINDへ反映する前に、設定ファイルの構文を確認します。
sudo named-checkconf
何も表示されなければ、基本的にはnamed.conf関連の構文に問題はありません。
次に、ゾーンファイルを確認します。
sudo named-checkzone example.com /etc/bind/zones/db.example.com
正常な場合は、次のように表示されます。
zone example.com/IN: loaded serial 2026080601
OK
エラーが表示された場合は、次の項目を確認してください。
- セミコロンや括弧が不足していないか
- ホスト名の末尾に
.が付いているか - MXの参照先にA・AAAAレコードがあるか
- MXの参照先がCNAMEになっていないか
- SOA・NSレコードの書式が正しいか
ゾーンを再読み込みする¶
設定に問題がなければ、変更したゾーンを再読み込みします。
sudo rndc reload example.com
サービス全体を再起動する方法もあります。
sudo systemctl restart bind9
MXレコードを追加しただけであれば、通常はゾーン単位で再読み込みする方が影響を抑えられます。
BINDの状態とログは、次のコマンドで確認できます。
sudo systemctl status bind9
sudo journalctl -u bind9
digでMXレコードを確認する¶
DNSサーバーのIPアドレスが192.0.2.10の場合は、次のように問い合わせます。
dig @192.0.2.10 example.com MX
ANSWER SECTIONに、登録したMXレコードが表示されることを確認します。
example.com. 3600 IN MX 10 mail1.example.com.
example.com. 3600 IN MX 20 mail2.example.com.
結果だけを簡潔に表示する場合は、+shortを付けます。
dig @192.0.2.10 example.com MX +short
10 mail1.example.com.
20 mail2.example.com.
MXの参照先も確認しましょう。
dig @192.0.2.10 mail1.example.com A +short
dig @192.0.2.10 mail2.example.com A +short
外部公開している場合は、外部のDNSサーバーからも確認します。
dig @8.8.8.8 example.com MX
外部で反映されない場合は、権威DNSの委任、ゾーンの公開状態、TTL、ファイアウォールなどを確認します。
nslookupで確認する¶
nslookupでもMXレコードを確認できます。
nslookup -type=MX example.com 192.0.2.10
ただし、LinuxでDNSの詳細を確認するときは、応答内容を確認しやすいdigを覚えておくと便利です。
MXレコードを設定するときの注意点¶
MXレコードが正しくても、それだけでメールを受信できるわけではありません。
実際に外部からメールを受け取るには、次の準備も必要です。
- MXの参照先でPostfixなどのSMTPサーバーを動かす
- TCPの25番ポートを受信できるようにする
- ドメインの権威DNSを正しく委任する
- メールサーバーのA・AAAAレコードを登録する
- 必要に応じて逆引きDNSを設定する
- SPF、DKIM、DMARCなどを設定する
- 不正中継や迷惑メールへの対策を行う
PostfixとDovecotの構築方法は、次の記事で解説しています。
BINDとMXレコードを実際に設定しながら学ぶ¶
DNSの設定は、レコードの意味を読むだけでは理解しにくい分野です。
InfraAcademyのLinux入門講座では、Linuxコマンド、設定ファイル、サービス、ログなどをブラウザ上の環境で操作しながら学習できます。
DNS、IPアドレス、ポート番号、ルーティングなどを基礎から理解したい方は、ネットワーク入門講座もおすすめです。
AWSのRoute 53やVPC、EC2などへ知識をつなげたい方は、AWS講座へ進むと、クラウド環境でのDNS設定も理解しやすくなります。
BINDでMXレコードを設定する方法まとめ¶
今回は、BINDでMXレコードを設定する方法を解説しました。
- MXレコードは、指定したドメイン宛てのメール配送先を表す
- 優先度の数字が小さいメールサーバーほど先に選ばれる
- MXの参照先にはIPアドレスではなくホスト名を指定する
- 参照先にはCNAMEではなく、A・AAAAレコードを持つホスト名を使う
- ゾーンファイルを変更したらSOAのシリアル番号を増やす
named-checkconfとnamed-checkzoneで確認してから再読み込みするdigでMXレコードと参照先のIPアドレスを確認する- メール受信には、SMTPサーバーやDNS、セキュリティの設定も必要
まずは外部へ公開していない検証環境でゾーンファイルを編集し、digでMXレコードが返るところまで確認してみましょう。



