flatray.com | 戻る 更新日時: 2021-01-29

MaxMind GeoLite2の利用方法

GeoLite2 (旧 GeoIP) とは簡単にいえば「IPアドレスから地理情報を得る仕組み」で、 MaxMind社 が提供しています。 商用版として GeoIP2 がありますが、それに匹敵する情報が得られます。(ただし精度は劣るとのこと)

MaxMind社のサービスが GeoIP から GeoLite2 に変わり、データベースやAPIが変更になりました。 さらに2019年末から GeoLite2 データベースファイルが単純にダウンロードできなくなりました。

本記事では以下を紹介します。

なお本記事で紹介するスクリプトは MIT License です。(利用自由、無保証)

パッケージ利用方法

Debian系のLinuxディストリビューションの場合:

apt install libgeoip2-perl

記事中のプログラムを利用するにはさらに:

apt install libconfigreader-simple-perl

データベースファイルの入手方法

  1. https://dev.maxmind.com/geoip/geoip2/geolite2/ にある「Sign up for GeoLite2」のリンクにアクセスし、アカウントを作成します。
  2. アカウントの作成に成功したら、入力したメールアドレスに以降の手順を記載したメールが届くので、手順に従いまずパスワードを設定します。
  3. メールアドレスと設定したパスワードで、手順通りに MaxMind account にログインします。
  4. 画面左側の「Download Files」をクリックすると、各データベースがダウンロードできます。執筆時点で存在するのは GeoLite2-ASN GeoLite2-City GeoLite2-Country の3種類で、多分アカウント不要の時と同じです。

ダウンロードの自動化

https://dev.maxmind.com/geoip/geoipupdate/ に2通りの方法が書いてあります。

Using GeoIP Update

github上にソースコードの他、Windows用バイナリやLinuxのdeb,rpmパッケージなどが用意されています。 こちらは試してないので今回は割愛します。

Direct Downloads

今回はこちらの方法を紹介します。

ライセンスキーの取得

「Using GeoIP Update」でも「Direct Downloads」でもライセンスキーが必要なので、取得します。

  1. MaxMind Account にログインします。
  2. 画面左の「My License Key」をクリック。
  3. 「Generate new license key」をクリック。
  4. 「License key description」に、キーの説明文を入力。ようは自分用のメモで、何のためのキーか等を入力すればいいでしょう。
  5. 「Will this key be used for GeoIP Update?」は、「Direct Downloads」の場合は No を選択。(「GeoIP Update」の場合は Yes を選択しさらに geoipupdate のバージョンなどを選択)
  6. 「Confirm」をクリックすると生成されます。なおここで次の注意事項が表示されます。
  7. 「Return to list」を選択すると「今後はライセンスキーは最初の4文字しか表示されないぞ、キーはちゃんと保存したか?」と確認されます。問題なければ「Continue」を選択。気になるなら「Go Back」で戻って再確認。
  8. Return to list」で戻ると、これまで生成したキーの一覧が表示されます。

実際のダウンロード方法

  1. ダウンロードしたいデータベースのURLをテキストエディタにコピーします。
  2. URLを編集します。
  3. GeoLite2-Countryの場合、URLは多分こうなります。(執筆時点)
    https://download.maxmind.com/app/geoip_download?edition_id=GeoLite2-Country&license_key=XXXXXXXXXXXXXXXX&suffix=tar.gz
  1. wget なり curl なりでこのURLを指定してダウンロードできます。
  2. 実際にダウンロードした履歴は、左の「Download History」で確認できます。

ダウンロード用スクリプト

ダウンロードしたファイルは tar.gz 形式で、

GeoLite2-Country_20200107/
GeoLite2-Country_20200107/LICENSE.txt
GeoLite2-Country_20200107/COPYRIGHT.txt
GeoLite2-Country_20200107/GeoLite2-Country.mmdb

こんな感じで年月日のディレクトリがありちょっと扱いづらいので、スクリプトを作成しました。 対象は GeoLite2-Country で、データベースやコンフィグを /usr/share/GeoLite2 に設置する前提です。必要に応じて修正してください。 また config の MMDB_URL の license_key= には上記で説明した通り、取得したライセンスキーを記載してください。

geolite2-update.sh

#! /bin/sh
set -eu

. /usr/share/GeoLite2/config
MMDB_TMP=$MMDB.tmp
DOWNLOAD_FILE=/tmp/GeoLite2-Country.tar.gz

wget -O $DOWNLOAD_FILE "$MMDB_URL"
if [ $? != 0 ] ; then
    echo "wget failed: $MMDB_URL"
    exit 1
fi

tar -xzO --wildcards -f $DOWNLOAD_FILE '*/GeoLite2-Country.mmdb' > $MMDB_TMP
cp -p $MMDB $MMDB.backup
mv $MMDB_TMP $MMDB

/usr/share/GeoLite2/config

MMDB=/usr/share/GeoLite2/GeoLite2-Country.mmdb
MMDB_URL='https://download.maxmind.com/app/geoip_download?edition_id=GeoLite2-Country&license_key=XXXXXXXXXXXXXXXX&suffix=tar.gz'

geoiplookup互換コマンド

GeoLite2 への変更後、標準で提供される mmdblookup はオプション指定や出力が geoiplookup とは完全に変わってしまい、ライトな使い方をするにはちょっと面倒になりました。 なので geoiplookup の一番シンプルな使い方「geoiplookup IPアドレス」で単純に国名を得る互換コマンドを作ってみました。

geoiplookup

#! /usr/bin/perl
# GeoLite Legacy の geoiplookup のエミュレーション +α

use strict;
use GeoIP2::Database::Reader;
use Encode;
use ConfigReader::Simple;

my $config = ConfigReader::Simple->new("/usr/share/GeoLite2/config");

my $reader = GeoIP2::Database::Reader->new(
    file    => $config->get("MMDB"),
    locales => [ 'en', 'ja', ]
    );

my $country = $reader->country( ip => $ARGV[0] );
my $country_record = $country->country;
printf("GeoIP Country Edition: %s, %s (%s)\n",
       $country_record->iso_code(),
       $country_record->names()->{en},
       encode('UTF-8', $country_record->names()->{ja}),
    );

(以上)