Skip to content

自定义 IP 地理位置数据库

Dashboard v0.18.3+ 采用离线数据库获取 GeoIP 信息,如需编译正确显示地理位置信息的 Dashboard,必须在 pkg/geoip/geoip.db 路径下放置符合 IPinfo 格式的 mmdb 数据库。

IPinfo 格式包含以下字段:

  • 作为条目的 IP 子网
  • continent:大洲代码
  • continent_name:大洲名称
  • country:国家/地区代码
  • country_name:国家/地区名称

其中 Dashboard 只需要用到 country 信息,其它字段可留空。

编辑数据库

目前推荐使用 MaxMind 官方使用的 mmdbwritermaxminddb-golang 这两个库进行 mmdb 的编辑操作。

如果你的主要目的是为了校正地理信息,建议直接在 IPinfo 原版数据库的基础上修改。类似的操作可以参考 sing-geoip 项目。

这里以校正 IPinfo 数据为例,你需要使用 ReplaceWith inserter(此为默认值)并写入 mmdbtype.Map 信息:

go
subnet := &net.IPNet{
    IP:   net.ParseIP("114.5.1.4")
    Mask: net.CIDRMask(32, 32)
}
countryMap := make(map[mmdbtype.String]mmdbtype.String)

countryMap[mmdbtype.String("country")] = mmdbtype.String("JP")

if err := writer.Insert(subnet, mmdbtype.Map(countryMap)); err != nil {
	return err
}

其中 writer 为一个 *mmdbwriter.Tree 的实例,需要通过 mmdbwriter.New 方法创建。具体操作和插入其它字段的过程不再赘述。

编辑完成并将数据库信息写入到文件后,可以使用 mmdbinspect 命令行工具测试数据库信息。例如:

shell
$ mmdbinspect -db ./country.mmdb 114.5.1.4
[
    {
        "Database": "./country.mmdb",
        "Records": [
            {
                "Network": "114.5.1.4/32",
                "Record": {
                    "continent": "AS",
                    "continent_name": "Asia",
                    "country": "JP",
                    "country_name": "Japan"
                }
            }
        ],
        "Lookup": "114.5.1.4"
    }
]

确定格式、信息无误后便可用于 Dashboard 编译。之后可通过 grpcurl 或类似工具测试查询 API 是否工作正常:

shell
grpcurl -proto ./nezha/proto/nezha.proto -plaintext -H 'client_secret: test' -d '{"ip": "114.5.1.4"}' 127.0.0.1:5555 proto.NezhaService/LookupGeoIP