地理位置

地理位置使用客户机 IP 查找 Maxmind geoip2 数据库,然后将关联的地理位置数据添加到上下文请求。

说明

地理位置插件添加与客户机 IP 关联的地理位置数据,它允许您配置一个 geoIP2 maxmind database 来添加与 IP 地址关联的地理位置数据。

数据利用元数据插件进行添加,然后还可以使用它来检索值,例如

import (
    "strconv"
    "github.com/coredns/coredns/plugin/metadata"
)
// ...
if getLongitude := metadata.ValueFunc(ctx, "geoip/longitude"); getLongitude != nil {
    if longitude, err := strconv.ParseFloat(getLongitude(), 64); err == nil {
        // Do something useful with longitude.
    }
} else {
    // The metadata label geoip/longitude for some reason, was not set.
}
// ...

数据库

支持的数据库使用城市架构,例如 CityEnterprise。当前还不支持其他具有不同架构的数据库类型。

您可以下载一个 免费的和公开的城市数据库

语法

geoip [DBFILE]

geoip [DBFILE] {
    [edns-subnet]
}
  • DBFILE mmdb 数据库文件路径。我们建议定期更新您的 mmdb 数据库以获得更准确的结果。

  • edns-subnet:可选。对于地理 IP,使用 EDNS0 子网(如果存在),而不是 DNS 请求的源 IP。这有助于通过中间 DNS 解析器识别最接近的源 IP 地址,并且还可以简化地理 IP 测试:dig +subnet=1.2.3.4 @dns-server.example.com www.geo-aware.com.

    注意:出于安全原因,递归 DNS 解析器可能会屏蔽客户机 IP 地址的几位,这会导致地理 IP 分辨不准确。

    标准中没有定义掩码大小,但有示例:RFC 7871’s example 隐藏 IPv6 源地址的最后 72 位,而 NS1 帮助中心 提到 启用 ECS 的 DNS 解析器仅发送源 IPv4 地址的前三个八位组(例如 /24)。

示例

以下配置配置 City 数据库,并根据 EDNS0 子网(如果存在)查找地理位置。

. {
    geoip /opt/geoip2/db/GeoLite2-City.mmdb {
      edns-subnet
    }
    metadata # Note that metadata plugin must be enabled as well.
}

视图插件可以使用 地理位置元数据作为选择标准来提供 GSLB 功能。在此示例中,“Exampleshire”市中的客户机将从 example.com.exampleshire-db 中定义的区域接收 example.com 的答案。所有其他客户机将从 example.com.db 中定义的区域接收答案。请注意,下面两个 example.com 服务器块的顺序很重要;无视图的默认服务器块必须是最后一个。

example.com {
    view exampleshire {
      expr metadata('geoip/city/name') == 'Exampleshire'
    }
    geoip /opt/geoip2/db/GeoLite2-City.mmdb
    metadata
    file example.com.exampleshire-db
}

example.com {
    file example.com.db
}

元数据标签

一组有限的字段将导出为标签,所有值都使用字符串存储无论其基础值类型如何,因此您可能必须将其转换回原始类型,请注意,数字值始终以 10 为基数表示。

标签 类型 示例 说明
geoip/city/name 字符串 剑桥 英文中的城市名称。
geoip/country/code 字符串 GB ISO 3166-1 国家代码。
geoip/country/name 字符串 英国 英文中的国家名称。
geoip/country/is_in_european_union 布尔值 false 可能是 truefalse
geoip/continent/code 字符串 EU 参见 Continent codes
geoip/continent/name 字符串 欧洲 英文中的洲名称。
geoip/latitude float64 52.2242 以 10 为底,精度为最大可用范围。
geoip/longitude float64 0.1315 以 10 为底,精度为最大可用范围。
geoip/timezone 字符串 欧洲/伦敦 时区。
geoip/postalcode 字符串 CB4 邮政编码。

Continent Codes

洲 (EN)
AF 非洲
AN 南极洲
AS 亚洲
EU 欧洲
NA 北美洲
OC 大洋洲
SA 南美洲