土曜日, 7月 21, 2007

逆引き失敗時の拒否メッセージを変更する方法

 Postfixのreject_unknown_client指定によって、逆引きできないクライアントを蹴る時にクライアントに返す拒否メッセージ(ログに残るメッセージでもある)は

450 4.7.1 Client host rejected: cannot find your hostname, [88.245.28.215]

のような形である。送信側のメールサーバのMTAがsendmailである場合、送信が4時間遅延すると送信者に遅延警告メッセージが送られることがある。その時、遅延警告メッセージの中に上記の形のメッセージが表示される。
 Postfixに組み込まれた「cannot find your hostname」というメッセージはつっけんどんである。「あなたのホスト名が見つかりません。あなたがDNS逆引きでホスト名を公開していないからじゃないんですか?あなたのホスト名がわからない限り、私は受け取りませんよ」というニュアンスが感じられる。
 6月2日「拒否メッセージを変更」で、ブラックリストと一般規則で拒否する時のメッセージを、「be patient」(お待ちください)という語句を含むものに変えたことを説明した。「ドメイン検査/S25R検査に引っかかりました。そのままお待ちください。調査の上で受信します」というニュアンスを込めれば、遅延警告メッセージを受けた送信者に不安を与えずにすむだろうと考えてのことである。
 その記事では、初め、逆引きできない時の拒否メッセージを変更するにはsrc/smtpd/smtpd_check.cというソースファイルを編集してリコンパイルする方法があるが、あえて変更するまでもないだろうと述べた。なお、クライアント制限設定ファイル(論文で記載しているファイル名はclient_restrictions)の最後に1行付け加える方法もあると書いたが、バグだと気付いてあわてて消した。
 しかし、逆引きできない時の拒否メッセージも変更したくなった。ソースファイルを編集する方法では、Postfixのバージョンアップのたびに編集を繰り返さなければならないし、ミスをすればトラブルを引き起こす。そこで、設定だけでメッセージを変更する方法を考案した。

 main.cfファイルでのsmtpd_client_restrictionsパラメータの指定を次のようにする。

smtpd_client_restrictions =
  permit_my_networks,
  …(必要ならばここに各種指定)
  check_client_access regexp:/etc/postfix/client_restrictions,
  check_client_access regexp:/etc/postfix/unknown_client_restriction

つまり、reject_unknown_clientをやめて、代わりにもう一つのクライアント制限設定ファイルunknown_client_restrictionを指定する(client_restrictionsファイルとは別のファイルとして設ける必要がある)。unknown_client_restrictionファイルには次の1行を記述する。

/^unknown$/ 450 reverse lookup failure, be patient

 これで、拒否メッセージは次の例のようになる。

450 4.7.1 <unknown[213.91.187.67]>: Client host rejected: reverse lookup failure, be patient

 「逆引きに失敗しました(あなたが逆引きを設定していないせいだとは言っていませんよ。私が逆引き検索をしようとして失敗したと言っているだけです)。そのままお待ちください。調査の上で受信します」というニュアンスを込めることができていると思う。

(7月30日追記)
 この記事にいただいたコメントのおかげで、もっとうまい方法を思い付きました。

2 件のコメント:

荻野 さんのコメント...

> クライアント制限設定ファイル(論文で記載しているファイル名はclient_restrictions)の最後に1行付け加える方法もあると書いたが、バグだと気付いてあわてて消した。

とありますが、別ファイルに分ける必要があるのでしょうか。
Rgrey 方式 http://k2net.hakuba.jp/rgrey/ に紹介されている設定でも S25R パターンの直前に /^unknown$/ を指定しており、当方の経験でもこれで希望どおり動作しているようです。

deo さんのコメント...

荻野さん:
 コメントありがとうございます。
 Rgreyの場合は、ホワイトリスティングがポリシーサーバに委ねられるので、それで支障ないのだと思います。ホワイトリストと拒否条件を同じファイルに書いているから、/^unknown$/で蹴る指定は別のファイルにする必要があります。
 あ、そうか。ホワイトリストファイルと拒否条件のファイルを別々にすればいいんですね。そうすれば、拒否条件のファイルに/^unknown$/もいっしょに組み込むことができそうです。検証してみます。