2026年5月17日
2026年5月17日
地理的なDNSルーティング(Geolocation DNS)の設定方法
はじめに
Geolocation DNSは、問い合わせ元のIPアドレスや国コードに基づいて異なるDNS応答を返す機能です。アジアからのアクセスは東京リージョン、欧州からはダブリンリージョンといった具合に最寄りのインフラへ誘導でき、ユーザー体感の遅延を大幅に削減できます。
GSLBやAnycastほど大規模ではない構成でも、マネージドDNSサービスの機能だけで実装でき、初期投資が少ない点が魅力です。
本記事ではAWS Route 53とCloudflareでのGeolocation設定、自前運用ならPowerDNSのGeoIPバックエンドを使う例まで紹介します。
症状・背景
- グローバルユーザー向けに最寄りリージョンを返したい
- 国別の規制対応(データレジデンシー)が必要
- 特定国だけメンテナンスメッセージを返したい
- CDN前段のオリジン振り分けを地理で行いたい
手順・設定方法
ステップ1: Route 53でGeolocationルーティング
# 日本ユーザー向けレコード
aws route53 change-resource-record-sets --hosted-zone-id Z123 --change-batch '{
"Changes":[{"Action":"UPSERT","ResourceRecordSet":{
"Name":"www.example.com.","Type":"A","SetIdentifier":"jp",
"GeoLocation":{"CountryCode":"JP"},"TTL":60,
"ResourceRecords":[{"Value":"203.0.113.10"}]}}]}'
# デフォルト(マッチしない国)
aws route53 change-resource-record-sets --hosted-zone-id Z123 --change-batch '{
"Changes":[{"Action":"UPSERT","ResourceRecordSet":{
"Name":"www.example.com.","Type":"A","SetIdentifier":"default",
"GeoLocation":{"CountryCode":"*"},"TTL":60,
"ResourceRecords":[{"Value":"198.51.100.10"}]}}]}'
ステップ2: CloudflareでGeo Steering(Load Balancing)
# 地理プールの作成
curl -X POST "https://api.cloudflare.com/client/v4/accounts/$ACC_ID/load_balancers/pools" \
-H "Authorization: Bearer $CF_TOKEN" -H "Content-Type: application/json" \
-d '{"name":"asia-pool","origins":[{"name":"tyo","address":"203.0.113.10"}],"enabled":true}'
# ロードバランサに地理ルールを追加
curl -X POST "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/load_balancers" \
-H "Authorization: Bearer $CF_TOKEN" -H "Content-Type: application/json" \
-d '{"name":"www.example.com","fallback_pool":"<EU_ID>",
"region_pools":{"WNAM":["<US_ID>"],"APAC":["<ASIA_ID>"]}}'
ステップ3: PowerDNSのGeoIPバックエンドを使う
sudo apt install -y pdns-server pdns-backend-geoip libmaxminddb0
sudo tee /etc/powerdns/pdns.d/geoip.conf <<'EOF'
launch=geoip
geoip-database-files=/usr/share/GeoIP/GeoLite2-Country.mmdb
geoip-zones-file=/etc/powerdns/geo-zones.yaml
EOF
sudo tee /etc/powerdns/geo-zones.yaml <<'EOF'
- domain: example.com
ttl: 60
records:
www.example.com:
- a:
default: 198.51.100.10
jp: 203.0.113.10
de: 203.0.113.20
EOF
sudo systemctl restart pdns
ステップ4: 検証
# Route 53のテスト機能
aws route53 test-dns-answer --hosted-zone-id Z123 --record-name www.example.com \
--record-type A --edns-client-subnet-ip 126.0.0.0 --edns-client-subnet-mask 24
# 期待動作の確認用にECSオプションを付与した問い合わせ
dig +subnet=126.0.0.0/24 @ns-XXX.awsdns-XX.net www.example.com
# 別経路からの確認
curl --resolve www.example.com:443:$(dig +short @1.1.1.1 www.example.com) https://www.example.com/
# GeoIP DBのバージョン確認
mmdblookup --file /usr/share/GeoIP/GeoLite2-Country.mmdb --ip 126.0.0.1
注意事項
- EDNS Client Subnet(ECS)非対応リゾルバ経由だと判定が大雑把になる
- GeoIPデータベースの精度に依存。月次更新を仕組み化する
- VPN・モバイルキャリアでは判定が外れることがある
- 国別の法規制(データレジデンシー)と整合させる
まとめ
1. 複数RRセット: 国別にレコードを分割
2. デフォルト: マッチなしのフォールバック必須
3. ECS有効化: クライアント実IPを精度よく判定
4. DB更新: GeoIP月次更新を自動化
5. 検証: dig +subnetで動作を再現
関連記事: