国や地域によってDNS応答レコードを変更させたい場合、MaxMindのデータベースを用いる事が出来る。
前段にロードバランサーを用いる場合はEDNS Client Subnetで接続元IPを中継させれば使える。
dnsdistのEDNS Client Subnetの設定はdnsdistのドキュメント、
gdnsdのgeoipプラグインのオプションや付加機能はgithubを読むこと。
gdnsdのGeoIPでは[6大陸]→[国コード]→[都市]の3階層を設定し、一番詳細な定義に合致するレコードを応答する。
特殊な設定で合致しなかった場合に応答するレコードもdefaultリージョンとして定義できる。
以下は国レベルで応答レコードを返答する設定例となる。
国 | 6大陸 | 国コード | DCMAP | 応答レコード |
日本 | AS | JP | japan | 198.51.100.1 | 198.51.100.2 |
台湾 | AS | TW | taiwan | 198.51.100.101 |
アメリカ | NA | US | america | 203.0.113.1 | 203.0.113.2 |
カナダ | NA | CA | canada | 203.0.113.101 |
デフォルト | default | global | 192.0.2.1 |
# vi /usr/lcoal/gdnsd/etc/gdnsd/config
---
geoip => {
maps => {
udp_53_dns => {
# https://dev.maxmind.com/geoip/docs/databases/city-and-country/
# 1st: continent_code [AF,AN,AS,EU,NA,OC,SA]
# 2nd: country_iso_code [ISO 3166-1]
# 3rd: city_name [UTF-8 CHAR]
geoip2_db => /var/lib/GeoIP/GeoLite2-City.mmdb
datacenters => [ japan, taiwan, america, canada, global ]
map => {
AS => {
JP => japan,
TW => taiwan,
}
NA => {
US => america,
CA => canada,
}
default => global,
}
}
}
resources => {
udp_53 => {
map => udp_53_dns
service_types => up
dcmap => {
japan => [ 198.51.100.1, 198.51.100.2 ],
taiwan => 198.51.100.101,
america => [ 203.0.113.1, 203.0.113.2 ],
canada => 203.0.113.101,
global => 192.0.2.1,
}
}
}
}
DNSゾーンは他と同様にDYNA/DYNCレコードを設定する。
レコードの接頭辞はプラグイン名のgeoipを指定する。
# vi /usr/local/gdnsd/etc/gdnsd/zones/gslb.test.org
---
;; DNSゾーンに追記
$TTL 10
www 10 DYNA geoip!udp_53
digコマンドにEDNS Client Subnetを追加し、権威DNSに対して直接DNS名前解決を実行して応答テストをする。
設定例で出した国コードに対応したコマンドとグローバルIP例は次の通りとなる。
以下のデフォルトではオーストラリアを指定している。
国 | 国コード | テストコマンド |
日本 | JP | dig @192.0.2.3 +subnet=1.0.16.0/32 www.gslb.test.org +short |
台湾 | TW | dig @192.0.2.3 +subnet=1.34.0.0/32 www.gslb.test.org +short |
アメリカ | US | dig @192.0.2.3 +subnet=10.32.232.0/32 www.gslb.test.org +short |
カナダ | CA | dig @192.0.2.3 +subnet=100.42.20.0/32 www.gslb.test.org +short |
デフォルト | default | dig @192.0.2.3 +subnet=1.178.0.0/32 www.gslb.test.org +short |
|