说明
地理位置插件添加与客户机 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.
}
// ...
数据库
支持的数据库使用城市架构,例如 City
和 Enterprise
。当前还不支持其他具有不同架构的数据库类型。
您可以下载一个 免费的和公开的城市数据库。
语法
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 |
可能是 true 或 false 。 |
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 | 南美洲 |