Knowledge CenterSURFPOINT™ ナレッジセンター

SURFPOINT™に関するQ&Aや技術に関する記事を掲載しています。

SURFPOINT™に関するQ&Aや技術に関する記事を掲載しています。

  • SURFPOINT
  • その他データ

MMDB形式の使ったIP Geolocation情報取得実例を解説

目次

弊社ではSURFPOINT™ for GeoIP2 Module という名前で、MMDB形式でのデータ納品も行っております。
この記事では、SURFPOINT™ for GeoIP2 ModuleをApache、Nginx、PHPから利用する際の設定例についてまとめています。
導入を検討している方は、ぜひ参考にしてください。 

■この記事でわかること

  • MMDB形式とは
  • 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の詳細をお聞きしたい場合は、下記フォームより問い合わせください。

一覧にもどる

目的別で探す