こういった悩みを持つLinuxエンジニアは多いです。virtual_mailbox_domainsとvirtual_alias_mapsの違いが曖昧なまま設定しても、メールが届かなかったりエラーになったりと、原因の特定に時間がかかります。
この記事では、Postfixのバーチャルドメイン設定について、virtual_mailbox_domains(独立したメールボックス管理)とvirtual_alias_maps(エイリアス転送)の2方式を実サーバーの設定例と出力例を交えながら解説します。Rocky Linux 9 / RHEL 9系で動作確認済みです。
【この記事でわかること】
・virtual_mailbox_domainsは独立したメールボックスを持つドメイン用
・virtual_alias_mapsは既存アカウントへの転送(エイリアス)に使う
・設定後はpostmap・postfixreloadで反映、postfix checkで構文確認
・2つを組み合わせるとドメイン別の柔軟なメール管理が実現できる
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
バーチャルドメインとは何か
Postfixにおける「バーチャルドメイン」とは、メールサーバーのホスト名(MXレコードが指すドメイン)とは別のドメイン宛てのメールを受け取る仕組みです。たとえばサーバーのホスト名が
mail.example.com だとしても、info@another-domain.jp 宛てのメールをそのサーバーで受け取って処理できます。Postfixのバーチャルドメインには大きく2つの方式があります。
・バーチャルエイリアスドメイン:既存のローカルユーザーや別アドレスへ転送する方式。
virtual_alias_mapsで制御します・バーチャルメールボックスドメイン:独立したメールボックスを持つ方式。
virtual_mailbox_domainsとvirtual_mailbox_mapsで制御しますどちらを使うかは運用形態によって異なります。個人や小規模で「外部ドメイン宛てのメールを自分のアカウントに転送したい」ならバーチャルエイリアス、ホスティングサービスのように「ドメインごとに独立したメールボックスを用意したい」ならバーチャルメールボックスが適しています。
virtual_alias_mapsの設定方法(バーチャルエイリアスドメイン)
バーチャルエイリアスドメインは、特定のアドレス宛てに来たメールを別のアドレスへ転送する最もシンプルな方式です。1. main.cfにvirtual_alias_domainsを追加する
/etc/postfix/main.cf を編集して、バーチャルドメインとして扱うドメインを宣言します。# バーチャルエイリアスドメインの宣言 virtual_alias_domains = another-domain.jp, sub.example.com # エイリアスマップファイルの指定 virtual_alias_maps = hash:/etc/postfix/virtual
virtual_alias_domains に指定したドメインは、mydestination には含めないでください。両方に同じドメインを入れると設定が競合してメールが届かなくなります。2. /etc/postfix/virtualにマッピングを記述する
/etc/postfix/virtual ファイルを作成し、「受信アドレス → 転送先アドレス」のマッピングを記述します。# 書式: 受信アドレス 転送先アドレス(タブまたはスペース区切り) # another-domain.jp の info@ 宛てを localuser@example.com へ転送 info@another-domain.jp localuser@example.com # support@ 宛てを複数アドレスへ転送(カンマ区切り) support@another-domain.jp admin@example.com, helpdesk@example.com # ドメイン全体をキャッチオールする(@ドメイン で指定) @sub.example.com catchall@example.com
3. postmapでデータベースファイルを生成する
テキストファイルを編集した後は、postmap コマンドで Postfix が読み込める DB ファイルを生成します。# DBファイルを生成(/etc/postfix/virtual.db が作られる) $ sudo postmap /etc/postfix/virtual # 生成確認 $ ls -la /etc/postfix/virtual* -rw-r--r-- 1 root root 312 Apr 7 10:30 /etc/postfix/virtual -rw-r--r-- 1 root root 12288 Apr 7 10:30 /etc/postfix/virtual.db
4. Postfixの設定を再読み込みする
# 構文チェック(エラーがあればここで検出できる) $ sudo postfix check # 設定を再読み込み(サービス停止不要) $ sudo postfix reload postfix/postfix-script: refreshing the Postfix mail system
virtual_mailbox_domainsの設定方法(バーチャルメールボックスドメイン)
バーチャルメールボックス方式は、ドメインごとに独立したメールボックスを用意します。実際のメールデータをサーバー上のディレクトリに保存するため、ホスティング環境に適しています。1. main.cfにvirtual_mailbox_domainsを設定する
# バーチャルメールボックスドメインの宣言 virtual_mailbox_domains = hosted-domain.jp, another-hosted.jp # メールボックスマップファイルの指定 virtual_mailbox_maps = hash:/etc/postfix/vmailbox # メールボックスのベースディレクトリ virtual_mailbox_base = /var/vmail # メールの配送UID/GID(専用ユーザーを作成して指定) virtual_uid_maps = static:5000 virtual_gid_maps = static:5000 # メールボックスマップ(任意だが指定推奨) virtual_alias_maps = hash:/etc/postfix/virtual
2. バーチャルメール用のOSユーザーを作成する
メールの実体ファイルを書き込む専用ユーザーを用意します。このユーザーはシェルログインが不要なので/sbin/nologin を指定します。# UID/GID 5000 で vmail ユーザーを作成 $ sudo groupadd -g 5000 vmail $ sudo useradd -g vmail -u 5000 -d /var/vmail -s /sbin/nologin vmail # メールボックスのベースディレクトリを作成 $ sudo mkdir -p /var/vmail $ sudo chown vmail:vmail /var/vmail $ sudo chmod 770 /var/vmail
3. /etc/postfix/vmailboxにメールボックスを定義する
各メールアドレスと、実際のメールボックスパスのマッピングを記述します。# 書式: メールアドレス ボックスパス(virtual_mailbox_base からの相対パス) # hosted-domain.jp のメールボックス info@hosted-domain.jp hosted-domain.jp/info/Maildir/ sales@hosted-domain.jp hosted-domain.jp/sales/Maildir/ admin@hosted-domain.jp hosted-domain.jp/admin/Maildir/ # another-hosted.jp のメールボックス contact@another-hosted.jp another-hosted.jp/contact/Maildir/
/ で終わる場合は Maildir 形式、終わらない場合は mbox 形式になります。現代の環境では Maildir を推奨します。4. postmapとpostfix reloadで反映する
# vmailbox の DB を生成 $ sudo postmap /etc/postfix/vmailbox # 確認 $ ls -la /etc/postfix/vmailbox* -rw-r--r-- 1 root root 280 Apr 7 11:00 /etc/postfix/vmailbox -rw-r--r-- 1 root root 12288 Apr 7 11:00 /etc/postfix/vmailbox.db # 構文チェックと再読み込み $ sudo postfix check $ sudo postfix reload postfix/postfix-script: refreshing the Postfix mail system
virtual_alias_mapsとvirtual_mailbox_domainsの組み合わせ
実際の現場では、バーチャルメールボックスドメインに対してもエイリアスを設定したいケースがあります。たとえばhosted-domain.jp のメールボックスを持ちながら、no-reply@hosted-domain.jp 宛てのメールは admin@hosted-domain.jp へ転送したい場合です。この場合は
virtual_alias_maps に以下を追記します。# /etc/postfix/virtual にエイリアスを追記 no-reply@hosted-domain.jp admin@hosted-domain.jp postmaster@hosted-domain.jp admin@hosted-domain.jp # postmap で再生成 $ sudo postmap /etc/postfix/virtual $ sudo postfix reload
virtual_alias_maps と virtual_mailbox_maps の両方に定義されている場合、virtual_alias_maps が優先されます。エイリアスとメールボックスを重複させないよう注意してください。実務Tips:設定確認とテスト送信の手順
設定変更後は必ず動作確認をします。Postfixには設定のテスト用コマンドが用意されています。1. postfix checkで構文エラーを確認する
$ sudo postfix check # エラーがなければ何も表示されない # エラーがある場合の例: # postfix/postfix-script: fatal: the Postfix mail system is not installed
2. postconf -nで有効な設定を確認する
# デフォルト値と異なる設定項目だけを表示 $ sudo postconf -n | grep virtual virtual_alias_domains = another-domain.jp, sub.example.com virtual_alias_maps = hash:/etc/postfix/virtual virtual_mailbox_base = /var/vmail virtual_mailbox_domains = hosted-domain.jp, another-hosted.jp virtual_mailbox_maps = hash:/etc/postfix/vmailbox virtual_uid_maps = static:5000 virtual_gid_maps = static:5000
3. postmapで登録内容を確認する
# 特定のアドレスが vmailbox に登録されているか確認 $ sudo postmap -q "info@hosted-domain.jp" hash:/etc/postfix/vmailbox hosted-domain.jp/info/Maildir/ # virtual に登録されているか確認 $ sudo postmap -q "no-reply@hosted-domain.jp" hash:/etc/postfix/virtual admin@hosted-domain.jp
4. mailコマンドでテスト送信する
# テストメールを送信 $ echo "test body" | mail -s "test subject" info@hosted-domain.jp # ログでメール配送を確認 $ sudo tail -f /var/log/maillog Apr 7 11:30:01 mail postfix/virtual[12345]: 3A4B27E240: to=
, relay=virtual, delay=0.05, delays=0.03/0.01/0/0.01, dsn=2.0.0, status=sent (delivered to maildir)
トラブルシュート:よくあるエラーと対処法
「User unknown in virtual mailbox table」が出る
/etc/postfix/vmailbox にアドレスが登録されていないか、postmap で DB を再生成していない可能性があります。# vmailbox に対象アドレスが登録されているか確認 $ sudo postmap -q "info@hosted-domain.jp" hash:/etc/postfix/vmailbox # 登録されている場合は出力あり。空の場合はファイルに追記してpostmapを再実行 $ sudo postmap /etc/postfix/vmailbox $ sudo postfix reload
「5.1.1 User unknown in virtual alias table」が出る
virtual_alias_domains に登録したドメイン宛てのアドレスが、/etc/postfix/virtual に存在しない場合に発生します。キャッチオール設定を追加するか、対象アドレスを明示的に追加してください。# キャッチオールを追加(any@ を既存アドレスへ転送) @another-domain.jp admin@example.com $ sudo postmap /etc/postfix/virtual $ sudo postfix reload
「mydestination に含まれている」エラー
バーチャルドメインとして設定したドメインがmydestination にも含まれていると、Postfix が「ローカル配送」と「バーチャル配送」で競合を起こします。# 現在の mydestination を確認 $ sudo postconf mydestination mydestination = $myhostname, localhost.$mydomain, localhost # バーチャルドメインが含まれていないか確認 # もし含まれていれば mydestination から削除して postfix reload
メールボックスにファイルが届かない
/var/vmail のパーミッションや所有者が正しくない場合、Postfix がメールを書き込めません。# ベースディレクトリの確認 $ ls -la /var/vmail/ drwxrwx--- 3 vmail vmail 4096 Apr 7 11:00 . drwxr-xr-x 1 root root 60 Apr 7 10:00 .. drwxrwx--- 2 vmail vmail 4096 Apr 7 11:30 hosted-domain.jp # パーミッションが違う場合 $ sudo chown -R vmail:vmail /var/vmail $ sudo chmod 770 /var/vmail
main.cfの全体構成例(バーチャルメールボックス運用)
実際の運用で使える/etc/postfix/main.cf の主要設定をまとめます。# === 基本設定 === myhostname = mail.example.com mydomain = example.com myorigin = $mydomain inet_interfaces = all inet_protocols = ipv4 # ローカル配送のドメイン(バーチャルドメインは含めない) mydestination = $myhostname, localhost.$mydomain, localhost # === バーチャルメールボックス設定 === virtual_mailbox_domains = hosted-domain.jp, another-hosted.jp virtual_mailbox_base = /var/vmail virtual_mailbox_maps = hash:/etc/postfix/vmailbox virtual_uid_maps = static:5000 virtual_gid_maps = static:5000 # === バーチャルエイリアス設定 === virtual_alias_domains = alias-domain.jp virtual_alias_maps = hash:/etc/postfix/virtual
本記事のまとめ
| やりたいこと | 使う設定 |
|---|---|
| 別ドメインのメールを既存アカウントへ転送 | virtual_alias_domains + virtual_alias_maps |
| ドメインごとに独立したメールボックスを作成 | virtual_mailbox_domains + virtual_mailbox_maps |
| バーチャルドメインにエイリアスを追加 | virtual_alias_maps(メールボックスと併用可) |
| 設定ファイル編集後の反映 | postmap /etc/postfix/virtual && postfix reload |
| 設定内容の確認 | postmap -q "address" hash:/etc/postfix/vmailbox |
| 構文エラーのチェック | postfix check |
virtual_alias_domains(エイリアス転送)とvirtual_mailbox_domains(独立メールボックス)の2つを使い分けることがポイントです。設定変更後は必ず postmap でDBを再生成し、postfix reload で反映させる手順を守れば、トラブルなく複数ドメインの運用が実現できます。Postfixの関連設定については「Postfixでメールキューの状態を確認する方法」や「LinuxのDNS設定の基本」も合わせてご覧ください。
Postfixのメールサーバー設定を体系的に学びませんか?
バーチャルドメイン設定が理解できると、Postfixのメール配送の仕組み全体が見えてきます。
現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。
「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
登録10秒/合わなければ解除3秒 / 詳細はこちら
- 次のページへ:MTAをSendmailからPostfixに変更する
- 前のページへ:logresolveコマンドでApacheログのIPアドレスをホスト名に変換する方法
- この記事の属するカテゴリ:Linuxtips・Postfix・サーバー管理・メールサーバー管理へ戻る

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。
登録無料・いつでも解除できます