Geo-DNS for Traffic Routing by Region
Geo-DNS determines geographic location of DNS client and answers query with IP of nearest or most suitable server. Result — reduced latency, compliance with local data storage rules, regional A/B tests.
How Geo-DNS Works
Standard DNS returns single IP for all. Geo-DNS provider analyzes IP of querying DNS resolver and chooses answer from pre-configured rules:
DNS Query: api.example.com
↓
Geo-DNS Provider
├── IP in Russia AS → 185.10.1.1 (VPS in Moscow)
├── IP in Europe → 94.20.2.2 (VPS in Amsterdam)
├── IP in USA → 44.30.3.3 (AWS us-east-1)
└── Default → 185.10.1.1
Geo-DNS Providers
| Provider | Features |
|---|---|
| Cloudflare | Free basic Geo-DNS, WAF integration |
| AWS Route 53 | Latency-based routing + Geo routing |
| NS1 | Flexible rules, filter chain |
| Gcore | Good CIS coverage |
| DNSimple | Simple interface, RegGeo-routing |
Setup in Cloudflare (Load Balancing)
Cloudflare Load Balancer with Geo-routing via pools:
{
"name": "api.example.com",
"pools": ["pool-russia", "pool-europe", "pool-usa"],
"region_pools": {
"ENAM": ["pool-usa"],
"EEU": ["pool-russia"],
"WEU": ["pool-europe"],
"SEAS": ["pool-europe"]
},
"fallback_pool": "pool-russia"
}
Setup in AWS Route 53
Latency-based routing — Route 53 measures latency with each region and routes to nearest:
{
"Name": "api.example.com",
"Type": "A",
"SetIdentifier": "eu-west-1",
"Region": "eu-west-1",
"TTL": 60,
"ResourceRecords": [{"Value": "52.18.1.2"}]
}
Geolocation routing — explicit country/continent binding:
{
"SetIdentifier": "Russia",
"GeoLocation": {"CountryCode": "RU"},
"ResourceRecords": [{"Value": "185.10.1.1"}]
}
Health Checks Monitoring
Geo-DNS should auto-exclude unavailable servers. Cloudflare and Route 53 support health checks: if server doesn't respond, traffic switches to next in list.
Timeline
Geo-DNS setup with 2–3 regions and health checks: 1–2 working days.







