Postfix のメール受信に制限を掛ける

こんにちは。サイオステクノロジー OSS サポート担当 N です。

RHEL の 標準 MTA として同梱されている Postfix について、メールの受信時の代表的な制限パラメータの動作を確認してみます。
本稿では、下記のメール受信時に動作するアーキテクチャの内、代表的な smtpd(8) で機能する制限をご紹介します。

・メールを受信する仕組み
 http://www.postfix.org/OVERVIEW.html#receiving
・メール受信時の制限
 http://www.postfix.org/TUNING_README.html#server_tips

■環境構成

 RHEL7.6
 postfix-2.10.1-7.el7.x86_64

 メール送信サーバ :sender.example.com
 メール受信サーバ :recipient.example.com
 ※今回は受信サーバ側で制限を設定します。

■動作検証

大量のエラーを発生させる SMTP クライアントの速度を制限する

Postfix の smtpd(8) サーバでは、各セッション毎で発生したエラー数を管理しています。同一セッション内で発生したエラーが一定数を超過すると、その SMTP クライアントへのサーバレスポンスに遅延時間を挿入して、速度を低下させます。それでも尚エラーが発生し続けると、今度は該当のコネクションを切断し、SMTP サーバプロセスが枯渇するのを防ぎます。

各パラメータの現在の設定値は、postconf コマンドで確認できます。

デフォルトでは以下のような挙動になります。

「同一セッション内で、エラー数が 10回を超えると、サーバレスポンスが 1秒間遅延し、20回を超えるとコネクションを切断」
また、セッション内のエラーをカウントするので、一度でも正常にメールを受信するなどしてセッションが終了すると、エラーのカウントはリセットされます。

送信サーバから telnet コマンドで受信サーバへ接続し、上記の制限を確認してみましょう。

 メール送信元アドレス :root@sender.example.com
 メール送信先アドレス :nobody-user@recipient.example.com
 ※「nobody-user」は Postfix サーバ上には存在しない架空のユーザです。
  したがって、宛先に指定すると 550 応答が返されエラーになります。

### ここまででエラー 10回目 [以降、遅延処理 (+1秒) が入る] ####

### ここまででエラー 20回目 [次でコネクション切断] ####

接続数が多すぎる SMTP クライアントとのコネクション数を制限する

Postfix の smtpd(8) サーバでは、同一の SMTP クライアントからの同時接続数を制限したり、Postfix anvil(8) サービスと連携して、単位時間あたりの接続レートを制限することができます。

デフォルトでは、同時接続数 (smtpd_client_connection_count_limit) は有効ですが、
単位時間あたりの制限 (*_rate_limit) は無効になっています。

 ※これらの制限は、正当なメール受信経路を規制するための使用は避けてください。
  これらは、不正な SMTP クライアントから smtpd(8) サーバを保護する目的 (つまりスパムメールへの対策などの為に) 設計されています。

送信サーバから telnet コマンドを実行して受信サーバへ接続し、上記の制限を確認してみましょう。
デフォルト値では、smtpd を最大100プロセス×コネクション数を最大50個まで許容します。

簡単にするため、以下のように、プロセス数 (default_process_limit) を1、プロセス当たりのコネクション数 (smtpd_client_connection_count_limit) を3に設定します。

つまり、同一の SMTP クライアントからの同時接続上限が3に制限されます。

 

[main.cf]

送信元サーバで複数の端末を開いて telnet を 4回実行し、受信サーバ側で netstat を実行してコネクション数を確認します。コネクション3つまでは ESTABLISHED (確立済み) となりますが、4つ目 (ポート:59086) では SYN_RECV (SYN受信済み) で止まり、コネクションを確立 (ESTABLISHED) できません。

この状態で ESTABLISHED のコネクション (ポート:59080) で “quit” を送信し、コネクションをクローズさせます。

すると、SYN_RECV だったコネクションが ESTABLISHED に変化し、コネクションが確立されたことが分かります。

最後に

今回はメール受信時、smtpd(8) で動作する制限パラメータについて動作検証を実施しました。
メール送信時に使用される smtp(8) と混同されがちですが、アーキテクチャそれぞれの役割を意識して、適切に設定したいですね。

次回は smtp(8) で動作するパラメータで、メール送信時の制限について動作検証を実施してみようと思います。

>> 雑誌等の執筆依頼を受付しております。
   ご希望の方はお気軽にお問い合わせください!

ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

0人がこの投稿は役に立ったと言っています。

コメント投稿

メールアドレスは表示されません。


*