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 Code | 105-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データベースを自動更新する方法を以下の記事にまとめました。