Linux実践記 vol.2 送信専用メールサーバーの構築

## 前書き
Linuxをマスターしたい人のための実践Ubuntuを読んでいたところ、「サーバーアプリケーションを動かそう」という章があったので、実際に動かしてみて備忘録代わりに記事にします。
Linux初心者の筆者でも脱落することなく楽しく読めました。Linux触ってみたいけど何から手を付けたらいいのかわからないという人にはオススメです。

https://www.shuwasystem.co.jp/book/9784798068251.html


# 事前知識

## メールサーバーとは？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2661124/f5d5d7a2-a1d5-2dcc-1557-3acb0e19618a.png)

https://www.value-domain.com/media/mailserver/

より引用

メールサーバーとは、メールの送受信を行うだけのサーバーで、送信側と受信側がそれぞれ別のメールサーバーを持ってます。利用者がメールを送信すると、送信者用のメールサーバーに一旦メールが送られ、そこでDNSの名前解決を行い、送信先の相手が利用している受信用のサーバーにメールが送られます。

メールを受け取った側は、受信用のメールサーバーにメールを受け取りに行くことで、届いたメールを閲覧することができます。送信用のメールサーバーをSMTPサーバーと言い、受信用のサーバーをPOP3サーバーと言います。これは使用するプロトコルに由来しているものと思われます。

最近は受信用のサーバーにIMAPサーバーを利用することもあります。違いとしては、メールをサーバーに残さないのがPOP3サーバーで、メールをサーバーに残すのがIMAPサーバーです。



## OP25B
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2661124/e4b503c3-4b80-cb5b-232f-3c3811234e6f.png)


https://baremail.jp/blog/2020/04/10/652/

より引用

先ほど説明したSMTPは25番ポートを用いて通信をします。ISP(インターネットサービスプロバイダ―)が指定したメールサーバー以外のサーバーに対して、25番ポートでアウトバウンド通信を行うことを制限することをOP25B（Outbound Port 25 Blocking）と言います。

なぜこのような規制が必要なのかというと、ポート25番を使ってインターネット上のメールサーバーを利用し、spamメールやウイルスメールの送信することを抑制したいからです。

25番ポートは認証をせずに利用することができてしまいます。そのため、インターネット上にあるメールサーバーに対して25番ポートで侵入し、そこから目的の宛先へメールを送ることで、自分の身元を隠しながら宛先へメールを送ることができてしまいます。このような悪事を規制する目的でおこなわれているのがOP25Bです。

そこで、代わりに「SMTP AUTH」という認証を行わないと使用できない587番ポートを使用することで、ISPが指定していないメールサーバーとも直接通信をすることができます。この587番ポートのことをサブミッションポートと言います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2661124/83e6ecaa-9f22-24d9-8657-825e3dece43c.png)

https://ccsnet.ne.jp/op25b/

より引用

OP25Bが設定されている環境であっても、ISP指定のメールサーバーを経由していれば25番ポートを利用したメール送信は可能です。

すべての通信で587番ポートを使用すればいいのでは？と思いましたが、どういうときに25番ポートを使用したいのでしょうか。ご存じの方は是非教えてほしいです。


## SMTPリレー
昔は大量送信が難しく、また受信側のサーバーと直接通信ができないこともあったそうです。そこで、信頼できる第三者が提供しているメールサーバーを中継してメールを送るという方法をとることがありました。これをSMTPリレーと呼びます。今回はこのSMTPリレーを実装しようと思います。ちなみに、現在では直接受信側のメールサーバーにメールを送信することが一般的みたいです。

# メールサーバーの構築

## Gmailのアプリケーションパスワードの発行
gmailをメールサーバーとして使うことができるらしいので、使うことにします。今回はSMTPリレー先ののメールサーバとして使います。

送信側のメールサーバーがgmailのメールサーバーを利用するには「アプリケーションパスワード」を発行しておく必要があるので事前に準備をしておきます。アプリケーションパスワードを発行するには二段階認証を有効にしておく必要があるので、まずは二段階認証を有効にします。

以下を参考にして進めていきます。

https://support.google.com/mail/answer/185839?hl=ja&ref_topic=3394217

> Google アカウントを開きます。
ナビゲーション パネルで [セキュリティ] を選択します。
[Google へのログイン] で、[2 段階認証プロセス] 次に [使ってみる] を選択します。
画面上の指示に沿って手順を完了します。

上記の通りに進めていけば特に詰まるところはないと思います。

続いて、アプリケーションパスワードを発行します。

https://support.google.com/mail/answer/185833?hl=ja&ref_topic=3394217&sjid=16539253897866474134-AP

> [Google アカウント] に移動します。
[セキュリティ] を選択します。
[Google へのログイン] で [2 段階認証プロセス] を選択します。
ページの下部にある [アプリ パスワード] を選択します。
アプリ パスワードを使用する場所を覚えやすい名前を入力してください。
[生成] を選択します。
アプリのパスワードを入力するには、画面の指示に沿って操作します。アプリ パスワードは、デバイスで生成される 16 文字のコードです。
[完了] を選択します。

こちらも特段難しい操作はなかったです。ただ一か所、「アプリ パスワードを使用する場所を覚えやすい名前を入力してください。」のところで使用する目的とデバイスを選択する箇所があり、そこで少し悩みました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2661124/4ac715c2-01d7-91e0-b75f-c039a71c49f4.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2661124/5f7bb8e9-b429-880b-ee15-d5c70f6572be.png)
こちらのプルダウンはタグをつけているだけであり。使用者が用途を思い出すためだけに必要なものなので、今回は何を選んでも大丈夫です。実際今回はUbuntuを使用するのにWindowsパソコンを選択しましたが、問題なく使えました。

こちらが生成されたアプリ パスワードです。今回は記事用に画像を一時的に保存しましたが、設定が完了すればパスワードはもう使わないので、設定完了後はパスワードを保存しないようにしましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2661124/ad495b50-10f9-beb8-c016-b23d9f11600d.png)





## Postfix
https://www.kagoya.jp/howto/it-glossary/mail/postfix/

> ソフトウェアの名称で、メールを送信(配送)するときに利用します。オープンソースで手軽にサーバーに導入できます。誕生してからおよそ20年経っており、安全且つ使いやすいように改良をされてきました。現在のシェアは約3割程度となっています。 (出典: Mail Server Survey 2018年1月)

送信側のメールサーバーとしては、Postfixを使用します。Ubuntuでは、postfixパッケージをインストールするだけでメールサーバーとして動かすことができます。

## AWSでubuntuのEC2を立てる
マネジメントコンソール > EC2 > インスタンス で出てくる画面の右上にある「インスタンスを起動」からインスタンスを起動します。

 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2661124/7f6047e1-bb4d-de8d-80c3-3fb04ebc4292.png)



AMIはubuntuの一番上に出てくるものを使用しました。ほかはデフォルトの設定どおりです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2661124/cadbdd15-23f7-964f-5eb3-d4a8f3738d74.png)

作成時はメールサーバーについてあまり理解してなかったのでセキュリティーグループは全開けしていました。しかし、EC2にインバウンドでアクセスしたいのは作業者だけなので、インバウンドは作業者がアクセスできるルールを設定して、アウトバウンドは全開けする、とする方がセキュリティ的には好ましいかなと思います。

EC2 Instance Connectを使ってみたかったのですが、エラーが出てうまく繋げませんでした。今回はEC2 Instance Connectは本題ではないので、SSHクライアントで接続しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2661124/3732c950-bf14-2f43-3bb4-894f2aff213f.png)

pemキーを保存しているフォルダに移動して、以下のコマンドを実行します。

```
ssh -i "xxxx.pem" ubuntu@ec2-xx-xx-xx-xx.compute-1.amazonaws.com
```


## Postfixのインストールとリレーの設定

postfixパッケージをインストールします。
```
sudo apt install -y postfix
```

セットアップを行います。
まずは使用目的です。「Internet with smarthost」を選択します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2661124/e75d306a-f11a-2e13-f104-a82c67388bc6.png)

メールシステムの名称を入力します。参考にした本には
> ここで設定されたドメイン宛てのメールは自分自身宛てのメールと判断され、インターネット宛てに送出せず、ローカル配送されます。今回はメールを受信することを想定していないので、自分自身のホスト名を入力しておけばいいでしょう

あまりよくわからなかったのですが、おそらく今回この機能は使用しないので、デフォルトで設定されている内容のまま進めました。特に問題はありませんでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2661124/4d2197ba-8013-16c6-17b9-4b3abf94e96b.png)

リレー先のサーバーを設定します。gmailにリレーするので[smtp.gmail.com]:587と入力します。
サブミッションポートを経由するため、サーバーのアドレスを[]で囲い、コロンで区切ってポート番号を指定するところがポイントらしいです。

ポート指定するのは指定しないと25になっちゃうからですかね？[]で囲む理由はよくわかりませんでした。

gmailサーバーを利用するための認証情報を設定します。
まず、/etc/postfix/sasl_passwdというファイルに、

```
[smtp.gmail.com]:587 gmailのアドレス:発行したアプリケーションパスワード
```
を記述します。ファイルを作成し、記述するには以下のコマンドを使用します。

```
sudo vi /etc/postfix/sasl_passwd
```

次にpostmapコマンドを使用して、作成したファイルをpstfixが読める検索テーブルに変換して、権限を変更し、不要になった元のファイルを削除します。

```
sudo postmap /etc/postfix/sasl_passwd
sudo chmod 600 /etc/postfix/sasl_passwd.db
sudo rm /etc/postfix/sasl_passwd
```

最後に、postconfを使用してメールサーバーに認証などの設定を行います。最後に設定を反映させるためにpostfix.serviceを再起動します。ここはもうおまじないですね。

```
sudo postconf -e 'smtp_use_tls = yes'
sudo postconf -e 'smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd'
sudo postconf -e 'smtp_sasl_mechanism_filter = plain'
sudo postconf -e 'smtp_sasl_tls_security_options = noanonymous'
sudo postconf -e 'smtp_sasl_auth_enable = yes'
sudo systemctl restart postfix.service
```

上記のコマンドは正しいのですが、本からコマンドを書き写す際に誤字があったためここで少し時間を溶かしてしましました。上記で書き込んだ内容は、以下のコマンドで確認することができます。
```
postconf -n
```
最後の行にwarningが表示されていました
```
postconf: warning: /etc/postfix/main.cf: unused parameter: smtp_sasl_tls_suth_enable=yes
postconf: warning: /etc/postfix/main.cf: unused parameter: smtp_sasl_tls_auth_enable=yes
```
1行目は一度目にコマンドを打った時です。suthとなっているのに気づきauthに直してコマンドを打ち直したのが2行目です。その後tlsが不要だったことに気づき、結局3度目のコマンドで正しく打ち込むことができました。

テストメールを送信します。目0るクライアントとして、mailutilsパッケージをインストールします。
```
sudo apt -y install
```
以下のようなエラーが出てしまいました
```l

Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
Package mailutils is not available, but is referred to by another package.
This may mean that the package is missing, has been obsoleted, or
is only available from another source

E: Package 'mailutils' has no installation candidate
```
パッケージがないと言っているみたいなので、
```
sudo apt update
```
してもう一度トライしたら上手くいきました。いまEC2を立てたところなのになぜうまくいかないのだろう、と思っていましたが、AMIを利用しているのでパッケージを保存しているリポジトリは最新ではないのかもしれません。

最後に、メールを送信します。
```
echo 'メール本文' | mail -s "件名" 宛先メールアドレス
```

届きました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2661124/fc763178-cc31-7168-bbc2-388ecfa5438c.png)


## 感想
簡単な実装ではありましたが、自分の手でサーバーアプリケーションを動かすというのは楽しいですね。人に頼ることなく最後まで実装できて少し自信がつきました。今後もLinuxに慣れていくためにちょこちょこ触っていこうと思います。おすすめの構築作業などありましたら是非教えてください。