menu-icon

IPアドレスから位置情報を推定する

MaxMindのGeoIP2-phpを使って、アクセス元のIPアドレスから、国や地域を推定するIP ジオロケーションをやってみます。なおGeo IP拡張DBの更新が終わっているので事実上使えないようです。

環境

  • ubuntu 18.04
  • PHP 7.4

GeoLite2 データベースの構築

GeoIP2-phpを使ってIPジオロケーションを行うには、GeoLite2データベースが必要になります。ユーザー登録からデータベースの構築まで解説します。

ユーザー登録

登録ページからユーザー登録します。登録するとメールが送られてきますので、記載されているリンクからパスワードを登録します。

ライセンスキーの発行

ログイン後、ライセンスキーの管理ページから「Generate new license key」ボタンを押して、ライセンスキーを発行します。

キーの説明を適当に入力し、ラジオボタンを下の画像の様に選択して「Confirm」ボタンを押すとキーが生成されます。

すると、下図の画面に遷移します。[Download Config]ボタンを押して、コンフィグファイル(GeoIP.conf)をダウンロードしておきます。

なお、この画面を離れると二度とライセンスキーを確認することはできません(一覧画面には頭4桁しか表示されません)。ただし、ダウンロードしたコンフィグファイルには記載されていますので、改めて控える必要はないです。

GeoIP Updateのインストール

以下のコマンドでインストールします。

$ sudo add-apt-repository ppa:maxmind/ppa
$ sudo apt update
$ sudo apt install geoipupdate

先程ダウンロードしたコンフィグファイルを/etc 下にコピーしておきます。

$ ls /etc/GeoIP.conf 
/etc/GeoIP.conf

コンフィグが準備できたら、geoipupdate を実行して、データベースを構築します。--verboseオプションを付けて、動きを見ながらの方が良いと思います。

$ sudo geoipupdate --verbose

/usr/share/GeoIP 下にデータベースファイルが作成されていることを確認してください。

$ ls /usr/share/GeoIP/
GeoIP.dat  GeoIPv6.dat  GeoLite2-ASN.mmdb  GeoLite2-City.mmdb  GeoLite2-Country.mmdb

なお今回はお試しなので、cronを使って定期的にデータベースを更新することはしません。

GeoIP2-php のインストール

composer叩くだけです。

$ composer require geoip2/geoip2:~2.0

サンプル

試しに使ってみました(tdomy/php-geoip)。

<?php
require_once __DIR__ . '/../vendor/autoload.php';

use GeoIp2\Database\Reader;

if ($argc < 1) {
    print("ERROR: This script requires target IP address as argument.\n");
    exit(1);
}

$reader = new Reader('/usr/share/GeoIP/GeoLite2-City.mmdb');

$target_ip_address = $argv[1];
$record = $reader->city($target_ip_address);

printf(
    "IP Address\t%s\nCode\t%s\nName\t%s\n",
    $target_ip_address,
    $record->country->isoCode,
    $record->country->name,
);

実行すると以下のようになります。

$ php bin/city.php `curl -s inet-ip.info`
IP Address      147.192.70.222
Code    JP
Name    Japan