■Postfixのインストール
一昔前ではメールサーバはsendmail+qpopperが主な組み合わせですが、ここ最近ではpostfix +dovecotとなりました。時代の変化ですね。sendmailといえば難解なcfファイルを設定しなければいけなかったのですが、その点postfixの設定は非常にわかりやすいです。先ずはpostfixをyumからインストールします。
# yum install postfix # rpm -qa | grep postfix postfix-2.10.1-6.el7.x86_64 |
/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を起動します。
# systemctl enable postfix # systemctl start postfix |
これで必要最低限の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のコマンド操作
知ってるとそのうち役にたつPostfixのコマンド群です。
コマンド | 説明 |
postfix check | 設定ファイルをチェックする |
postfix reload | 設定をリロードする |
postfix flush | メールキューを手動配送する |
postconf -n | 現在の設定を表示する |
postqueue -p | キュー内のメールの情報を表示する |
postqueue -f | キュー内のメールを強制排出する |
postcat -q <ID> | 特定のメールの内容を表示する |
postsuper -d ALL | 全てのメールキューを削除する |
postsuper -d <queue id> | 特定のメールキューを削除する |
今現在、キューがどれだけ滞留しているかわかりやすく確認するシェルスクリプトが以下です。
# vi queue_count.sh #!/bin/sh QUEUE_PATH="/var/spool/postfix" echo "### Postfix MailQueue File Count(PATH:$QUEUE_PATH) ###" for i in `ls $QUEUE_PATH` do echo -n $i : ls -l $QUEUE_PATH/$i/* | grep "^-" | wc -l done 2> /dev/null |
上記を実行すると以下のような結果が得られて便利です。
# ./queue_count.sh ### Postfix MailQueue File Count(PATH:/var/spool/postfix) ### active :0 bounce :0 corrupt :0 defer :26 deferred :26 flush :1 hold :0 incoming :0 maildrop :0 pid :12 private :0 public :0 saved :0 trace :0 |
SMTP Authを利用して運用していると特定アカウントのパスワードが取られ、そのアカウントを利用してSPAM発信されることが過去に多々ありました。容易なパスワードを設定しないというのが本来の対策なのですがもしそういったことが起きた際には特定のfromアドレスやtoアドレスを元にキューに溜まったメールを削除したいことがあります。
このとき、以下のコマンドで特定のキューを削除することが可能です。
mailq | tail -n '+2' | grep -v '^ *(' | awk 'BEGIN { RS = "" } { if ( $7 == "送信元アドレス" && $8 == "送信先アドレス" && $9 == "") print $1 }'| tr -d '*!' | postsuper -d - |
$7は送信元アドレス、$8以降は送信先アドレスとなっています。どちらかだけで良い場合は一方だけを指定すれば良いことになります。
■Dovecotのインストール
dovecot(ダブコット)を用いてpop3/imap4サーバを構築します。特にLDAP連携等は行わずSSLも使用しない極めて単純なPOP/IMAPサーバでOSのアカウントを用いる手法です。dovecotをyumからインストールします。
# yum install dovecot # rpm -qa | grep dovecot dovecot-2.2.10-4.el7_0.1.x86_64 |
/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を有効にして起動します。
# systemctl enable dovecot.service # systemctl start dovecot.service |
以上 で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 |