このドキュメントに書かれているキュー投入前コンテンツフィルタリング 機能は、流量が少ないサイトにのみ適しています。詳細は以下の"メリットとデメリット" のセクションを参照してください。
バージョン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つをおこないます:
SMTPを通してPostfixにメールを再投入しますが、その内容や 配送先は変えられているかもしれません。
Postfixに適切なSMTPステータスコードを送り返すことでメールを 拒否します。PostfixはリモートのSMTPクライアントにそのステータスを 返します。こうすればPostfixはバウンスメッセージを送る必要は ありません。
フィルタ後のPostfix SMTPサーバはコンテンツフィルタからメールを 受け取ります。それ以降Postfixは通常通りメールを処理します。
ここに書かれたキュー投入前コンテンツフィルタは FILTER_README ドキュメントに書かれた キュー投入後コンテンツフィルタのように働きます。多くの場合は以下の "メリットとデメリット" セクションで書かれた制限の 下で、同じソフトウェアを使えます。
メリット: Postfixは入ってくるSMTPメール転送が完了する前に メールを拒否することができるため、Postfixは拒否したメールを送信者 (これは たいてい偽造されています) に送り返す必要がありません。受け入れなかった メールの責任はリモートSMTPクライアントに残ります。
デメリット: リモートSMTPクライアントは期限内にSMTP応答が あることを期待しています。システムの負荷が上がるにつれ、期限内に答えるのに 使えるCPUサイクルの残りがだんだん少なくなっていき、結果としてメールの 受付を止めるかメールのフィルタリングを止める必要が出てきます。キュー 投入前コンテンツフィルタが流量の少ないサイトでのみ使えるというのは、 こういった理由のためです。
デメリット: コンテンツフィルタリングソフトウェアが多量のメモリ リソースを使ってしまうことがあります。メモリを使い果たさないようにする ためには、フィルタ前のSMTPサーバプロセス数を減らして、メールの集中で コンテンツフィルタプロセスを起動しすぎてシステムをダウンしないように します。言い換えると、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セッションの数がデフォルトの100からたった20に 減らされています。これはメールの集中でコンテンツフィルタのプロセスが 多くなりすぎてしまって、動いているシステムがダウンしてしまうことを 防ぎます。
"-o smtpd_client_connection_count_limit=10" は 1つのSMTPクライアントだけで20のSMTPサーバプロセス全てを使って しまわないようにします。この制限は信頼するリレーホストからしかメールを 受けないのであれば不要です。
注意: この設定は安定版Postfix 2.1リリースでは無視されます。 この機能はPostfix 2.2まではexperimental版のみで使えます。
"-o smtpd_proxy_filter=127.0.0.1:10025" は フィルタ前SMTPサーバに、localhost のTCPポート 10025 で待っている コンテンツフィルタに入ってきたメールを渡すように伝えます。
Postfix 2.3はTCPフィルタおよびUNIXドメインフィルタの両方を サポートしています。上のフィルタは "inet:127.0.0.1:10025" のように 指定できました。UNIXドメインフィルタを指定するには、"unix:pathname" を指定します。相対pathnameはPostfixキューディレクトリからの相対パス として解釈されます。
フィルタ後のSMTPサーバは新しい master.cf エントリです:
"127.0.0.1:10026" はフィルタ後のSMTPサーバをネットワークに 晒さないように、localhost アドレスのみで待たせます。「絶対に」フィルタ後の SMTPサーバをインターネットに晒さないでください :-)
"-o smtpd_authorized_xforward_hosts=127.0.0.0/8" によってフィルタ後のSMTPサーバがフィルタ前SMTPサーバからリモート SMTPクライアントの情報を受け取れるようになり、フィルタ後 Postfix デーモンが localstho[127.0.0.1] ではなく、リモートSMTPクライアントの 情報をログに記録できるようになります。
フィルタ後のSMTPサーバの残りの設定は、"フィルタ前" SMTP サーバですでにおこなったことと重複しないようにするためのものです。
デフォルトでは、フィルタが仕事をするのに与えられた時間は100秒です。 それ以上かかると、Postfixは諦めてリモートSMTPクライアントにエラーを 報告します。この時間制限を長くすることもできますが (以下のセクションの 設定パラメータを参照)、そうするとリモートクライアントがタイムアウト したときに制御できなくなるので無意味です。
プロキシを制御するパラメータ:
smtpd_proxy_filter (文法: host:port): キュー投入前コンテンツフィルタのホストおよび TCP ポート。ここに host または host: が指定されないと、localhost が想定されます。
smtpd_proxy_timeout (デフォルト: 100s): キュー投入前コンテンツフィルタへの接続とコマンドや データの送受信のタイムアウト。プロキシエラーはすべて maillog ファイルに ログとして記録されます。プライバシー上の理由から、リモートの SMTP クライアントは "451 Error: queue file write error" しか見えません。 内部の詳細を他人に公開するのは正しいことではないでしょう。
smtpd_proxy_ehlo (デフォルト: $myhostname): キュー投入前コンテンツフィルタにEHLOコマンドを送るときに使うホスト名。
フィルタ前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の会話を完了させずに接続を強制切断すべきです。