EC2でメールサーバ構築ハンズオン

はじめに

現場でDNSにSPFレコードの設定を頼まれたところから、そもそもメールサーバってどんなふうに作るのかと思い構築をしてみました。
独自ドメインは今回取得せず、1台のEC2のなかで完結するような構築をしました。

メールサーバにおける用語

メールを利用するにあたっての、主要な用語を簡単に説明する。
文字だけでは分かりにくいため、下記本構築アーキテクト図に「どこ」が「どこ」にあたるのかを記載する。

コンポーネント

省略語 正式名称 内容 プログラムの一例
MUA Mail User Agent エンドユーザがメールを読んだり作成したりするプログラム。 「Thunderbird」、「Outlook」
MTA Mail Transfer Agent 「メールサーバ」や「SMTPサーバ」と呼ばれ、ドメインからDNS検索して配送先のMTAを見つけ転送や、ローカルの場合であればMDAに転送。 「postfix」
MDA Mail Delivery Agent メール配送を担当するエージェントプログラム。受信者のメールボックスに配送する役割を持つ。 「Dovecot」
MRA Mail Retrieval Agent メール受信を担当するエージェントプログラム。ユーザーがメールサーバーからメールを取得する際に使用される。 MDAと同様に「Dovecot」

プロトコル

プロトコル名 正式名称 ポート番号 内容
SMTP Simple Mail Transfer Protocol Port: 25 メール送信するために使用するプロトコル。
IMAP Internet Message Access Protocol Port: 143 メールサーバ上のメールにアクセスし、管理するためのプロトコル。
POP3 Post Office Protocol Port: 110 メールクライアントがメールサーバーからメールをダウンロードするために使われるプロトコル。

システム ※本構築スコープ外

システム名 正式名称 内容
DNS Domain Name System ドメイン名をIPアドレスに変換するシステム。メールサーバーにおいては、メールを正しい宛先にルーティングするために、ドメイン名を関連付けたIPアドレスに解決する役割を持つ。

構成図

構築

前提条件

・EC2(Linux系)が構築されていること。
・EC2のSGで下記ポートが開放されていること。

No タイプ プロトコル ポート範囲
1 POP3 TCP 110
2 SSH TCP 22
3 SMTP TCP 25
5 IMAP TCP 143

1.SMTPサーバ構築

SMTPサーバを構築するための手順について説明する。
SMTPサーバは、メールの送信とルーティングを管理するサーバ。
利用MWとしてPostfixを利用する。

1.1.Postfixのインストール

SMTPサーバを構築するため、Postfixのインストール。
プログラムを起動と、自動的に起動する設定を行う。

sudo yum update -y
sudo yum install -y postfix
sudo systemctl start postfix
sudo systemctl enable postfix

1.2.Postfixの設定

Postfixを設定する。

sudo vim /etc/postfix/main.cf

各項目の設定内容

項目名 内容
myhostname メールサーバのホスト名
mydomain メールを送受信するドメイン
myorigin 送信メールのデフォルトドメイン
inet_interfaces Postfixがリッスンするネットワークインターフェース
mydestination ローカルで配送されるメールのリスト
mynetworks 信頼されたネットワークのリスト
home_mailbox ユーザーのメールボックスのパス

設定例

myhostname =  ip-192-168-10-234.ap-northeast-1.compute.internal
mydomain = tetutetu.com
myorigin = $mydomain
inet_interfaces = all
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
mynetworks = 127.0.0.0/8 [::1]/128
home_mailbox = Maildir/

2. Dovecotのインストールと設定

IMAP/POP サーバを構築するための手順について説明する。
IMAP/POP サーバは、メールの受信とメールボックスの操作を管理するサーバ。
利用MWとしてDovecotを利用する。

2.1.Dovecotのインストール

IMAP/POP サーバを構築するため、Dovecotのインストール。
プログラムを起動と、自動的に起動する設定を行う。

sudo yum install -y dovecot
sudo systemctl start dovecot
sudo systemctl enable dovecot

2.2.Dovecotの設定

2.2.1.メイン設定ファイル設定

IMAPとPOP3を通信プロトコルとして利用するための設定。

sudo vim /etc/dovecot/dovecot.conf
protocols = imap pop3

2.2.2.メールボックス形式設定

メールボックスがMaildir形式であることをDovecotに指示。

sudo vim /etc/dovecot/conf.d/10-mail.conf
mail_location = maildir:~/Maildir

2.2.3.セキュリティ設定

IMAPとPOP3はSSL暗号化されていないため通信が拒否されてしまうため、下記の設定を実施。
※ただしセキュリティレベルを落とすため本番環境などでは非推奨の設定。

  • プレーンテキスト(暗号化されていない)でも認証を許可する。
sudo vim /etc/dovecot/conf.d/10-auth.conf
disable_plaintext_auth = no

  • Dovecotに対してSSL/TLSを無効にする。
sudo vim /etc/dovecot/conf.d/10-ssl.conf
ssl = no

3.テストのための下準備作成

今回のテストではec2-userというユーザから、tetutetuユーザに対してメールを送付するシナリオのため、ユーザの作成及びメール受信ディレクトリを作成する。

3.1.ユーザの追加

メールを送る対象のユーザを作成する。

sudo useradd tetutetu
sudo  passwd tetutetu

3.2.メール受信用ディレクトリ作成

ユーザ作成時、ホームディレクトリにメール受信用ディレクトリが自動的に作成されるよう設定する。

mkdir -p /etc/skel/Maildir/{new,cur,tmp}
chmod -R 700 /etc/skel/Maildir/

挙動の確認

メール送信テスト

メール内容、タイトル、送り先をコマンド実施。

echo "Test email body" | mail -s "Test Email Subject" tetutetu@tetutetu.com

メールログの確認

メールが送られているログを確認することができる。

sudo cat /var/log/maillog
postfix/postfix-script[2953]: starting the Postfix mail system
(中略)
from=<ec2-user@tetutetu.com>, size=536, nrcpt=1 (queue active)
to=<tetutetu@tetutetu.com>, relay=local, delay=0.03, delays=0.02/0.01/0/0, dsn=2.0.0, status=sent (delivered to maildir)

メール受信確認

※ユーザを送信したユーザに切り替えることに注意する。

sudo su tetutetu
cd /home/tetutetu/Maildir/
ls new/
1705800314.Vca01Ic5d404M486290.ip-192-168-10-234.ap-northeast-1.compute.internal
cat new/1705800314.Vca01Ic5d404M486290.ip-192-168-10-234.ap-northeast-1.compute.internal 

 メール内容確認

ec2-userで送信したメール内容が、tetutetuユーザに送信されていることが確認できる。

<中略>
To: tetutetu@tetutetu.com
Subject: Test Email Subject
<中略>
From: ec2-user@tetutetu.com (EC2 Default User)
Test email body

さいごに

メールサーバについて全くわからなかったところからスタートしたので、かなり自分的に大収穫となった検証となりました。
ドメイン取得してからの動きも気になりますし、そもそものSPFレコードってどこでどうなってるのかなども今回の検証ではスコープではなかったので、次回のブログでは是非ともその部分まで踏み込んでいきたいなと思います。

Last modified: 2024-01-21

Author