ネットワーク分析やセキュリティインシデントの調査において、IPアドレスからその所在地や関連組織を特定したい場面は少なくありません。Kali Linuxを使っている方なら、Wiresharkスイートに含まれる `mmdbresolve` という強力なコマンドラインツールが利用可能です。
このブログ記事では、`mmdbresolve` の基本的な使い方から、より実践的な応用方法、そして利用する上での注意点まで、網羅的に解説していきます。初心者の方でも理解できるよう、具体的なコマンド例を交えながら説明しますので、ぜひ最後までご覧ください。
mmdbresolveとは? 🤔
`mmdbresolve` は、Wiresharkと共に配布されているコマンドラインユーティリティの一つです。その主な機能は、与えられたIPv4またはIPv6アドレスを、MaxMind DB(MMDB)形式のデータベースファイルと照合し、IPアドレスに関連付けられた情報を表示することです。
このツールを使うことで、以下のような情報を取得できます。
- 🌍 **地理情報**: 国、都市、郵便番号、緯度経度など
- 🏢 **組織情報**: ISP(インターネットサービスプロバイダ)、組織名、ASN(自律システム番号)など
これらの情報は、ネットワークトラフィックの分析、不正アクセスの調査、地域ターゲティング広告、コンテンツ配信の最適化など、様々な用途で活用されています。`mmdbresolve` は、これらの情報をコマンドラインから手軽に取得できるため、特にスクリプトとの連携や自動化処理において非常に便利です。
準備:MaxMind DBの入手と設定 🛠️
`mmdbresolve` を利用するには、MaxMind社が提供する **MMDB (MaxMind DB) 形式** のデータベースファイルが不可欠です。MaxMindは、高精度な商用版 (GeoIP2) と、無料で利用可能な **GeoLite2** というデータベースを提供しています。このブログでは、主に無料のGeoLite2データベースを使用することを前提に解説します。
GeoLite2データベースには、主に以下の種類があります。
- GeoLite2-ASN: IPアドレスに対応するASN(自律システム番号)と組織名を提供します。
- GeoLite2-City: IPアドレスに対応する国、都市、郵便番号、緯度経度などの地理情報を提供します。最も詳細な地理情報が含まれます。
- GeoLite2-Country: IPアドレスに対応する国情報を提供します。Cityよりも軽量です。
GeoLite2データベースの入手方法
以前は自由にダウンロードできましたが、現在、MaxMindからGeoLite2データベースをダウンロードするには、MaxMindアカウントを作成し、ライセンスキーを取得する必要があります(無料)。これは、MaxMindがデータ利用に関する規約遵守をより確実にするための措置です (2019年12月以降)。
- MaxMindのウェブサイト (https://www.maxmind.com/en/geolite2/signup) にアクセスし、アカウントを作成します。
- アカウント作成後、ログインしてライセンスキーを生成します。
- アカウントポータルの「Download Files」セクションから、必要なデータベース (GeoLite2-ASN, GeoLite2-City, GeoLite2-Country の `.mmdb` ファイル) をダウンロードします。通常、GZIP形式で圧縮されているため、ダウンロード後に展開 (`gunzip`) する必要があります。
⚠️ 注意: MaxMindの公式サイト以外からダウンロードできるGeoLite2データベースも存在しますが(例: GitHubリポジトリ)、ライセンス規約 (CC BY-SA 4.0) を遵守する必要があります。また、更新頻度や信頼性の観点から、可能な限り公式サイトから入手し、定期的に更新することをお勧めします。
データベースファイルの配置
ダウンロード・展開した `.mmdb` ファイルは、任意の場所に配置できますが、一般的には `/usr/share/GeoIP/` や `/usr/local/share/GeoIP/` といった共通のディレクトリ、あるいはユーザーのホームディレクトリ内などにまとめて置くと管理しやすいでしょう。
例えば、以下のように配置します。
/usr/share/GeoIP/GeoLite2-ASN.mmdb
/usr/share/GeoIP/GeoLite2-City.mmdb
/usr/share/GeoIP/GeoLite2-Country.mmdb
`mmdbresolve` を実行する際には、これらのデータベースファイルのパスを `-f` オプションで指定します。
基本的な使い方 💻
`mmdbresolve` の基本的な構文は非常にシンプルです。
mmdbresolve -f <db_file> [-f <db_file> ...] -i <ip_address>
または、標準入力からIPアドレスを読み込ませることも可能です。
echo <ip_address> | mmdbresolve -f <db_file> [-f <db_file> ...]
主なオプション
`mmdbresolve` でよく使用されるオプションをいくつか紹介します。
オプション | 説明 | 必須/任意 |
---|---|---|
-f, --file <db_file> |
使用するMaxMind DBファイル (.mmdb) へのパスを指定します。複数のデータベースを使用する場合は、このオプションを複数回指定します。 | 必須 |
-i, --ip <ip_address> |
情報を取得したいIPv4またはIPv6アドレスを指定します。このオプションを使用しない場合は、標準入力からIPアドレスを読み取ります。 | 任意 (標準入力を使わない場合) |
--all |
データベースに含まれる、利用可能な全ての情報を表示します。指定しない場合は、主要な情報のみが表示されることがあります。 | 任意 |
--lookup-path <path> |
データベース内の特定のデータパスを指定して、その値のみを抽出します。複数指定可能です。 (例: country/iso_code , city/names/ja ) |
任意 |
-v, --verbose |
より詳細な情報を表示します(デバッグなどに有用)。 | 任意 |
-h, --help |
ヘルプメッセージを表示して終了します。 | 任意 |
実行例 🚀
例として、Google Public DNS のIPアドレス `8.8.8.8` の情報を、`GeoLite2-City.mmdb` データベースを使って調べてみましょう。データベースファイルが `/usr/share/GeoIP/GeoLite2-City.mmdb` にあると仮定します。
# -i オプションを使う場合
mmdbresolve -f /usr/share/GeoIP/GeoLite2-City.mmdb -i 8.8.8.8
# 標準入力を使う場合
echo 8.8.8.8 | mmdbresolve -f /usr/share/GeoIP/GeoLite2-City.mmdb
実行すると、以下のようなINI形式の出力が得られます(内容はデータベースのバージョンによって若干異なる場合があります)。
[init]
db.0.path: /usr/share/GeoIP/GeoLite2-City.mmdb
db.0.status: OK
mmdbresolve.status: true
# End init
[8.8.8.8]
# GeoLite2-City
continent.code: NA
continent.geoname_id: 6255149
continent.names.de: Nordamerika
continent.names.en: North America
continent.names.es: Norteamérica
continent.names.fr: Amérique du Nord
continent.names.ja: 北アメリカ
continent.names.pt-BR: América do Norte
continent.names.ru: Северная Америка
continent.names.zh-CN: 北美洲
country.geoname_id: 6252001
country.is_in_european_union: false
country.iso_code: US
country.names.de: USA
country.names.en: United States
country.names.es: Estados Unidos
country.names.fr: États-Unis
country.names.ja: アメリカ合衆国
country.names.pt-BR: Estados Unidos
country.names.ru: США
country.names.zh-CN: 美国
location.accuracy_radius: 1000
location.latitude: 37.751000
location.longitude: -97.822000
location.time_zone: America/Chicago
registered_country.geoname_id: 6252001
registered_country.is_in_european_union: false
registered_country.iso_code: US
registered_country.names.de: USA
registered_country.names.en: United States
registered_country.names.es: Estados Unidos
registered_country.names.fr: États-Unis
registered_country.names.ja: アメリカ合衆国
registered_country.names.pt-BR: Estados Unidos
registered_country.names.ru: США
registered_country.names.zh-CN: 美国
# End 8.8.8.8
出力は `[init]` セクションと、問い合わせたIPアドレス `[8.8.8.8]` のセクションに分かれています。
- `[init]` セクション: 使用したデータベースファイルの情報や `mmdbresolve` 自体のステータスが表示されます。
- `[8.8.8.8]` セクション: IPアドレス `8.8.8.8` に関する情報がキーと値のペアで表示されます。データベースの種類 (`# GeoLite2-City`) もコメントで示されます。大陸 (continent)、国 (country)、位置情報 (location) など、様々な情報が含まれていることがわかります。特に `country.iso_code` (国コード) や `country.names.ja` (国名の日本語表記)、 `location.latitude`, `location.longitude` (緯度経度) などがよく利用されます。
このように、`mmdbresolve` を使うと、コマンド一つで簡単にIPアドレスの地理情報を取得できます。🌍
応用的な使い方 ✨
`mmdbresolve` は基本的な使い方だけでも便利ですが、いくつかのテクニックを組み合わせることで、さらに強力なツールとなります。
複数のデータベースを同時に利用する
地理情報 (City DB) と ASN情報 (ASN DB) の両方を一度に取得したい場合、`-f` オプションを複数回指定します。
mmdbresolve \
-f /usr/share/GeoIP/GeoLite2-City.mmdb \
-f /usr/share/GeoIP/GeoLite2-ASN.mmdb \
-i 8.8.8.8
出力には、Cityデータベースからの情報とASNデータベースからの情報がマージされて表示されます。ASN情報には `autonomous_system_number` (ASN) や `autonomous_system_organization` (組織名) などが含まれます。
[8.8.8.8]
# GeoLite2-City
continent.code: NA
... (City DBからの情報) ...
location.time_zone: America/Chicago
registered_country.geoname_id: 6252001
... (City DBからの情報) ...
registered_country.names.zh-CN: 美国
# GeoLite2-ASN
autonomous_system_number: 15169
autonomous_system_organization: GOOGLE
# End 8.8.8.8
これにより、IPアドレスの所在地と、そのIPアドレスを管理している組織を同時に知ることができます。これは、特にセキュリティインシデントの調査などで役立ちます。💡
特定の情報だけを抽出する (`–lookup-path`)
データベースに含まれる全ての情報が必要ない場合、`–lookup-path` オプションを使って特定のデータ項目だけを抽出できます。データパスは、MMDBデータベース内部の構造に対応します (例: `country.iso_code`, `city.names.en`, `autonomous_system_organization`)。
例えば、国コード (ISO) と英語の都市名だけを取得したい場合は、以下のように指定します。
mmdbresolve \
-f /usr/share/GeoIP/GeoLite2-City.mmdb \
-i 8.8.8.8 \
--lookup-path country/iso_code \
--lookup-path city/names/en
出力は以下のようになり、指定した項目だけが表示されます。
[init]
...
# End init
[8.8.8.8]
# GeoLite2-City
country.iso_code: US
# city.names.en path not found # (注: 8.8.8.8 は特定の都市に関連付けられていないため、パスが見つからない場合がある)
# End 8.8.8.8
別のIPアドレス (例: `1.1.1.1`) で試してみましょう。
mmdbresolve \
-f /usr/share/GeoIP/GeoLite2-City.mmdb \
-i 1.1.1.1 \
--lookup-path country/iso_code \
--lookup-path city/names/en
[init]
...
# End init
[1.1.1.1]
# GeoLite2-City
country.iso_code: US
city.names.en: Ashburn
# End 1.1.1.1
このように、必要な情報だけをピンポイントで取得できるため、スクリプトでの処理やデータの整形が容易になります。✅
シェルスクリプトとの連携 (複数IPアドレスの処理)
`mmdbresolve` は標準入力からIPアドレスを受け取ることができるため、ファイルに記述されたIPアドレスリストを処理するのに便利です。`cat` と `while read` ループを組み合わせることで、リスト内の各IPアドレスに対して `mmdbresolve` を実行できます。
まず、IPアドレスのリストが書かれたファイル (`ip_list.txt`) を用意します。
# ip_list.txt
8.8.8.8
1.1.1.1
203.0.113.1
次に、以下のシェルスクリプトを実行します。
#!/bin/bash
DB_CITY="/usr/share/GeoIP/GeoLite2-City.mmdb"
DB_ASN="/usr/share/GeoIP/GeoLite2-ASN.mmdb"
IP_LIST="ip_list.txt"
if [ ! -f "$DB_CITY" ] || [ ! -f "$DB_ASN" ]; then
echo "データベースファイルが見つかりません。" >&2
exit 1
fi
if [ ! -f "$IP_LIST" ]; then
echo "IPアドレスリストファイル '$IP_LIST' が見つかりません。" >&2
exit 1
fi
echo "IPアドレスリスト '$IP_LIST' を処理中..."
cat "$IP_LIST" | while read ip_address; do
# 空行やコメント行をスキップ
[[ -z "$ip_address" || "$ip_address" =~ ^# ]] && continue
echo "--- IP: $ip_address ---"
mmdbresolve -f "$DB_CITY" -f "$DB_ASN" -i "$ip_address"
echo "" # 区切りとして空行を出力
done
echo "処理完了。"
このスクリプトは、`ip_list.txt` から1行ずつIPアドレスを読み込み、それぞれのIPアドレスに対してCityデータベースとASNデータベースを使って情報を取得し、結果を表示します。
`jq` との連携 (JSONライクな出力の整形)
`mmdbresolve` の出力はINI形式ですが、キーと値のペアはJSONの構造に似ています。より柔軟なデータ処理を行いたい場合、出力を少し加工して `jq` のようなJSONプロセッサで扱うことができます。
簡単な方法として、`mmdbresolve` の出力から特定のキーの値だけを取り出すことができます。例えば、国コードとASN組織名だけをタブ区切りで出力したい場合、以下のようなコマンドが考えられます (多少強引な方法ですが)。
IP="8.8.8.8"
DB_CITY="/usr/share/GeoIP/GeoLite2-City.mmdb"
DB_ASN="/usr/share/GeoIP/GeoLite2-ASN.mmdb"
mmdbresolve -f "$DB_CITY" -f "$DB_ASN" -i "$IP" | \
grep -E 'country.iso_code:|autonomous_system_organization:' | \
awk -F': ' '{gsub(/^[ \t]+|[ \t]+$/, "", $2); printf "%s\t", $2}' && echo ""
このコマンドは、`mmdbresolve` の出力から `country.iso_code:` または `autonomous_system_organization:` を含む行を `grep` で抽出し、`awk` を使って値の部分だけを取り出してタブ区切りで表示します。
出力例:
US GOOGLE
このように、標準的なUnixコマンドと組み合わせることで、`mmdbresolve` の出力を様々な形式に加工して利用することが可能です。スクリプト内でデータを処理する際に非常に役立ちます。⚙️
ユースケース・活用事例 🌐
`mmdbresolve` は、その手軽さと機能性から、様々な分野で活用されています。ここでは、代表的なユースケースをいくつか紹介します。
1. セキュリティインシデント分析 🛡️
ファイアウォールのログ、侵入検知システム (IDS/IPS) のアラート、Webサーバーのアクセスログなどには、通信元のIPアドレスが記録されています。不審なアクセスや攻撃が検知された際、そのIPアドレスの発信元情報を `mmdbresolve` で調査することは、インシデント対応の初動として非常に有効です。
- 攻撃元の特定: 攻撃者の地理的な位置や利用しているISP/ホスティング業者 (ASN情報から) を特定し、攻撃の背景や意図を推測する手がかりとします。例えば、「特定の国からのアクセスが急増している」「特定のASNからのスキャン活動が頻繁に見られる」といった状況把握に役立ちます。
- 対策の検討: 特定の国やASNからのアクセスを一時的にブロックするなど、`mmdbresolve` で得られた情報に基づいて、より的確な防御策を講じることができます。
- レポート作成: インシデントレポートに、攻撃元IPアドレスの地理情報や組織情報を付記することで、状況の理解を深め、関係者への説明責任を果たす上で役立ちます。
例えば、2023年に発生したある企業のWebサーバーへのブルートフォース攻撃を分析した際、アクセスログに含まれる大量の試行元IPアドレスを `mmdbresolve` とスクリプトで処理しました。その結果、攻撃トラフィックの大部分が、特定の数カ国のクラウドサーバーから発信されていることが判明しました。この情報に基づき、該当国のIPアドレス範囲からの認証試行回数に制限を設けることで、攻撃を効果的に緩和できたという事例があります (これは一般的なシナリオ例です)。
2. ネットワーク監視とトラフィック分析 📊
ネットワーク機器から収集されるNetFlowやsFlowといったトラフィック情報と `mmdbresolve` を組み合わせることで、ネットワーク全体の通信状況をより深く理解することができます。
- 通信相手の可視化: どの国や地域のサーバーとどれくらいの通信が発生しているかを把握できます。これにより、予期せぬ国との通信や、特定の地域へのトラフィック集中などを検知できます。
- パフォーマンス分析: CDN (コンテンツデリバリーネットワーク) が効果的に機能しているか、ユーザーに最も近いサーバーからコンテンツが配信されているかなどを確認する際に、IPアドレスの地理情報が役立ちます。
- 異常検知: 平常時の通信パターンと比較し、「普段通信のない国からのアクセスが急増した」「特定のISPからのトラフィックが異常に多い」といった変化を捉え、潜在的な問題や脅威の早期発見に繋げます。
3. Webアクセスログ分析とマーケティング 📈
Webサーバーのアクセスログには、サイト訪問者のIPアドレスが記録されています。これらのIPアドレスを `mmdbresolve` で処理することで、訪問者の地域分布を把握できます。
- 地域ターゲティング: どの地域のユーザーからのアクセスが多いかを分析し、地域に特化したコンテンツ配信や広告キャンペーンの計画に役立てます。
- コンテンツ最適化: 特定の国や言語圏からのアクセスが多い場合、その言語に対応したページを用意したり、地域の文化に合わせたコンテンツを提供したりといった改善策を検討できます。
- 不正利用検知: 特定地域からの異常なアクセスパターン(例: 大量のアカウント作成試行、プロキシ経由でのアクセスなど)を検知し、対策を講じる材料とします。
これらのユースケースはほんの一例です。`mmdbresolve` はアイデア次第で様々な自動化や分析に応用できる、非常に汎用性の高いツールと言えるでしょう。
注意点とトラブルシューティング ⚠️
`mmdbresolve` は非常に便利なツールですが、利用にあたってはいくつかの注意点があります。また、予期せぬ問題が発生した場合の対処法も知っておくと良いでしょう。
1. データベースの精度と限界
MaxMindのGeoLite2データベースは無料で利用できる優れたリソースですが、その精度には限界があります。特に、以下の点に留意してください。
- 国レベルの精度は比較的高いですが、都市レベルや郵便番号レベルの精度は、国や地域によってばらつきがあります。特にモバイルIPアドレスやVPN/プロキシ経由のIPアドレスの場合、実際の所在地と異なる情報が返されることがあります。
- データベースの情報は、IPアドレスが**登録されている**国や組織を示しますが、必ずしもそのIPアドレスが**物理的に**存在する場所や、**実際に**利用しているユーザーの所在地と一致するとは限りません。
- `mmdbresolve` から得られる情報は、あくまで**推定値**または**登録情報**として捉え、補助的な情報として利用するのが適切です。決定的な証拠として扱うのは避けましょう。
2. データベースの更新の重要性
前述の通り、IPアドレスの割り当て状況は常に変化しています。古いデータベースを使い続けると、誤った情報に基づいて判断を下してしまうリスクが高まります。
3. プライバシーへの配慮
IPアドレスから得られる地理情報や組織情報は、組み合わせによっては個人の特定につながる可能性もゼロではありません。特に、取得した情報を公開したり、第三者と共有したりする場合には、プライバシー保護に関する法令(GDPRなど)やガイドラインを遵守し、慎重に取り扱う必要があります。利用目的に照らして、必要最小限の情報のみを取得・保持するように心がけましょう。
4. よくあるエラーと対処法
`mmdbresolve` の実行時に遭遇する可能性のある一般的なエラーとその対処法をいくつか紹介します。
エラー: `mmdbresolve: Can’t open … No such file or directory`
原因: `-f` オプションで指定したデータベースファイルが存在しないか、パスが間違っています。
対処法:
- データベースファイルのパスが正しいか確認してください。
- ファイルが存在するか `ls` コマンドなどで確認してください。
- ファイルに対する読み取り権限があるか確認してください。
エラー: `mmdbresolve: Error opening database file … : Invalid metadata block` (または類似のDBエラー)
原因: データベースファイルが破損しているか、MMDB形式として正しくありません。
対処法:
- データベースファイルをMaxMindから再ダウンロードしてみてください。
- ダウンロードしたファイルが正しく展開されているか確認してください (GZIP形式の場合)。
- ファイルの破損がないか確認してください (ダウンロード時のエラーなど)。
エラー: (特に出力なし、または予期しない出力)
原因: `-i` オプションで指定したIPアドレスの形式が不正、または標準入力からIPアドレスが渡されていない。
対処法:
- `-i` で指定したIPアドレスが正しい形式 (IPv4またはIPv6) であるか確認してください。
- 標準入力から渡す場合、`echo` コマンドなどが正しくIPアドレスを出力しているか確認してください。
- `-v` (verbose) オプションを付けて実行し、詳細なエラーメッセージが出力されないか確認してください。
問題が解決しない場合は、`mmdbresolve -h` でヘルプを確認したり、Wiresharkのドキュメントやコミュニティフォーラムで情報を探したりすると良いでしょう。
まとめ 📝
`mmdbresolve` は、Wiresharkスイートに含まれる、IPアドレスから地理情報やASN情報を取得するためのシンプルかつ強力なコマンドラインツールです。MaxMindのGeoLite2データベース (無料) と組み合わせることで、ネットワーク分析、セキュリティ調査、ログ解析など、多岐にわたるタスクを効率化できます。
この記事では、基本的な使い方から、複数のデータベースの利用、特定情報の抽出、シェルスクリプトや他のコマンドとの連携といった応用テクニック、そして利用上の注意点までを解説しました。
重要なポイント:
- ✅ MaxMindアカウントを作成し、GeoLite2データベース (.mmdb) を入手・配置する。
- ✅ 基本的なコマンドは `mmdbresolve -f <db_file> -i <ip_address>`。
- ✅ `-f` を複数指定して複数のDBを同時に利用可能。
- ✅ `–lookup-path` で必要な情報だけを抽出できる。
- ✅ シェルスクリプトや `jq` などと連携して自動化・データ加工が可能。
- ⚠️ データベースの精度には限界があり、定期的な更新が不可欠。
- ⚠️ プライバシーに配慮して利用する。
`mmdbresolve` を使いこなすことで、IPアドレスという一見無機質な情報から、より多くの洞察を得ることができるようになります。ぜひ、日々の業務や学習に取り入れてみてください! 💪
参考情報 📚
より詳細な情報については、以下の公式ドキュメントやリソースをご参照ください。
-
Kali Linux Tools – wireshark (mmdbresolve含む):
https://www.kali.org/tools/wireshark/
Kali LinuxにおけるWiresharkスイート(mmdbresolveを含む)の概要ページです。
-
Wireshark Documentation – mmdbresolve(1) man page:
https://www.wireshark.org/docs/man-pages/mmdbresolve.html
mmdbresolveコマンドの公式マニュアルページです。オプションの詳細などが記載されています。
-
MaxMind Developer Portal – GeoLite2 Free Geolocation Data:
https://dev.maxmind.com/geoip/geolite2-free-geolocation-data
GeoLite2データベースの概要、ダウンロード、ライセンスに関する情報がまとめられています。
-
MaxMind Account Login (for DB download):
https://www.maxmind.com/en/account/login
GeoLite2データベースをダウンロードするためのMaxMindアカウントログインページです。
コメント