geoip

原始碼

geoip 使用用戶端 IP 查詢 maxmind geoip2 資料庫,然後將相關的 geoip 資料新增至內容請求。

描述

geoip 外掛程式會新增與用戶端 IP 相關聯的地理位置資料,它允許您設定 geoIP2 maxmind 資料庫 以新增與 IP 位址相關聯的地理位置資料。

資料的添加利用了 metadata 外掛程式,值也可以使用它來檢索,例如

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。目前不支援其他具有不同結構描述的資料庫類型。

您可以下載 免費且公開的 City 資料庫

語法

geoip [DBFILE]

geoip [DBFILE] {
    [edns-subnet]
}
  • DBFILE mmdb 資料庫檔案路徑。我們建議您定期更新 mmdb 資料庫,以獲得更準確的結果。

  • edns-subnet: 選用。使用 EDNS0 子網路(如果存在)進行地理 IP 定位,而不是 DNS 請求的來源 IP。這有助於透過中介 DNS 解析器識別最近的來源 IP 位址,並且也讓地理 IP 測試變得容易:dig +subnet=1.2.3.4 @dns-server.example.com www.geo-aware.com

    注意: 由於安全原因,遞迴 DNS 解析器可能會遮蔽用戶端 IP 位址的一些位元,這可能會導致地理 IP 解析不準確。

    標準中沒有定義遮罩大小,但有一些範例:RFC 7871 的範例 隱藏了 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.
}

view 外掛程式可以使用 geoip 中繼資料作為選擇標準,以提供 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 請參閱 洲代碼
geoip/continent/name 字串 歐洲 英文洲名稱。
geoip/latitude float64 52.2242 10 進制,最大可用精度。
geoip/longitude float64 0.1315 10 進制,最大可用精度。
geoip/timezone 字串 歐洲/倫敦 時區。
geoip/postalcode 字串 CB4 郵遞區號。

洲代碼

洲 (EN)
AF 非洲
AN 南極洲
AS 亞洲
EU 歐洲
NA 北美洲
OC 大洋洲
SA 南美洲