最近大量のSPAMがコメントに投稿されるようになってしまったので、対策用のシェルスクリプトを作成しました.
あまりアクセス数がないこのブログですが、実は処理できていないコメントが1000件近くあります.
この大部分がSPAM.文面をみると、あきらかに怪しいもの+変なサイトへのリンクばかり.
しかも、殆どが外国語で書かれたもの.
基本的に拒否しているので問題はないのですが、あまりにコメントが溜まりすぎてうんざりしています.
そこで、特定の国からのアクセスを遮断するシェルを作成しました.
1.ソース
1 2 3 4 5 6 7 8 |
#!/usr/bin/env bash # update cidr list from nami.jp curl http://nami.jp/ipv4bycc/cidr.txt.gz | gunzip > cidr.txt grep XX cidr.txt | awk '{ sub(/CN/, "deny from", $0); print $0 }' > blockList.txt cat .htaccessSource blockList.txt > .htaccess |
XX の箇所にはブロックしたい国のコードをいれてください.
国別コードにはISO 3166-1 alpha-2が利用されています.国ごとのコード値はWikipediaを参照してください.(2文字コードが利用されています)
複数ブロックする場合は、grep -e XX -e YY -e ZZ のように指定してください.
2.使い方
上記のシェルをcountryBlocker.shという名前で作成し、サーバのパスwwwに置きます.
実行できるように権限をつけます.(下では所有者にのみ実行権限をつけています.)
1 |
$ chmod 700 countryBlocker.sh |
詳しくは3.解説に記載していますが、元々.htaccessで制御している場合が多いかと思いますので、リネームして退避させておきます.
1 |
$ mv .htaccess .htaccessSource |
リネーム後の名前は必ず.htaccessSourceにしてください.
リネーム後の名前でファイルを探し、アクセス制限のリストと結合しています.
定期的にIPのリストは更新されるようなので、cron登録します.
1 2 |
$ crontab -e 00 00 * * * youruser /home/foo/www/countryBlocker.sh |
上記は毎日0時にyouruserアカウントで実行する例.
ユーザアカウント名, シェルのパスは適宜変更してください.
3..解説
こちらのサイトが何と、国別のIPアドレスリストを公開しています.(勝手に使っているので、問題があれば連絡ください.)
国別のIPアドレスリストは、
cidr.txt.gz |
このリストを取得し、加工して.htaccessに追記しています.
もともと.htaccessを利用していた場合を想定し、.htaccessSource と最新のリストを結合したものを.htaccessに出力しています.
そのため静的な部分は事前に.htaccessSourceに記載しておくことで、動的なリストと分離して管理できます.