UnixPower on Networking
  http://www.unix-power.net/

 
 Top - Linux - CentOS Postfix




■Postfixのインストール


一昔前ではメールサーバはsendmail+qpopperが主な組み合わせですが、ここ最近ではpostfix +dovecotとなりました。時代の変化ですね。sendmailといえば難解なcfファイルを設定しなければいけなかったのですが、その点postfixの設定は非常にわかりやすいです。先ずはpostfixをyumからインストールします。

# yum install postfix
# rpm -qa | grep postfix
postfix-2.6.6-2.2.el6_1.i686

/etc/postfix/main.cfが設定ファイルとなります。以下、編集部分のみ記載致します。

# vi /etc/postfix/main.cf

myhostname = mail.unix-power.net
mydomain = unix-power.net
myorigin = $myhostname
#inet_interfaces = localhost
inet_interfaces = all
inet_protocols = ipv4
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
mynetworks = 192.168.0.0/16, 127.0.0.1
home_mailbox = Maildir/

smtpd_recipient_restrictions = permit_mynetworks
reject_unauth_destination


メールの保存形式はMaildir形式が主流です。Mailbox形式では/var/spool/mail配下に ユーザ名で1ファイルにメールが溜まり続けていきますがMaildir形式では各ユーザのホームディレクトリに1通づつメールが溜まっていきます。これに対応させるために以下のコマンドを実行します。

# mkdir -p /etc/skel/Maildir/{new,cur,tmp}
# chmod -R 700 /etc/skel/Maildir/


上記を実行した後、ユーザを追加すると自動的にホームディレクトリにMaildirが作成され、ここにメールが溜まっていきます。これでpostfixを起動します。

# /etc/rc.d/init.d/postfix start


これで必要最低限のSMTPサーバは完成です。


■メール配送の設定

main.cfに次の例のように設定を追加することで、外部へ送信するメールを特定ホストへ送るよう指定します。下記の設定では全てのメールをmail-gw.unix-power.netのMXレコードを参考にメールを配送します。MXレコードを無視して送るには[mail-gw.unix-power.net]のように指定します。

relayhost = mail-gw.unix-power.net


relayhostを設定すると全てのメールの配送方法を変更することになります。ただ、実際には特定のドメイン宛のメールだけを特定ホストに送りたい場合があります。postfixでは/etc/postfix/transportに個別の配送先を指定することができます。まず、main.cfに次の設定を追加し静的なメール配送の設定を行います。

transport_maps = hash:/etc/postfix/transport


transportには転送先のパターンに基づいて様々な設定を行うことができます。以下、記述例です。

# vi /etc/postfix/transport

# unix-power.netドメイン宛てのメールはローカルで処理
unix-power.net                 local:

# sub.unix-power.net宛てのメールはmail-gw.unix-power.netに転送
sub.unix-power.net             smtp:mail-gw.unix-power.net:25

# remote.unix-power.net宛てのメールは192.168.12.1に転送
remote.unix-power.net          smtp:[192.168.12.1]:25


このファイルの設定は$mydestinationで指定する受信アドレスの指定より優先されますので、local:を使って明示的にローカル宛てのメールを記載するようおすすめいたします。また、transportファイルを変更した場合はpostmapコマンドでファイルをデーターベース形式に変換しておく必要があります。

# postmap /etc/postfix/transport


■メールリレーの設定

mynetworksではこのメールサーバを使ってメールをリレーすることを許可するネットワークを指定することができます。メールサーバをインターネットに接続する場合にはこの設定は必ず必要です。

mynetworks = 192.168.12.0/24, 127.0.0.1


Postfixはmynetworksで指定された信頼できるクライアントからのメールは無条件に許可しますが、それ以外のクライアントからは$relay_domainsに指定された宛先のメールしか受け取りません。Postfixはこのパラメータの指定がない場合は$mydestinationの値を使用します。$relay_domainsの指定を行う場合には$mydestinationに指定してある値も明示的に設定する必要があります。

relay_domains = $mydestination, ok.unix-power.net


■受信時のエラーに対する遅延処理

Postfixはメール送信者から受信処理中にエラーを検出した場合に応答を遅延する機能をもっています。このエラーはプロトコル上のエラーだけでなく宛先不明などのエラーに対しても適用されますのでメールアドレスを変更しながら大量のメールを送信してくるSPAMホストやウィルスによるメール送信などの場合に適用されます。


以下はエラー数がnum個より大きくなったら応答遅延を開始するという設定でデフォルトは10です。

smtpd_soft_error_limit = <num>


応答遅延を行う場合にどれぐらいの時間を遅延するかという設定です。デフォルトは1秒です。

smtpd_error_sleep_time = <time>


応答遅延を行なってもエラーが継続して発生した場合はnum個以上のエラーは許容しないという設定です。デフォルトは20で、この制限に抵触した場合にはPostfixはSMTP接続を強制的に切断します。

smtpd_hard_error_limit = <num>


■クライアントごとのリソースと使用率の制御

Postfixではメール受信時にメール送信元のSMTPクライアントごとにリソースや速度の制御が実施できます。anvilサービスと呼ばれる個別のサービスプロセスが導入され、SMTPクライアントごとの接続数やメール送信数を管理します。この機能によって大量のメールを送り付けるSPAMホストに対する対策を実施することができます。


以下では、anvilが管理するクライアントの使用率を測定する単位時間の長さを設定します。以降の解説で単位時間と表現するのはこの時間です。デフォルトは1分です。

anvil_rate_time_unit = <time>


同じメール送信元からの同時接続数を<num>に制限します。同時に多数の接続を行い大量のメールを送信してくるSPAMホストなどに対する対策として有効と思われます。デフォルトは50であり、0を設定するとこの機能は無効になります。

smtpd_client_connection_count_limit = <num>


同じ送信元から単位時間に接続を行うことのできる回数を制限します。これにより同時にとまでもはいかなくても次々に接続を繰り返し送信し続けるホストに対して制限をかけることが可能となります。これはデフォルトで0に設定されており無効になっています。

smtpd_client_connection_rate_limit = <num>


同じ送信元から単位時間にメールを送信する宛先数を制限します。これによりメールの宛先数をコントロールすることができるようになります。これはデフォルトは0であり機能が無効になっています。

smtpd_client_recipient_rate_limit = <num>


同じ送信元から単位時間にメールを送信する数を制限します。これにより現実的なメールの送信通数をコントロールすることができるようになります。これはデフォルトは0であり機能が無効になっています。

smtpd_client_message_rate_limit = <num>


上で記載したクライアントごとの送信制限から除外する対象を設定します。特に設定しない場合はmynetworkで指定したホストを除外します。

smtpd_client_event_limit_exceptions = <network>


anvilサービスは実際に制限が実施されたクライアントについて定期的に最大の接続数と使用率をログに出力します。この値でその時間間隔を指定することができます。デフォルトは10です。

anvil_status_update_time = <time>


クライアントごとの制限では送信元がIPアドレスを変えながら接続してきた場合には対策できず十分とはいえません。クライアントごとではなくサーバ全体で制限することも可能です。

以下では1回のメッセージ配送で受け付けることが可能な最大宛先数の設定です。デフォルトは1000です。

smtpd_recipient_limit = <num>


■メッセージサイズと再送制御

message_size_limit でメールサイズを制限しています。単位はバイトとなるので下の例では20MBに設定しています。

message_size_limit = 20480000


メールを送ろうとしたとき、何らかの理由(相手とSMTPのコネクションが張れない等)の場合はメールがキューに入ります。その後、一定の間隔で再送を試みるのですが、これの細かいパラメータを指定してるのが下記のパラメーターとなります。


この例では7日間たてば諦めて送信元にエラーメッセージを返すという動きになります。


# キューに保存される期間
maximal_queue_lifetime = 7d
# キューに保存されたが配送不可能と判断する期間
bounce_queue_lifetime = 7d # キューをチェックする間隔
queue_run_delay = 300s

# 再送処理間隔の最短時間。1回目の再送処理はこの間隔で行われ2回目以降は2倍づつ上げていく
minimal_backoff_time = 1000s # 再送処理間隔の最大時間。minimalから2倍づつ値を上げていくがmaximalが最大値となる
maximal_backoff_time = 4000s


■PostfixのSMTP認証

各組織のローカルネットワークからのみメールが送信 できるように設定するのが一般的ですが外部からも送信できたほうが便利です。但し、無条件に外部から送信できてしまうとこれを悪用されることがありSPAMメールの踏み台とされてしまいます。これを回避するため外部からのメール発信には必ず一度認証を通す必要があるよう設定します。これをSMTP認証と呼びます。ここではSMTP認証に使用するアカウントはUNIXアカウントを使用します。

必要なソフトがインストールされていなければyumからインストールします。

# yum install cyrus-sasl cyrus-sasl-plain
# rpm -qa | grep cyrus
cyrus-sasl-2.1.23-13.el6_3.1.i686
cyrus-sasl-plain-2.1.23-13.el6_3.1.i686
cyrus-sasl-lib-2.1.23-13.el6_3.1.i686


UNIXアカウントを認証に使用する場合は以下の ファイルを編集する必要があります。

# vi /etc/sysconfig/saslauthd

#MECH=pam
MECH=shadow

そしてpostfix側の設定を変更します。以下、編集部分のみ記載します。

# vi /etc/postfix/main.cf

# smtpd_recipient_restrictions = permit_mynetworks
# reject_unauth_destination

smtpd_recipient_restrictions = permit_mynetworks
permit_sasl_authenticated ※SMTP認証を行ったクライアントは許可
reject_unauth_destination

# SASL認証を有効化する smtpd_sasl_auth_enable = yes # mynetworks以外で匿名での接続を拒否する
smtpd_sasl_security_options = noanonymous
# 規格外の動作に対応させる
broken_sasl_auth_clients = yes


サブミッションポート( TCP/587 )をオープンにしておき、これを経由する際はSMTP Authを必須とします。下記の編集の実際はコメントアウトです。

# vi /etc/postfix/master.cf

submission inet n       -       n       -       -       smtpd
#  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject


ここまでで設定は完了なのでCyrusを起動しPostfixもリロー ドします。。


# /etc/rc.d/init.d/postfix reload
postfix を再読み込み中: [ OK ]
# /etc/rc.d/init.d/saslauthd start
saslauthd を起動中: [ OK ]

コマンドラインから動作確認を行います。Cyrusにtestsaslauthdコマンドというのが用意されていますのでこれを利用します。


# testsaslauthd -u test -p password
0: OK "Success."

上記のように「OK "Success."」と表示されれば認証は成功しています。さらにPostfixでSMTP認証が正常に機能しているのか下記のコマンドから確認可能です。


# telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 mail.unix-power.net ESMTP Postfix
EHLO unix-power.net
250-mail.unix-power.net
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-AUTH PLAIN LOGIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
AUTH LOGIN
334 VXNlcm5hbWU6

上記のAUTH LOGINを発行した際にエラーが出なければOKです。


■telnetでメール送信


現地でメールサーバを構築してテストしようとしたときに客先によっては端末をネットワークに繋げれずテストが出来ないときがあります。そういった場合にはサーバ自身からtelnetコマンドを叩いてメール送信のテストを行うことが出来ます(完全なテストというわけではないですが)。その場合のコマンドが以下です。

# telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 mail.unix-power.net ESMTP Postfix
HELO unix-power.net
250 mail.unix-power.net
MAIL From: mailuser1@unix-power.net
250 2.1.0 Ok
RCPT To: mailuser2@unix-power.net
250 2.1.5 Ok
DATA
354 End data with <CR><LF>.<CR><LF>
From: mailuser1@unix-power.net
To: mailuser2@unix-power.net
Subject: Test
Hello!

.
250 2.0.0 Ok: queued as 3EDA640AEC
quit
221 2.0.0 Bye
Connection closed by foreign host.



■Postfixのコマンド操作


知ってるとそのうち役にたつPostfixのコマンド群です。

 コマンド 説明 
postfix check 設定ファイルをチェックする 
postfix reload 設定をリロードする 
postfix flush  メールキューを手動配送する 
postconf -n  現在の設定を表示する 
postqueue -p  キュー内のメールの情報を表示する 
postqueue -f キュー内のメールを強制排出する 
postcat -q <ID>  特定のメールの内容を表示する 
postsuper -d ALL  全てのメールキューを削除する 
postsuper -d <queue id>  特定のメールキューを削除する 



■Dovecotのインストール


dovecot(ダブコット)を用いてpop3/imap4サーバを構築します。特にLDAP連携等は行わずSSLも使用しない極めて単純なPOP/IMAPサーバでOSのアカウントを用いる手法です。dovecotをyumからインストールします。

# yum install dovecot
# rpm -qa | grep dovecot
dovecot-2.0.9-2.el6_1.1.i686

/etc/dovecot/dovecot.confがメイン設定ファイルとなります。以下、編集部分のみ記載致します。

# vi /etc/dovecot/dovecot.conf

#protocols = imap pop3 lmtp
protocols = imap pop3
#listen = *, ::
listen = *


dovecotは2.0から設定ファイルが分割され少々ややこしくなっています。
その中から必要なファイルを修正していきます。

# vi /etc/dovecont/conf.d/10-mail.conf

mail_location = maildir:~/Maildir
# vi /etc/dovecont/conf.d/10-auth.conf

disable_plaintext_auth = no
# vi /etc/dovecont/conf.d/10-ssl.conf

ssl = no


以下のコマンドでdovecotを起動します。


/etc/rc.d/init.d/dovecot start


以上 でPOP/IMAPサーバの完成です。
SMTPサーバの時と同様にtelnetから動作確認を行うことが可能です。

# telnet localhost 110
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
+OK Dovecot ready.
user xxxxx
+OK
pass *******
+OK Logged in.
list
+OK 1 messages:
1 514



 
 関連記事
 Postfix+Mailmanのインストール
 Postfix+Dovecot+OpenLDAPの設定
 PostfixAdmin+Dovecot+MySQLのインストール
 Postfixでバーチャルドメイン

 Postfix+AMaViS+Clamavのインストール
 RoundCubeのインストール
 Copyright(C) 2003-2015 UnixPower on Networking All rights reserved.