そろそろサムネイル用の画像を作るのがめんどくさくなってきました…どうでもいいですね。

テスト用に閉じられたネットワーク向けのメールサーバーを構築しました。
従って、 セキュリティ的にはザル で公開を前提とはしてません。

目次

  1. はじめに
  2. 環境
  3. 手順
  4. ゲストOSのインストール
  5. Vagrantfile
  6. CentOS(ゲストOS)設定
    1. システムのアップデート
    2. SELinux無効
    3. ファイアウォール設定
  7. Postfix
    1. インストール
    2. 設定変更(ゲストOS内でのテスト向け)
    3. 再起動する
  8. アカウント作成
    1. ディレクトリの書き込み権限
  9. ゲストOS内でテスト実施
    1. telnetインストール
    2. テスト
  10. Dovecot
    1. インストール
    2. 設定変更(ゲストOS内でのテスト向け)
      1. dovecot.conf
      2. 10-mail.conf
      3. 10-auth.conf
      4. 10-ssl.conf
    3. 再起動する
  11. ゲストOS内でテスト実施
  12. ネットワーク設定変更
    1. Postfix
    2. Dovecot
  13. クライアントからのテスト
  14. クライアントからつながらないとき
  15. 所感

はじめに


下記のサイトを参考にさせて頂いて構築しました。

ローカルネットワーク内のみで使えるメールサーバをたてよう

ただし、私の場合は下記が違います。

  • 仮想環境はVagrantで構築した
  • 一部テストを飛ばしている
  • ポートフォワーディングでホストOS以外からも使用できるようにした
  • クライアント側のメーラーが違う(どうでもいい要素。そもそも本記事内で書いてない)

環境


Ubuntuでやってもたぶん同じですが、変なところで詰まりたくなかったので参考サイトと同じくCentOSで行いました。
なお、私はIMAPしか使用してないですが、POP3用のポートさえ開ければPOP3も使用できるはずです…

OSとかソフトとか 役割
Windows10 ホストOS
VirtualBox 5.0.20 仮想環境用
Vagrant 1.8.4 仮想環境用
CentOS 7.2 ゲストOS
Postfix 2.10.1 ゲストOS上で稼働するMTA(SMTP)サーバー
Dovecot 2.2.10 ゲストOS上で稼働するPOP3,IMAPサーバー

手順


VirtualBoxとVagrantは割愛します。

  • ゲストOS(CenOS7.2)のインストール
  • Vagrantfileの設定
  • ゲストOS(CenOS7.2)の設定
  • Postfixのインストール & 設定
  • Postfixが動作するかゲストOS上でテストする
  • Dovecotのインストール & 設定
  • Postfix & Dovecotをクライアントから接続できるようにする
  • クライアントからのテスト

参考記事の通り一旦、ゲストOS内でテストするようにしています。

ゲストOSのインストール


Vagrant上にCentOS7.2を構築します。

CentOS7.2のBox

1
vagrant init bento/centos-7.2
1
vagrant up --provider virtualb

この後、Vagrantfileをいじくるために一旦vagrant haltでシャットダウンします。

Vagrantfile


Vagrantfileの設定方法は以前ここで書きました。

下記で動作させます。

  • ネットワーク設定 private
  • メモリ512MB
  • 1コア

ドメインはlocal.mailにしました。
誤配信とかが恐いのでRFC2606で決められてるトップレベルドメインを使用したほうがよいと思います。

※以下、もともとlocal.mailで書いてたのですがmail-server.testで書き直しました。
(でも調べたら.testドメイン使ってる記事とかででこないんだよなぁ…大丈夫かな…)

参考記事

例示/実験用として利用できるドメイン名
まだtest.comやaaa.comをテストデータに使うのはやめましょうという話

ホストOSと同一ネットワークのマシンからも利用できるようにポートフォワーディングを設定します。
ホストOSから以外はメールサーバーを使用しないという場合はポートフォワーディング設定は不要です。

ポートフォワーディングはウェルノウンポートの関係でホスト側の10000番以降くらいを使用します。

設定 内容
ドメイン config.vm.hostname = “mail-server.test”
ポートフォワーディング config.vm.network “forwarded_port”, guest: 25, host: 10025
ポートフォワーディング config.vm.network “forwarded_port”, guest: 143, host: 10143

CentOS(ゲストOS)設定


ゲストOSの設定を行います。

システムのアップデート

1
yum -y update

SELinux無効

1
2
3
vi /etc/selinux/config

SELINUXTYPE=disabled

ファイアウォール設定

  • SMTPを許可
  • IMAP用の143ポートを許可
  • POP3は使用しない
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//smtp許可
firewall-cmd --add-service=smtp --zone=public --permanent

//imap用のポート許可 143
firewall-cmd --add-port=143/tcp --zone=public --permanent
firewall-cmd --add-port=143/udp --zone=public --permanent

//リロード
firewall-cmd --reload

//確認
firewall-cmd --list-all --zone=public --permanent

//結果
public (default)
interfaces:
sources:
services: dhcpv6-client smtp ssh
ports: 143/tcp 143/udp
masquerade: no
forward-ports:
icmp-blocks:
rich rules:

設定したポートがLISTENしているか確認します。

1
2
//Listenポート確認
ss -t -l -n

Postfix


ネットワーク上でメールを転送・配送するソフトの一つです。
SMTPサーバーと理解すればいいハズ…

インストール

1
2
3
4
5
6
7
8
9
10
sudo yum -y install postfix

//起動
service postfix start

//postfixのバージョン確認
postconf | grep mail_version

//自動起動
chkconfig postfix on

設定変更(ゲストOS内でのテスト向け)

初めにゲストOS内でテスト実施するための設定を行います。

1
vi /etc/postfix/main.cf

以下の各項目を設定変更する(その他の項目は省略)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//自身のドメイン設定
mydomain = mail-server.test
myorigin = $mydomain

//ローカルホスト以外からも受け付ける
inet_interfaces = all

//ipv4しか使用しないため
inet_protocols = ipv4

//宛先ドメインに自身のドメインを追加
mydestination = $myhostname, localhost.$mydomain, localhost, mail-server.test

//初めはローカルホストで動かすため
mynetworks = localhost

//メールボックスの形式設定
home_mailbox = Maildir/

再起動する

設定反映のためにPostfixを再起動します。

1
service postfix restart

アカウント作成


メールテスト用のアカウントを2つ作成します。
名前はなんでもいいですが参考記事と同一にしています。

1
2
3
4
5
6
7
8
9
//user1というアカウントを作成する。
useradd user1 -s /sbin/nologin
//任意のパスワード入力
passwd ****

//server1というアカウントを作成する。
useradd server1 -s /sbin/nologin
//任意のパスワード入力
passwd ****

ディレクトリの書き込み権限

user1とserver1が書き込みできるようにする

1
chmod 777 /var/spool/mail

ゲストOS内でテスト実施


ゲストOS内でメールのやり取りができるか確認します。
telnetを使用します。

telnetインストール

1
yum -y install telnet

テスト

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
//ローカルホストの25番ポートに接続
telnet localhost 25

//出力
220 localhost.localdomain ESMTP Postfix

//入力
helo localhost

//出力
250 localhost.localdomain

//入力:送信元アドレス
mail from: user1@mail-server.test

//出力
250 2.1.0 Ok

//入力:宛先アドレス
rcpt to: user1@mail-server.test

//出力
250 2.1.5 Ok

//入力:メールの本文かきますコマンド
data

//出力
354 End data with <CR><LF>.<CR><LF>

//入力:メール本文
helo postfix
//入力:本文書き終えましたコマンド
.

//出力
250 2.0.0 Ok: queued as ・・・

//入力:telnet終了
quit

//出力
221 2.0.0 Bye

/home/user1/Maildir ディレクトリが存在することを確認します。

Dovecot


POP3,IMAPサーバーです。
今回はIMAPのみ使用します。
が、CentOSのファイアウォールでPOP3用のファイアウォールを開けていればPOP3も使用できるはずです。

インストール

1
2
3
4
5
6
7
8
//インストール
yum -y install dovecot

//起動
service dovecot start

//自動起動
chkconfig dovecot on

設定変更(ゲストOS内でのテスト向け)

Dovecotの設定変更を行います。
設定するファイルは複数存在します。

dovecot.conf

下記の項目を変更します。(その他の項目は記述省略)

1
2
3
4
5
6
7
vi /etc/dovecot/dovecot.conf

//使用するプロトコル列挙
protocols = imap pop3 lmtp

//IPv4のみ使用。v6へのバインドを行わない
listen = *

10-mail.conf

下記の項目を変更します。(その他の項目は記述省略)

1
2
3
4
vi /etc/dovecot/conf.d/10-mail.conf

//ファイルの場所を指定
mail_location = maildir:~/Maildir

10-auth.conf

下記の項目を変更します。(その他の項目は記述省略)

1
2
3
4
5
6
vi /etc/dovecot/conf.d/10-auth.conf

//平文認証の許可
disable_plaintext_auth = no

auth_mechanisms = plain login

10-ssl.conf

下記の項目を変更します。(その他の項目は記述省略)
ポートフォワーディングで接続する場合のみ必要です。

1
2
3
vi /etc/dovecot/conf.d/10-ssl.conf

ssl = no

再起動する

設定反映のため、再起動します。

1
service dovecot restart

ゲストOS内でテスト実施


仮想マシン内でメールのやり取りができるか確認します。
telnetを使用します。

1
telnet localhost 143

入力時は数字(1とか2とか)も入力する必要があります。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
//出力
Connected to localhost.

//入力:user1でログイン
1 login user1 パスワード

//出力
Logged in

//入力:ホームディレクトリの一覧を見る
2 list "" *

//出力
* List () "." "INBOX"
2 OK List completed.

//入力:INBOXの中身を見る
3 select INBOX

//出力
1 EXISTS  ←1通のメールがある
1 RECENT  ←最新のメールは1通
3 OK Select completed.

//入力:1通目のメールを見る。送信時のテストのものが見れる。
4 fetch 1 body[]

//出力
From: user1@mail-server.test
To: undisclosed-recipients:;

helo postfix
)
4 OK Fetch completed.

//入力:終了
5 logout

//出力
5 OK logout completed.

ネットワーク設定変更


ホストOS(ポートフォワーディング設定時は他の同一ネットワークのマシンからも)閲覧できるように設定変更します。

Postfix

1
2
3
4
5
6
7
vi /etc/postfix/main.cf

//Vagrantに割り当てているネットワークを追記
mynetworks = localhost, 192.168.33.0/24

//再起動
service postfix restart

Dovecot

1
2
3
4
5
6
7
vi /etc/dovecot/dovecot.conf

//Vagrantに割り当てているネットワークを記述
login_trusted_networks = 192.168.33.0/24

//再起動
service dovecot restart

クライアントからのテスト


特別書くことはないですが、使用しているメーラーでメールの送受信ができるかどうか確認します。
ポートフォワーディングする場合はホストOSのIPおよび、ポートを設定する必要があります。

クライアントからつながらないとき


ターミナルソフトputtyとかで接続モードtelnetでポート指定して試してみると原因特定できるかもしれません。

所感


おもったより簡単で、ゲストOSのインストールから大体半日(4~5時間)でクライアントからポートフォワーディングなしで使用するまで構築できました。
ポートフォワーディングでつなぐ場合はdovecotssl = noを設定する必要があり、ここでさらに数時間かかりました。

トータルで約1日で構築できました。