0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Go言語でGeoIP2/GeoLite2(IP位置情報)データベースを使う方法

Posted at

はじめに

IPアドレスから位置情報を検索するためのデータベースGeoIP2/GeoLite2をGo言語から使う方法の説明です。

パッケージ

Go言語のパッケージは、

です。

GeoLite2データベースの入手方法

無償版のGeoLite2はパッケージのREADME.mdにダウンロードのリンクが記載されていますが、
現在はページがありません。404のページが表示されます。
以前はユーザー登録をしないでダウンロード可能でしたが現在は登録してからダウンロードするようになりました。

のページ

image.png

にあるリンクから登録してログインすると

image.png

のような画面からダウンロードできます。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のアドレス分析

image.png

の画面でIPアドレスから位置を調べられます。
NetFlowの情報からも自動で位置情報を取得してレポートを作成しています。

GeoLite2のデータベースは、組み込んでいないので、この記事で紹介した方法に従ってダウンロードしてください。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?