mod_rewrite で RBL を使ったアクセス制御を行う
RBLを使ったアクセス制限をしたかったんだが、apache標準ではそういうモジュールは存在しない。第3者によるモジュールの実装やパッチ*1は存在するがapacheのバージョンによって使えるモジュールやパッチがまちまちだし実装によって設定方法も違うのでイマイチだった。何とかバージョン共通でコピペで使える方法が無いか考とえたアイデアの一つが以下に示す mod_rewrite を使ったやり方です。
その方法とは外部プログラムを使って RewriteMap を定義して、それに REMOTE_ADDR を渡してアクセス元が SPAM か HAM かチェックするというものです。
RewriteMap用プログラム
以下のような仕様のプログラムを、ここでは /etc/httpd/conf/bin/rbl_map.pl というファイル名で作成します。
#!/usr/bin/perl use strict; use Socket qw(inet_aton); my @RBL_SERVERS = ('niku.2ch.net'); $| = 1; while(<STDIN>) { chomp; my $ip = $_; my $revip = join('.', reverse(split(/\./, $ip))); my $status = 'HAM'; foreach my $server (@RBL_SERVERS) { if(inet_aton("$revip.$server")) { $status = "SPAM"; last; } } print "$status\n"; }
ここで @RBL_SERVERS に設定している niku.2ch.net はかなり強力ですが、強力すぎて正常なアクセスも阻害する恐れもあります。自分でコメントやトラックバックスパム用の RBL を調べた上で適当なのを使った方がよいかもしれません。
作成したプログラムを以下のようにしてテストしてみました。
[root@localhost ~]# echo 202.86.196.9 | /etc/httpd/conf/bin/rbl_map.pl SPAM [root@localhost ~]# echo 124.83.139.191 | /etc/httpd/conf/bin/rbl_map.pl HAM
httpd.conf に以下のように記述します。
RewriteEngine on RewriteMap rbl-map prg:/etc/httpd/conf/bin/rbl_map.pl RewriteCond %{REQUEST_URI} ^/rbltest/ RewriteCond ${rbl-map:%{REMOTE_ADDR}} SPAM RewriteRule (.*) SPAM [F]