2010年7月24日土曜日

接続元IPアドレスの国 調査

サーバへの接続元のIPアドレスがどこの国なのか調べたいことがある。
1つ、2つなら、geoiplookupコマンドを使ってやっても不便はない。

# geoiplookup IPアドレス

ただし、膨大な量のIPアドレスを調べるとなると毎回ツールが起動して時間がかかりすぎる。
オンメモリで一気に回したい。

そこで、Rubyのライブラリを使うことにする。



◆ geoipのインストール
geoipパッケージ内にgeoiplookupのコマンドも含まれている。
# yum install geoip

gemを使ってruby用のgeoipモジュールをインストールする。
# /usr/local/ruby-2.0.0/bin/gem install geoip -p http://192.0.2.1:8080/
※ rubyのインストール先は下段の"◆ 補足"を参照のこと。
※ -pオプション以降はプロキシの設定である。
  環境依存するところなので適宜読み替えること。



◆ geoipのデータベースの用意
geoipのデータベースをダウンロードする。
geoipのパッケージにもデータベースは含まれているが最新のものを
利用したほうがいいだろう。また月一ぐらいで更新はかけておきたい。
# http_proxy=192.0.2.1:8080 wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz -O /var/tmp/GeoIP.dat.gz

# gunzip /var/tmp/GeoIP.dat.gz

# /bin/mv /var/tmp/GeoIP.dat /usr/share/GeoIP/GeoIP.dat



◆ ツールの用意
今回は例として以下の形式のIPアドレスのリストを読み込ませ、
国コードを出力させる。

# vi ip_list
203.216.227.176
74.125.95.104

# vi geoip.rb
#!/usr/local/ruby-2.0.0/bin/ruby
require 'geoip'

geo = GeoIP.new('/usr/share/GeoIP/GeoIP.dat')

open(ARGV.shift) do |file|
file.each_line do |line|
ip=line.chomp
country3 = geo.country(ip).country_code3
printf "%15s : %s\n",ip, country3
end
end

exit 0



◆ ツールの実行
# chmod 755 geoip.rb

# ./geoip.rb
203.216.227.176 : JPN
74.125.95.104 : USA



◆ 補足(Rubyインストール先)
# cd /usr/local/src/
# ftp_proxy=192.0.2.1:8080 wget ftp://core.ring.gr.jp/pub/lang/ruby/ruby-2.0-stable.tar.gz
# tar zxvf ruby-2.0-stable.tar.gz
# cd ruby-2.0.0-p195/
# ./configure --prefix=/usr/local/ruby-2.0.0
# make
# make install