Postfixでバーチャルメールボックスを有効にし、バーチャルドメイン宛てのメールを受け取る - Postfix

Linux(CentOS)にインストールしたPostfixを設定します。

事前準備

Postfixのインストール

インストールについての記事は
を参照してください。

SELinuxの無効化

メールがメールボックスに格納される際に、ディスク書き込みがブロックされる可能性があるため、SELinuxを無効化します。SELinuxの無効化についてはこちらの記事を参照してください。

main.cfの編集

inet_interfaceの設定:接続可能なインターフェイスの設定

メールサーバーに接続できるアドレスを設定します。今回は外部から接続してメールを送信できるメールサーバーを構築するため、
/etc/postfix/main.cf ファイルの
#inet_interface = all
#inet_interface = $myhostname
#inet_interface = $myhostname, localhost
inet_interface = localhost
と記述されている部分を

inet_interface = all
#inet_interface = $myhostname
#inet_interface = $myhostname, localhost
#inet_interface = localhost
と変更します。

mydestinationの確認

mydestination = $myhostname, localhost.$mydomain, localhost 
#mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain 
#mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain, mail.$mydomain, www.$mydomain, ftp.$mydomain
ドメイン宛のメールはバーチャルメールボックスで受け取るため、mydestinationが上記になっていることを確認します。

または
mydestination = localhost 
#mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain 
#mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain, mail.$mydomain, www.$mydomain, ftp.$mydomain
とします。

mynetworksの設定

ローカルネットワークからSMTP認証なしで送信する場合や、中継を許可する場合にはmynetworksを設定する必要があります。
mynetworks = (ローカルネットワークのアドレス)
を記述します。

記述例

mynetworks = 192.168.0.0/28

バーチャルメールボックスユーザーの作成

main.cfのvirtual_uid_maps(後述)で指定するuidを持つユーザーを作成します。以下のコマンドを実行します。
groupadd -g 5000 vmail
useradd -g vmail -u 5000 vmail -s /bin/false -d /home/vmail -m
または
useradd -u 5000 -s /bin/false vmail

バーチャルメールボックスの設定

/etc/postfix/main.cf ファイルに以下を追記します。
virtual_mailbox_domains = (受信するドメイン名)
virtual_mailbox_base = /var/mail/vhosts
virtual_mailbox_maps = hash:/etc/postfix/vmailbox
virtual_minimum_uid = 100
virtual_uid_maps = static:5000
virtual_gid_maps = static:5000
virtual_alias_maps = hash:/etc/postfix/virtual

今回は以下を記載しました
 virtual_mailbox_domains = ipentec.com, ixx.jp
 virtual_mailbox_base = /home/mail/vhosts 
 virtual_mailbox_maps = hash:/etc/postfix/vmailbox
 virtual_minimum_uid = 100
 virtual_uid_maps = static:5000
 virtual_gid_maps = static:5000
 virtual_alias_maps = hash:/etc/postfix/virtual
※virtual_mailbox_baseを/homeに変えました。
※複数のドメインを受信する場合はvirtual_mailbox_domainsに","で区切り受信するドメインを記載します。

メールユーザーのディレクトリ内に配置する場合は、以下の記述でも良いです。
virtual_mailbox_domains = ipentec.com, ixx.jp
virtual_mailbox_base = /home/vmail/vhosts 
virtual_mailbox_maps = hash:/etc/postfix/vmailbox
virtual_minimum_uid = 100
virtual_uid_maps = static:5000
virtual_gid_maps = static:5000
virtual_alias_maps = hash:/etc/postfix/virtual

補足1

virtual_mailbox_domains のドメイン名が多くなる場合は、ドメインを記載したファイルを指定することもできます。
virtual_mailbox_domains = /etc/postfix/vdomains
virtual_mailbox_base = /home/vmail/vhosts 
virtual_mailbox_maps = hash:/etc/postfix/vmailbox
virtual_minimum_uid = 100
virtual_uid_maps = static:5000
virtual_gid_maps = static:5000
virtual_alias_maps = hash:/etc/postfix/virtual

この場合、/etc/postfix/vdomains ファイルには受信するドメインを記載します。
/etc/postfix/vdomains ファイル(例)
 iepntec.com
 ipentec.net
 ixx.jp
受信するドメインを1行に1つ記載します。

補足2:virtual_mailbox_base をどこに指定するか

virtual_mailbox_base の位置についてです。
今回の例では /home/vmail/vhosts としています。これは、virtual_uid_maps で作成するuid=5000 のユーザー名が vmailであるため、このユーザーのディレクトリの下にメール格納ディレクトリを配置するというポリシーに沿って設定しています。
メールはサーバー全体の共通のシステムと考えた場合、特定のユーザー(この場合はvmail)のホームディレクトリ内に格納するのは不自然との考えもあります。その場合は、/etc/vmail や /home/mail や /home/vhosts など別の場所をvirtual_mailbox_base に指定することもできます。
virtual_uid_maps のユーザーディレクトリ内に格納するポリシーの場合のvirtual_mailbox_base 例

システム共通とするポリシーの場合のvirtual_mailbox_base 例

virtual_mailbox_mapsファイル(vmailbox)の編集

/etc/postfix/vmailbox ファイルに以下を追記します。
 (受信するメールアドレス)   (メールボックスフォルダ名)
 ...

今回は以下を記載しました。
 test@ipentec.com    ipentec.com/test/Maildir/
 info@ipentec.com    ipentec.com/info/Maildir/
 penguin@ipentec.com   ipentec.com/penguin/Maildir/
 info@ixx.jp   ixx.jp/info/Maildir/

Maildir形式にする場合はMaildirと末尾の"/"まで含めます。

編集後の更新処理

/etc/postfix/vmailbox ファイルを編集後
 postmap /etc/postfix/vmailbox 
コマンドを実行し更新処理をします。

ディレクトリ作成

バーチャルメールボックスのドメインのディレクトリを作成する必要があります。
 cd /home
 mkdir vmail
 chown 5000 vmail
 chgrp 5000 vmail
 cd vmail
 mkdir vhosts
 chown 5000 vhosts
 chgrp 5000 vhosts
 
 cd vhosts
 mkdir ipentec.com
 chown 5000 ipentec.com
 chgrp 5000 ipentec.com
 mkdir ixx.jp
 chown 5000 ixx.jp
 chgrp 5000 ixx.jp
上記のコマンドを入力し /home/vmail/vhosts 以下に各ドメインのメールディレクトリを作成します。

補足

以前のPostfixでは、ドメイン名のディレクトリまで作成すればそれ以下のディレクトリはシステムで作成されましたが、新しいPostfixでは、MailDirのディレクトリまで作成する必要があります。最新のPostfixでは以下のコマンドとなります。
(vmail ユーザーを作成し、vmailユーザーのディレクトリ内にMailDirを作成しています。)
 su vmail
 cd /home/vmail
 mkdir vhosts
 
 cd vhosts
 mkdir ipentec.com
 cd ipentec.com
 mkdir -p test/Maildir
 mkdir -p info/Maildir
 mkdir -p penguin/Maildir
 cd ..
 
 mkdir ixx.jp
 cd ixx.jp
 mkdir -p info/Maildir

virtual_alias_mapsファイル(virtual)の編集

/etc/postfix/virtual ファイルに以下を追記します。
(受信するメールアドレス) (転送先ユーザー)

(受信するメールアドレス)と(転送先ユーザー)の間の空白はスペース1文字でないと動作しない場合があります。

今回は転送するアドレスはないので追加はしませんでした。

編集後の更新処理

/etc/postfix/virtual ファイルを編集後
 postmap /etc/postfix/virtual 
コマンドを実行し更新処理をします。

SMTPAuthを利用する場合の設定

/etc/postfix/main.cf の編集

/etc/postfix/main.cfファイルを開き
 smtpd_sasl_auth_enable = yes
 smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
を記載します。

smtpd_sasl_auth_enable = yes
でPostfixのSMTPでSMTP AUTHを有効にします。

smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
はSMTP Authで認証されたユーザーのメールは中継を許可する設定になります。

コマンド意味
permit_mynetworks$mynetworksで指定されたIPアドレスのホストからのメールは中継を許可する
permit_sasl_authenticatedSMTP Auth認証をされたユーザーのメールは中継を許可する
reject_unauth_destination 名前解決した配送先アドレスが $relay_domains またはそのサブドメインにマッチし、アドレスに送信者指定のルーティング (user@elsewhere@domain) を含まないとき。
Postfix が最終配送先のとき: $mydestination や $inet_interfaces, $virtual_alias_maps, $virtual_mailbox_domains にマッチするいずれかの配送先。
これ以外の時はメールの配送を拒否します。

/usr/lib64/sasl2/smtpd.conf の編集

CentOS 5.xの場合

SMTPAuthを利用する場合は/usr/lib64/sasl2/smtpd.confファイル (32ビット版の場合は /usr/lib/sasl2/smtpd.conf ファイル)を変更します。
 pwcheck_method: saslauth
 pwcheck_method: auxprop
に変更します。

CentOS6の場合

SMTPAuthを利用する場合は以下のファイルを変更します。
/etc/sasl2/smtpd.conf
ファイルの
pwcheck_method: saslauth
pwcheck_method: auxprop
に変更します。

CentOS7の場合

SMTPAuthを利用する場合は以下のファイルを変更します。
/etc/sasl2/smtpd.conf
ファイルの
pwcheck_method: saslauthd
pwcheck_method: auxprop
に変更します。

before

pwcheck_method: saslauthd
mech_list: plain login

after

pwcheck_method: auxprop
mech_list: plain login

SMTPAuthのユーザー追加

SMTPAuthのユーザーを追加をするには
saslpasswd2 -c -u (ドメイン名) (ユーザー名)
コマンドを入力しパスワードを入力するとSMTPAuthのユーザーが追加できます。

 saslpasswd2 -c -u ipentec.com penguin
で、penguin@ipentec.com のメールユーザーのパスワードを設定できます。

/etc/sasldb2 のパーミッションの確認

saslpasswd2コマンドで作成されたユーザー情報は/etc/sasldb2に格納されます。postfixが/etc/sasldb2を参照できるようにパーミッションを変更する必要があります。
 chgrp postfix /etc/sasldb2
 chown postfix /etc/sasldb2
コマンドを実行し、/etc/sasldb2 のオーナーとグループをpostfixユーザーに変更します。
またアクセス権が640("-rw-r-----")になっていることを確認します。

補足:saslauthdの停止

UNIXユーザーアカウントでの認証ではないのでsaslauthdを停止させても問題ありません。

CentOS7以前

 /etc/rc.d/init.d/saslauthd status

CentOS7

 systemctl status saslauthd
でsaslauthdの起動状態を確認できます。

CentOS7以前

 /etc/rc.d/init.d/saslauthd stop

CentOS7

 systemctl stop saslauthd
でsaslauthdを停止できます。

ファイアウォールの設定

サービスの設定ができていても、ファイアウォールでメールサーバーのポートが開いていない場合、通信ができません。ファイアウォールを設定して、メールサーバーで利用するポートを開放します。メールサーバーのファイアウォールの設定についてはこちらの記事を参照してください。

補足

Dovcotでバーチャルメールボックスにアクセスするための設定は の記事を参照してください。
著者
かつて日本を代表したスーパーエンジニア (自称)
ハードウェア、電気設備、ガーデニング関係の記事を担当。
掲載日: 2011-02-13
iPentec all rights reserverd.