Postfixのバーチャルドメイン設定方法|virtual_mailbox_domainsとvirtual_alias_mapsの書き方

宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
HOMELinux技術 リナックスマスター.JP(Linuxマスター.JP)Linuxtips, Postfix, サーバー管理, メールサーバー管理 > Postfixのバーチャルドメイン設定方法|virtual_mailbox_domainsとvirtual_alias_mapsの書き方
「1台のサーバーで複数ドメインのメールを受け取りたいが、Postfixのバーチャルドメイン設定が複雑でどこから手を付けていいか分からない」

こういった悩みを持つ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つを組み合わせるとドメイン別の柔軟なメール管理が実現できる


「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
図解60P/登録10秒/解除も3秒 / 詳細はこちら

バーチャルドメインとは何か

Postfixにおける「バーチャルドメイン」とは、メールサーバーのホスト名(MXレコードが指すドメイン)とは別のドメイン宛てのメールを受け取る仕組みです。

たとえばサーバーのホスト名が mail.example.com だとしても、info@another-domain.jp 宛てのメールをそのサーバーで受け取って処理できます。

Postfixのバーチャルドメインには大きく2つの方式があります。

バーチャルエイリアスドメイン:既存のローカルユーザーや別アドレスへ転送する方式。virtual_alias_mapsで制御します
バーチャルメールボックスドメイン:独立したメールボックスを持つ方式。virtual_mailbox_domainsvirtual_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_mapsvirtual_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
Postfixのバーチャルドメイン設定は、virtual_alias_domains(エイリアス転送)とvirtual_mailbox_domains(独立メールボックス)の2つを使い分けることがポイントです。設定変更後は必ず postmap でDBを再生成し、postfix reload で反映させる手順を守れば、トラブルなく複数ドメインの運用が実現できます。

Postfixの関連設定については「Postfixでメールキューの状態を確認する方法」や「LinuxのDNS設定の基本」も合わせてご覧ください。

バーチャルドメイン環境での mailq / postsuper トラブル対処

バーチャルドメインを運用していると「特定ドメイン宛だけメールがキューに溜まる」「postsuper でキューを削除したい宛先を絞りたい」といった場面に出くわします。mailqpostsuper でドメイン単位の状況を把握し、安全に再送・削除する手順をまとめます。

1. ドメインごとのキュー件数を集計する

mailqの出力を awk でドメイン部分だけ抽出し、件数集計するパターンです。

# キュー内のメールを宛先ドメインごとに集計する # mailq | awk '/^[A-F0-9]/ {getline; print $1}' | awk -F@ '{print $2}' | sort | uniq -c | sort -nr 38 example.com 5 another-domain.jp 2 some-broken-domain.example

集計結果から「どのドメインがボトルネックになっているか」が一目で判別できます。バーチャルドメイン環境では virtual_alias_maps 経由で別ドメインに転送されるパターンもあるため、転送先サーバ側の問題でキューに残っているケースがよくあります。

2. 特定ドメイン宛のキューだけを削除する(postsuper -d ALL deferred の落とし所)

postsuper -d ALLは強力ですが、全消しは怖いという場面が多いはずです。特定ドメイン宛だけを削除するには Queue ID を列挙してから渡します。

# example.com 宛のキューだけ削除する # mailq | awk '/^[A-F0-9]/ {qid=$1; getline; if ($1 ~ /@example\.com$/) print qid}' | postsuper -d - # deferred キューだけ全削除(バーチャルドメイン環境でも安全な落とし所) # postsuper -d ALL deferred

postsuper -d - は標準入力から Queue ID を読み込んで一括削除するモードです。誤って active キューに手を出すリスクが低く、運用で重宝します。

3. virtual_alias_maps の不整合が原因のキュー滞留

バーチャルエイリアス設定を更新した後、postmap を実行し忘れていると、エイリアス変換が古いままになりキューが詰まることがあります。

# /etc/postfix/virtual を更新した後は必ず postmap する # postmap /etc/postfix/virtual # Postfix のリロード(main.cf 変更時は reload、virtual のような hash DB は postmap 単体でも反映) # systemctl reload postfix

「設定を変えたのに反映されない」という時の99%は、postmap 忘れか postfix reload 忘れです。手順書に固定文として組み込んでおくのが安全です。

virtual_mailbox_domains と DNS(MXレコード)の整合確認

バーチャルドメイン運用で意外と落とし穴になるのが、Postfix側の virtual_mailbox_domains に書いてあるドメインの MX レコードが、このサーバを指していないケースです。

1. MX レコードを確認する

# バーチャルドメインの MX を確認する # dig MX another-domain.jp +short 10 mail.example.com. # Aレコードまで辿る # dig A mail.example.com +short 192.0.2.10

virtual_mailbox_domains に書いているドメインの MX が、このPostfixサーバの IP / FQDN になっていることが受信の前提です。MX が別サーバを指していると、メールはそちらに届いてしまい、こちらでは maillog に何も出ません。

2. main.cf の myhostname / mydestination との衝突を確認する

virtual_mailbox_domainsに書いたドメインが、mydestination にも書かれていると Postfix は「ローカル配送」と判断し、バーチャルメールボックスへ届きません。

# 現在の mydestination / virtual_mailbox_domains を表示する # postconf -n mydestination virtual_mailbox_domains mydestination = localhost, mail.example.com virtual_mailbox_domains = another-domain.jp

mydestinationanother-domain.jp が含まれていないことを必ず確認してください。重複した瞬間にバーチャルメールボックス側の設定が無効になります。

3. recipient が見つからないログの読み方

maillogRecipient address rejected: User unknown in virtual mailbox table が出ている場合、virtual_mailbox_maps に該当アドレスが登録されていません。

# virtual_mailbox_maps の中身を確認する # postmap -q "info@another-domain.jp" hash:/etc/postfix/vmailbox another-domain.jp/info/

何も表示されなければ未登録です。vmailboxに追記してから postmap /etc/postfix/vmailbox を再実行してください。

mailq と postqueue でメールキューを確認する基本コマンド

ここまでバーチャルドメイン環境での mailq / postsuper 応用を扱いましたが、検索で「mailq 削除」「postsuper」と打って辿り着いた方は、まず単体コマンドの基本動作を確認したいはずです。バーチャルドメイン設定とは独立した、Postfix 標準のキュー操作を整理しておきます。
# 現在のキュー内容を一覧表示(mailq は postqueue -p のエイリアス)
$ mailq
$ postqueue -p

# 同じ出力。キュー内のメール数だけ知りたいときは末尾の "Mail queue is empty" や "-- 5 Kbytes in 3 Requests." を見る

# キュー内全メールを再送試行する(postfix flush)
$ postqueue -f
$ postfix flush

キュー削除は postsuper です。引数の -d が「delete」を意味し、後続の Queue ID または ALL で対象を指定します。

# 全キューを一括削除する(強力なので運用前に確認)
$ postsuper -d ALL

# 特定の Queue ID だけ削除する
$ postsuper -d ABC1234DEF

# deferred キュー(再送待ち)だけ削除する
$ postsuper -d ALL deferred

私も postsuper -d ALL は何度か使いましたが、消した後に「あのメール戻せますか」と聞かれて手が動かなくなったことがあります。本番では postsuper -d ALL deferred で再送待ちだけ削除する方が安全です。active キュー(配送中)に手を出すと、配送ループや二重送信の原因になります。

postsuper -d ALL を本番で安全に使うチェックリスト|active キューに触らない運用と段階削除

「postsuper all」「postsuper -d ALL」で辿り着いた方は、すでにキュー溢れの本番障害対応中の状況も多いと思います。基本コマンドは前のセクションで整理済みなので、本セクションは「本番で叩く前に何を確認するか」と「どのキューに触っていいか」の運用面に絞ります。

# 1. まずキュー総数と滞留先を把握する(active / deferred / hold の内訳を見る)
$ postqueue -p | tail -5
-- 247 Kbytes in 312 Requests.

$ mailq | awk '/^[A-Z0-9]/{print $1}' | sed 's/[*!]$//' | head
ABC1234DEF
EFG5678HIJ
(Queue ID 一覧を確認)

# 2. キュー種別ごとの件数を数える(postqueue -j は JSON 形式)
$ postqueue -j | jq -r '.queue_name' | sort | uniq -c
    298 deferred
     12 active
      2 hold

削除の順序は holddeferred → 最後に active(基本的に触らない)です。active は配送中のメールで、削除すると二重送信や配送ループの引き金になります。

# 安全側:deferred キューだけを削除する(再送待ちのみ)
$ postsuper -d ALL deferred

# 中間:hold キュー(手動で保留したもの)を削除する
$ postsuper -d ALL hold

# 最終手段:全キュー削除(active 含む、配送中メール紛失の覚悟が必要)
$ postsuper -d ALL

私も本番で postsuper -d ALL を打った後、「あの再送中のメール戻せますか」と聞かれて手が動かなくなった経験があります。基本は deferred だけを段階的に削除し、active は配送が落ち着くまで触らない方針が安全です。削除前後で maillogtail -f しておくと、配送ループや異常終了を早期に検知できます。

# 削除前後でログを並行監視する(別端末で実行)
$ tail -f /var/log/maillog | grep -E 'postsuper|status=(sent|bounced|deferred)'

Postfixのメールサーバー設定を体系的に学びませんか?

バーチャルドメイン設定が理解できると、Postfixのメール配送の仕組み全体が見えてきます。
現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。

「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

登録10秒/合わなければ解除3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録
宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として20年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。