Что такое DNS-кэш?
DNS-кэш хранит ранее полученные ответы DNS до истечения TTL. Он ускоряет запросы, но может временно возвращать устаревший адрес после изменения зоны.
Почему кэширование DNS важно
Кэш снижает задержку и нагрузку на авторитетные серверы, но задерживает миграцию и усложняет диагностику.
Как работает DNS-кэш
Иерархия кэширования
Кэш есть в браузере, ОС, локальной сети и рекурсивном резолвере; у каждого слоя свой срок и политика.
Browser Cache (seconds to minutes)
↓
OS Cache (seconds to minutes)
↓
Local Resolver Cache (minutes to hours)
↓
ISP Resolver Cache (minutes to hours)
↓
Authoritative Name Server (source of truth)
Процесс поиска в кэше
Резолвер ищет имя и тип, проверяет оставшийся TTL, а при промахе обращается к авторитетным серверам.
Истечение по TTL
После нулевого TTL запись нужно запросить снова. Отрицательные ответы кэшируются по SOA-политике.
example.com. 300 IN A 203.0.113.50
^^^
TTL in seconds (5 minutes)
Слои DNS-кэша
Кэш браузера
Браузер может хранить ответ дольше сетевого резолвера по собственной политике.
Кэш операционной системы
ОС или локальный stub resolver сохраняет записи для приложений устройства.
# View cache
ipconfig /displaydns
# Flush cache
ipconfig /flushdns
# Flush cache (macOS 10.15+)
sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder
# Flush systemd-resolved cache
sudo systemd-resolve --flush-caches
# Check statistics
sudo systemd-resolve --statistics
Кэш резолвера
Рекурсивный DNS-сервис отвечает из общего кэша до TTL и может обслуживать многих клиентов.
| Резолвер | Стратегия кэширования |
|---|---|
| Google (8.8.8.8) | Соблюдает TTL, глобальный кэш |
| Cloudflare (1.1.1.1) | Соблюдает TTL, распределённый кэш |
| Резолверы ISP | Могут игнорировать низкие TTL |
Примеры поведения кэша
Обычная работа
Повторный запрос получает кэшированный ответ с уменьшенным TTL и без нового обращения к authoritative NS.
Query 1: example.com
→ Full lookup: 50ms
→ Cached for 300s (TTL)
Query 2: example.com (1 minute later)
→ Cache hit: 1ms
Query 3: example.com (10 minutes later)
→ Cache expired, full lookup: 50ms
→ Re-cached for 300s
Обновление DNS-записи
После изменения зоны часть клиентов увидит старый IP, пока не истечёт прежний TTL.
Original: example.com → 203.0.113.50 (TTL: 300s)
Time: 10:00 - DNS updated to 203.0.113.51
Client queries at 10:02
→ Still cached: 203.0.113.50 (expires 10:05)
Client queries at 10:06
→ Cache expired, new lookup: 203.0.113.51
→ Cached until 10:11
Стратегия TTL и кэширование
Выбор TTL
Большой TTL подходит стабильным записям, малый - подготовке миграции; учитывайте нагрузку и риск задержки.
| Сценарий | Рекомендуемый TTL | Обоснование |
|---|---|---|
| Стабильная инфраструктура | 3600–86400 с (1–24 часа) | Редко меняется, снижает нагрузку DNS |
| Рабочий сайт | 300–1800 с (5–30 минут) | Баланс производительности и гибкости |
| Активная миграция | 60–300 с (1–5 минут) | Быстрее распространяет изменения |
| Балансировка нагрузки | 60–120 с | Быстрое переключение при смене серверов |
Снижение TTL перед миграцией
Уменьшите TTL заранее, дождитесь обновления кэшей, переключите ресурс и верните значение после стабилизации.
Day -7: example.com TTL 3600s (1 hour)
Day -2: Reduce to 300s (5 minutes)
Day 0: Make DNS change
→ Max 5 minute cache retention
Day +1: Restore TTL to 3600s
Отравление DNS-кэша и безопасность
Атака отравления кэша
Злоумышленник пытается подменить ответ, чтобы направить пользователя на чужой адрес. DNSSEC и защищённый транспорт снижают риск.
Меры защиты
Используйте DNSSEC, актуальные резолверы, ограничение доступа, мониторинг, случайные идентификаторы и проверку источника.
example.com. IN A 203.0.113.50
IN RRSIG A 8 2 300 ...
Проверка DNS-кэша
Просмотр содержимого кэша
Открытый кэш нельзя считать доказательством владения. Используйте администраторские инструменты только в своей сети.
ipconfig /displaydns | more
sudo killall -INFO mDNSResponder
# Check Console.app for logs
sudo systemd-resolve --statistics
Проверка поведения кэша
Сравнивайте authoritative и recursive ответы, TTL, timestamp, регион и тип записи.
# First query (cache miss)
time dig example.com
# Immediate repeat (cache hit)
time dig example.com
# Compare times
Проблемы, связанные с кэшем
Старый кэш после изменения DNS
Старый ответ не означает, что публикация не состоялась. Учитывайте максимальный прежний TTL и отрицательное кэширование.
Слишком агрессивное кэширование
Чрезмерный TTL задерживает отказоустойчивость, отзыв адреса и исправление ошибки.
Отрицательное кэширование
NXDOMAIN и NODATA кэшируются по SOA и могут скрывать новую запись до истечения срока.
Query: newsubdomain.example.com
Response: NXDOMAIN (does not exist)
Cached: 3600s (SOA minimum TTL)
Result: New subdomain won't resolve for 1 hour
Очистка DNS-кэша
Когда очищать кэш
Flush полезен при локальной диагностике, но не удаляет кэши всех резолверов и пользователей.
Как очистить кэш
Используйте команду ОС, браузера или управляемого резолвера, не меняя зону без необходимости.
ipconfig /flushdns
sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder
sudo systemd-resolve --flush-caches
Navigate to: chrome://net-internals/#dns
Click: "Clear host cache"
Toggle network.dnsCacheExpiration in about:config
Or restart browser
Лучшие практики
Документируйте TTL, проверяйте несколько источников, используйте DNSSEC и не классифицируйте stale, timeout или SERVFAIL как отсутствие домена.
Расширенные концепции кэширования
Предварительное обновление (prefetching)
Резолвер может заранее обновить популярную запись перед истечением TTL, сохраняя доступность при высокой нагрузке.
<!-- Hint to browser -->
<link rel="dns-prefetch" href="//cdn.example.com">
Прогрев кэша
Предварительные запросы прогревают кэш после миграции, но не заменяют корректную делегацию и мониторинг.
Anycast и кэширование
Anycast направляет клиента к ближайшему узлу резолвера; ответы и TTL всё равно зависят от конкретного кэша.