Mail

【初心者向け】EC2を利用したメールサーバーの構築( Postfix + Dovecot )

はじめに

こんにちは、ディーネットの山中です。

AWS EC2を利用したメールサーバーの構築について
外部からの受信が確認できるところまでを手順にまとめてみました。

外部への送信については簡単な手順の紹介のみとなりますが、
これからメールサーバーの構築を行う方のご参考になれば幸いです。

前提&事前準備

  • ドメイン取得済み
    取得していないドメインの場合でもローカル環境下での送受信までなら可能です。
    ※使用したドメインはブログ内では「hogetest.com」に置き換えています。

  • EC2インスタンス構築済み
    EC2インスタンス構築について
    【超絶初心者向け】これだけでEC2を無料で建てられるブログ。後編

  • Elastic IP 割り当て済み
    Elastic IP を割り当てなくても構築は可能ですが、
    インスタンスの再起動などでパブリックIPアドレスが変わってしまう点にご注意ください。
    Elastic IP について
    Elastic IPの設定

  • セキュリティグループは以下のポートを開放済み
    (22, 25, 110, 143, 587)

セキュリティグループ
セキュリティグループ
  • 使用予定メールアドレス
    denet-mail@hogetest.com

  • OS
    AlmaLinux

メールサーバの用語や動きについて

構築を行っていく前にこちらのサイトを一読しておくと自分がどの部分の構築をしているかイメージしやすくなると思います。

メール送受信の仕組みについて解説!SMTP、POP、IMAP、DNSなどの用語を理解しよう!

メールサーバの用語集

SMTPサーバー構築(Postfix)

Postfix導入

Postfixは主にメールの送信、転送をするのに利用します。

EC2インスタンスにSSH接続し、rootユーザーに切り替えます。
SSH接続について

$ sudo su -

全てのパッケージをアップデートします。

# yum -y update

Postfixをインストールします。

# yum install postfix

Postfixのインストールを確認します。
postfix-バージョンと表示されればOKです。

# rpm -qa | grep postfix
postfix-3.5.8-4.el8.x86_64

設定ファイル編集

/etc/postfix/ に移動し

# cd /etc/postfix/

Postfixの設定ファイルである main.cf が存在している事を確認します。

# ll main.cf
-rw-r--r--. 1 root root 29369 Apr 18  2022 main.cf

現在の日時でバックアップを作成します。

# cp -p main.cf{,_`date "+%Y%m%d"`}

現在の日時で作成されたバックアップを確認します。

# ll main.cf*
-rw-r--r--. 1 root root 29369 Apr 18  2022 main.cf
-rw-r--r--. 1 root root 29369 Apr 18  2022 main.cf_20230117 ←コレです
-rw-r--r--. 1 root root 29130 Apr 18  2022 main.cf.proto

コピー元とバックアップの中身に違いがない事を確認します。
何も表示されなければOKです。

# diff main.cf main.cf_20230117

Postfixの設定ファイルを開きます。

# vi main.cf

Postfixの設定ファイルを以下のように編集していきます。

myhostname

SMTPサーバーのホスト名をFQDN(ホスト名+ドメイン名)で設定します。

#myhostname = host.domain.tld
#myhostname = virtual.domain.tld
↓
#myhostname = host.domain.tld
#myhostname = virtual.domain.tld
myhostname = denet-mail.hogetest.com (追加します)

mydomain

SMTPサーバーが属するドメイン名を指定します。

#mydomain = domain.tld
↓
#mydomain = domain.tld
mydomain = hogetest.com (追加します)

myorigin

ローカルからのメール送信時、送信元メールアドレス@以降にドメイン名を付加させるように設定します。

#myorigin = $myhostname
#myorigin = $mydomain
↓
#myorigin = $myhostname
myorigin = $mydomain (先頭のコメントアウト "#" を外します)

mydestination

SMTPサーバーがメールをローカルで受信するドメイン名を指定します。

mydestination = $myhostname, localhost.$mydomain, localhost
#mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
#mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain,
↓
#mydestination = $myhostname, localhost.$mydomain, localhost (コメントアウト "#" します)
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain (先頭のコメント
アウト "#" を外します)
#mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain,

mynetworks

VPCのネットワークと自分自身からは無条件で転送するように設定します。

#mynetworks = $config_directory/mynetworks
#mynetworks = hash:/etc/postfix/network_table
↓
#mynetworks = $config_directory/mynetworks
#mynetworks = hash:/etc/postfix/network_table
mynetworks = 10.0.0.0/16, 127.0.0.0/8 (追加します)

smtpd_banner

Telnet等でアクセスした際のバナー情報、バージョンを非表示にします。

#smtpd_banner = $myhostname ESMTP $mail_name
#smtpd_banner = $myhostname ESMTP $mail_name ($mail_version)
↓
#smtpd_banner = $myhostname ESMTP $mail_name
#smtpd_banner = $myhostname ESMTP $mail_name ($mail_version)
smtpd_banner = $myhostname ESMTP unknown (追加します)

home_mailbox

メールボックスの形式を Maildir形式 に指定します。

#home_mailbox = Mailbox
#home_mailbox = Maildir/
↓
#home_mailbox = Mailbox
home_mailbox = Maildir/ (先頭のコメントアウト "#" を外します)

ここまで設定できたらファイルを保存して閉じます。

設定した値をバックアップと比較して確認してみます。

# diff main.cf_`date "+%Y%m%d"` main.cf

95a96
> myhostname = denet-mail.hogetest.com
102a104
> mydomain = hogetest.com
118c120
< #myorigin = $mydomain
---
> myorigin = $mydomain
183,184c185,186
< mydestination = $myhostname, localhost.$mydomain, localhost
< #mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
---
> #mydestination = $myhostname, localhost.$mydomain, localhost
> mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
285a288
> mynetworks = 10.0.0.0/16, 127.0.0.0/8
438c441
< #home_mailbox = Maildir/
---
> home_mailbox = Maildir/
592a596
> smtpd_banner = $myhostname ESMTP unknown

書式チェックを行います、
エラーが表示されなければOKです。

# postfix check

Postfixの起動と自動起動設定を行います。

# systemctl enable --now postfix
Created symlink /etc/systemd/system/multi-user.target.wants/postfix.service → /usr/lib/systemd/system/postfix.service.

Postfixの起動状態を確認します。
「Active: active (running)」となっていれば問題なく起動している事が確認でき、
「Loaded: ~ postfix.service;」の横が「enabled;」となっていれば自動起動が有効化できている事を確認できます。

# systemctl status postfix
● postfix.service - Postfix Mail Transport Agent
   Loaded: loaded (/usr/lib/systemd/system/postfix.service; enabled; vendor preset: disabled)
   Active: active (running) since Tue 2023-01-17 09:41:01 UTC; 24s ago

25番ポート(SMTP) が 「LISTEN」 状態(接続待ち)になっているか確認します。

# ss -atn | grep 25
LISTEN 0      100        127.0.0.1:25           0.0.0.0:*
LISTEN 0      100            [::1]:25              [::]:*

これで設定、起動、ポートの確認が完了しました。

メールユーザー作成

メール受信用にユーザーを作成していきます。
まずは新規ユーザー追加時に自動でMaildir形式メールボックス作成するように設定します。

# mkdir -p /etc/skel/Maildir/{new,cur,tmp}

メールボックスのパーミッションを変更します。

# chmod -R 700 /etc/skel/Maildir/

ユーザーを作成します。

# useradd denet-mail

パスワードも設定していきます。
今回はユーザー名と同じ「denet-mail」で設定します。

# passwd denet-mail
Changing password for user denet-mail.
New password:

安易なパスワードなので警告が出ますが一旦このままで設定していきます。

Changing password for user denet-mail.
New password:
BAD PASSWORD: The password contains the user name in some form
Retype new password:
passwd: all authentication tokens updated successfully.

パスワードの設定後、
先程設定したメールボックスが自動作成されているか確認します。
Maildir ディレクトリに cur,new,tmp ディレクトリが作成されていればOKです。

# ll /home/denet-mail/Maildir/
total 0
drwx------. 2 denet-mail denet-mail 6 Jan 17 10:12 cur
drwx------. 2 denet-mail denet-mail 6 Jan 17 10:12 new
drwx------. 2 denet-mail denet-mail 6 Jan 17 10:12 tmp

Postfix動作確認

ローカル環境下のメールテストを行うため telnet をインストールします。

telnetについて

telnet でサーバへ接続すると、サーバを直接操作できるようになります。

今回の用途としては、メールサーバに接続してメールサーバから直接メールを送信する事でサーバが動作している事を確認できるため telnet を使用しています。
telnetとは|「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典

# yum install telnet

自身のメールサーバに接続します。
接続に成功すればコード220の応答があります。
※上手くいかない場合は、セキュリティグループでtelnetのポートを許可してみたり、25番ポートの許可がされているか確認してみてください。

# telnet localhost 25
Trying ::1...
Connected to localhost.
Escape character is '^]'.
220 denet-mail.hogetest.com ESMTP unknown

SMTPコマンドを使用します。
helo で自身のメールサーバとのセッションを開始して、送信元メールアドレスを確認します。
コマンド成功を意味するコード250と送信元メールアドレスが返ってきます。

helo localhost (入力します)
250 denet-mail.hogetest.com

mail from: コマンドで送信元メールアドレスを入力します。
250が返ってきます。

mail from:denet-mail@hogetest.com(入力します)
250 2.1.0 Ok

rcpt to: コマンドで送信先メールアドレスを入力します。
250が返ってきます。

rcpt to:denet-mail@hogetest.com (入力します)
250 2.1.5 Ok

data コマンドで本文を入力していきます。
data と入力しエンターを押した後、本文「This is test mail.」を入力します。
入力後「.」(ドット)で入力を終了します。

data (入力します)
354 End data with <CR><LF>.<CR><LF>
This is test mail. (入力します)
. (入力します)
250 2.0.0 Ok: queued as E69E43600CD

quit (セッション終了)でメールサーバーとの接続を切ります。

quit (入力します)
221 2.0.0 Bye
Connection closed by foreign host.

先程送信したメールが届いているか確認します。

# ll /home/denet-mail/Maildir/new/
total 4
-rw-------. 1 denet-mail denet-mail 518 Jan 17 10:45 1673952354.V10302I36e84cM61427.denet-mail

ありました

届いたメールの中身も確認します。

# cat /home/denet-mail/Maildir/new/1673952354.V10302I36e84cM61427.denet-mail

Return-Path: <denet-mail.hogetest.com@hogetest.com>
X-Original-To: denet-mail@hogetest.com
Delivered-To: denet-mail@hogetest.com
Received: from localhost (localhost [IPv6:::1])
        by denet-mail.hogetest.com (Postfix) with SMTP id E69E43600CD
        for <denet-mail@hogetest.com>; Tue, 17 Jan 2023 10:40:48 +0000 (UTC)
Message-Id: <20230117104208.E69E43600CD@denet-mail.hogetest.com>
Date: Tue, 17 Jan 2023 10:40:48 +0000 (UTC)
From: denet-mail.hogetest.com@hogetest.com

This is test mail.

先程送信した内容で届いているようです。
これで無事Postfixの動作を確認する事ができました。

続いてDovecotの導入を行っていきます。

IMAP/POP3サーバ構築(Dovecot)

Dovecot導入

DovecotはIMAP/POP3に対応した受信サーバとなります。

Dovecotをインストールします。

# yum install dovecot

Dovecotのインストールを確認します。

# rpm -qa | grep dovecot
dovecot-2.3.16-3.el8.x86_64

設定ファイル編集

10-mail.conf

/etc/dovecot/conf.d/ に移動し

# cd /etc/dovecot/conf.d/

「10-mail.conf」ファイルの存在を確認します。

# ll 10-mail.conf
-rw-r--r--. 1 root root 17795 Oct  8 14:16 10-mail.conf

バックアップをとります。

# cp -p 10-mail.conf{,_`date "+%Y%m%d"`}

バックアップの作成を確認します。

# ll 10-mail.conf*
-rw-r--r--. 1 root root 17795 Oct  8 14:16 10-mail.conf
-rw-r--r--. 1 root root 17795 Oct  8 14:16 10-mail.conf_20230117

コピー元とバックアップの中身が同じであることを確認します。

# diff 10-mail.conf{_`date "+%Y%m%d"`,}

ファイルを開きます。

# vi 10-mail.conf

「10-mail.conf」ファイルを以下のように編集していきます。

mail_location

メール格納形式をMaildir形式に設定します。

#mail_location =
↓
#mail_location =
mail_location = maildir:~/Maildir (追加します)

ファイルを保存して閉じ、設定した値をバックアップと比較して確認します。

# diff 10-mail.conf{_`date "+%Y%m%d"`,}
30a31
> mail_location = maildir:~/Maildir

10-auth.conf

10-mail.confと同じようにバックアップ等を行っていきます。

# cd /etc/dovecot/conf.d/
# ll 10-auth.conf
-rw-r--r--. 1 root root 5248 Aug  6  2021 10-auth.conf
# cp -p 10-auth.conf{,_`date "+%Y%m%d"`}
# ll 10-auth.conf*
-rw-r--r--. 1 root root 5248 Aug  6  2021 10-auth.conf
-rw-r--r--. 1 root root 5248 Aug  6  2021 10-auth.conf_20230117
# diff 10-auth.conf{_`date "+%Y%m%d"`,}
# vi 10-auth.conf

「10-auth.conf」ファイルを以下のように編集していきます。

disable_plaintext_auth

SSLを使用しない場合必須になります、暗号化されていない認証を許可します。

#disable_plaintext_auth = yes
↓
#disable_plaintext_auth = yes
disable_plaintext_auth = no (追加します)

auth_mechanisms

認証時のメカニズムを指定します。
plainに加えて "login" を追加します。

# NOTE: See also disable_plaintext_auth setting.
auth_mechanisms = plain
↓
# NOTE: See also disable_plaintext_auth setting.
auth_mechanisms = plain login (付け加えます)

ファイルを保存して閉じ、設定した値をバックアップと比較して確認します。

# diff 10-auth.conf{_`date "+%Y%m%d"`,}
10a11
> disable_plaintext_auth = no
100c101
< auth_mechanisms = plain
---
> auth_mechanisms = plain login

10-ssl.conf

10-auth.confと同じようにバックアップ等を行っていきます。

# cd /etc/dovecot/conf.d/
# ll 10-ssl.conf
-rw-r--r--. 1 root root 3648 Oct  8 14:16 10-ssl.conf
# cp -p 10-ssl.conf{,_`date "+%Y%m%d"`}
# ll 10-ssl.conf*
-rw-r--r--. 1 root root 3648 Oct  8 14:16 10-ssl.conf
-rw-r--r--. 1 root root 3648 Oct  8 14:16 10-ssl.conf_20230117
# diff 10-ssl.conf{_`date "+%Y%m%d"`,}
# vi /etc/dovecot/conf.d/10-ssl.conf

「10-ssl.conf」ファイルを以下のように編集していきます。

ssl

SSLを使用しないのでメールクライアントと「dovecot」間のSSL接続を無効にします。

ssl = required
↓
ssl = no (書き換えます)

ファイルを保存して閉じ、設定した値をバックアップと比較して確認します。

# diff 10-ssl.conf{_`date "+%Y%m%d"`,}
8c8
< ssl = required
---
> ssl = no

10-master.conf

10-ssl.confと同じようにバックアップ等を行っていきます。

# cd /etc/dovecot/conf.d/
# ll 10-master.conf
-rw-r--r--. 1 root root 3569 Aug  6  2021 10-master.conf
# cp -p 10-master.conf{,_`date "+%Y%m%d"`}
# ll 10-master.conf*
-rw-r--r--. 1 root root 3569 Aug  6  2021 10-master.conf
-rw-r--r--. 1 root root 3569 Aug  6  2021 10-master.conf_20230117
# diff 10-master.conf{_`date "+%Y%m%d"`,}
# vi /etc/dovecot/conf.d/10-master.conf

「10-master.conf」ファイルを以下のように編集していきます。

SMTP認証に使用する Dovecot sasl ライブラリの認証ソケットファイルを指定します。

# Postfix smtp-auth
# unix_listener /var/spool/postfix/private/auth {
# mode = 0666
# }

↓

# Postfix smtp-auth
unix_listener /var/spool/postfix/private/auth {   (コメントを外す)
mode = 0666  (コメントを外す)
user = postfix  (追記)
group = postfix  (追記)
}

ファイルを保存して閉じ、設定した値をバックアップと比較して確認します。

# diff 10-master.conf{_`date "+%Y%m%d"`,}
107,109c107,111
<   #unix_listener /var/spool/postfix/private/auth {
<   #  mode = 0666
<   #}
---
>   unix_listener /var/spool/postfix/private/auth {
>     mode = 0666
>     user = postfix
>     group = postfix
>   }

Dovecotの起動と自動起動設定を行います。

# systemctl enable --now dovecot
Created symlink /etc/systemd/system/multi-user.target.wants/dovecot.service → /usr/lib/systemd/system/dovecot.service.

Dovecotの起動と自動起動設定を確認します。

# systemctl status dovecot
● dovecot.service - Dovecot IMAP/POP3 email server
   Loaded: loaded (/usr/lib/systemd/system/dovecot.service; enabled; vendor preset: disabled)
   Active: active (running) since Tue 2023-01-17 11:57:09 UTC; 19s ago

IMAP/POP3動作確認

143番ポート(IMAP)と110番ポート(POP3)が接続待ちになっている事を確認します。

# ss -atn | grep 110
LISTEN 0      100          0.0.0.0:110          0.0.0.0:*
LISTEN 0      100             [::]:110             [::]:*
# ss -atn | grep 143
LISTEN 0      100          0.0.0.0:143          0.0.0.0:*
LISTEN 0      100             [::]:143             [::]:*

POP3動作確認

POP3の動作を確認していきます。

# telnet localhost 110
Trying ::1...
Connected to localhost.
Escape character is '^]'.
+OK Dovecot ready.

メールサーバに接続後、POP3コマンドを使用していきます。

ユーザ名を入力し

User denet-mail
+OK

パスワードを入力してログインします。

Pass denet-mail
+OK Logged in.

メールの一覧を取得します。
ローカルで送信されたメールがあるかと思います。

LIST
+OK 1 messages:
1 529
.

RETR(メールの取得)でメールを取得し、メール番号1を開きます。
ローカルテスト時のメールの確認ができました。

RETR 1
+OK 529 octets
Return-Path: <denet-mail.hogetest.com@hogetest.com>
X-Original-To: denet-mail@hogetest.com
Delivered-To: denet-mail@hogetest.com
Received: from localhost (localhost [IPv6:::1])
        by denet-mail.hogetest.com (Postfix) with SMTP id E69E43600CD
        for <denet-mail@hogetest.com>; Tue, 17 Jan 2023 10:40:48 +0000 (UTC)
Message-Id: <20230117104208.E69E43600CD@denet-mail.hogetest.com>
Date: Tue, 17 Jan 2023 10:40:48 +0000 (UTC)
From: denet-mail.hogetest.com@hogetest.com

This is test mail.

POP3サーバーの動作が確認できたので切断します。

quit
+OK Logging out.
Connection closed by foreign host.

IMAP動作確認

続いてIMAPサーバーの動作を確認していきます。

# telnet localhost 143
Trying ::1...
Connected to localhost.
Escape character is '^]'.
* OK [CAPABILITY IMAP4rev1 SASL-IR LOGIN-REFERRALS ID ENABLE IDLE LITERAL+ AUTH=PLAIN AUTH=LOGIN] Dovecot ready.

ユーザー名とパスワードを入力しログインします。

1 login denet-mail denet-mail

1 OK [CAPABILITY IMAP4rev1 SASL-IR LOGIN-REFERRALS ID ENABLE IDLE SORT SORT=DISPLAY THREAD=REFERENCES THREAD=REFS THREAD=ORDEREDSUBJECT MULTIAPPEND URL-PARTIAL CATENATE UNSELECT CHILDREN NAMESPACE UIDPLUS LIST-EXTENDED I18NLEVEL=1 CONDSTORE QRESYNC ESEARCH ESORT SEARCHRES WITHIN CONTEXT=SEARCH LIST-STATUS BINARY MOVE SNIPPET=FUZZY PREVIEW=FUZZY PREVIEW STATUS=SIZE SAVEDATE LITERAL+ NOTIFY SPECIAL-USE] Logged in

メールボックスの一覧を取得します。

2 list "" *

* LIST (\HasNoChildren) "." INBOX
2 OK List completed (0.001 + 0.000 secs).

メールボックスの内容を確認していきます。

3 select INBOX

* FLAGS (\Answered \Flagged \Deleted \Seen \Draft)
* OK [PERMANENTFLAGS (\Answered \Flagged \Deleted \Seen \Draft \*)] Flags permitted.
* 1 EXISTS
* 0 RECENT
* OK [UIDVALIDITY 1674013233] UIDs valid
* OK [UIDNEXT 2] Predicted next UID
3 OK [READ-WRITE] Select completed (0.001 + 0.000 secs).

メールの内容を確認します。
ローカルテスト時のメールが確認できるかと思います。

4 fetch 1 body[]

* 1 FETCH (BODY[] {529}
Return-Path: <denet-mail.hogetest.com@hogetest.com>
X-Original-To: denet-mail@hogetest.com
Delivered-To: denet-mail@hogetest.com
Received: from localhost (localhost [IPv6:::1])
        by denet-mail.hogetest.com (Postfix) with SMTP id E69E43600CD
        for <denet-mail@hogetest.com>; Tue, 17 Jan 2023 10:40:48 +0000 (UTC)
Message-Id: <20230117104208.E69E43600CD@denet-mail.hogetest.com>
Date: Tue, 17 Jan 2023 10:40:48 +0000 (UTC)
From: denet-mail.hogetest.com@hogetest.com

This is test mail.
)
4 OK Fetch completed (0.001 + 0.000 secs).

IMAPサーバーの動作が確認できたので切断します。

5 logout

* BYE Logging out
5 OK Logout completed (0.001 + 0.000 secs).
Connection closed by foreign host.

これでDovecotの設定は完了です。

ここからは外部との送受信に必要な
Postfixの追加設定と認証機能を導入していきます。

Postfix追加設定

/etc/postfix/ に移動します。

# cd /etc/postfix/

念のためバックアップをとっておきます。

# cp -p main.cf{,_`date "+%Y%m%d"`_1}

バックアップを確認します。
同じ日付であれば「main.cf_{現在の日時}_1」が作成されているかと思います。
今回は日付を跨いでいるので「main.cf_20230118_1」が作成されています。

# ll main.cf*
-rw-r--r--. 1 root root 29515 Jan 18 05:26 main.cf
-rw-r--r--. 1 root root 29369 Apr 18  2022 main.cf_20230117
-rw-r--r--. 1 root root 29515 Jan 18 05:26 main.cf_20230118_1
-rw-r--r--. 1 root root 29130 Apr 18  2022 main.cf.proto

Postfixの設定ファイルを開きます。

# vi /etc/postfix/main.cf

inet_interfaces

メールの受け取りインターフェイスを指定します。
"all" を指定することで外部からのメールを受信できるようになります。

#inet_interfaces = all
#inet_interfaces = $myhostname
#inet_interfaces = $myhostname, localhost
inet_interfaces = localhost
↓
inet_interfaces = all (コメントアウトを外します)
#inet_interfaces = $myhostname
#inet_interfaces = $myhostname, localhost
#inet_interfaces = localhost (コメントアウトします)

inet_protocols

postfixが待ち受けを行うプロトコルを "ipv4" に設定します。

inet_protocols = all
↓
inet_protocols = ipv4 (書き換えます)

以下の項目は最下行に追加します

smtpd_sasl_auth_enable

Postfix SMTP サーバの SASL 認証を有効にします。

smtpd_sasl_auth_enable = yes

smtpd_sasl_type

SMTP-AUTHの認証形式を指定します。

smtpd_sasl_type = dovecot

smtpd_sasl_path

認証用のソケットファイルを指定します。

smtpd_sasl_path = private/auth

smtpd_recipient_restrictions

メールのリレーに関する設定を行います。
SMTP の RCPT TO コマンドで通知される宛先メールアドレスに応じてメール受信の許可/拒否を設定します。

permit_mynetworks

自ネットワークは許可します。

permit_sasl_authenticated

SASL認証を通れば許可します。

reject_unauth_destination

SMTP-AUTHで認証が通らなかったものはリレーを拒否します。

smtpd_recipient_restrictions =
    permit_mynetworks
    permit_sasl_authenticated
    reject_unauth_destination

ファイルを閉じて保存し、先程作成したバックアップと比較します。

# diff main.cf main.cf_20230118_1
134c134
< inet_interfaces = all
---
> #inet_interfaces = all
137c137
< #inet_interfaces = localhost
---
> inet_interfaces = localhost
140c140
< inet_protocols = ipv4
---
> inet_protocols = all
743,752d742
<
< # SMTP AUTH
< smtpd_sasl_auth_enable = yes
< smtpd_sasl_type = dovecot
< smtpd_sasl_path = private/auth
<
< smtpd_recipient_restrictions =
<     permit_mynetworks
<     permit_sasl_authenticated
<     reject_unauth_destination

SUBMISSION

続いて587番ポート(SUBMISSION)の有効化、SMTP認証の有効化を行います。

SUBMISSION(587)について

メールの送信になぜ587番ポートを使うのか?

/etc/postfix/ に移動します。

# cd /etc/postfix/

バックアップをとります。

# cp -p master.cf{,_`date "+%Y%m%d"`}

バックアップを確認し

# ll master.cf*
-rw-r--r--. 1 root root 6372 Apr 18  2022 master.cf
-rw-r--r--. 1 root root 6372 Apr 18  2022 master.cf_20230118
-rw-r--r--. 1 root root 6372 Apr 18  2022 master.cf.proto

コピー元と同じ内容のバックアップである事を確認します。

# diff master.cf{_`date "+%Y%m%d"`,}

「master.cf」ファイルを開きます。

# vi /etc/postfix/master.cf

「master.cf」ファイルを以下のように編集していきます。

submission inet n - n - - smtpd

SUBMISSIONポート有効化します。

#submission inet n - n - - smtpd
↓
submission inet n - n - - smtpd (コメントアウトを外します)

-o smtpd_sasl_auth_enable=yes

SUBMISSIONポートでSMTP認証を有効化します。

# -o smtpd_sasl_auth_enable=yes
↓
-o smtpd_sasl_auth_enable=yes (コメントアウトを外します)

ファイルを保存して閉じ、バックアップと比較します。

# diff master.cf{_`date "+%Y%m%d"`,}
17c17
< #submission inet n       -       n       -       -       smtpd
---
> submission inet n       -       n       -       -       smtpd
32c32
< #  -o smtpd_sasl_auth_enable=yes
---
>   -o smtpd_sasl_auth_enable=yes

SMTP認証設定

Postfix自体は認証機能を持たないので「cyrus-sasl」をインストールしていきます。

# yum install cyrus-sasl

起動と自動起動設定を行います。

# systemctl enable --now saslauthd
Created symlink /etc/systemd/system/multi-user.target.wants/saslauthd.service → /usr/lib/systemd/system/saslauthd.service.

起動と自動起動設定を確認します。

# systemctl status saslauthd
● saslauthd.service - SASL authentication daemon.
   Loaded: loaded (/usr/lib/systemd/system/saslauthd.service; enabled; vendor preset: disabled)
   Active: active (running) since Wed 2023-01-18 06:53:48 UTC; 9s ago

一度 Postfix を再起動します。

# systemctl restart postfix

ステータスを確認します。

# systemctl status postfix
● postfix.service - Postfix Mail Transport Agent
   Loaded: loaded (/usr/lib/systemd/system/postfix.service; enabled; vendor preset: disabled)
   Active: active (running) since Wed 2023-01-18 06:54:52 UTC; 5s ago

Postfixの認証機能確認します。

cyrus と dovecot が表示されれば認証機能が追加されている事を確認できます。

# postconf -a
cyrus
dovecot

SUBMISSION動作確認

587番ポートが 「LISTEN」 状態(接続待ち)であるか確認します。

# ss -atn | grep 587
LISTEN 0      100          0.0.0.0:587         0.0.0.0:*

587番ポート(SUBMISSION)に接続し、ローカルでのメール送信を行います。

# telnet localhost 587

Trying ::1...
telnet: connect to address ::1: Connection refused
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 denet-mail.hogetest.com ESMTP unknown
ehlo localhost (入力します)
250-denet-mail.hogetest.com
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-STARTTLS
250-AUTH PLAIN LOGIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250-DSN
250 SMTPUTF8
mail from:denet-mail@hogetest.com (入力します)
250 2.1.0 Ok
rcpt to:denet-mail@hogetest.com (入力します)
250 2.1.5 Ok
data (入力します)
354 End data with <CR><LF>.<CR><LF>
587 test mail (入力します)
. (入力します)
250 2.0.0 Ok: queued as 570F235D24D
quit (入力します)
221 2.0.0 Bye
Connection closed by foreign host.

new ディレクトリを開いて送信したメールが届いているか確認してみます。
最初のローカル送信テスト時に送信したメールは
一度開いたので cur ディレクトリに入っているかと思います。

# ll /home/denet-mail/Maildir/new/
total 4
-rw-------. 1 denet-mail denet-mail 481 Jan 18 07:14 1674026057.V10302I36eb32M271598.denet-mail

メールの中身も確認しておきます。

# cat /home/denet-mail/Maildir/new/1674026057.V10302I36eb32M271598.denet-mail

Return-Path: <denet-mail@hogetest.com>
X-Original-To: denet-mail@hogetest.com
Delivered-To: denet-mail@hogetest.com
Received: from localhost (localhost [127.0.0.1])
        by denet-mail.hogetest.com (Postfix) with ESMTP id 570F235D24D
        for <denet-mail@hogetest.com>; Wed, 18 Jan 2023 07:12:22 +0000 (UTC)
Message-Id: <20230118071307.570F235D24D@denet-mail.hogetest.com>
Date: Wed, 18 Jan 2023 07:12:22 +0000 (UTC)
From: denet-mail@hogetest.com

587 test mail

無事メールが届いている事を確認できました。

メールサーバーの設定は以上となります。

DNS(Route53)

ホストゾーン作成、レコード登録

外部とのメールの送受信を行うためにDNSの設定を行います。

まず、ドメインでホストゾーンを作成します。

Route53
Route53

ホストゾーンが作成できたらレコードを登録していきます。

サーバーのホスト名とElastic IPでAレコードを登録します。

Aレコード
Aレコード

次に、ドメインとサーバーのホスト名でMXレコードを登録します。

MXレコード
MXレコード

最後にSPFレコードを登録します。

TXTレコード
TXTレコード

SPFレコード

SPF(TXT)レコードを登録する事で
受信側にメールが正規の送信ドメインから送られている事を証明できます。

正規の送信ドメインから送られている事を受信側へ証明できない場合、
なりすましや迷惑メールだと判定されてしまう恐れがあります。

SPF (TXT) レコードの詳細やレコードの登録内容についてはこちらを
SPFとは

レコード確認

設定が完了したら
コマンドプロンプトなどで外部から設定したレコードが引けるかを確認します。

コマンドプロンプトの開き方
コマンドプロンプトを開く方法

Aレコード

nslookup コマンドで MXレコード のホスト名を入力して
返ってきたIPアドレスが Route53 で設定したIPアドレスと同じ値であるか確認します。

Aレコード確認
Aレコード確認

MXレコード

nslookup -type=MX ドメイン と入力して
メールサーバのホスト名が Route53 で設定したホスト名と同じ値であるか確認します。

MXレコード確認
MXレコード確認

SPFレコード

nslookup -type=txt ドメイン と入力して
SPF(TXT)レコードが設定した値と同じである事を確認します。

SPFレコード確認
SPFレコード確認

レコードが確認できればDNSの設定は完了です。
これで外部から作成したメールサーバを見つける事ができるようになりました。

最後にメーラーを使用して外部からの受信をテストしていきます。

メールクライアント(Thunderbird)を使用した動作確認

Thunderbirdにアカウントを登録して外部からの受信テストを行います。
※外部への送信については後ほど

1.Thunderbirdを開き、
 [ファイル] - [新規作成] - [既存のメールアカウント] と進みます。

2.「あなたのお名前」
 「メールアドレス」
 「パスワード」を入力し、手動設定を選択します。

3.各情報を以下のように入力後、 [再テスト] をクリックし問題なさそうであれば [完了] をクリックします。

Thunderbird設定
Thunderbird設定

4.「接続する上での危険性を理解しました」にチェックを入れ、確認をクリックします。

Thunderbird警告
Thunderbird警告

これでアカウントの登録が完了しました。
受信トレイを覗くとローカルでテストしたメールが入っているかと思います。

Thunderbird設定完了
Thunderbird設定完了

5.外部からの受信テスト

Gmailなどから作成したメールサーバ宛にメールを送信してみてください。
何事もなく受信されれば外部からの受信テストは完了です。

25番ポート制限解除と逆引き登録について

あとは外部への送信ができればいいのですが

AWSなどのクラウドサービスはスパムメールの転送を禁止するため、
OP25B(Outbound Port 25 Blocking)というメールの送信規制があります。(外部へのTCP25番ポートをブロックする)

なので外部へメールを送信しようとしても、メールはメールサーバーから外部へ出る事ができず送信することができません。

外部へのメール送信を行うためにはAWSに25番ポートの制限解除申請と、逆引きレコードの登録が必要になります。

今回は検証用に作成したサーバなので制限解除申請は行わず、手順の紹介のみとさせていただきます。

外部へのメール送信を行うための手順

  1. ElasticIPアドレスの逆引きDNSレコードを登録

  2. AWSに25番ポートの制限解除申請を行う
    【公式】制限解除申請ページ

  3. 申請が通ればAWSから以下のようなメールが届きます

件名:Your AWS Inquiry [アカウントID]
Hello,
We have successfully~
  1. 外部へのメール送信テストを行う

その他、参考になりそうな記事を貼っておきますので参考にしてただければ幸いです。

Amazon EC2 インスタンスまたは AWS Lambda 関数のポート 25 の制限を削除するにはどうすればよいですか?

EC2 Eメール送信制限解除はなぜ必要なのか

【AWS】25番ポートメール送信時に必要なDNSレコード登録

EC2からメールを送信する(ポート 25 に対する制限を解除)

以上、AWS EC2 を利用してのメールサーバ構築でした。
最後まで読んでいただきありがとうございました。

1件のコメント

  1. メールサーバ構築の手順がとてもわかりやすくまとめられており、大変助かりました。ありがとうございます。

返信を残す

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

CAPTCHA