拒絶ログソーティングスクリプト2014/10/27バージョンアップ(旧バージョンはこちら)S25Rスパム対策方式によって正当なメールサーバが誤って拒絶されているのを発見するのに有用なシェルスクリプトを紹介します。メールサーバがウェブサーバを兼ねているなら、このスクリプトをcgi-binディレクトリ配下のディレクトリにパスワード付きで置くことにより、ウェブブラウザで拒絶記録を容易に監視できます。コマンドとして実行することもできます。機能このスクリプトは、応答コード「4XX」(「後で再試行せよ」の意味;「XX」は数字の組)で拒絶されたアクセスの記録をPostfixのメールログから抽出し(S25Rによるもの以外も抽出されます)、再試行アクセスが連続して並ぶようにソーティングして表示します。クライアントIPアドレス、送信者アドレス、および受信者アドレスとも同じであるアクセスは、連続した行で表示されます。それらのいずれかでも異なるアクセスは、空白行で分断して表示されます。拒絶の理由コードが次の文字で表示されます。rejected(reject_unknown_helo_hostnameを使った場合)O:Other(それ以外)また、最後に次のデータを表示します。count:抽出されたアクセスの総数です。count:クライアントIPアドレスと受信者アドレスがともに同じであるアクセスをメッセージ一通と数えた推定メッセージ数です。これは、スパム対策をしていなければ受けてしまったであろうスパムメッセージの数にほぼ近いと考えられます。送信者アドレスの違いを考慮せずに数えるのは、一通のスパムメッセージが送信者アドレスを変えながら再試行することがあるからです。count:再試行アクセスのシーケンスの数です。これが0でないときは、再試行アクセスを調べてください。正当なメールサーバは、応答コード「4XX」による拒絶に対して、必ず適度な時間間隔を置きながら送信を再試行します。その拒絶の記録は、このスクリプトによって連続して表示されます。したがって、ホワイトリストに登録すべき正当なメールサーバからのアクセスを見つけるのに助けになります(理由コードが「C」か「B」でない場合は、S25Rのホワイトリストにホストを登録しても受信できませんので、ご注意ください)。連続して表示されたアクセスが次のすべての条件を満たすならば、クライアントはホワイトリストに登録すべき正当なメールサーバである可能性があります。再試行間隔が1分以上、4時間以下である。(ただし、一人の送信者が一人の受信者に複数のメッセージを送信したならば、見かけ上の再試行間隔が短くなることがあります。)再試行が30分以上続いている。受信者アドレスが正しい。連続して表示されたアクセスが次のいずれかの条件に該当するならば、クライアントはおそらく、あるいは間違いなく不正です。再試行間隔が1分未満である。再試行が30分未満で止まっている。HELOアドレスがあなたのメールサーバのIPアドレスか、または受信者のドメインである。HELOアドレスが変化している。クライアントが正当か不正か、いずれとも判断しにくい場合は、ひとまずホワイトリストに登録して、もし受信者からスパムの苦情が来たら登録を取り消すのがよいでしょう。必要な設定HTTPデーモンの権限でメールログファイルが読めるようにアクセス権を設定してください。多くのシステムでは、以下のコマンドで設定できます。/var/log/maillog*HTTPデーモンのユーザー・グループ名が「daemon」である場合は、上記の「nobody」を「daemon」に置き換えてください。改造メールログファイル名このスクリプトは、メールログが毎週ローテーションされる私のシステム環境に合わせて、先週と今週のメールログファイルを入力するように書かれています。必要ならば、あなたのシステム環境または監視したい期間に合わせてメールログファイル名を書き換えてください。単独のアクセス記録を抑止するには再試行されなかったアクセスの記録は、空白行で分断された単独の行として表示されます。これは、再試行したように見えたクライアントが実は正当なメールサーバではないと見破るのに役立つかもしれません。単独のアクセス記録が多すぎて監視に邪魔になるなら、それを抑止することができます。Suppress_single_access_records=0という行を次のように書き換えてください。Suppress_single_access_records=1単独のアクセス記録を抑止しても、アクセス総数、推定メッセージ数、再試行アクセスシーケンス数の表示は同じです。(どんな改造もその公表もご自由にどうぞ。