■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 |