モーグルとカバとパウダーの日記

モーグルやカバ(EXカービング)山スキー(BC)などがメインの日記でした。今は仕事のコンピュータ系のネタが主になっています。以前はスパム対策関連が多かったのですが最近はディープラーニング関連が多めです。

postfixでのregexp適用順がマニュアルの記述と違う

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に対してgreylistingtarpittingを掛ける設定をしている場合、同じregexpテーブル内でIPでホワイトリストを書いても、それが効いてくれません。
場所はわかったんで、またパッチ書こうかと思ったんですが、これは結構変更めんどくさそう(regexpと他のテーブルでは適用順が違うため、regexp用の適用順で新たに関数を書くのが正しいと思う。)なんで、まずは同じネタが流れたことなかったかをMLで確認してみようと思います。


(関連)

モーグルとカバとパウダーの日記 - Starpitでほぼ誤検出無く98%のスパムを排除 (S25R+tarpittingによるスパム対策)