delete from hateblo.jp where 1=1;

タイトルに意味はありません。

複数ドメイン対応のpostfix+dovecotを構成する

対象

postfixをマルチドメイン対応し、配送をdovecotへ委託する簡単なお仕事です。

ソフトウエア構成

このページで紹介する設定

注意点

拡張メールアドレスを使用できないように見えますが、「recipient_delimiter」をdovecotpostfixの両方に設定することで使用可能になるそうです。
[Dovecot] LMTP with address extension

postfix

/etc/postfix/master.cf(差分)

ネットワークとホスト名の設定はいつものとおり。
最後のdovecot-lmtpとvirtual_mailbox_domains.cfが肝。
マルチドメインの場合、行き先がわからずbounceしてしまう。
そのため、virtual_mailbox_domains.cfで自分自身であることを明示的に示す。

diff main.cf.org main.cf
76a77
> myhostname = mailtest.home.lan
113c114
< #inet_interfaces = all
---
> inet_interfaces = all
116c117
< inet_interfaces = localhost
---
> #inet_interfaces = localhost
409c410
< #recipient_delimiter = +
---
> recipient_delimiter = +
676a678,702
> 
> #dovecot_destination_recipient_limit = 1
> virtual_mailbox_domains = proxy:mysql:/etc/postfix/virtual_mailbox_domains.cf
> virtual_mailbox_maps = proxy:mysql:/etc/postfix/virtual_mailbox_maps.cf
> virtual_alias_maps = proxy:mysql:/etc/postfix/virtual_mailbox_maps.cf
> virtual_transport = lmtp:unix:private/dovecot-lmtp
> mailbox_transport = lmtp:unix:private/dovecot-lmtp
> 
> 
> smtpd_sasl_type = dovecot
> # Can be an absolute path, or relative to $queue_directory
> # Debian/Ubuntu users: Postfix is setup by default to run chrooted, so it is best to leave it as-is below
> smtpd_sasl_path = private/auth
> # On Debian Wheezy path must be relative and queue_directory defined
> #queue_directory = /var/spool/postfix
> # and the common settings to enable SASL:
> smtpd_sasl_auth_enable = yes
> # With Postfix version before 2.10, use smtpd_recipient_restrictions
> smtpd_relay_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
> 
> smtpd_use_tls = yes
> smtpd_tls_cert_file = /etc/pki/tls/certs/mail.pem
> smtpd_tls_key_file = /etc/pki/tls/certs/mail.pem
> smtpd_tls_session_cache_database = btree:/var/lib/postfix/smtpd_scache
  • virtual_alias_maps
    • 実装はサボっています
    • 本来は転送先等を考慮した構成にすべきです
/etc/postfix/virtual_mailbox_domains.cf

ドメインの情報を拾ってくる。
スキーマは前回紹介したdovecotの構成を流用する。

user = postfix
password = postfixpostfix
hosts = 192.168.1.1
dbname = mailserver
query = SELECT domain FROM domain WHERE domain='%s'

なお、上記設定のデバッグを行う場合は以下のコマンドを実行してデータが帰ってくるかを確認してください。

postmap -q mailtest.home.lan mysql:/etc/postfix/virtual_mailbox_domains.cf
/etc/postfix/virtual_mailbox_maps.cf

ドメインの情報を拾ってくる。
スキーマは前回紹介したdovecotの構成を流用する。

user = postfix
password = postfixpostfix
hosts = 192.168.1.1
dbname = mailserver
query = SELECT email FROM mailbox WHERE email='%s' AND domain=substring_index( '%s', '@' , -1 )

なお、上記設定のデバッグを行う場合は以下のコマンドを実行してデータが帰ってくるかを確認してください。

postmap -q test@mailtest.home.lan mysql:/etc/postfix/virtual_mailbox_maps.cf

dovecot

/etc/dovecot/conf.d/10-master.conf

lmtp プロトコルを使用してメールの配信を行う。

diff /etc/dovecot/conf.d/10-master.conf.org /etc/dovecot/conf.d/10-master.conf -u
--- /etc/dovecot/conf.d/10-master.conf.org  2014-12-28 12:48:46.157639142 -0800
+++ /etc/dovecot/conf.d/10-master.conf      2014-12-28 20:58:16.179631631 -0800
@@ -46,9 +46,14 @@
 }
 
 service lmtp {
-  unix_listener lmtp {
-    #mode = 0666
+  unix_listener /var/spool/postfix/private/dovecot-lmtp {
+   group = postfix
+   mode = 0600
+   user = postfix
   }
+  #unix_listener lmtp {
+  #  #mode = 0666
+  #}
 
   # Create inet listener only if you can't use the above UNIX socket
   #inet_listener lmtp {
@@ -85,9 +90,12 @@
   }
 
   # Postfix smtp-auth
-  #unix_listener /var/spool/postfix/private/auth {
-  #  mode = 0666
-  #}
+  unix_listener /var/spool/postfix/private/auth {
+    mode = 0660
+    # Assuming the default Postfix user and group
+    user = postfix
+    group = postfix
+  }
 
   # Auth process is run as this user.
   #user = $default_internal_user
/etc/dovecot/conf.d/10-mail.conf
  • 念のためmaildir形式であることを宣言しておく(本来不要)
  • システムユーザー等でのログインを拒否する
  • プラグインをロードするようにしておく
diff /etc/dovecot/conf.d/10-mail.conf.org /etc/dovecot/conf.d/10-mail.conf
24c24
< #   mail_location = maildir:~/Maildir
---
> mail_location = maildir:~/Maildir
167c167
< #first_valid_uid = 500
---
> first_valid_uid = 500
207c207
< #mail_plugins = 
---
> mail_plugins = quota autocreate
/etc/dovecot/conf.d/10-ssl.conf
  • TLS(SSL)を有効にする
  • SSLv3は拒否しておく
diff /etc/dovecot/conf.d/10-ssl.conf.org /etc/dovecot/conf.d/10-ssl.conf
6c6
< #ssl = yes
---
> ssl = yes
41c41,42
< #ssl_cipher_list = ALL:!LOW:!SSLv2:!EXP:!aNULL
---
> ssl_cipher_list = ALL:!LOW:!SSLv2:!EXP:!aNULL:!SSLv3
/etc/dovecot/conf.d/20-lmtp.conf
  • plugin等の設定を行う
  • postmaster_addressは必須のため、設定すること。
diff /etc/dovecot/conf.d/20-lmtp.conf.org /etc/dovecot/conf.d/20-lmtp.conf
15c15,16
<   #mail_plugins = $mail_plugins
---
>   mail_plugins = $mail_plugins
>   postmaster_address = postmaster@home.lan

テスト

メールを送信してみる
telnet localhost 25
HELO mailtest.home.lan
MAIL FROM: test@mailtest.home.lan
RCPT TO: root@mailtest.home.lan
DATA

This is testmail
.
QUIT

結果は以下のとおり

telnet localhost 25                                                                          
Trying ::1...
Connected to localhost.
Escape character is '^]'.
220 mailtest.home.lan ESMTP Postfix
HELO mailtest.home.lan
250 mailtest.home.lan
MAIL FROM: test+extends@mailtest.home.lan
250 2.1.0 Ok
RCPT TO: root@mailtest.home.lan
250 2.1.5 Ok
DATA
354 End data with <CR><LF>.<CR><LF>
This is testmail
.
250 2.0.0 Ok: queued as E49AAC0DD0
QUIT
221 2.0.0 Bye
Connection closed by foreign host.

maillogは以下のようになっていればOK。

Dec 28 12:33:53 localhost postfix/smtpd[17242]: connect from localhost[::1]
Dec 28 12:34:07 localhost postfix/smtpd[17242]: E49AAC0DD0: client=localhost[::1]
Dec 28 12:34:20 localhost postfix/cleanup[17254]: E49AAC0DD0: message-id=<20141228203407.E49AAC0DD0@mailtest.home.lan>
Dec 28 12:34:21 localhost postfix/qmgr[17240]: E49AAC0DD0: from=<test+extends@mailtest.home.lan>, size=373, nrcpt=1 (queue active)
Dec 28 12:34:21 localhost dovecot: lmtp(17257): Connect from local
Dec 28 12:34:21 localhost dovecot: lmtp(17257, root@mailtest.home.lan): 1pEdCU1poFRpQwAAYLDy1w: msgid=<20141228203407.E49AAC0DD0@mailtest.home.lan>: saved mail to INBOX
Dec 28 12:34:21 localhost postfix/lmtp[17256]: E49AAC0DD0: to=<root@mailtest.home.lan>, relay=mailtest.home.lan[private/dovecot-lmtp], delay=17, delays=17/0.05/0.06/0.04, dsn=2.0.0, status=sent (250 2.0.0 <root@mailtest.home.lan> 1pEdCU1poFRpQwAAYLDy1w Saved)
Dec 28 12:34:21 localhost dovecot: lmtp(17257): Disconnect from local: Client quit
Dec 28 12:34:21 localhost postfix/qmgr[17240]: E49AAC0DD0: removed
Dec 28 12:34:23 localhost postfix/smtpd[17242]: disconnect from localhost[::1]

参考文献