はじめに
IPアドレスから位置情報を検索するためのデータベースGeoIP2/GeoLite2をGo言語から使う方法の説明です。
パッケージ
Go言語のパッケージは、
です。
GeoLite2データベースの入手方法
無償版のGeoLite2はパッケージのREADME.mdにダウンロードのリンクが記載されていますが、
現在はページがありません。404のページが表示されます。
以前はユーザー登録をしないでダウンロード可能でしたが現在は登録してからダウンロードするようになりました。
のページ
にあるリンクから登録してログインすると
のような画面からダウンロードできます。Download Filesメニューです。
GeoLite2 CityのGZIPをダウンロードすればよいです。
解凍すると
GeoLite2-City.mmdb
というファイルがあります。これがGeoLite2のデータベースファイルです。
サンプルプログラム
このデータベースを利用してIPアドレスから位置情報を取得するサンプルプログラムは
package main
import (
"encoding/json"
"fmt"
"log"
"net"
"os"
"github.com/oschwald/geoip2-golang"
)
func main() {
if len(os.Args) < 2 {
log.Fatal("No IP")
}
db, err := geoip2.Open("GeoLite2-City.mmdb")
if err != nil {
log.Fatal(err)
}
defer db.Close()
ip := net.ParseIP(os.Args[1])
record, err := db.City(ip)
if err != nil {
log.Fatal(err)
}
js, err := json.MarshalIndent(record, "", " ")
if err != nil {
log.Fatal(err)
}
fmt.Println(string(js))
}
です。データを見やすくするためJSON形式にフォーマットしています。
$ go run main.go 219.118.71.18
のように実行すると
{
"City": {
"Names": null,
"GeoNameID": 0
},
"Postal": {
"Code": ""
},
"Continent": {
"Names": {
"de": "Asien",
"en": "Asia",
"es": "Asia",
"fr": "Asie",
"ja": "アジア",
"pt-BR": "Ásia",
"ru": "Азия",
"zh-CN": "亚洲"
},
"Code": "AS",
"GeoNameID": 6255147
},
"Subdivisions": null,
"RepresentedCountry": {
"Names": null,
"IsoCode": "",
"Type": "",
"GeoNameID": 0,
"IsInEuropeanUnion": false
},
"Country": {
"Names": {
"de": "Japan",
"en": "Japan",
"es": "Japón",
"fr": "Japon",
"ja": "日本",
"pt-BR": "Japão",
"ru": "Япония",
"zh-CN": "日本"
},
"IsoCode": "JP",
"GeoNameID": 1861060,
"IsInEuropeanUnion": false
},
"RegisteredCountry": {
"Names": {
"de": "Japan",
"en": "Japan",
"es": "Japón",
"fr": "Japon",
"ja": "日本",
"pt-BR": "Japão",
"ru": "Япония",
"zh-CN": "日本"
},
"IsoCode": "JP",
"GeoNameID": 1861060,
"IsInEuropeanUnion": false
},
"Location": {
"TimeZone": "Asia/Tokyo",
"Latitude": 35.6897,
"Longitude": 139.6895,
"MetroCode": 0,
"AccuracyRadius": 500
},
"Traits": {
"IsAnonymousProxy": false,
"IsAnycast": false,
"IsSatelliteProvider": false
}
}
のような結果が表示されます。
国や緯度経度などの情報が取得できます。
City(都市名)も取得できる場合があります。
有償のGeoIP2のデータベースでは試したことがりません。
もっと、正確な情報が表示されるかもしれません。
余談
このGeoIPのパッケージは、TWSNMPシリーズで使っています。
TWSNMP FCのアドレス分析
の画面でIPアドレスから位置を調べられます。
NetFlowの情報からも自動で位置情報を取得してレポートを作成しています。
GeoLite2のデータベースは、組み込んでいないので、この記事で紹介した方法に従ってダウンロードしてください。