EC2でPostfix+Dovecotによるメールサーバ構築
はじめに
先日からAWSの勉強もかねてEC2でいろいろ遊んでいるのでその一環として、PostfixとDovecotを使用してメールサーバを構築&SPF・DKIM・DMARCの設定までの手順をまとめました。(SESを使うほうがおそらく簡単だとは思うのですが・・・)
構成概要
本記事で構築するメールサーバの構成は以下の通りです。
-
MTA(Mail Transfer Agent): Postfix
- メールの送受信や配送を担当
-
MDA/IMAP・POPサーバー(Mail Delivery Agent): Dovecot
- メールの保存と取り出しを担当
- 暗号化: SSL/TLS証明書(Let's Encrypt)
- 認証: SASL認証(Dovecot経由)
- 送信認証: SPF、DKIM、DMARC
前提条件
- EC2インスタンスを使用(Amazon Linux 2023・t4g.microを想定)
- EC2はパブリックサブネットに配置・NATゲートウェイ・NLBなどは使用していません。
- 独自ドメインを取得済み(ここではexample.jpとする。)
- Route53でDNS管理を行っている
構築手順
1. Elastic IPと逆引きDNSの設定
Elastic IPの払い出し
EC2インスタンスに固定IPアドレスを割り当てます。
- EC2コンソール → Elastic IP → Elastic IPアドレスを割り当て
- インスタンスに関連付け
逆引きDNSの設定
逆引きDNSレコード(PTRレコード)を設定することで、メールサーバの信頼性が向上します。
- Route53でAレコードを作成
- レコード名:
mail.example.jp - 値: Elastic IPアドレス
- レコード名:
- EC2コンソール → Elastic IP → アクション → 逆引きDNSレコードを更新
- Elastic IPアドレス: 払い出したElastic IP
- 逆引きDNS:
mail.example.jp
2. EC2のメール送信制限について
AWSではスパム対策のため、デフォルトでEC2からの25番ポート(SMTP)送信が制限されています。
25番ポート制限解除の申請
このURLから申請可能です。
注意点:
3. hostnameの設定
cloud-initによるhostname上書きを防ぐため、ホスト名を変更
sudo vim /etc/cloud/cloud.cfg
# 以下の行を変更
preserve_hostname: false
↓
preserve_hostname: true
hostnameを設定します。
sudo hostnamectl set-hostname mail.example.jp
4. SSL/TLS証明書の取得
Let's Encryptを使用してSSL/TLS証明書を取得します。
# Nginxが起動している場合は一時的に停止
sudo systemctl stop nginx
# 証明書を取得
sudo certbot certonly --standalone -d mail.example.jp
証明書は以下のパスに保存されます。
/etc/letsencrypt/live/mail.example.jp/fullchain.pem
/etc/letsencrypt/live/mail.example.jp/privkey.pem
証明書の自動更新設定
cronで証明書の自動更新を設定します。
sudo crontab -e
以下を追加します。
0 0 1 * * /usr/bin/certbot renew --quiet && systemctl reload postfix && systemctl reload dovecot
5. Postfixのインストールと設定
インストール
sudo dnf install postfix -y
main.cfの設定
/etc/postfix/main.cf を編集します。
sudo vim /etc/postfix/main.cf
以下の内容を追記・変更します。
mail_owner = postfix
myhostname = mail.example.jp
mydomain = mail.example.jp
myorigin = $mydomain
inet_interfaces = all
inet_protocols = all
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
local_recipient_maps = unix:passwd.byname $alias_maps
mynetworks_style = subnet
mynetworks = 127.0.0.0/8
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
home_mailbox = Maildir/
smtpd_banner = $myhostname ESMTP
newaliases_path = /usr/bin/newaliases.postfix
mailq_path = /usr/bin/mailq.postfix
setgid_group = postdrop
# TLS/SSL設定
smtp_tls_security_level = may
smtp_tls_loglevel = 1
smtp_tls_note_starttls_offer = yes
smtpd_tls_cert_file = /etc/letsencrypt/live/mail.example.jp/fullchain.pem
smtpd_tls_key_file = /etc/letsencrypt/live/mail.example.jp/privkey.pem
smtpd_tls_received_header = yes
smtpd_tls_security_level = may
smtpd_tls_loglevel = 1
# SASL認証設定
smtpd_sasl_auth_enable = yes
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_security_options = noanonymous
smtpd_sasl_local_domain = $myhostname
# アクセス制限
smtpd_recipient_restrictions =
permit_mynetworks
permit_sasl_authenticated
reject_unauth_destination
# ログ設定
maillog_file = /var/log/mail/maillog
master.cfの設定
/etc/postfix/master.cf に以下を追記します。
sudo vim /etc/postfix/master.cf
smtps inet n - y - - smtpd
-o syslog_name=postfix/smtps
-o smtpd_tls_wrappermode=yes
-o smtpd_sasl_auth_enable=yes
-o smtpd_reject_unlisted_recipient=no
-o smtpd_relay_restrictions=permit_sasl_authenticated,reject
-o milter_macro_daemon_name=ORIGINATING
エイリアスの再構築と起動
# エイリアスの再構築(おそらく今回は実行しなくても問題ない)
sudo newaliases
# 設定のチェック(書き方におかしいところがあればエラーとして出てくる)
sudo postfix check
# ログディレクトリの作成
sudo mkdir -p /var/log/mail
sudo touch /var/log/mail/maillog
sudo chmod 640 /var/log/mail/maillog
# 起動
sudo systemctl start postfix
sudo systemctl enable postfix
6. Dovecotのインストールと設定
インストール
sudo dnf install dovecot -y
dovecot.confの設定
/etc/dovecot/dovecot.conf を編集します。
sudo vim /etc/dovecot/dovecot.conf
protocols = imap
10-master.confの設定
/etc/dovecot/conf.d/10-master.conf を編集します。
sudo vim /etc/dovecot/conf.d/10-master.conf
service imap-login {
inet_listener imap {
port = 0
}
inet_listener imaps {
port = 993
ssl = yes
}
}
service pop3-login {
inet_listener pop3 {
port = 0
}
inet_listener pop3s {
port = 0
}
}
service submission-login {
inet_listener submission {
port = 0
}
inet_listener submissions {
port = 0
}
}
# Postfix SASL認証用のソケット
unix_listener /var/spool/postfix/private/auth {
mode = 0666
user = postfix
group = postfix
}
10-auth.confの設定
sudo vim /etc/dovecot/conf.d/10-auth.conf
disable_plaintext_auth = yes
auth_mechanisms = plain login
10-ssl.confの設定
sudo vim /etc/dovecot/conf.d/10-ssl.conf
DHパラメータを生成します(5分くらいかかりました。)
sudo openssl dhparam 4096 > /etc/dovecot/dh.pem
ssl = yes
ssl_cert = </etc/letsencrypt/live/mail.example.jp/fullchain.pem
ssl_key = </etc/letsencrypt/live/mail.example.jp/privkey.pem
ssl_dh = </etc/dovecot/dh.pem
ssl_min_protocol = TLSv1.2
10-mail.confの設定
sudo vim /etc/dovecot/conf.d/10-mail.conf
mail_location = maildir:~/Maildir
10-logging.confの設定
sudo vim /etc/dovecot/conf.d/10-logging.conf
log_path = /var/log/dovecot/dovecot.log
info_log_path = /var/log/dovecot/dovecot.log
ログディレクトリの作成と起動
# ログディレクトリ作成
sudo mkdir /var/log/dovecot
# 起動
sudo systemctl start dovecot
sudo systemctl enable dovecot
7. メール受信用のユーザ作成
メールアドレスは ユーザ名@ドメイン名 の形式になります。
# ユーザ作成
sudo useradd mailuser
sudo passwd mailuser
# Maildirディレクトリ作成
sudo mkdir -p /home/mailuser/Maildir/{new,cur,tmp}
sudo chown -R mailuser:mailuser /home/mailuser/Maildir
8. DNS設定(SPF/DKIM/DMARC)
メール送信の信頼性を高めるため、SPF、DKIM、DMARCレコードを設定します。
SPFレコードの設定
Route53でTXTレコードを追加します。
- レコード名:
mail.example.jp - レコードタイプ: TXT
- 値:
v=spf1 ip4:割り振られたElasticIPアドレス/32 -all
DKIMの設定
OpenDKIMをインストールして鍵を生成します。
# インストール
sudo dnf install -y opendkim opendkim-tools
# ディレクトリ作成
sudo mkdir -p /etc/opendkim/keys/mail.example.jp
# 鍵生成
sudo opendkim-genkey -D /etc/opendkim/keys/mail.example.jp/ \
-d mail.example.jp -s 20260301
# 権限設定
sudo chown -R opendkim:opendkim /etc/opendkim/keys/mail.example.jp/
生成された公開鍵をDNSに登録します。
cat /etc/opendkim/keys/mail.example.jp/20260301.txt
Route53でTXTレコードを追加します。
- レコード名:
20260301._domainkey.mail.example.jp - レコードタイプ: TXT
- 値: 上記コマンドで表示された内容
OpenDKIM設定ファイルを編集します。
sudo vim /etc/opendkim.conf
Mode sv
KeyFile /etc/opendkim/KeyTable
KeyTable refile:/etc/opendkim/KeyTable
SigningTable refile:/etc/opendkim/SigningTable
ExternalIgnoreList refile:/etc/opendkim/TrustedHosts
InternalHosts refile:/etc/opendkim/TrustedHosts
SoftwareHeader no
Socket inet:8891@localhost
KeyTableを設定します。
sudo vim /etc/opendkim/KeyTable
20260301._domainkey.mail.example.jp mail.example.jp:20260301:/etc/opendkim/keys/mail.example.jp/20260301.private
SigningTableを設定します。
sudo vim /etc/opendkim/SigningTable
*@mail.example.jp 20260301._domainkey.mail.example.jp
TrustedHostsを設定します。
sudo vim /etc/opendkim/TrustedHosts
127.0.0.1
::1
Postfixに設定を追加します。
sudo vim /etc/postfix/main.cf
# 以下を追加
smtpd_milters = inet:127.0.0.1:8891
non_smtpd_milters = $smtpd_milters
milter_default_action = accept
OpenDKIMを起動します。
sudo systemctl start opendkim
sudo systemctl enable opendkim
sudo systemctl restart postfix
DMARCレコードの設定
Route53でTXTレコードを追加します。
- レコード名:
_dmarc.mail.example.jp - レコードタイプ: TXT
- 値:
v=DMARC1; p=none; sp=reject; adkim=s; aspf=s; rua=mailto:mailuser@mail.example.jp
9. セキュリティグループ設定
EC2のセキュリティグループで以下のポートを開放します。
| ポート | プロトコル | 用途 |
|---|---|---|
| 25 | TCP | SMTP(受信用) |
| 465 | TCP | SMTPS(送信用) |
| 993 | TCP | IMAPS(受信メール取得用) |
Route53に登録するDNSレコード一覧
-
example.jpに対するMXレコード- レコードの内容:
mail.example.jp
- レコードの内容:
-
mail.example.jpのAレコード- レコードの内容:EC2に割り当てられたElasticIP
-
mail.example.jpのTXTレコード(SPFレコード)- レコードの内容:
v=spf1 ip4:[割り振られたElasticIP]/32 -all
- レコードの内容:
SPF・DKIM・DMARCの動作チェック
今後の方針
- fail2banなどの利用によるセキュリティ強化
まとめ
EC2上でPostfixとDovecotを使用してメールサーバを構築する手順を解説しました。
やはり実際に触ることで理解度がかなり向上しますね。特にSPF・DKIM・DMARCや通信の流れなどは構築する中で動作のイメージがより鮮明にできたような気がします。

