いちいちフィルターにお馬鹿IPを突っ込むのも面倒くさい訳です。
サーバ管理者ならこんな事を言ってはいけないのでしょうが、面倒くさい物は面倒くさい。
それに、アタック仕掛けられたり、spam寄越されてからの対応では何かと腹が立つのです。程度の差は有っても。
だったら、関係ないところからのアクセスは初めからご遠慮申し上げますというお話。
どの国にどのIPアドレスを割り当てたかは地域レジストリが公開していて、各地域レジストリのFTPサイトから入手することが出来ます。
この情報は決められたフォーマットになっており、
apnic|AU|ipv4|1.0.0.0|256|20100504|assigned
のような形で記載されています。
左から、割り当て地域レジストラ・国別識別コード・IP種別・ネットワークアドレス・割り当てIP数・割り当て日付・状態となっていますから、このファイルを利用すれば基本的には国毎にブロックするための情報が生成出来る事になります。
基本的にと言うのは、最近割り当ての際に欧州連合(EU)として割り当てられる場合があり、実際にどの国に割り当てられているのかwhoisで引いてみないと判らないケースが存在するのです。ごっそりブロックするのであればEUをブロックすれば良いのですけれど。
で、上記情報からPF用のテーブルファイルを作成するスクリプトを書いてみました。元々ipfw用のスクリプトとして公開されていたものを、おいらが勝手にPF用に改変+αしたものです。
どこから入手したのか忘れてしまって記載が出来ず申し訳ないのですが、ご自分が書かれた等の情報があればご連絡頂ければと思います。
スクリプトはこちら c_filter
スクリプトは3つのファイルで構成されています
- c_filter.pl(スクリプト本体・Perlスクリプト)
- c_filter.conf(設定ファイル)
- c_filter.cc(国別設定ファイル)
となります。
c_filter.zipファイルを解凍したら、c_filter.plを/usr/local/sbin等にコピーし、
chmod 755 /usr/local/sbin/c_filter.pl
等として実行権を付与します。他の2つのファイルは/usr/local/etcの下にコピーしてください。
次にc_filter.confファイルを編集します。基本的にデフォルト状態で動作するはずですが、一応各変数について解説しておきます。
- $NICList
割り当てリスト取得有無- 1: 取得する
- 0: 取得しない
- $StatsListURL
割り当てリスト取得先(FTP) - $ListFileName
割り当てリスト名 - $GetFileTMP
割り当てリストファイル格納用テンポラリディレクトリ名
ここまでが地域レジストリの割り当てリスト取得情報になります。各ファイルのロケーションが変わった場合に変更する必要がありますが、変更になることはまずないので弄らないようにしてください。
現時点では全ての割り当てリストをAPNICのFTPサーバからfetchを使用して取得し、/var/tmpディレクトリに格納しています。
- $WhiteLists
未使用 - $UndefMode
c_filter.ccファイルで明示的に処理対象としていない場合、どのように扱うか- pass: 処理対象としない
- block: 処理対象とする
- $PFTable
pf.confに定義するテーブル名称 - $PFTableFile
$PFTableで指定したテーブルに対するファイル名 - $EXECMode
処理モード- BLACK: blockテーブルを作成
- WHITE: passテーブルを作成(使用しないでください)
- $PFCTLCommand
pfctlコマンドをフルパスで指定 - $PFCONF
pf.confファイルをフルパスで指定 - $CountryFile
c_filter.ccファイルをフルパスで指定
作って大分経つのにホワイトリスト関連はまったく使っていないので、なにが起こるかわかりません。なので、BLACKリスト作成処理のみに限って使用してください。
次にc_filter.ccですが、このファイルには国毎に処理対象とするかしないかを記述します。フォーマットは
国別識別コード(TAB)処理指定(TAB)コメント
のようになっていて、それぞれの間は必ずTAB1つで区切ります。処理指定はtrueなら処理対象とせず、falseなら処理対象となります。明示的に処理指定を行わなかった場合は、$UndefModeの指定に従います。
添付のc_filter.ccはおいらの環境で実際に使っているものなので、どのようになっているかについてはエディタ等で参照した上で、追加削除等状況に合わせて編集してください。
設定が終わったら
/usr/local/sbin/c_filter.pl
のように一旦手動でc_filter.plを起動してテーブルファイルを作成します。
次に、/etc/pf.confにテーブル指定およびルールを追加します。
- テーブル
# KCFilter
table <kcfilter> persist file "/var/db/kcfilter"
- ルール
block in quick proto tcp from <kcfilter> to any
/etc/pf.confを修正したらPFを再起動しておいてください。
# なんでkcfilterなのかは察してください。最初はcだけだったんですけれどね(汗)。
次にc_filter.plが毎日自動で起動するように/etc/crontabファイルに
# C_Filter
0 5 * * * root /usr/local/sbin/c_filter.pl
のように追記します。
上記例では毎日午前5時にc_filter.plが自動起動され、テーブルファイルを作成した後、pfctlを実行してフィルタルールを更新します。
コメント