InfraAcademy

InfraAcademy Blog

BINDでMXレコードを設定する方法とは?メール配送の仕組みと確認手順を解説

| #Linux #Linux初心者 #DNS
Linuxをブラウザで試してみる

Linux・ネットワーク・AWSを、環境構築なしで実践学習できます

こんにちは、インフラエンジニアの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へメールを送る場合を考えてみましょう。

大まかな流れは次のとおりです。

  1. Aさんのメールソフトが、送信メールサーバーへメールを渡す
  2. 送信メールサーバーが、example.comのMXレコードを問い合わせる
  3. DNSサーバーが、mail1.example.comなどの配送先を返す
  4. 送信側が、配送先のA・AAAAレコードを問い合わせる
  5. 取得したIPアドレスのメールサーバーへSMTPで接続する
  6. 受信側のメールサーバーが、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:設定確認や管理に使うコマンド
  • dnsutilsdignslookupなどの確認コマンド

BINDの基本設定から確認したい方は、次の記事も参考にしてください。

BINDを設定してDNSサーバーを構築する手順

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-checkconfnamed-checkzoneで確認してから再読み込みする
  • digでMXレコードと参照先のIPアドレスを確認する
  • メール受信には、SMTPサーバーやDNS、セキュリティの設定も必要

まずは外部へ公開していない検証環境でゾーンファイルを編集し、digでMXレコードが返るところまで確認してみましょう。

Next Action

記事で読んだ内容を、講座で実装してみましょう

InfraAcademyでは、ブラウザ上でLinuxやネットワークの実践環境を使いながら学習できます。無料で始められる講座から、学習の流れを試せます。

この記事を書いた人

ryu

InfraAcademy運営 / エンジニア

エンジニア歴10年。Linux、ネットワーク、クラウドを中心に、実務で役立つインフラ技術を初心者にもわかりやすく解説しています。

X: @ryu63614894

Related

関連記事

ブログ一覧へ

Roadmap

まずはこの4講座から

ログインすれば無料で始められる講座です。気になったテーマから手を動かして学べます。

講座一覧を見る