GeoLite2 (旧 GeoIP) とは簡単にいえば「IPアドレスから地理情報を得る仕組み」で、 MaxMind社 が提供しています。 商用版として GeoIP2 がありますが、それに匹敵する情報が得られます。(ただし精度は劣るとのこと)
MaxMind社のサービスが GeoIP から GeoLite2 に変わり、データベースやAPIが変更になりました。 さらに2019年末から GeoLite2 データベースファイルが単純にダウンロードできなくなりました。
本記事では以下を紹介します。
なお本記事で紹介するスクリプトは MIT License です。(利用自由、無保証)
Debian系のLinuxディストリビューションの場合:
apt install libgeoip2-perl
記事中のプログラムを利用するにはさらに:
apt install libconfigreader-simple-perl
https://dev.maxmind.com/geoip/geoipupdate/ に2通りの方法が書いてあります。
github上にソースコードの他、Windows用バイナリやLinuxのdeb,rpmパッケージなどが用意されています。 こちらは試してないので今回は割愛します。
今回はこちらの方法を紹介します。
「Using GeoIP Update」でも「Direct Downloads」でもライセンスキーが必要なので、取得します。
https://download.maxmind.com/app/geoip_download?edition_id=GeoLite2-Country&license_key=XXXXXXXXXXXXXXXX&suffix=tar.gz
ダウンロードしたファイルは 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= には上記で説明した通り、取得したライセンスキーを記載してください。
#! /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
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'
GeoLite2 への変更後、標準で提供される mmdblookup はオプション指定や出力が geoiplookup とは完全に変わってしまい、ライトな使い方をするにはちょっと面倒になりました。 なので geoiplookup の一番シンプルな使い方「geoiplookup IPアドレス」で単純に国名を得る互換コマンドを作ってみました。
#! /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}),
);
(以上)