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

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

その際、dovecotによるquota制御を行いたいので、dovecotのドキュメント「Dovecot LDA with Postfix」の”Virtual users”にある設定を行う。

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」の処理を見てみると以下の順番でメールアドレスの存在確認を行っている模様

recipient_canonical_maps
canonical_maps
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処理が追加されていた。

recipient_canonical_maps
canonical_maps
virtual_alias_maps
virtual_mailbox_maps

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

コメントを残す

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

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

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