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


警告

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

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

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

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

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

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

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

動作原理

フィルタ前の Postfix SMTP サーバがインターネットからメールを受信して 通常のリレーアクセス制御や SASL 認証、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 コマンドすべてのコピーを改変せずに 転送します。SMTP プロキシサーバは Postfix SMTP サーバと同じ MAIL FROM および RCPT TO コマンドの文法を受け付けなければいけません。Postfix は その他の SMTP コマンドは送りません。

フィルタ前 Postfix SMTP サーバから、通常は標準ではないポートで 待っているフィルタ後の Postfix SMTP サーバへは、コンテンツフィルタは SMTP コマンドを改変しないで渡すことが期待されています。フィルタが コンテンツを拒否する場合、フィルタは否定的な SMTP 応答をフィルタ前 Postfix SMTP サーバに返し、フィルタ後の Postfix SMTP サーバとの SMTP の 会話を完了させずに接続を強制切断すべきです。

Postfix からプロキシへの相互作用の詳細は、"透過性" というタイトルのセクションにあります。

透過性

フィルタ前 Postfix SMTP サーバは承認された MAIL FROM、RCPT TO および DATA コマンドを転送しますが、TLS や SASL コマンドのような他のコマンドは 転送しません。なので透過的ではないかもしれません。

一方、リアルタイムコンテンツフィルタは透過的でなければいけません。 非透過的リアルタイムコンテンツフィルタをサポートするためには、Postfix は フィルタ前 Postfix ESMTP 機能と Postfix がリアルタイムコンテンツ フィルタから受け取る機能を組み合わせなければいけないでしょう。

そのため、Postfix SMTP サーバはキュー投入前コンテンツフィルタに関して 透過することはできません。