Skip to content

Apache や Wireshark で GeoIP を利用する

"GeoIP" と一般的に呼ばれている機能を使うと、IP アドレスを地理情報に変換することが出来ます。具体的には Apache で「特定の国からのアクセスは拒否する」といった制御を実施したり、Wireshark でキャプチャした IP アドレスが「どこの国の IP アドレスなのか?」解析したり、といったことが出来ます。GeoIP 用のデータベースは有料のものが多いのですが、MaxMind では無料で利用可能なバージョンが配布されています(有料版もあります)。 ただし、GeoIP で判定される地理情報は 100%、正しいとは限らないので注意が必要です。

Linux で GeoIP を手軽に利用してみる

Linux ではコマンドラインから GeoIP を利用することが出来ます。CentOS では yum で簡単に GeoIP をインストールすることが出来ます。ここでは CentOS 5.5 x86_64 環境で試しています。

1
sudo yum -y install geoip

"geoiplookup" コマンドに続けて IP アドレスか、もしくは FQDN を入力すると「そのアドレスは、どの国のものか?」を表示してくれます。

1
2
3
4
$ geoiplookup www.google.com
GeoIP Country Edition: US, United States
$ geoiplookup 66.249.89.104
GeoIP Country Edition: US, United States

Apache 2.x 系へ GeoIP をインストールする

Apache と GeoIP を組み合わせることで「特定の国からのアクセスを制限」したり、「ログに国も記載する」ことが出来るようになります。Apache 用の GeoIP 機能は MaxMind から mod_geoip としてリリースされています。mod_geoip は Apache のバージョンによって 1.3 系用と 2.x 系用のものがあります。今回は Apache 2.x 系のものを利用しました。

1
2
3
$ /usr/sbin/apachectl -v
Server version: Apache/2.2.3
Server built:   Aug 30 2010 12:28:40

mod_geoip はソースコードで提供されており、コンパイルする為には GeoIP のヘッダーファイルが必要になります。ヘッダーファイルを含む、GeoIP の C ライブラリは MaxMind のサイトでも提供されている のですが、CentOS であれば yum でインストールすることが出来ました。また、mod_geoip を Apache モジュールとしてコンパイル&インストールする際に apxs を使うので、apxs を含んでいる httpd-devel パッケージもインストールしておきます。

1
2
$ sudo yum -y install geoip-devel
$ sudo yum -y install httpd-devel

apxs で mod_geoip のソースコードをダウンロードし、コンパイルします。

1
2
3
4
wget http://geolite.maxmind.com/download/geoip/api/mod_geoip2/mod_geoip2_1.2.5.tar.gz
tar zxvf mod_geoip2_1.2.5.tar.gz
cd mod_geoip2_1.2.5
sudo /usr/sbin/apxs -i -a -L/usr/lib64 -I/usr/include -lGeoIP -c mod_geoip.c

apxs で指定しているオプションは以下の通りです。

  • -i
    • インストールする
  • -a
    • コンパイル後、httpd.con に LoadModule ディレクティブを追加する
  • -L
    • ヘッダーファイルの位置を指定する
  • -I
    • ライブラリの位置を指定する
  • -c
    • コンパイルする

これで mod_geoip のインストールは完了です。

Apache 2.x 系のログに GeoIP で取得した国情報を記録する

mod_geoip の活用例として、ログに国情報(カントリーコード)を記録するように設定してみます。httpd.conf に以下を追記します。

1
2
3
4
5
6
<IfModule geoip_module>
  GeoIPEnable On
  GeoIPDBFile /usr/share/GeoIP/GeoIP.dat MemoryCache
</IfModule>

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{GEOIP_COUNTRY_CODE}e\"" combined

設定が完了したら Apache を再起動します。

1
2022-01-10 14:01:07 Mondaysudo /etc/init.d/httpd restart

Apache のログを確認すると、以下の "US" のように、カントリーコードが記録されています。

1
2
3
4
5
$ sudo tail -f /var/log/httpd/access_log
63.150.131.202 - - [13/Nov/2010:14:07:12 +0900] "GET / HTTP/1.1" 403 5043 "US"
63.150.131.202 - - [13/Nov/2010:14:07:12 +0900] "GET /icons/apache_pb.gif HTTP/1.1" 304 - "US"
63.150.131.202 - - [13/Nov/2010:14:07:12 +0900] "GET /icons/powered_by_rh.png HTTP/1.1" 304 - "US"
63.150.131.202 - - [13/Nov/2010:14:07:12 +0900] "GET /favicon.ico HTTP/1.1" 404 288 "US"

Apache のログフォーマットは必要に応じて、例えば以下のようにカスタマイズします。

1
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" \"%{GEOIP_COUNTRY_CODE}e\"" combined

出力例は下記のようになります。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
$ sudo tail -f /var/log/httpd/access_log
63.150.131.202 - - [13/Nov/2010:14:07:12 +0900] "GET /icons/powered_by_rh.png HTTP/1.1" 304 - "US"
63.150.131.202 - - [13/Nov/2010:14:07:12 +0900] "GET /favicon.ico HTTP/1.1" 404 288 "US"
63.150.131.202 - - [13/Nov/2010:14:57:47 +0900] "GET / HTTP/1.1" 403 5043 "-" "Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/534.12 (KHTML, like Gecko) Chrome/9.0.576.0 Safari/534.12" "US"
63.150.131.202 - - [13/Nov/2010:14:57:47 +0900] "GET /icons/apache_pb.gif HTTP/1.1" 304 - "http://63.150.131.201/" "Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/534.12 (KHTML, like Gecko) Chrome/9.0.576.0 Safari/534.12" "US"
63.150.131.202 - - [13/Nov/2010:14:57:47 +0900] "GET /icons/powered_by_rh.png HTTP/1.1" 304 - "http://63.150.131.201/" "Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/534.12 (KHTML, like Gecko) Chrome/9.0.576.0 Safari/534.12" "US"
63.150.131.202 - - [13/Nov/2010:14:57:47 +0900] "GET /favicon.ico HTTP/1.1" 404 288 "-" "Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/534.12 (KHTML, like Gecko) Chrome/9.0.576.0 Safari/534.12" "US"
63.150.131.202 - - [13/Nov/2010:15:00:19 +0900] "GET / HTTP/1.1" 403 5043 "-" "Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/534.12 (KHTML, like Gecko) Chrome/9.0.576.0 Safari/534.12" "US"
63.150.131.202 - - [13/Nov/2010:15:00:19 +0900] "GET /icons/apache_pb.gif HTTP/1.1" 304 - "http://63.150.131.201/" "Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/534.12 (KHTML, like Gecko) Chrome/9.0.576.0 Safari/534.12" "US"
63.150.131.202 - - [13/Nov/2010:15:00:19 +0900] "GET /icons/powered_by_rh.png HTTP/1.1" 304 - "http://63.150.131.201/" "Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/534.12 (KHTML, like Gecko) Chrome/9.0.576.0 Safari/534.12" "US"
63.150.131.202 - - [13/Nov/2010:15:00:19 +0900] "GET /favicon.ico HTTP/1.1" 404 288 "-" "Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/534.12 (KHTML, like Gecko) Chrome/9.0.576.0 Safari/534.12" "US"

Wireshark で GeoIP を利用する

Wireshark に GeoIP を組み込むと、キャプチャしたパケットの IP アドレス情報を基に、国情報や都市情報、AS 番号情報を表示させることが出来ます。以前は GeoIP オプションを有効にして Wireshark をコンパイルする必要があったのですが、最近、配布されている Wireshark のバイナリは既に GeoIP が有効化されているようです。GeoIP が有効か、否かは Version ダイアログに表示されます。今回は Windows XP SP3(32bit)環境を用いて確認を進めます。

file

GeoIP を有効化する以前では、Endpoint 情報を確認しても、地理情報は表示されません。Wireshark のメニューから "Statics → Endpoint List → IPv4" を選択し、Endpoint 情報を表示してみますが、地理情報は表示されていないことが分かります。

file

Wireshark で GeoIP を利用するには "Country", "City", "ASN" をダウンロードする必要があります。

  1. GeoLite Country
    • http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz
  2. GeoLite City
    • http://www.maxmind.com/app/installation?city=1
  3. GeoLite ASN
    • http://geolite.maxmind.com/download/geoip/database/asnum/GeoIPASNum.dat.gz

ダウンロードしたファイルには以下のファイルが含まれていますので、これを適当なフォルダに展開しておきます。今回は「C:\GeoIP」に展開しましたが、スペースを含むフォルダに展開しても、Wireshark の GeoIP 機能は問題無く、動作していました。

  • GeoIP.dat
  • GeoIPASNum.dat
  • GeoLiteCity.dat

先ほど、GeoIP 関連ファイルを展開したフォルダを Wireshark から指定します。Wireshark のメニューから "Edit → Prefereces → Name Resolution → (GeoIP database directories の) Edit" を選択します。

file

開いたダイアログから GeoIP 関連ファイルを保存したフォルダを指定します。フォルダの指定が完了しても、GeoIP 機能は Wireshark を再起動(アプリケーションを終了させて、立ち上げなおす)しないと有効になりません。

file

パケットをキャプチャした状態で再度、Endpoint 情報を表示すると "Country", "City", "AS Number" といったカラムが増えていることが分かります。

file