最近、このブログへのスパム業者のアクセスが急増した。
一日普通の人のPVが700くらいなんだけれども、そのうちスパムだと思われうものが200くらいあって、
アクセスログの集計の邪魔をしてくれる。
コメントも大量書き込みも連中はやってくれて、一晩で200件くらい書いてくれたこともある。
Akismetというスパムコメントを自動的に捨ててくれるプラグインをいれたから、コメントの方は良くはなったけれど
それでもアクセス件数の集計に大きな誤差がでてしまうのでアクセスを遮断したい。
結果的にはiptables(ファイアウォール)でパケットを破棄するようにした。
Apacheよりはiptablesで
スパムのアクセスはほとんどが中国からで、xxx.com.cn(xは伏字)というドメインが半分くらい占めていた。
だから、最初は簡単にApacheのアクセス制御をつかった。
Deny from .cn
ってね。
しかし、ホスト名が分からない(逆引きできない)アクセスもあって完全に除去できない。
また、ドメインでアクセス制限をかけると、IPから逆引きをするためその分パフォーマンスが落ちるらしい。
それに遮断されていると言ってもApacheで制御されているので、大量アクセスをされたらその分負荷がかかる。
だったらアクセスを遮断するならもっと手前で堰き止めたい。
というわけでファイアウォールに任せましょう。
iptablesでごっそり遮断しよう
iptablesはLinuxでもっとも使われているファイアウォールだ。
しかし、iptablesでドメイン指定して制御する方法が分からない…
グーグル先生に聞いても答えが出てこない。
もしかしたら、できないのかもしれない。
スパム業者のIPは同じIPではないの、それぞれを直に拒否をしたら膨大な量になる。
でも似たようなIPなので傾向を見るため、3週間くらいのアクセスログからgrep cut sort uniqなどを駆使して怪しいアクセスのIPを抽出してみた。
すると全部で300種類くらいあった。
それらを並べてみると、大体近い数値のものが多かったので
IP業者が使うであろうアドレスを含む広い範囲を遮断すればいいんじゃないか?という結論に達した。
中国に割り当てられているIPをしらべる
http://fetus.k-hsu.net/document/network/ipv4assign/
ここに国別に割り当てられているIPのリストがあったので、
これを参考にIP業者が使うであろうIPアドレスの範囲をしらべた。
IPアドレスはアジアだったらAPNIC 日本だったらJPNICというような団体が管理していて、配布しているそうだ。
あるIPからあるIPは中国、このIPからこのIPまでは日本みたいに、まとまった形で各地域に配布されている。
だから、300くらいある業者のIPアドレスもそれらが含まれるIPアドレスのまとまりを遮断してしまえば、
少ない設定で済む上にまだアクセスしていないスパム業者の別のIPのアクセスも予防できる。
かなり広い範囲で遮断するので、善良な一般の中国人のアクセスも拒否してしまうが
日本語ブログで今まで日本人しか来なかったので問題はないだろう。
設定をする
300くらいあったIPだけれども、6つのブロックの設定で住むことがわかった。
↓それらのブロックを先ほどのリンク先からコピペして、以下のようなコマンドを6つ実行した。(xは伏字)
# iptables -I INPUT 2 -s xx.xxx.xxx.xxx/12 -j DROP
※ DROPの前の-jはジェー(フォントによってはiに似ていて、僕自身が間違えた)
-I INPUT 2の -Iはインサートといういみで、2は二行目という意味。
iptablesは上からルールに合致したらそれを実行するので、拒否系は上の方に設定している。
↓そのあとは保存とリスタート
# /etc/init.d/iptables save # /etc/init.d/iptables restart
結果
この設定は効果覿面!
中国のスパム業者は全く来なくなった。
ロシアなどの他の国のスパムアクセスはあるのだけれども、かなり頻度は少なく、
ログが見辛くなるなどの害がまだ出ていないので放置している。