前回、MT5と連携した形で、スパムフィルタを作りました。
日々自動的に追加していってくれるので、便利なことは便利なのですが、踏み台とされるIPアドレスがつぎつぎに増えていっているため、イタチごっこ状態となっています。
スパムと判定されたIPアドレスの一覧を見ると、ほとんどが中国からのアクセス(DNS解決できないものも含めて)ですが、特に
*.dynamic.163data.com.cn
からのものが多くなっています。
中国のプロバイダーにぶら下がっているユーザで、セキュリティーの甘いユーザーが踏み台にされて、各国のサイトに悪さをしているようです。
(ネットで検索すると、あちこちで被害が発生しているようです)
ということで、いよいよ強制措置を取ることにします。上記中国のプロバイダーからのアクセスは、丸ごと「完全遮断」することにします。
あわせて、MT5でスパム認定される毎に、IPアドレスを一つ一つちまちまと追加していたのでは日が暮れてしまうので(夜中に自動処理ですけど)、スパム認定されたIPアドレスを含むサブネット全体を、丸ごと「完全遮断」することにします。
これらには、上記中国のプロバイダーのIPアドレスに加えて、DNS解決できないIPアドレスも含みます。
工房としては、かなり思い切った措置となります。
当然のことながら、まっとうなユーザーも影響を受けることになりますが、どーせほとんどが中国からのアクセスなので、ばっさり切り捨てます。
(不幸にも、セキュリティーリテラシーの弱い人たちがいるセグメントに含まれていたということで、諦めていただきます)
上記を実現するためには、「IPアドレスから、そのIPアドレスが含まれるネットアドレスと、サブネットマスクを得る」という機能(関数)が必要となります。
以下、そのソース(一部)です。
IPアドレスからネットアドレス等の関連情報を取得するには、ご存知のとおり、「whois」というコマンドを使います。ネット上では、APNIC(アジア・太平洋エリアを管轄する組織)などのサイトで確認できます。
こんな確認をいちいちやっていたのでは日が暮れてしまうので、自動的に取得できるようにする訳ですが、試行錯誤の結果、
http://wq.apnic.net/apnic-bin/whois.pl?searchtext=(IPアドレス)&object_type=inetnum
というコマンド(URL)を与えることにより、ネットアドレスを取得でることが分かりました。
「GetNetMask()」というのが、その関数です。
PHPでは、Webサーバが出力するデータを、通常のファイルと同じように扱うことができます。
上記URLをオープンして、出力される行を検索し、「inetnum」という文字列が含まれる行にある、IPv4形式のIPアドレス(開始アドレスと終了アドレス)を取得します。
その開始アドレスと終了アドレスから、ネットアドレスとサブネットマスクを生成します。
この関数を、いろいろ試行錯誤して作っていたのですが、なんのことはない、PHPの電子マニュアルに、そのままどんぴしゃの関数の例が載っていました。「ip2cidr()」という関数です。
ということで、割と簡単に機能を強化することができまました。上記IPアドレスの一覧のうち、一番右のカラムに、「ネットマスク」(ネットワークアドレスとサブネットマスク)の情報を載せてあります。
この情報を、Webサーバの「.htaccess」ファイルに、「deny from (ネットマスク)」として追加することにより、スパム認定されたIPアドレスを含むサブネット全体を、丸ごと「完全遮断」することができます。
さて、その効果のほどはいかに・・・。