EC2 インスタンスでメールサーバ構築

June 06, 2018

はじめに

今回は EC2 インスタンスを用いて、メールサーバ (受信 only) を構築します。
なお、送信については、EC2 ではアウトバウンド 25 番ポートが制限されているため、事前に制限解除が必要です。

セキュリティグループの設定

以下のポートを開いておきましょう。

タイプ プロトコル ポート ソース
SMTP TCP 25 0.0.0.0/0, ::/0
POP3 TCP 110 0.0.0.0/0, ::/0
IMAP TCP 143 0.0.0.0/0, ::/0

ドメインの設定

user@example.com にメールを送るには以下のような DNS レコードの設定が必要になります。

Name Type Value
example.com A EC2 の IP アドレス
mail.example.com A EC2 の IP アドレス
example.com MX 10 mail.example.com

postfix のインストール及び設定

まずは yum でちゃちゃっとインストール。

$ sudo yum install postfix  

次に設定だが、/etc/postfix/main.cf /etc/postfix/master.cf /etc/sasl2/smtpd.conf をいじることになる。

$ sudo cp /etc/postfix/main.cf /etc/postfix/main.cf.org  
$ sudo cp /etc/postfix/master.cf /etc/postfix/master.cf.org  
$ sudo cp /etc/sasl2/smtpd.conf /etc/sasl2/smtpd.conf.org   
  
$ diff /etc/postfix/main.cf /etc/postfix/main.cf.org   
76c76  
< myhostname = mail.example.com  
---  
> #myhostname = virtual.domain.tld  
83c83  
< mydomain = example.com  
---  
> #mydomain = domain.tld  
99c99  
< myorigin = $mydomain  
---  
> #myorigin = $mydomain  
113c113  
< inet_interfaces = all  
---  
> #inet_interfaces = all  
116c116  
< #inet_interfaces = localhost  
---  
> inet_interfaces = localhost  
164c164  
< mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain  
---  
> mydestination = $myhostname, localhost.$mydomain, localhost  
264c264  
< mynetworks = 10.1.0.0/16, 127.0.0.0/8  
---  
> #mynetworks = 168.100.189.0/28, 127.0.0.0/8  
419c419  
< home_mailbox = Maildir/  
---  
> #home_mailbox = Maildir/  
677,684d676  
<   
< ## add setting  
< smtpd_sasl_auth_enable = yes  
< smtpd_sasl_local_domain = $myhostname  
< smtpd_recipient_restrictions =  
<     permit_mynetworks  
<     permit_sasl_authenticated  
<     reject_unauth_destination  
  
$ diff /etc/postfix/master.cf /etc/postfix/master.cf.org  
12c12  
< submission inet n       -       n       -       -       smtpd  
---  
> #submission inet n       -       n       -       -       smtpd  
19,20c19,20  
<   -o smtpd_sasl_auth_enable=yes  
<   -o smtpd_client_restrictions=permit_sasl_authenticated,reject  
---  
> #  -o smtpd_sasl_auth_enable=yes  
> #  -o smtpd_client_restrictions=permit_sasl_authenticated,reject  
  
$ diff /etc/sasl2/smtpd.conf /etc/sasl2/smtpd.conf.org   
1c1  
< pwcheck_method: auxprop  
---  
> pwcheck_method: saslauthd  

sendmail を停止して自動起動もやめる。

$ sudo service sendmail stop  
Shutting down sm-client:                                   [  OK  ]  
Shutting down sendmail:                                    [  OK  ]  
$ sudo chkconfig sendmail off  

MTA を postfix に変更。

$ sudo alternatives --config mta  
  
There are 2 programs which provide 'mta'.  
  
  Selection    Command  
-----------------------------------------------  
*+ 1           /usr/sbin/sendmail.sendmail  
   2           /usr/sbin/sendmail.postfix  
  
Enter to keep the current selection[+], or type selection number: 2  

postfix 及び saslauthd の自動起動設定を行い、起動。

$ sudo chkconfig --add postfix  
$ sudo chkconfig postfix on  
$ sudo service postfix start  
Starting postfix:                                          [  OK  ]  
$ sudo chkconfig saslauthd on  
$ sudo service saslauthd start  
Starting saslauthd:                                        [  OK  ]  

メール受信用ユーザを作成。

$ sudo useradd yuki -d /home/yuki -s /bin/bash  
$ sudo passwd yuki  
Changing password for user yuki.  
New password:   
BAD PASSWORD: The password fails the dictionary check - it is based on a (reversed) dictionary word  
Retype new password:   
passwd: all authentication tokens updated successfully.  
$ cat /etc/passwd | grep yuki  
yuki:x:505:506::/home/yuki:/bin/bash  

作成したユーザで Maildir を作成する。

$ su - yuki  
Password:   
Last failed login: 月  64 12:59:51 JST 2018 from 192.168.100.9 on ssh:notty  
There was 1 failed login attempt since the last successful login.  
$ mkdir Maildir  

以上で、yuki@example.com にメールを送信すると ~/Maildir/new にメールが保存されていることが確認できる。

$ ls -l  
total 12  
-rw------- 1 yuki yuki 5143 Jun  6 18:38 1528277892.Vca01I80747M599700.ip-10-1-11-92  
-rw------- 1 yuki yuki 2347 Jun  6 18:39 1528277947.Vca01I8074bM472756.ip-10-1-11-92  

ちなみに

SES 使えば以下みたいな感じで送信する環境も簡単に構築できます。

$ aws ses send-email --to user@hogehoge.com --from yuki@example.com --subject 'This is a test' --text 'TEST' --region us-east-1  
{  
    "MessageId": "01000163d79ab286-e1ba974d-598b-4825-9a76-a1757602893c-000000"  
}  

 © 2022, Dealing with Ambiguity