postfixのvirtual_transport=dovecot指定時にもvirtual_mailbox_mapsを指定したほうが良い件

postfix/dovecotのメールサーバで、実ドメイン以外のドメインのメールも受け取るようpostfix側にvirtual mailbox domainsの設定を行うことがある

その際、dovecotによるquota制御を行いたい。

その場合の手法は2種類ある。
 ・dovecotドキュメント「Dovecot LDA with Postfix」の「virtual_transport = dovecot」を設定して”Virtual users”にある設定を行う手法
 ・dovecotドキュメント「Postfix and Dovecot LMTP」の「virtual_transport = lmtp:unix:private/dovecot-lmtp」を設定してLMTPを使う手法

LMTPの方は「Dovecot LDAのdeliverでは動作しません」と書いてあるため、dovecot のquotaを使うためにdovecot ldaを使用する場合には使えなさそう。

このため、まずは「virtual_transport = dovecot」の手法を実装

postfixの/etc/postfix/main.cf には以下の設定

dovecot_destination_recipient_limit = 1
virtual_mailbox_domains = your.domain.here
virtual_transport = dovecot

postfixの/etc/postfix/master.cf には以下の設定

dovecot   unix  -       n       n       -       -       pipe
  flags=DRhu user=vmail:vmail argv=/usr/libexec/dovecot/dovecot-lda -f ${sender} -d ${recipient}

しかし、この設定を行った場合、存在しないメールアドレス宛に来たメールを拒否する、という動作をしてくれない

検証方法はこんな感じ

$ telnet メールサーバホスト名 25
Trying 192.168.x.x...
Connected to 192.168.x.x.
Escape character is '^]'
220 メールサーバホスト名 ESMTP Postfix
ehlo testhost
250-メールサーバホスト名
250-<以下省略>
mail from: <>
250 2.1.0 Ok
rcpt to: nothing@your.domain.here
250 2.1.5 Ok

存在しないアドレスを指定した「rcpt to: nothing@your.domain.here」に対する応答として「550 5.1.1 ~」が返ってくることを期待したものの、「250 2.1.5 Ok」という、メールアドレスが存在する場合と同じ応答となっている。

これをなんとか出来ないかを調べてみると、プラグインを独自開発しろ、とかいう話が出てきたものの、意外な解決方法の糸口を発見・・・

/etc/postfix/master.cf の smtpdの起動を「smtpd -v」と詳細ログ出力モードに変えて、上記操作をしてみたところ、rcpt to入力後の動作に気になるところが・・・

「CHECKING Recipient address VALIDATION MAPS」の処理を見てみると以下の順番でメールアドレスの存在確認を行っている模様
 1) recipient_canonical_maps
 2) canonical_maps
 3) virtual_alias_maps

検証環境ではvirtual_mailbox_domains とは別に virtual_alias_domains も設定され、virtual_alias_mapsはhashファイルが指定されている。これにより、virtual_alias_mapsの検索が行われていると判断される

じゃあ、ここにvirtual_mailbox_mapsを設定したら、virtual_mailbox_mapsに対してメールアドレスの存在確認を行ってくれるんじゃないかな?と期待

main.cfに「virtual_mailbox_maps = ldap:/etc/postfix/ldap-mailbox.cf」を追加して、LDAP検索のqueryは「query_filter = (&(objectClass=user)(mail=%s))」で設定した

設定後、「dnf install postfix-ldap」でpostfixのldapサポートを追加し、「systemctl restart postfix」でpostfixを再起動して見ると以下の結果となった

$ telnet メールサーバホスト名 25
Trying 192.168.x.x...
Connected to 192.168.x.x.
Escape character is '^]'
220 メールサーバホスト名 ESMTP Postfix
ehlo testhost
250-メールサーバホスト名
250-<以下省略>
mail from: <>
250 2.1.0 Ok
rcpt to: nothing@your.domain.here
550 5.1.1 <nothing@your.domain.here>: Recipient address rejected: User unknown in virtual mailbox table

期待通りに「550 5.1.1」による拒否を行ってくれるようになった

postfixのdebugログを確認すると、virtual_alias_maps 処理の次に virtual_mailbox_maps処理が追加されていた。
 1) recipient_canonical_maps
 2) canonical_maps
 3) virtual_alias_maps
 4) virtual_mailbox_maps

このことから、postfixで「virtual_transport=dovecot」を設定した場合であっても、virtual_mailbox_maps設定を行い、postfix側でメールアドレスの存在確認を行った方がよい、ということになる

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

モバイルバージョンを終了