せかいろぐ

ほぼ自分用備忘録

ArchLinux上にDovecot+Postfixでメールサーバを構築

ArchLinux上にDovecot + Postfixでメールサーバを構築します。SSLで暗号化通信ができるようにします。また、PostfixにはDovecot SASLを利用してSMTP-Auth機能を持たせます。

1. インストール

# pacman -S dovecot postfix

2. 設定

2.1. Dovecotの設定

2.1.1. SSL証明書を作成

dovecotパッケージにはSSL証明書生成のためのスクリプトが用意されています。

# cp /etc/ssl/dovecot-openssl.cnf{.sample,}
# nano /etc/ssl/dovecot-openssl.cnf
[ req_dn ]
C=(国別コード)
ST=(都道府県)
L=(市区町村)
O=(組織)
OU=(部門)
CN=(メールサーバのホスト名)
emailAddress=(メールアドレス)
# /usr/lib/dovecot/mkcert.sh

これで証明書と鍵のペアが /etc/ssl/certs/dovecot.pem と /etc/ssl/private/dovecot.pem に生成されます。

2.1.2. 設定のサンプルをコピー

予め用意されている設定サンプルをコピーします。

# cp /usr/share/doc/dovecot/example-config/dovecot.conf /etc/dovecot
# cp -r /usr/share/doc/dovecot/example-config/conf.d /etc/dovecot
2.1.3. /etc/dovecot/conf.d/10-mail.conf

Maildir形式を採用します。

# nano /etc/dovecot/conf.d/10-mail.conf
mail_location = maildir:~/Maildir
2.1.4. /etc/dovecot/conf.d/10-masster.conf

PostfixからDovecot SASLを使用するための設定をします。

# nano /etc/dovecot/conf.d/10-masster.conf
service auth {
    ...
    unix_listener /var/spool/postfix/private/auth {
        mode = 0660
        user = postfix
        group = postfix
    }
    ...
}

2.2. Postfixの設定

2.2.1. /etc/postfix/main.cf

基本設定をします。SMTP-AuthDovecot SASLを使用します。Dovecotで使うものと同じ証明書でSSL/TLSを有効にします。

# nano /etc/postfix/main.cf
myhostname = (メールサーバのホスト名)
mydomain = (メールドメイン)
myorigin = $mydomain
inet_interfaces = all
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
home_mailbox = Maildir/

smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes

smtpd_use_tls = yes
smtpd_tls_cert_file = /etc/ssl/certs/dovecot.pem
smtpd_tls_key_file = /etc/ssl/private/dovecot.pem
smtpd_tls_session_cache_database = btree:/var/lib/postfix/smtpd_scache
2.2.2. /etc/postfix/master.cf

smtpsを有効にします。SMTP-Authを使えるようにします。

# nano /etc/postfix/master.cf
smtp  inet n - n - - smtpd
-o smtpd_sasl_auth_enable=yes

smtps inet n - n - - smtpd
-o smtpd_tls_wrappermode=yes
-o smtpd_sasl_auth_enable=yes
2.2.3. エイリアスの設定

root宛メールを受け取れるようにします。

# nano /etc/postfix/aliases
root: (root宛メールを受け取るユーザ)
# newaliases

2.3. その他設定

2.3.1. /etc/services

smtpsのポート番号を書き込みます。

# nano /etc/services
smtps 465/tcp
smtps 465/udp
2.3.2. iptablesの設定

smtp、smtps、imap、imapsが使うポートを開きます。

# nano /etc/iptables/iptables.rules
-A INPUT -p tcp -m conntrack --ctstate NEW -m tcp --dport 25 -j ACCEPT
-A INPUT -p tcp -m conntrack --ctstate NEW -m tcp --dport 143 -j ACCEPT
-A INPUT -p tcp -m conntrack --ctstate NEW -m tcp --dport 465 -j ACCEPT
-A INPUT -p tcp -m conntrack --ctstate NEW -m tcp --dport 993 -j ACCEPT
# systemctl restart iptables
2.3.3. Maildirを準備

ユーザを新しく作成した時Maildirが自動生成されるようにします。

# mkdir /etc/skel/Maildir
# mkdir /etc/skel/Maildir/{new,temp,cur}
# chmod -R 700 /etc/skel/Maildir
2.3.4. メールユーザ追加

新規メールユーザを追加してみます。

# useradd -m -s /sbin/nologin (ユーザ名)
# passwd (ユーザ名)
新しい UNIX パスワードを入力してください: (パスワード)
新しい UNIX パスワードを再入力してください: (パスワード)

# saslpasswd2 -u (メールサーバのホスト名) -c (ユーザ名)
Password: (SMTP-Auth用パスワード)
Again (for verification): (SMTP-Auth用パスワード)

# chgrp postfix /etc/sasldb2

3. 起動・自動起動設定

# systemctl start dovecot
# systemctl start postfix
# systemctl enable dovecot
# systemctl enable postfix

4. テスト

メールサーバのホストがtestserver.jpで、ユーザtestuserが作成済みであるとします。太字部分が入力です。一部省略しています。

4.1. 送信

# telnet 127.0.0.1 25

Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
220 testserver.jp ESMTP Postfix
ehlo localhost
250-testserver.jp
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-STARTTLS
250-AUTH PLAIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
mail from:test@test.test
250 2.1.0 Ok
rcpt to:testuser
250 2.1.5 Ok
data
354 End data with .
From: test@test.test
To: testuser@testserver.jp
Subject: Test
Test
.

250 2.0.0 Ok: queued as 6BF86540645
quit
221 2.0.0 Bye
Connection closed by foreign host.

4.2. 受信

# telnet 127.0.0.1 143

Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
* OK [(略)] Dovecot ready.
1 login testuser (パスワード)
1 OK [(略)] Logged in
2 select INBOX
(略)
2 OK [READ-WRITE] Select completed.
3 fetch 1 rfc822.header
* 1 FETCH (RFC822.HEADER
(略)
X-Original-To: testuser
Delivered-To: testuser@testserver.jp
Received: from localhost (localhost.localdomain [127.0.0.1])
(略)
From: test@test.test
To: testuser@testserver.jp
Subject: Test
...
)
3 OK Fetch completed.
4 fetch 1 rfc822.text
* 1 FETCH (RFC822.TEXT {6}
Test
)
4 OK Fetch completed.
5 logout
* BYE Logging out
5 OK Logout completed.
Connection closed by foreign host.

4.3. 第三者中継チェック

念のためにテストしておきます。
第三者中継チェック - RBL.JP