VirtualBox内でメールサーバを2つ立ててメールを送受信する

仮想マシンでセキュリティもなんも考慮していないメールサーバを立てて、申し訳程度のメールサーバ気分に浸ろうという記事です。Linuxド初心者向け。

# 環境について
macOS Big Sur 11.6.2
VirtualBox 6.1.32
Alma Linux 8.6

# 0. 準備
VirtualBoxをインストールし、何かしらのLinuxディストリビューションのISOを用意します。ディストリビューションは何を選んでも大体何とかなるとは思いますが、RedHat系のディストリビューションがおすすめです。ちょっと前までは初心者はCentOS一択みたいな風潮があったんですが、今はそうでもなくなりました。

おすすめなのは、Fedora, Alma Linux, Rocky Linuxあたりでしょうか。今回はAlma Linuxでやろうと思います。名前がかっこいいから……

以下のリンクからAlmaLinux-8.6-x86_64-minimal.isoをダウンロードします。
https://almalinux.org/ja/

# 1. 仮想マシンを立てる
VirtualBoxで仮想マシンを、とりあえず1個だけ立てます。

VirtualBoxでマシンを立てたことがない人は、以下の記事を読んでおけばなんとかなるんじゃないでしょうか。
https://note.com/kokoronokori/n/n6bd3c44b8706　　

__重要な点として、ネットワークの設定からホストオンリーアダプターを追加しなければなりません。__ ホストオンリーアダプターっちゅうのは、仮想マシン同士の通信だの、ホストOSと仮想マシンとの通信だのを可能にするやつと思っておけば大体間違いはないでしょう。今回はメールサーバを2つ立てて、そいつらで通信を行うので、ホストオンリーアダプターが必要になる訳です。

追加の仕方がわからなければ、以下の記事が参考になるでしょう。記事内に出てくるnmtuiは、なければdnfなどでインストールすることができます。
https://blog.proglus.jp/3315/#i-5

dnfは以下のように利用できます。一応。
```bash
dnf update // dnfを使えるようにする前準備
dnf install nmtui // nmtuiをインストール
```

# 2. SMTPサーバとIMAPサーバを立てる
おさらいですが、SMTPサーバがメールの送信に使うサーバで、IMAPサーバがメールの受信, 保持, クライアントへの送信を担うサーバです。1つの仮想マシンの中にSMTPサーバもIMAPサーバも立てます。

立てた仮想マシンの中に、メールサーバに必要なソフトウェアを入れていきます。SMTPサーバを立てるにはpostfixが、IMAPサーバを立てるにはdovecotが必要です。

それぞれを導入する方法が書かれた良い記事がここにあるので、これを読んで導入してください。(03)の｢メールアカウント登録(OSユーザ)｣までやればOKです。
https://www.server-world.info/query?os=CentOS_Stream_8&p=mail&f=1

~~いや〜  偉大な先人がいると記事を書くのが実に楽だな(笑)~~

上記の記事の設定に加えて、/etc/postfix/main.cfに以下を追記しておいてください。(後ほど説明するのですが、/etc/hostsを参照する際にこの設定が絡んできます。)
```/etc/postfix/main.cf
smtp_host_lookup = native
```

#### 送信テストが上手くいかない場合
原因を調査するために、メールを送信した際にログを出力するようにします。まずはsyslogをインストールします。
```bash
dnf install -y rsyslog
systemctl start rsyslog
```

これで、メールを送信した際にログが出力されるようになります。ログを確認するためには`tail /var/log/maillog`コマンドを入力します。

すると、Maildirへの書き込み権限が無いだとか、ドメインが見つからないだとか、時と場合によって色々なエラーが出てきます。

全てのエラーを把握しているわけでは無いので、具体的に「〇〇が起きた時は〇〇しろ！」という指示は上手くできません。（すみません）
私が経験したものだと、Fedoraで同じサーバを構築した際に、SELinuxが原因でMaildirへの書き込みが上手くできなかったり、Alma Linuxでpostfixの設定が原因でドメインの名前解決が上手くいかなかったりしました。(前者は`setenforce 0`で雑に対処して、後者は`smtp_host_lookup`の設定で対処しました。)

# 3. 立てた仮想マシンをクローンする
もう1つ同じものを用意してそいつらで通信させたいわけですが、まあ面倒なので、もう1つはコピペで済ませてしまおうと思います。

#### 3.1 とりあえずクローン
VirtualBoxから仮想マシンを右クリックして、クローンを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952892/7b4e6cd6-dfef-b8ca-6c5a-d102fad841f8.png)
まあこんな感じでクローンします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952892/33011622-70f0-d348-f1db-c708752a94b7.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952892/97e187c9-fdcd-5eaf-c782-c6a0ee48b074.png)

#### 3.2 IPアドレスの設定を変更
クローンしたマシンを起動して、IPアドレスの設定を変更します。1つ目の仮想マシンとダブってると困るので。
ホストオンリーアダプター(enp0s8)のアドレスを、nmtuiなどから、1つ目の仮想マシンとは異なるもの(192.168.xxx.3など)に変更してださい。

#### 3.3 ドメインの設定を変更
先ほど設定したpostfixの設定のドメインの部分を書き換えます。ドメインも1つ目の仮想マシンとダブっていると困るので。
こんな感じで、/etc/postfix/main.cfを編集します。
```/etc/postfix/main.cf
myhostname = mail.srv2.world
mydomain = srv2.world
```

編集が終わったらpostfixを再起動します。
```bash
systemctl restart --now postfix
```

# 4. 通信先サーバのドメインの設定
おさらいですが、そもそもドメインというのはIPアドレスと結びついているものです。なので、上記の設定の例で言えば、cent@srv2.worldにメールを送ったならば、192.168.xxx.3にメールが届くべきなのです。

ドメインとIPアドレスを結びつけるのはDNSというサーバの仕事なのですが、わざわざ申し訳程度のメールサーバ気分に浸るためだけにDNSまで立てるというのはあまりにダルすぎます。なので、もうちょっと簡易的な方法でこれに対処します。

/etc/hostsファイルというものがあるので、これを利用します。/etc/hostsファイルとは、IPアドレスとドメインの対応を書いておけば、DNSを使わなくともその通りに名前解決をしてくれるという優れものです。

それぞれの仮想マシンで以下のように設定します。
```/etc/hosts
192.168.xxx.2 srv.world
192.168.xxx.3 srv2.world
```

これで、お互いのサーバをドメインで認識できるようになりました。

/etc/hostsファイルについてもっと知りたければ、以下の記事が参考になるでしょう。
https://linuc.org/study/knowledge/506/

# 5. 送信テスト
やっとこさ2つのメールサーバが揃ったので、送信テストをしてみます。「2. SMTPサーバとIMAPサーバを立てる」で紹介したサイトを参考にテストをしてみます。
1つ目の仮想マシンで以下のように送信テストを行います。
```
# srv２.worldにテストメール送信 [mail (ユーザー名)@(ホスト名)]
[cent@mail ~]$ mail cent@srv2.world
# 件名
Subject: Test Mail#1
# 本文
This is the first mail.

# 本文を終了する場合はピリオド (.) を入力して Enter
.
EOT
```

上手くいっていれば、2つ目の仮想マシンで`mail`コマンドを実行すると、メールが受信できているはずです。お疲れ様でした。