- SURFPOINT
- その他データ
MMDB形式の使ったIP Geolocation情報取得実例を解説
- 目次
弊社ではSURFPOINT™ for GeoIP2 Module という名前で、MMDB形式でのデータ納品も行っております。
この記事では、SURFPOINT™ for GeoIP2 ModuleをApache、Nginx、PHPから利用する際の設定例についてまとめています。
導入を検討している方は、ぜひ参考にしてください。
■この記事でわかること
|
MMDB形式とは
MMDB形式とは、GeoIP2とも呼ばれ、MaxMind社が開発したIPアドレスに紐づいた情報を検索することに特化されたデータベースファイルフォーマットです。
ファイルフォーマットの仕様は公開(https://maxmind.github.io/MaxMind-DB/)されており、誰でも閲覧可能です。
Apacheから利用する設定例
Git Hubで公開されている手順を参考に、mod_maxminddbをインストールします。
https://github.com/maxmind/mod_maxminddb
例)特定国からのアクセスを制限する方法
Apache構成ファイル(httpd.conf、apache2.conf)や.htaccessに、以下を追加すると、特定国からのアクセスを制限することができます。
<IfModule mod_maxminddb.c>
MaxMindDBEnable On
MaxMindDBFile COUNTRY_DB /usr/local/share/SP/SURFPOINT-Country.mmdb
MaxMindDBEnv COUNTRY_CODE COUNTRY_DB/country/iso_code
<Location "/">
# 特定の国をブロック 例はロシア、中国、北朝鮮
SetEnvIf COUNTRY_CODE ^(RU|CN|KP) BlockCountry
Order Deny,Allow
Deny from env=BlockCountry
Allow from all
</Location>
</IfModule>
confファイル内に記載した各項目は、以下の意味を表しています。
MaxMindDBEnable
MaxMind DB 検索を有効または無効にします。Onが有効、Offが無効を指します。
MaxMindDBEnable On
MaxMindDBFile
名前プレースホルダーをディスク上の MaxMind DB ファイルに関連付けます。mmdbファイルの保管場所をパス込みで記載してください。
以下のようにそれぞれに独自の名前を付けて複数のデータベースを指定することも可能です。
MaxMindDBFile COUNTRY_DB /usr/local/share/SP/SURFPOINT-Country.mmdb
MaxMindDBFile CITY_DB /usr/local/share/SP/SURFPOINT-City.mmdb
MaxMindDBEnv
MMDBの検索結果を環境変数に割り当てます。
最初のパラメータ(COUNTRY_CODEに該当する部分)は、環境変数です。
2番目のパラメータ(COUNTRY_DB/country/iso_codeに該当する部分)は、環境変数に入れる項目を指定します。
MaxMindDBEnv COUNTRY_CODE COUNTRY_DB/country/iso_code
例)国判定をアクセスログに出力
Apache構成ファイル(httpd.conf、apache2.conf)内に、「特定国からのアクセスを制限する方法」内でご紹介した「MaxMindDBEnable」「MaxMindDBFile」「MaxMindDBEnv」が設定されている状態で、LogFormatに、以下の赤文字で書かれた部分を追加すると、アクセスログの一番後ろに、アクセス者の国コードが出力されるようになります。
LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\" \"%{COUNTRY_CODE}e\"" combined
ログ出力結果
上記設定をすると、レコードの一番後ろ(赤文字)に国コードが出力されるようになります。
198.51.100.1 - - [08/May/2024:12:45:52 +0900] "GET /.env HTTP/1.1" 401 581 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.129 Safari/537.36" "US"
198.51.100.1 - - [08/May/2024:13:46:03 +0900] "GET /index.html HTTP/1.1" 200 581 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36" "US"
Nginxから利用する設定例
Git Hubで公開されている手順を参考に、ngx_http_geoip2_moduleをインストールします。
https://github.com/leev/ngx_http_geoip2_module
例)特定国からのアクセスを制限する方法
nginx.conf、default.confに、以下の赤文字で書かれた部分を追加すると、特定国からのアクセスを制限することができます。
- nginx.conf
# nginx.confのeventより上に追加する項目
load_module "modules/ngx_http_geoip2_module.so"
# nginx.conf httpディテクティブ内に追加する項目
http {
…
geoip2 mmdb /usr/local/share/SP/SURFPOINT-Country.mmdb {
auto_reload 60m;
$geoip2_data_county_code country iso_code ;
}
map $geoip2_data_country_code $allowed_country {
default yes;
RU no;
CN no;
KP no;
}
}
- default.conf
# serverディテクティブに追加する項目
server {
if ( $allowed_country = "no" ) {
return 403;
}
}
confファイル内に記載した各項目は、以下の意味を表しています。
geoip2 mmdb
ディスク上の MaxMind DB ファイルを指定します。MMDBファイルの保管場所をパス込みで記載してください。
auto_reload
MMDBファイルの更新時間を確認する間隔を指定できます。このオプションを追加すると、Nginxを再起動しなくても、MMDBファイルのリロードが行われます。
例)国判定をアクセスログに出力
nginx.conf内に、「特定国からのアクセスを制限する方法」内でご紹介した「nginx.confのeventより上に追加する項目」「nginx.conf httpディテクティブ内に追加する項目」が設定されている状態で、log_format部分に以下の赤文字で書かれた部分を追加すると、アクセスログの一番後ろに、アクセス者の国コードが出力されるようになります。
log_format main '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" "$geoip2_data_country_code";
ログ出力結果
上記設定をすると、レコードの一番後ろ(赤文字)に国コードが出力されるようになります。
198.51.100.1 - - [08/May/2024:12:45:52 +0900] "GET /.env HTTP/1.1" 401 581 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.129 Safari/537.36" "US"
198.51.100.1 - - [08/May/2024:13:46:03 +0900] "GET /index.html HTTP/1.1" 200 581 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36" "US"
PHPから直接MMDBを参照する方法
Git Hubで公開されている手順を参考に、APIをインストールします。
https://github.com/maxmind/MaxMind-DB-Reader-php
例)ブラウザにアクセスがあったIPアドレスの国コード、国名を出力する方法
以下PHPファイルを作成し、ブラウザ側からアクセスすると、アクセス者のIPアドレスに合わせて国判定(国コード、国名)を表示することができます。
※出力もブラウザ側の前提
<?php
require_once 'vendor/autoload.php';
use MaxMind\Db\Reader;
$ipAddress = getenv( 'REMOTE_ADDR' );
$databaseFile = 'MMDBファイル';
$var = array();
$var = $reader->getWithPrefixLen($ipAddress);
print_r($var[0]['country']['iso_code'] . '<br>');
print_r($var[0]['country'] ['names']['ja'] . '<br>');
$reader->close();
?>
ApacheもしくはNginxでMMDBを参照し、その結果をPHPで利用する方法
ApacheやNginxを利用している場合は、Apache、Nginx側で環境変数に判定結果を設定することで、その環境変数を使ってPHPで読みだすことが可能となります。
こちらの場合は、PHPのAPIインストール作業は不要です。
Apache+PHP
「Apacheから利用する設定例」の「MaxMindDBEnv」で設定した値が環境変数となります。
Nginx+PHP
以下のように、fastcgi_paramを使用することで、環境変数に設定することができます。
ginx.conf httpディレクティブ内に追加する項目
http {
…
geoip2 mmdb /usr/local/share/SP/SURFPOINT-Country.mmdb {
auto_reload 60m;
$geoip2_data_county_code country iso_code;
}
fastcgi_param COUNTRY_CODE $geoip2_data_country_code;
}
PHPでの環境変数から取得方法
環境変数は、$_SERVERという配列に登録されています。
以下のように、$_SERVER[‘環境変数’]と指定することで、PHP側で環境変数に設定した判定結果を呼び出すことが可能です。
<?php
print_r($_SERVER[' COUNTRY_CODE '] . '<br>');
?>
PHP以外での連携
PHPは一例で、Pythonなどほかの言語との連携用ライブラリもGit Hubで公開されております。
他の言語をご利用の場合は、下記ページからライブラリをご確認ください。
https://github.com/maxmind
取得データ一覧
SURFPOINT™ for GeoIP2 ModuleのCountry、City、Advanceで取得できるデータ項目名の一覧です。
下記ページでもラインナップなどをご紹介しておりますので、併せてご確認ください。
https://www.surfpoint.jp/geo-ip2-module/
「CountryとAnonymous Networkを組み合わせたデータがほしい」といった要望にも対応可能です。
Country
項目名 | 項目内容 | データ型 | ||
---|---|---|---|---|
大陸(continent) | code | 大陸コード | utf8_string | |
geoname_id | GeoNameID | uint32 | ||
names | en | 大陸名(英語) | utf8_string | |
ja | 大陸名(日本語) | utf8_string | ||
国(country) | geoname_id | GeoNameID | uint32 | |
iso_code | ISOコード | utf8_string | ||
names | en | 国名(英語) | utf8_string | |
ja | 国名(日本語) | utf8_string | ||
登録国(registered_country) | geoname_id | GeoNameID | uint32 | |
iso_code | ISOコード | utf8_string | ||
names | en | 国名(英語) | utf8_string | |
ja | 国名(日本語) | utf8_string |
City
Countryの項目に追加で、以下の項目を収録しています。
項目名 | 項目内容 | データ型 | |||
---|---|---|---|---|---|
都市(city) | name | en | 都市名(英語) | utf8_string | |
ja | 都市名(日本語) | utf8_string | |||
ロケーション(location) | latitude | 緯度 | double | ||
longitude | 経度 | double | |||
第一行政区画(subdivisions) | 0 | iso_code | ISOコード | utf8_string | |
names | en | 第一行政区画名(英語) | utf8_string | ||
ja | 第一行政区画名(日本語) | utf8_string |
Advance
Country、Cityの項目に追加で、以下の項目を収録しています。
項目名 | 項目内容 | データ型 | |||
---|---|---|---|---|---|
接続回線(line) | cf | 接続回線CF | uint16 | ||
code | 接続回線コード | utf8_string | |||
domain | ドメイン | utf8_string | |||
domain_type | ドメイン種別 | utf8_string | |||
proxy | プロキシフラグ | boolean | |||
ロケーション(location) | area_code | 市外局番 | utf8_string | ||
bcflag | Bフラグ | utf8_string | |||
time_zone | タイムゾーン | utf8_string | |||
組織(organization) | address | en | 住所(英語) | utf8_string | |
ja | 住所(日本語) | utf8_string | |||
capital | 資本金コード | uint16 | |||
city_code | 組織市区町村コード | utf8_string | |||
code | 企業コード | utf8_string | |||
date | 設立年月 | utf8_string | |||
domain | 組織ドメイン | utf8_string | |||
domain_type | 組織ドメイン種別 | utf8_string | |||
employees | 従業員数コード | uint16 | |||
fax | FAX番号 | utf8_string | |||
gross | 売上高コード | uint16 | |||
independent | 自営業フラグ | uint16 | |||
industrial_category | l | 業種大分類コード | utf8_string | ||
m | 業種中分類コード | utf8_string | |||
s | 業種小分類コード | utf8_string | |||
t | 業種細分類コード | utf8_string | |||
ipo | 上場区分フラグ | uint16 | |||
latitude | 組織緯度 | double | |||
names | en | 組織名(英語) | utf8_string | ||
ja | 組織名(日本語) | utf8_string | |||
office | 本支店フラグ | utf8_string | |||
pref_code | 組織都道府県コード | utf8_string | |||
stock_ticker_number | 証券コード | utf8_string | |||
tel | 電話番号 | utf8_string | |||
url | URL | utf8_string | |||
zip | 組織郵便番号 | utf8_string | |||
第一行政区画(subdivisions) | 0 | region | 地方コード | utf8_string |
SURFPOINT™ for GeoIP2 Moduleを活用しよう
SURFPOINT™ for GeoIP2 Moduleは、MaxMind社で公開されているライブラリを用いて簡単に連携することが可能です。
導入サポートも承りますので、もし乗り換えを検討しておりましたら、ぜひSURFPOINT™ for GeoIP2 Moduleをご検討ください。
SURFPOINT™ for GeoIP2 Moduleの詳細をお聞きしたい場合は、下記フォームより問い合わせください。