Кэширование DNS и не только в CentOS/RHEL и Fedora

Настройка правильных серверов имен

Мы все знаем, что Cloudflare — ведущий и самый быстрый DNS- провайдер.
Однако у него есть проблемы с работоспособностью, поэтому для обеспечения отказоустойчивости вам следует использовать больше серверов имен.

При условии, что имя вашего подключения в NetworkManager — eth0, вы можете использовать DNS-серверы Cloudflare и Google следующим образом:

nmcli connection modify eth0 ipv4.dns 1.1.1.1,1.0.0.1,8.8.8.8,8.8.4.4

По умолчанию RHEL вообще не выполняет кэширование DNS . Почему это так, остается загадкой.

Можно только догадываться, что причиной отсутствия кэширования DNS в RHEL является спорная эффективность для тех систем, которые не подключены к сети или просто не нуждаются в поиске DNS.

Конечно, бывают случаи, когда вам не нужны (многие) разрешения DNS. Я могу думать о:

  • выделенный сервер БД
  • частный сервер, где все хосты перечислены в hosts файле

Эти системы, скорее всего, не будут выполнять поиск DNS во время работы или вообще не будут выполнять его, и кеш DNS на самом деле для них не важен.

Но в большинстве случаев при использовании настольных или серверных компьютеров RHEL вам будет полезен кэш DNS.

Включить кэш DNS в RHEL 7 и 8 легко благодаря интеграции dnsmasq NetworkManager.

Это dnsmasq очень легкий кэширующий сервер пересылки DNS, который отлично работает даже на самом маленьком оборудовании, таком как ваш собственный домашний маршрутизатор.

Я не буду вас мучить длинными инструкциями по включению кэша DNS. Это действительно быстро и сводится к:

yum -y install dnsmasq

cat << 'EOF' | sudo tee /etc/NetworkManager/conf.d/dns.conf 
[main]
dns=dnsmasq
EOF

systemctl reload NetworkManager

Вы только что сделали свою машину быстрее, запустив их.

Более подробную информацию и тонкую настройку читайте дальше.

NetworkManager и DNSmasq

Давайте объясним, что произошло, когда мы выполнили приведенные выше команды для включения кэширования DNS.

В первую очередь мы установили саму суть DNS-кеширования — программу dnsmasq.

Затем мы записываем файл, /etc/NetworkManager/conf.d/dns.conf содержимое которого указывает NetworkManager включить и использовать его dnsmasq плагин. Затем мы перезагружаем конфигурацию NetworkManager, чтобы применить наши изменения.

Это, в свою очередь, запускает частный экземпляр программы dnsmasq, который привязан к интерфейсу обратной связи 127.0.0.1 и прослушивает стандартный порт DNS 53.

На этом все не заканчивается. NetworkManager теперь обновлен /etc/resolv.conf и настроен nameserver 127.0.0.1 так, что вся операционная система будет выполнять поиск DNS по своему dnsmasq экземпляру.

Он dnsmasq сам будет использовать любые серверы имен, которые вы явно настроили в NetworkManager, или те, которые предоставлены запросами DHCP.

Очень чистая и красивая интеграция.

Убедитесь, что dnsmasq работает

Просто выполните поиск DNS, используя dig, против 127.0.0.1

# yum -y install bind-utils
dig +short example.com @127.0.0.1

Если выходные данные выглядят как действительный IP- адрес или список IP-адресов, значит, все dnsmasqработает нормально.

Вы также можете проверить, работает ли кэширование DNS. Выполните разрешение другого домена, дважды выполнив следующую команду:

time getent hosts foo.example.com

Обратите внимание на real сокращение времени вывода для последующих запросов. Например, первый запрос дает:

real 0m0.048s
user 0m0.006s
sys 0m0.006s

Последующие запросы дают:

real 0m0.009s
user 0m0.006s
sys 0m0.002s

Посмотрите, какие DNS-запросы делает ваша система

Чтобы увидеть, какие DNS-запросы отправляет ваша система, вы можете временно включить ведение журнала запросов. Обратите внимание, что это очистит кэш DNS, поскольку dnsmasq будет перезапущен:

echo log-queries | sudo tee -a /etc/NetworkManager/dnsmasq.d/log.conf
sudo systemctl reload NetworkManager

Затем вы можете tail создать less файл /var/log/messages, который будет содержать информацию о сделанных запросах. Например, на веб-сервере, использующем PaperTrail remote_syslog:

dnsmasq[20802]: forwarded logs6.papertrailapp.com to 2606:4700:4700::1001
dnsmasq[20802]: reply logs6.papertrailapp.com is 169.46.82.182
dnsmasq[20802]: reply logs6.papertrailapp.com is 169.46.82.183
dnsmasq[20802]: reply logs6.papertrailapp.com is 169.46.82.184
dnsmasq[20802]: reply logs6.papertrailapp.com is 169.46.82.185

Этот подход можно использовать для определения внешних сайтов, с которыми взаимодействует ваш сервер.

Когда закончите, не забудьте отключить ведение журнала:

sudo rm /etc/NetworkManager/dnsmasq.d/log.conf
sudo systemctl reload NetworkManager

Насколько хорошо работает DNSmasq в вашей системе

На странице руководства dnsmasq есть следующее:

Получив SIGUSR1, dnsmasq записывает статистику в системный журнал. Он записывает размер кэша, количество имен, которые пришлось удалить из кэша до истечения срока их действия, чтобы
освободить место для новых имен, и общее количество имен, которые были вставлены в кэш. Также указывается количество попаданий и промахов кэша и количество ответов на авторитетные запросы.

Таким образом, мы можем легко собирать статистику DNS-запросов:

sudo pkill --signal USR1 dnsmasq && sudo tail /var/log/messages | grep dnsmasq

Выходные данные могут включать, например:

dnsmasq[31949]: cache size 400, 0/60 cache insertions re-used unexpired cache entries.
queries forwarded 30, queries answered locally 60

0 0/60 означает «нулевое удаление кэша». Таким образом, это число указывает на то, что размер кэша достаточен. Оно должно быть как можно ниже.
Если это число велико, это означает, что размер кэша может быть недостаточно большим.

Мы также видим, что 30 запросов DNS были перенаправлены на вышестоящие серверы имен (промахи), а 60 запросов были удовлетворены непосредственно кешем (попадания).

Сбор такой статистики будет хорошо работать, если у вас есть только один экземпляр dnsmasq. Иногда у вас их несколько (например, libvirt может запускать один из них).

Надёжнее использовать статистическую информацию dnsmasq, которая, что неудивительно, предоставляется через DNS 🙂 Команды:

dig +short chaos txt hits.bind
dig +short chaos txt misses.bind

… дает вам попадания и промахи соответственно.

С помощью магии командной строки вы можете легко рассчитать коэффициент попадания в кэш DNS:

# yum -y install bc
echo "scale=2; $(dig +short chaos txt hits.bind)*100/($(dig +short chaos txt hits.bind)+$(dig +short chaos txt misses.bind))" | \sed 's@"@@g' | bc

Выходные данные представляют собой процент DNS-запросов, которые были удовлетворены кэшем DNS, например: 80,95%.

Добавление пользовательских записей DNS

Иногда вам нужно добавить свои собственные записи DNS. Это может потребоваться для добавления доменов разработки, например, example.local или для переопределения/блокировки существующей записи DNS.
Вы можете использовать его /etc/hosts как обычно. Чтобы dnsmasq соблюдать записи из него, создайте файл /etc/NetworkManager/dnsmasq.d/custom.confс содержимым:

addn-hosts=/etc/hosts

Затем перезагрузите NetworkManager сервис.

Альтернативно, вы можете напрямую добавлять записи в dnsmasq, добавляя их в тот же файл, например:

address=/hexagon-analytics.com/0.0.0.0
address=/stats.pusher.com/0.0.0.0

Настройка размера кэша

Размер кэша экземпляра dnsmasq, запускаемого NetworkManager, по умолчанию равен 400.
Это подходящий размер по умолчанию для веб-серверов.

Для настольного компьютера вы можете увеличить его значительно. Это поможет значительно снизить нагрузку на домашний маршрутизатор и ускорить работу сети, особенно если вы являетесь пользователем Chrome. Этот браузер самостоятельно кэширует DNS, но только на 1 минуту — проблема, которая отбрасывается как «функция».

Итак, чтобы установить размер кэша DNS равным 20 КБ, выполните:

echo cache-size=20000 | sudo tee -a /etc/NetworkManager/dnsmasq.d/cache.conf
sudo systemctl reload NetworkManager

dnsmasq и ваш рабочий стол

Чтобы расширить тему использования dnsmasq на рабочем столе, вы также можете использовать его для блокировки сценариев отслеживания и ускорения работы в Интернете:

sudo curl https://raw.githubusercontent.com/dvershinin/lightweight-dnsmasq-blocklist/master/list.txt \
  --output /etc/NetworkManager/dnsmasq.d/blocklist.conf
sudo systemctl reload NetworkManager

Наконец, вы также можете повысить скорость DNS, обеспечив минимальный TTL для записей DNS, для которых он установлен слишком низким.

echo min-cache-ttl=1800 | sudo tee -a /etc/NetworkManager/dnsmasq.d/cache.conf
sudo systemctl reload NetworkManager

Это гарантирует, что даже если запись DNS настроена, например, на 2 минуты TTL на удаленном сервере имен, dnsmasqона все равно будет кэшироваться в течение 30 минут.

Обратите внимание, что это приемлемо для настольных компьютеров, но не для веб-серверов.

Разные DNS-серверы для разных доменов

Предположим, что ваша система настроена на разрешение всего через DNS-сеть Cloudflare. Однако он известен цензурой. Примером тому был случай, когда

dig +short securepay.tinkoff.ru @1.1.1.1 не дал результатов только в США.

Чтобы настроить разрешение определенных доменов через разные DNS-серверы, например DNS Яндекса, используйте это в качестве примера:

echo "server=/securepay.tinkoff.ru/77.88.8.8" | sudo tee -a /etc/NetworkManager/dnsmasq.d/custom.conf
sudo systemctl reload NetworkManager

Для справки, Яндекс DNS использует следующие серверы имен:

  • 77.88.8.8
  • 77.88.8.1

Также рекомендуется добавить strict-order вверху /etc/NetworkManager/dnsmasq.d/custom.conf.
Это обеспечит dnsmasq последовательное использование предоставленных серверов имен. Это полезно, когда вы указываете первые серверы имен как самые быстрые, например Cloudflare. Но в случае, если он не отвечает, dnsmasq будет использовать другие, потенциально более медленные серверы имен.

Уф, думаю, на dnsmasq сегодня это всё. Наслаждайтесь более быстрым DNS.