🌎

GeoIP:どこの国からアクセスしているか、IPアドレスから逆算する方法

2022/12/24に公開

どこの国からアクセスしているか、IPアドレスから逆算する方法

IPアドレスの割当は、ある程度まとまって行われており、どのIPアドレスがどこの国に割り当てられているか分かっています。

アクセスしてきた国によって、言語やサービスを変えたり、アクセスをシャットアウトすることができます。

Linux

インストール

sudo yum install GeoIP

使い方

geoiplookup 8.8.8.8

上記のコマンドで以下のような結果が返ります。
国コードだけを取得したい場合は、正規表現で取り出す必要があります。

GeoIP Country Edition: US, United States

データベース

ここでいうデータベースとは、MySQLなどのリレーショナル・データベースのことではありません。単一のバイナリファイルです。

昔はライセンスの関係でデータベースはインストールされなかったのですが、CentOS 8 Streamではインストールされています。

データベースの場所

/usr/share/GeoIP/GeoIP.dat

データベースの更新

IPアドレスの割当はたまに変わります。最新の情報に定期的にアップデートしましょう。

sudo yum install geoipupdate
sudo geoipupdate

ただし、ライセンスを購入していないとエラーになります。CentOS 8 Streamの場合は、パッケージ管理で自動的にアップデートされるようです。

PHP

PHPからGeoIPを呼び出して使うことができます。

インストール

sudo yum install php-geoip

通常はパッケージシステムが適切に設定してくれると思いますが、動かない場合は確認しましょう。

phpinfo()

GeoIPが有効になっていない場合は、php.ini を編集し、 extension=geoip.so を追加します。

使い方

echo geoip_country_code_by_name('8.8.8.8'); // USが返る
echo geoip_country_name_by_name('8.8.8.8'); // United Statesが返る

国コードの一覧
https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes

PHP公式のGeoIPのマニュアル
https://www.php.net/manual/ja/book.geoip.php

データベースの指定

ChatGPTによると、、、
PHP 5.3以前では、geoip_open で指定できたようです。
PHP 5.4以降では、geoip_db_open で指定できたようです。
PHP 7.3以前までは、上記で指定できたようです。
ところが、PHP公式サイトのリファレンスにはそのような記述はありません。
実際に上記のバージョンでテストしてみましたが、そのような関数はありません。
おそらく、ChatGPTは下記を学習したのではないかと思います。

https://github.com/maxmind/geoip-api-php/blob/main/README.mdk

Mac

GeoIPはライセンス料を支払わなければ使用することができません。[1]
MacPortsでは、GeoIP がインストールできないのはライセンスの関係かもしれません。分かりません。 GeoLiteCity をインストールすると使用することができるようになります。

インストール

sudo port install GeoLiteCity

使い方

geoiplookup 8.8.8.8

GeoLiteCityの場合は、以下のように住所や緯度経度も返ってきます。[2]

GeoIP City Edition, Rev 1: US, CA, California, Mountain View, 94043, 37.419201, -122.057404, 807, 650

データベースの場所

/opt/local/share/GeoIP/GeoIPCity.dat

PHP

Macでは、ライセンスを購入しないとGeoIPライブラリーを使うことができません。2020年くらい(PHP 7.2くらい?)までは、Macのローカル開発環境で構築できていました。昔は、Lite版のGeoIPデータベースが、MixMind社からダウンロードできてたような気がします。ひょっとしたら、以下のURLからGeoIPデータベースがダウンロードできるかもしれません。

https://dev.maxmind.com/geoip/geolite2-free-geolocation-data?

解決策

実行演算子を使って、シェルコマンドとして実行しちゃう荒業もあります。ただし国コードだけが欲しい場合は、正規表現で抽出する必要があります。

echo `/opt/local/bin/geoiplookup 8.8.8.8 2>&1`;

ライセンス違反

CentOS 8 StreamにインストールされたGeoIPデータベースをローカルのMacにコピーしても動くはずですが、それはライセンス違反になるはずなので、やってはいけません❗

Windows

Windowsは使ってないので分かりませんが、WSLを利用すれば、Ubuntuと同じなんだと思います。知らんけど。

GeoIP と GeoLiteCity の違い

GeoIPとGeoLiteCityは、MaxMind社が提供するIPアドレスから位置情報を検索するためのデータベースです。どちらもIPアドレスを使用して、そのIPアドレスが属する国や地域を検索することができます。

ただし、GeoIPとGeoLiteCityには次のような違いがあります。

  1. データの精度: GeoIPのデータは、より精度が高く、IPアドレスからより詳細な位置情報を検索することができます。一方、GeoLiteCityのデータは、精度が低いものの、無料で使用することができるという特徴があります。
  2. 使用条件: GeoIPは、商用利用を前提としています。そのため、商用で使用する場合には、ライセンス料を支払う必要があります。一方、GeoLiteCityは、商用利用や非商用利用を問わず、無料で使用することができます。
  3. データの更新頻度: GeoIPのデータは、より頻繁に更新されます。一方、GeoLiteCityのデータは、更新頻度が低いものの、無料で使用することができるという特徴があります。

どちらのデータベースを使用するかは、利用目的や予算などによって異なります。商用で使用する場合や、より精度の高いデータが必要な場合には、GeoIPを使用することをおすすめします。一方、非商用で使用する場合や、無料で使用できるデータが求められる場合には、GeoLiteCityを使用することをおすすめします。

脚注
  1. CentOSの場合は、Redhat社がライセンス料を払っているのかもしれません。ありがとうございます。 ↩︎

  2. 緯度経度は正確ではありません。正確な緯度経度はブラウザから返して貰うことができます。 ↩︎

Discussion