Ubuntu 20.04でPostfix + Dovecot + MariaDBを利用したメールサーバの構築方法について記載していきます。
タイムゾーンを日本に設定
1
|
sudo timedatectl set-timezone Asia/Tokyo
|
各種パッケージをインストール
をインストールします。
1
2
3
4
5
|
sudo apt-get update
sudo DEBIAN_FRONTEND=noninteractive apt-get install -y \
-o Dpkg::Options::="--force-confdef" \
-o Dpkg::Options::="--force-confold" \
dovecot-pop3d dovecot-imapd dovecot-mysql mariadb-server postfix-mysql
|
Postfixのメール受信用設定
メール保存先ディレクトリの作成
バーチャルメールボックスを利用してメールを送受信するので、メール保存先のディレクトリを作成します。
1
2
|
sudo sudo mkdir -pv /var/vmail
sudo chown 5000:5000 /var/vmail
|
認証用のデータベースの作成、設定
ユーザー認証等をMariaDBに保存したデータで行うため、データベースを作成し、認証用データを保存していきます。
MariaDBにrootユーザーで接続し、
- 各種テーブルを保存するための「mail」データベース
- データベースに接続するための「mail」ユーザー
を作成します。
設定するパスワードは適宜変更してください。
1
2
3
4
5
|
sudo mysql -vv -e "
CREATE DATABASE mail;
CREATE USER mail;
GRANT ALL ON mail.* TO mail IDENTIFIED BY 'password';
"
|
次に、メールアドレスと保存先を定義するテーブルを作成します。
接続パスワードは適宜変更してください。
1
2
3
4
5
6
7
8
9
10
11
|
mysql -vv -u mail -ppassword mail -e "
CREATE TABLE mailbox_maps (
id int NOT NULL AUTO_INCREMENT,
address VARCHAR(255) NOT NULL,
destination VARCHAR(255) NOT NULL,
is_regexp TINYINT(1) DEFAULT 0 NOT NULL,
is_active TINYINT(1) DEFAULT 1 NOT NULL,
PRIMARY KEY (id),
UNIQUE KEY (address)
);
"
|
メールボックス用のコンフィグ設定
virtual_mailbox_domains
は適宜変更してください。
1
2
3
4
5
6
7
8
9
|
# メールボックスの所有ユーザーとグループを5000で固定する
sudo postconf virtual_uid_maps=static:5000
sudo postconf virtual_gid_maps=static:5000
# メール保存先のベースディレクトリ
sudo postconf virtual_mailbox_base=/var/vmail
# メールを受信するドメイン
sudo postconf virtual_mailbox_domains="example.com, example.net"
# メール保存先の定義
sudo postconf virtual_mailbox_maps=mysql:/etc/postfix/virtual_mailbox_maps.cf
|
メール保存先を取得するSQLの定義
UbuntuのPostfixはデフォルトでchrootで動作するので、hosts
はlocalhostではなく、127.0.0.1で記述する必要があります。localhostだとソケットが読めず、認証に失敗します。
password
は適宜変更してください。
1
2
3
4
5
6
7
8
9
10
|
cat << EOT | sudo tee /etc/postfix/virtual_mailbox_maps.cf > /dev/null
user = mail
password = password
hosts = 127.0.0.1
dbname = mail
query = SELECT destination FROM mailbox_maps
WHERE
(address = '%s' AND is_regexp = 0 AND is_active = 1)
OR ('%s' REGEXP address AND is_regexp = 1 AND is_active = 1)
EOT
|
メール保存先マッピングデータの作成
address
にメールアドレス、 destination
に保存ディレクトリを記述します。
接続パスワードや内容は適宜変更してください。
1
2
3
4
5
6
7
8
9
10
|
mysql -vv -u mail -ppassword mail -e "
INSERT INTO mailbox_maps (address, destination, is_regexp)
VALUES
# example@example.comの定義
('example@example.com', 'example.com/example/', 0),
# admin@example.com, info@example.comはexample@example.comのボックスに保存(正規表現を利用)
('^(admin|info)@example\.com$', 'example.com/example/', 1),
# ***@example.netはexample@example.netユーザーのディレクトリに保存する
('@example.net', 'example.net/example/', 0);
"
|
サービスリロード
設定を反映させるためにPostfixをリロードします。
1
|
sudo systemctl reload postfix
|
動作確認
ここまでの設定で、メールを受信してPostifxのメールボックスに保存することが可能になります。
sendmailコマンドで配送テスト実行します。
1
2
3
4
5
6
7
|
cat << EOT | sendmail -t
From: from@example.com
To: example@example.com
Subject: hello
this is test mail
EOT
|
配送されたメールはnewディレクトリに保存されるので、確認します。
1
2
3
4
5
6
|
sudo find /var/vmail -path '*/new/*' -type f | \
while read line
do
echo -e "\n\n[file: $line]"
sudo cat $line
done
|
メールが届いてない、エラーが発生した場合は/var/log/mail.log
を確認して対応します。
Dovecotの設定
認証用ユーザーテーブルの作成
POP3/IMAP/SMTP Authの認証に使用するテーブルを作成します。
接続パスワードや内容は適宜変更してください。
1
2
3
4
5
6
7
8
9
10
11
|
mysql -vv -u mail -ppassword mail -e "
CREATE TABLE users (
id int NOT NULL AUTO_INCREMENT,
username VARCHAR(128) NOT NULL,
domain VARCHAR(128) NOT NULL,
password VARCHAR(64) NOT NULL,
is_active TINYINT(1) DEFAULT 1 NOT NULL,
PRIMARY KEY (id),
UNIQUE KEY username_domain (username, domain)
);
"
|
ユーザーの追加
認証ユーザーを追加します。
接続パスワードや内容は適宜変更してください。
1
2
3
4
5
6
|
mysql -vv -u mail -ppassword mail -e "
INSERT INTO users (username, domain, password)
VALUES
('example', 'example.com', 'hogehoge'),
('example', 'example.net', 'fugafuga');
"
|
メール保存先の設定
Postfixと同じディレクトリのメールを参照するため、コンフィグを設定します。
1
|
sudo sed -Ei 's#^(mail_location).+#\1 = maildir:/var/vmail/%d/%n#' /etc/dovecot/conf.d/10-mail.conf
|
メールボックス設定
IMAP接続時に自動でディレクトリを作成する設定を行います。
参考:
https://wiki.dovecot.org/MailboxSettings
1
2
|
sudo sed -zEi 's#(mailbox Sent \{\s+)special_use#\1auto = subscribe\n special_use#m' /etc/dovecot/conf.d/15-mailboxes.conf
sudo sed -zEi 's#(mailbox Junk \{\s+)special_use#\1auto = create\n special_use#m' /etc/dovecot/conf.d/15-mailboxes.conf
|
認証のコンフィグ設定
/etc/dovecot/conf.d/10-auth.conf
を変更して、sql認証を有効にします。
1
|
sudo sed -Ei 's/#(!include auth-sql\.conf\.ext)/\1/' /etc/dovecot/conf.d/10-auth.conf
|
dovecotのsql認証内容を設定
/etc/dovecot/dovecot-sql.conf.ext
にコンフィグを記述します。
接続パスワードは適宜変更してください。
1
2
3
4
5
6
7
8
|
cat << EOT | sudo tee -a /etc/dovecot/dovecot-sql.conf.ext > /dev/null
driver = mysql
connect = host=localhost dbname=mail user=mail password=password
default_pass_scheme = PLAIN
password_query = SELECT username AS user, domain, password FROM users WHERE username = '%n' AND domain = '%d' AND is_active = 1
user_query = SELECT CONCAT('/var/vmail/', domain, '/', username, '/') as home, 5000 as uid, 5000 as gid FROM users WHERE username = '%n' AND domain = '%d' AND is_active = 1
EOT
|
SSL証明書の設定
ドメインごとに別々の証明書を利用するので、/etc/dovecot/conf.d/10-ssl.conf
にドメインごとの証明書パスを設定します。
内容は適宜変更してください。
ワイルドカード証明書の取得については
こちら
1
2
3
4
5
6
7
8
9
10
11
|
cat << EOT | sudo tee -a /etc/dovecot/conf.d/10-ssl.conf > /dev/null
local_name *.example.com {
ssl_cert = </etc/letsencrypt/live/example.com/fullchain.pem
ssl_key = </etc/letsencrypt/live/example.com/privkey.pem
}
local_name *.example.net {
ssl_cert = </etc/letsencrypt/live/example.net/fullchain.pem
ssl_key = </etc/letsencrypt/live/example.net/privkey.pem
}
EOT
|
サービスリロード
設定を反映させるためにDovecotをリロードします。
1
|
sudo systemctl reload dovecot
|
動作確認
メーラーなどにコンフィグを設定し、メール受信が可能なことを確認します。
メールが受信できない、エラーが発生した場合は/var/log/mail.log
を確認して対応します。
SMTP認証用の設定
メーラーからメール送信出来るように、SMTP認証の設定を行います。
Postfixに設定を追加
relayhost
は利用可能なサーバを設定してください。
例では
SendGrid
の設定になります。
1
2
3
4
5
6
7
8
9
10
11
|
# Dovecot連携設定
sudo postconf smtpd_sasl_path=private/auth
sudo postconf smtpd_sasl_type=dovecot
# リレー設定
sudo postconf relayhost=[smtp.sendgrid.net]:587
sudo postconf smtp_sasl_auth_enable=yes
sudo postconf smtp_sasl_password_maps=hash:/etc/postfix/smtp_sasl_password_maps
sudo postconf smtp_sasl_security_options=noanonymous
sudo postconf smtp_tls_security_level=may
sudo postconf tls_server_sni_maps=hash:/etc/postfix/tls_server_sni_maps
|
リレー時の認証設定
relayhost
に接続する際のSMTP認証情報を設定します。
内容は適宜変更してください。
1
2
3
4
|
cat <<EOT | sudo tee /etc/postfix/smtp_sasl_password_maps > /dev/null
[smtp.sendgrid.net]:587 apikey:SG.xxxxxxxxxxxxxxxxxxxxxx.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
EOT
sudo postmap /etc/postfix/smtp_sasl_password_maps
|
SSL証明書の設定
ドメインごとに別々の証明書を利用するので、tls_server_sni_maps
に設定したファイルにドメインごとの証明書パスを設定します。
内容は適宜変更してください。
ワイルドカード証明書の取得については
こちら
1
2
3
4
5
|
cat <<EOT | sudo tee /etc/postfix/tls_server_sni_maps > /dev/null
.example.com /etc/letsencrypt/live/example.com/privkey.pem /etc/letsencrypt/live/example.com/fullchain.pem
.example.net /etc/letsencrypt/live/example.net/privkey.pem /etc/letsencrypt/live/example.net/fullchain.pem
EOT
sudo postmap -F /etc/postfix/tls_server_sni_maps
|
DovecotにPostfixとの連携設定を追加
smtpd_sasl_type=dovecot
を設定しているため、Dovecot側にPostfixと連携する設定を追加します。
1
2
3
4
5
6
7
8
9
|
cat <<EOT | sudo tee /etc/dovecot/conf.d/10-postfix-auth.conf > /dev/null
service auth {
unix_listener /var/spool/postfix/private/auth {
mode = 0660
user = postfix
group = postfix
}
}
EOT
|
Postfixのメール送信用設定
Submissionポート(587)の設定を/etc/postfix/master.cfに追記します。
1
2
3
4
5
6
7
8
|
sudo postconf -M submission/inet="submission inet n - n - - smtpd"
sudo postconf -P "submission/inet/syslog_name=postfix/submission"
sudo postconf -P "submission/inet/smtpd_tls_security_level=encrypt"
sudo postconf -P "submission/inet/smtpd_sasl_auth_enable=yes"
sudo postconf -P "submission/inet/smtpd_tls_auth_only=yes"
sudo postconf -P "submission/inet/smtpd_client_restrictions=permit_sasl_authenticated,reject"
sudo postconf -P "submission/inet/smtpd_relay_restrictions=permit_sasl_authenticated,reject"
sudo postconf -P "submission/inet/milter_macro_daemon_name=ORIGINATING"
|
サービスリロード
設定を反映させるためにDovecotをリロードします。
1
|
sudo systemctl reload dovecot postfix
|
動作確認
メーラーなどにコンフィグを設定し、メール送信が可能なことを確認します。
メールが送信できない、エラーが発生した場合は/var/log/mail.log
を確認して対応します。
参考サイト
http://www.postfix.org/documentation.html
https://doc.dovecot.org/configuration_manual/