Postfixキュー投入前コンテンツフィルタ


警告

このドキュメントに書かれているキュー投入前コンテンツフィルタリング 機能は、流量が少ないサイトにのみ適しています。詳細は以下の"メリットとデメリット" のセクションを参照してください。

Postfixキュー投入前コンテンツフィルタの機能

バージョン2.1では、Postfix SMTPサーバは入ってくるメール全てを、 Postfixメールキューに入れられる「前に」全てのメールを検査するコンテンツ フィルタリングプロキシサーバに転送できるようになりました。

キュー投入前コンテンツフィルタは以下のように使うことを意図しています:

インターネット -> Postfix SMTPサーバ -> キュー 投入前 フィルタ -> Postfix SMTPサーバ -> Postfix cleanup サーバ -> Postfixキュー -< smtp
local
virtual

キュー投入前コンテンツフィルタを FILTER_README ドキュメントに記述されているアプローチと混同しないでください。そちらは Postfixメールキューに入れられた「後に」メールをフィルタリングするものです。

このドキュメントには以下の話題について書いてあります:

動作原理

フィルタ前のPostfix SMTPサーバがインターネットからの接続を受け付け、通常の リレーアクセス制御やSASL認証、TLSネゴシエーション、RBL検索、存在しない 送信者や受信者アドレスの拒否などを適用します。キュー投入前コンテンツ フィルタはフィルタリングされていないメールコンテンツをPostfixから受け取り、 以下の いずれか1つをおこないます:

  1. SMTPを通してPostfixにメールを再投入しますが、その内容や 配送先は変えられているかもしれません。

  2. Postfixに適切なSMTPステータスコードを送り返すことでメールを 拒否します。PostfixはリモートのSMTPクライアントにそのステータスを 返します。こうすればPostfixはバウンスメッセージを送る必要は ありません。

フィルタ後のPostfix SMTPサーバはコンテンツフィルタからメールを 受け取ります。それ以降Postfixは通常通りメールを処理します。

ここに書かれたキュー投入前コンテンツフィルタは FILTER_README ドキュメントに書かれた キュー投入後コンテンツフィルタのように働きます。多くの場合は以下の "メリットとデメリット" セクションで書かれた制限の 下で、同じソフトウェアを使えます。

キュー投入前コンテンツフィルタリングのメリットと デメリット

Postfix SMTPパススループロキシ機能の設定

以下の例では、フィルタ前Postfix SMTPサーバはメールを localhost ポート 10025 で待つコンテンツフィルタに渡します。フィルタ後のPostfix SMTPサーバは localhost ポート 10026 を通してコンテンツフィルタからメールを受け取ります。 それ以降Postfixは通常通りメールを処理します。

コンテンツフィルタ自身にはここでは触れません。SMTPが使えるならどんな フィルタを使っても構いません。SMTPが使えないコンテンツフィルタ ソフトウェア用には、Bennett Todd のSMTPプロキシがすばらしいPERL/SMTP コンテンツフィルタリングフレームワークを実装しています。 http://bent.latency.net/smtpprox/ を参照してください。

インターネット -> Postfix SMTPサーバ on port 25 -> フィルタ on localhost port 10025 -> Postfix SMTPサーバ on localhost port 10026 -> Postfix cleanup サーバ -> Postfix incoming キュー

これは master.cf ファイルを編集することで設定します:

/etc/postfix/master.cf:
    # =============================================================
    # service type  private unpriv  chroot  wakeup  maxproc command
    #               (yes)   (yes)   (yes)   (never) (100)
    # =============================================================
    #
    # フィルタ前のSMTPサーバ。ネットワークからメールを受け取り、
    # localhost ポート 10025 のコンテンツフィルタに渡します。
    #
    smtp      inet  n       -       n       -       20      smtpd
        -o smtpd_proxy_filter=127.0.0.1:10025
        -o smtpd_client_connection_count_limit=10
    #
    # フィルタ後のSMTPサーバ。コンテンツフィルタからメールを
    # localhost ポート 10026 で受け取ります。
    #
    127.0.0.1:10026 inet n  -       n       -        -      smtpd
        -o smtpd_authorized_xforward_hosts=127.0.0.0/8
        -o smtpd_client_restrictions=
        -o smtpd_helo_restrictions=
        -o smtpd_sender_restrictions=
        -o smtpd_recipient_restrictions=permit_mynetworks,reject
        -o smtpd_data_restrictions=
        -o mynetworks=127.0.0.0/8
        -o receive_override_options=no_unknown_recipient_checks

注意: "=" や "," の前後に空白を置いてはいけません。

フィルタ前のSMTPサーバエントリは、通常 master.cf ファイルの最初で 設定されるデフォルトのPostfix SMTPサーバエントリを修正したバージョン です:

フィルタ後のSMTPサーバは新しい master.cf エントリです:

デフォルトでは、フィルタが仕事をするのに与えられた時間は100秒です。 それ以上かかると、Postfixは諦めてリモートSMTPクライアントにエラーを 報告します。この時間制限を長くすることもできますが (以下のセクションの 設定パラメータを参照)、そうするとリモートクライアントがタイムアウト したときに制御できなくなるので無意味です。

設定パラメータ

プロキシを制御するパラメータ:

Postfixがキュー投入前コンテンツフィルタに話しかける 方法

フィルタ前Postfix SMTPサーバはコンテンツフィルタに接続し、 メッセージを1つ配送して接続を切ります。コンテンツフィルタにメールを 送っている間、PostfixはESMTPを話しますが、コマンドパイプライニングは 使いません。Postfixは独自にEHLO、XFORWARD (localhost [127.0.0.1] の 代わりにリモートクライアントIPアドレスをログに記録するため)、DATA およびQUITコマンドを生成し、フィルタ前Postfix SMTPサーバが拒否 しなかったMAIL FROMおよびRCPT TOコマンドすべてのコピーを改変せずに 転送します。Postfi はその他のSMTPコマンドは送りません。

コンテンツフィルタはフィルタ前Postfix SMTPサーバと同じMAIL FROMおよび RCPT TOコマンド文法を受け付け、そのコマンドを改変せずにフィルタ後SMTP サーバに渡すべきです。フィルタ前SMTPサーバがサポートしている全てのESMTP機能を コンテンツフィルタやフィルタ後SMTPサーバがサポートしていない場合、不足している 機能はフィルタ前Postfix SMTPサーバで smtpd_discard_ehlo_keywords を使って 機能を無効にしておかなければいけません。

フィルタがコンテンツを拒否する場合、フィルタは否定的なSMTP応答を フィルタ前Postfix SMTPサーバに返し、フィルタ後のPostfix SMTPサーバとの SMTPの会話を完了させずに接続を強制切断すべきです。