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で動作を再現

関連記事:

お気軽にご相談ください

お見積りへ お問い合わせへ