2018/05/22 CentOS6.3





インターネットへ向けて送信しない閉じたメールサーバ

LAN内でシステムのSMTP/POPの動作試験を行うときに使います。
もちろん、インターネットへ向けて送信できるようにすればメールサーバの出来上がりです。

監視サーバの通報やメールフィルタリングのようにLAN内でメールシステムの検証をするとき、テスト用サーバとして重宝します。

このページではPostfix + Dovecot の組み合わせで構築します。

条件
 メールドメインをexample.localとします。
 自身が持つメールドメイン宛のメールを受け付けます。
 POP3によりメール取得を受け付けます。
 外部へは転送しません。
 (外部へ転送したい場合はPostfixの設定が変わるだけです。Postfixでメールサーバを構築する(解説))
 postfixで受信したメールは /var/mail/アカウント名 で保存される。
 保存形式はmaidir形式(1メール1ファイル)か、MailBox形式(全メール1ファイル)で保存する。
 保存用のメールディレクトリが無い場合は、自動作成されるようにしておく。
 


Postfixをインストールする
Postfixを設定する
送信宛のメールアカウントを作成する
メールディレクトリを自動作成できるようにする
TelnetでSMTPの動作を確かめる

Dovecotを設定する
POPアカウントを試験する

Postfixをインストールする
postfixがインストールされているか確かめ、見つからなければPostfixをインストールします。

#rpm -q postfix
(Postfixとバージョン番号が表示されるか?)

表示されなければコマンドでインストールします。
#yum install postfix

インストールしても、Postfixは起動しません。一見起動したように見えますが、statusを見ると起動してません。
これはデフォルトでSendmailが起動しているので、すでに25番ポートが使用されているからです。

sendmailを止めてPostfixを起動させます。

#service sendmail stop  (Sendmailを止めます)
#chkconfig sendmail off (自動起動を止めます)
#service postfix start   (Postfixを起動させます)
#chkconfig postfix on   (自動起動を有効にします)
#service postfix status  (動作を確認します)

「telnet localhost 25」などとして25番ポートのPostfixへアクセスできるか確認します。
ファイアウォールが開いているか確認しておきましょう。


Postfixを設定する
次にPostfixの設定ファイルを編集します。
/etc/postfix/main.cfを次のように編集します。

/etc/postfix/main.cf


mydestination = $myhostname, localhost.$mydomain, example.local (追加)
特に重要なパラメータ。
ここで指定したドメインと同じドメインのメールが到着すると自分宛のメールと認識され、ローカルディスクへ保存されます。

inet_interface = all
どのIPアドレスへサービスをバインドするかです。
デフォルトはlocalhostへバインドされていますので、メールサーバ自身しかPostfixへアクセスできません。
とりあえず全てのIPアドレスでサービスを提供しましょう。

inet_protocols = ipv4
バインドするIPアドレスをIPv4に限定させます。
IPv6が無い場合の、とりあえず起動エラーを避けるためです。

mynetworks = localhost
無条件に外部ドメインへメールをリレーするクライアントを指定します。
localhostが指定されているので、localhostからはどこへでも送信できますが、それ以外のパソコンからはメールを中継することはできません。
なお、localhostだけに制限されていても自分宛て(example.local宛)のメールは全てのアドレスから受信可能ですので問題ありません。


次にメールボックスの形式を以下2種類から選択します。
CentOSのPostfixはデフォルトはメールスプールへMailBox形式で保存します。
MailBox形式は、全てのファイルを1ファイルへ保存します。
MailDir形式は1メールを1ファイルで保存します。

●MailBox形式の場合(全メール1ファイル・Postfixのデフォルト)

/var/mailに、ユーザー別のファイル名でmbox形式で保存

#home_mailbox = Mailbox コメントアウト
mail_spool_directory = /var/mail

home_mailbox をコメントアウトし、mail_spool_directory でディレクトリを指定。
home_mailboxが指定されていないので、mboxはユーザー名で保存されます。

mail_spool_directoryで指定したディレクトリにファイルが保存されます。
mail_spool_directoryをコメントアウトすると、デフォルトの/var/mailが指定されたものとみなされます。


なお「home_mailbox=Mailbox」を有効にすると、ユーザーのホームディレクトリにMailboxというファイル名で
mboxが保存されます。
mail_spool_directoryの設定は無視されます。


●MailDir形式の場合(1メール1ファイル)

/var/mailへ、ユーザー別のディレクトリ名で保存

#home_mailbox = Maildir/  コメントアウト

mail_spool_directory = /var/mail/  (末尾へスラッシュを加える

home_mailboxをコメントアウトし、mail_spool_directory でディレクトリを指定。
末尾にスラッシュを付けると、mail_spool_directory以下に、ユーザ名でMailDirを保存します。
mail_spool_directoryを変更した場合は、変更後のディレクトリにpostfixのアクセス権があるか注意しましょう。
アクセス権の変更は「MailDirの場合、メールディレクトリを自動作成できるようにする」で後述します。


なお「home_mailbox=Maildir/」を有効にすると、ユーザーのホームディレクトリにMaildirというディレクトリ名で
MailDir形式で保存されます。こちらも、末尾にスラッシュを加えます。
mail_spool_directoryの設定は無視されます。



一応追加のパラメータ

mydomain = example.local
myoriginal = $mydomain
検証レベルの動作には影響しません。
$mydomainとして変数として参照されたり、他のパラメータのデフォルト値として採用されることがあります。


ここまで設定したら、Postfixにコンフィグを読み込ませます。

#service postfis restart


メールアカウントを作成する
メールサーバでメールを受け付けるためには、宛先となるメールアカウントが必要です。
メールアカウントとは、CentOS上のユーザアカウントです。

#useradd user1 -s /sbin/nologin
#passwd user1


メールを受信するためだけでログイン権限を与えるのは危険なので、ログインできない制限アカウントを作ります。
パスワードも設定します。これがメール受信時のパスワードになります。

外部からexample.local宛のメールを受け付け、/var/mailに保存されることを確認しましょう。


MailDirの場合、メールディレクトリを自動作成できるようにする
メールアカウントはあり、保存すべきディレクトリが未作成の場合、自動作成してくれると管理が楽です。

ただしデフォルトではメールディレクトリを作成してくれません。
Postfixに、というよりメールアカウント(一般ユーザ)に/var/mailディレクトリへの書き込み権が
ないからです。
(※MailBox形式の場合、/var/spool/mailの設定を変更しなくてもメールファイルを保存可能です)

通常、mailディレクトリは、所有者がroot、グループがmailとなっています。
/var/mail ディレクトリの実体は /var/spool/mail にあります。
したがって、以下のコマンドで所有者とアクセス権を確認します。

#ll /var/spool/mail

と入力すると。デフォルトのアクセス権は「drwxrwxr-x root mail」となっていると思われます。
メール user1@example.localが着信すると、user1の権限でディレクトリを作成しようとします。
rootユーザとmailグループ以外のユーザには書き込み権(w)がないので、失敗します。
以下のコマンドで、一般ユーザにもディレクトリ作成権利を与えます。

#chmod o+w /var/spool/mail
もしくは
#chmod 777 /var/spool/mail

これで、メールが着信すると、自動でメールディレクトリが作成されます。
ただしすでにMailbox形式のファイルが作成されていると、重複によりメールディレクトリの作成に失敗します。先に削除しておきましょう。

※ディレクトリの権限を777にすることで、注意すべきがあります、
/var/spool./mailディレクトリが777となっているため、このディレクトリ配下にあるファイルは一般ユーザでも 削除可能です。ただし以下2点により現実には問題になりません。
  ・ファイルを削除できても、メールディレクトリは閲覧・削除できないので問題にはなりません。
  ・純粋なメールサーバなら、管理者かそれに準ずるユーザしかログインできません。

この「/var/mail以下に全メールディレクトリを集める」運用方式の唯一の欠点は、メールアカウントを削除してもメールディレクトリが残ってしまう点です。
メールユーザを削除したら、メールディレクトリも忘れず削除します。
/home/user/maildir で管理するシステムの場合、ユーザを削除するとホームディレクトリも一緒に削除してくれるので、ゴミが残るということはありません。


TelnetでSMTPの動作を確かめる
telnetでSMTPのメールを送信するのは面倒ですが、テストのためにはよく使います。
telnetのメール送信はSMTPの動作不良を確認するのに大事なスキルです。
身に着けておきましょう。

「telnet SMTPサーバアドレス 25」として直接SMTPサービスにログインし、SMTPコマンドを実行します。

太字部分が入力内容です。

220 localhost.localdomain ESMTP Postfix
helo localhost
250 localhost.localdomain
mail from: user1@example.local
250 2.1.0 Ok
rcpt to: user1@example.local
250 2.1.5 Ok
data
354 End data with <CR><LF>.<CR><LF>
helo postfix
.
250 2.0.0 Ok: queued as 0625633CC90
quit
221 2.0.0 Bye

メールサーバのuser1ディレクトリにファイルが増えていることを確認します。
#ls /var/mail/user1

SMTPの仕事は、受信したメールをディレクトリにファイルとして保存するだけです。
パソコンがサーバからメールを取り出すには、POPサービスを使用します。


Dovecotを設定する
Dovecotがインストールされているか確かめます。

#rpm -q dovecot

表示されなければコマンドでインストールします。
#yum install dovecot

インストールが正常終了しても、起動エラーすることが多いです。
デフォルトのコンフィグが環境に合わないことがあるからです。


/etc/dovecot/dovecot.conf

listen = * #IPv6へのバインドを止め、IPv4へのみバインドする

IPv6環境が構成されていない場合、ここで起動エラーを出力します。


/etc/dovecot/conf.d/10-mail.conf

メールスプールの形式(MailDirからMBoxか)に合わせて設定します。
Postfixがメールを保存している形式に合わせます。

●MailDir形式の場合(1メール1ファイル)
mail_location = maildir:/var/mail/%u

/var/mail/ユーザ名で保存されているメールディレクトリ式のメールを取り出す設定です。
各ユーザーのホームディレクトリにメールディレクトリが保存されている場合は、
mail_location = maildir:~/Maildir
と設定します。


●MailBox形式の場合(全メール1ファイル・Postfixのデフォルト)
mail_location = mbox:/var/empty:INBOX=/var/mail/%u:INDEX=MEMORY

なおIMAPを用いる場合はメールボックス以外に各ユーザーごとにディレクトリが必要です。
通常は以下のようにホームディレクトリへまとめて保存させます。
mail_location = mbox:~/mail:INBOX=/var/mail/%u
設定の意味は「基本ディレクトリはユーザーのホームフォルダへmailとして保存し、メール本文(INBOX)は/var/mailに保存します」です。


/etc/dovecot/conf.d/10-auth.conf

disable_plaintext_auth = no   #yesからnoへ変更

POP3通信時の平文の認証を許可します。
デフォルトでは暗号化されたパスワードしか受け付けないので、POP3が動作しません。


/etc/dovecot/conf.d/10-ssl.conf

#ssl = required #コメントアウト

いつの頃からか、プレーンテキストでPOP3通信しようとすると、TLSやSSLなどの暗号化が強要されます。
ここでSSL通信強制を無効化しておきます。


POPアカウントを試験する
メールクライアントから、メールの送受信試験をします。

SMTP/POPサーバ CentOSのアドレス
メール送信者 user1@example.local
宛先 user1@example.local
本文やタイトルは適当

user1@example.localへ向かって正常にメールが送信でき、そして受信出来たでしょうか。

LAN内の検証用のメールサーバとしては、これで十分でしょう。
実際に運用する場合は、さらにPostfixの補強が必要です。






prev.gif