中国フィルターを作った

自社の問い合わせに中国からスパムが来る。 先月辺りからRailsアプリに

require 'ipaddr'
class ApplicationController < ActionController::Base
  protect_from_forgery
  before_filter :china_filter
  private
  def china_filter
    begin
      if IPAddr.new("175.42.0.0/15").include?(request.remote_ip) ||
          IPAddr.new("175.44.0.0/16").include?(request.remote_ip) ||
          IPAddr.new("36.248.0.0/14").include?(request.remote_ip) ||
          IPAddr.new("112.111.0.0/16").include?(request.remote_ip)
        render :text=>""
        return
      end
    rescue => e
      logger.info e.message
      logger.info request.remote_ip.inspect
    end
  end
end

とかやっていたのですが、敵もさるもので、どんどんIPを変更して スパムを送ってきます。イタチごっこも疲れてきたので、 iptablesで中国を丸ごとフィルタにかけることにしました。

まず、IPdeny IP country CIDR blocksからリストをとってきます。

wget http://www.ipdeny.com/ipblocks/data/countries/cn.zone

を実行すればOKです。 んで、

#!/usr/bin/env ruby

open("cn.zone","r").readlines.each do |l|
  l.strip!
  system("iptables -A INPUT -i eth0 -s #{l} -j LOG --log-prefix '[CN FILTER]'")
  system("iptables -A INPUT -i eth0 -s #{l} -j DROP")
end

でいいでしょう。1行目はロギングのためのものです。 iptables -L -n |lv とかで確認して下さい。 大丈夫そうなら、iptables-saveで保存して(ubuntuの場合)、再起動した時も読み込まれるようにします。 4600行ぐらいのボリュームなので、これをRailsでやったら酷いことになるとおもって iptablesでフィルタすることにしました。

結果はこれからです。どうなるやら。

追記

とりあえずはうまくはじけているようです。中国からのアクセスを拒否しているログが残っています。 プロキシ使われたらアウトなんですよね。それが問題ですが、とりあえずいいでしょう。