GeoIP2によりIPアドレスから住所(緯度・経度)を特定する

GeoIP2によりIPアドレスから住所(緯度・経度)を特定する プログラミング

IPアドレスから住所を検索したことがありますか?
サーバー管理者なら、不正なアクセス元のIPを調査したことはあるでしょう。

住所でなくても、IPアドレスから緯度経度を検索したことはあるかもしれません。
地図に場所を表示する際に、緯度経度の情報が必要になることが多いです。

みなさんは、そのような場合にどうしていますか?
おそらく、何らかのサービス(API含む)を利用しているはずです。

でも、もうそのようなサービスを使う必要はありません。
あなた自身の手で、IPアドレスから住所(緯度経度)を特定する仕組みを作れます。

GeoIP2を使えば、その仕組みを作れます。

本記事の内容

  • GeoIP2とは?
  • GeoIP2の仕組み
  • GeoIP2データベースのダウンロード
  • GeoIP2のシステム要件
  • geoip2のインストール
  • geoip2の動作確認

それでは、上記に沿って解説していきましょう。

GeoIP2とは?

GeoIP2とは、米国のMaxMind社の製品ブランド名のことです。
製品と言っても、主にデータを販売することで利益を上げています。

そして、そのデータには以下の種類があります。

  • Country
  • City
  • Anonymous IP
  • ISP
  • Domain
  • Connection Type

上記は、IPアドレスから検索できるデータです。
今回は、この中からCityを利用します。

Cityでは、次の項目を得ることが可能です。
実際に得られる値も載せておきます。

項目
Continentアジア
Country日本
Regional Subdivision東京都,大阪府
City東京,大阪市
Postal Code105-0011
Approximate Latitude/Longitude*35.6585/139.7454

住所と言っても、詳細な住所がわかるわけではありません。
「City」レベルで東京なのか、大阪市なのかがわかる程度です。
これは、GeoIP2以外のサービスを使っても同じことに違いはありません。

以上より、GeoIP2のおおよそがわかったはずです。
では、次にわれわれがそのGeoIP2をどうやって利用するのかを説明していきます。

GeoIP2の仕組み

GeoIP2を利用する方法は、以下の2通りです。

  • Webサービスとして利用(API)
  • データベースをダウンロードして利用

ここで注意が必要です。
基本的には、GeoIP2は有料となります。

ただし、無料利用の道が用意されています。
それが、GeoLite2です。

簡単に言うと、商用利用を制限されたGeoIP2と言えます。
データの質的には、有料版とほぼ同じ(若干だけ劣る場合もある)のようです。

なお、無償利用の場合には次の表記が必要となります。

This product includes GeoLite2 data created by MaxMind, available from
<a href="https://www.maxmind.com">https://www.maxmind.com</a>.

GeoLite2を利用しているページには、MaxMindサイトへのリンクが必要ということです。
閉じた環境で使うなら、何もする必要がないとも言えます。

以上が、ライセンスに関してでした。
では、冒頭で述べた利用方法に関しても触れておきましょう。

今回は、「データベースをダウンロードして利用」を採用します。
APIの利用だと、1日に1000回アクセスという制限がかかります。

次では、そのデータベースをダウンロードする方法を説明します。

GeoIP2データベースのダウンロード

正確には、GeoLite2データベースのダウンロードです。
無償版が対象となりますので。

API・ダウンロードのいづれの場合でも、アカウント登録が必要となります。

GeoLite2アカウント登録
https://www.maxmind.com/en/geolite2/signup

上記画面でアカウントを登録します。
アカウントが登録できたら、次の画面へアクセス。

MaxMindログイン
https://www.maxmind.com/en/account/login

ログインに成功すると、次の画面に遷移。

「Download Databases」をクリック。
「Download GeoIP2 and GeoIP Legacy Databases」ページに遷移します。
ここで、次の箇所までスクロール。

今回は、「Download GZIP」をクリックしてファイルをダウンロードします。
「GeoLite2-City_yyyymmdd.tar.gz」という名称のファイルがダウンロードできます。

yyyymmddは、データの更新日です。
ダウンロードしたファイルを解凍すると以下のファイルを確認できます。

ここで重要なモノは「GeoLite2-City.mmdb」となります。
GeoLite2-City.mmdbが、必要となるデータベースです。

GeoLite2-City.mmdbは、バイナリ形式のため中身をそのままでは見れません。
サイズは、案外小さくて60MBちょっとです。

これでデータベースの用意ができました。
次は、このデータベースにアクセスするための方法について解説します。

GeoIP2のシステム要件

GeoIP2データベースにアクセスする方法が、多くの言語で用意されています。
MaxMind社がサポートするモノだけでも、以下があります。

  • .NET (C#)
  • C
  • Java
  • Node.js
  • Perl
  • PHP
  • Python
  • Ruby
  • Apache (mod_maxminddb)

これ以外では、サードパーティーがC++・Go・Rust向けのモノを公開しています。
見た限り、ほぼ大抵の言語は大丈夫そうです。

今回は、Python用のgeoip2ライブラリに関して説明します。

geoip2

現時点では、geoip2の最新バージョンが4.1.0となります。
この最新バージョンが公開されたのは、2020年9月26日です。

OSに関しては、特に記載がないので何でもOKなのでしょう。
つまり、以下OSを含むクロスプラットフォーム対応ということです。

  • Windows
  • macOS
  • Linux

ただ、Pythonのバージョンには注意しましょう。
以下のバージョンがサポート対象となっています。

  • Python 3.6
  • Python 3.7
  • Python 3.8

比較的新しいバージョンのみが、サポート対象となります。
そのため、Python 3.9でも大丈夫でしょう。

実際、私は以下のバージョンで検証しています。

>python -V
Python 3.9.1

以上、geoip2の説明となります。
次では、geoip2をインストールしていきます。

geoip2のインストール

最初に、現状のインストール済みパッケージを確認しておきます。

>pip list
Package           Version
----------------- -----------
pip               21.0.1
setuptools        54.1.1

次にするべきことは、pip自体の更新です。
pipコマンドを使う場合、常に以下のコマンドを実行しておきましょう。

python -m pip install --upgrade pip

では、geoip2のインストールです。
geoip2のインストールは、以下のコマンドとなります。

pip install geoip2

インストールは、そこそこ時間がかかります。
では、どんなパッケージがインストールされたのかを確認しましょう。

>pip list
Package           Version
----------------- -----------
aiohttp           3.7.4.post0
async-timeout     3.0.1
attrs             20.3.0
certifi           2020.12.5
chardet           4.0.0
geoip2            4.1.0
idna              2.10
maxminddb         2.0.3
multidict         5.1.0
pip               21.0.1
requests          2.25.1
setuptools        54.1.1
typing-extensions 3.7.4.3
urllib3           1.26.3
yarl              1.6.3

結構な数のパッケージが、インストールされました。
これだけインストールするなら、時間がかかりますよね。

以上、geoip2のインストールが完了しました。
次は、geoip2の動作確認を行いましょう。

geoip2の動作確認

動作確認用のコードは、以下。

import geoip2.database

with geoip2.database.Reader('./GeoLite2-City.mmdb') as reader:
    response = reader.city('xxx.xxx.xxx.xxx')

    continent_name = response.continent.names['ja']
    country_name = response.country.names['ja']
    prefecture_name = response.subdivisions.most_specific.names['ja']
    city_name = response.city.names['ja']
    latitude = response.location.latitude
    longitude = response.location.longitude
    postal_code = response.postal.code
    
    print(continent_name)
    print(prefecture_name)
    print(city_name)
    print(latitude)
    print(longitude)
    print(postal_code)

最初に、GeoLite2-City.mmdbを読み込みます。
そして、IPアドレスは以下の部分に設定します。

response = reader.city('xxx.xxx.xxx.xxx')

上記プログラムを実行すると、各項目が表示されます。
なお、存在しない場合はエラーになります。
エラー処理は各自で自由に追記してください。

ちなみに、このブログが動いているサーバーのIPアドレス「133.167.77.58」を指定した結果は以下。

アジア
大阪府
大阪市
34.7135
135.4911
530-0011

多分、あっていると思います。
サーバー所在地は、大阪を選択しています。
サーバー会社は、さくらインターネットになります。

実際に、上記の本社所在地にサーバーを置いているかどうかは不明ですけど。

以上より、geoip2の動作確認を終了とします。

追記 2021年3月13日
GeoIP2データベースを自動更新する方法を以下の記事にまとめました。

タイトルとURLをコピーしました