Starpitのエントリーでもコメントに指摘いただいてますが、regexpの適用順がマニュアルに書いてあるのと違っているようです。
例えば、example.jp が 192.0.2.0/24 を持っている場合、基本的にexample.jpからの接続は拒否するのだけど、192.0.2.1からのみ接続を許したい場合、下記のregexpで可能なはずですが、出来ません。
/^192\.0\.2\.1$/ OK /example\.jp$/ REJECT
そのため、check_client_accessを複数行書いて、先のものをホワイトリストとして利用することで対応しました。
マニュアルを確認したところ、regexpテーブルの適用順について
Postfix manual - access(5)
http://www.kobitosan.net/postfix/trans-2.2/jhtml/access.5.html
パターンは検索文字列にマッチするまで、テーブルに指定された順で適用されます。
http://www.postfix.org/access.5.html
Patterns are applied in the order as specified in the table,until a pattern is found that matches the search string.
とあるのですが、実際にコードを見てみると
src/smtpd/smtpd_check.c
check_namadr_access 関数内
/* Look up the host name, or parent domains thereof. … check_domain_access(state, table, name, … /* Look up the network address, or parent networks thereof. … check_addr_access(state, table, addr, …
という感じに記述されており、先にホスト名でのマッチングが行われてから、IPでのマッチングが行われているため、このような動作になってしまうように思います。
そのためRgreyやStarpitで、unknownに対してgreylistingやtarpittingを掛ける設定をしている場合、同じregexpテーブル内でIPでホワイトリストを書いても、それが効いてくれません。
場所はわかったんで、またパッチ書こうかと思ったんですが、これは結構変更めんどくさそう(regexpと他のテーブルでは適用順が違うため、regexp用の適用順で新たに関数を書くのが正しいと思う。)なんで、まずは同じネタが流れたことなかったかをMLで確認してみようと思います。
(関連)
モーグルとカバとパウダーの日記 - Starpitでほぼ誤検出無く98%のスパムを排除 (S25R+tarpittingによるスパム対策)