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設定の基本」も合わせてご覧ください。

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

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

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

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

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

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

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

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

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

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

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

この記事を書いた人

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

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

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