Разворачиваем свой кеширующий DNS (PDNSD)

Даже при быстром интернете и низком отклике остается одно узкое место, DNS запросы. За счет использования кеширования на сервере возможно ускорить даже быстрый Интернет.

В 2012 году я производил расчет использования кеширования DNS запросов для прокси сервера, DNS был на базе Windows, вот сам расчет, часть данных правда высосана из пальца, но общий принцип понятен:

Ускорение единичных запросов за счет кеширования DNS составляет порядка 20-40мс.
К примеру запрос главной страницы example.com
i.example.com: 14 components
example.com: 7 components
a.example.com: 26 components
www.example.com: 18 components
af.example.com: 3 components
counter1.example.ru: 1 component
counter2.example.ru: 1 component

Итого 70 элементов с 7 серверов. Общее время потери на DNS запросы 1400 МС, размер получаемых данных 3 КБайта.
При использование кеширования для данного адреса для 500 пользователей, экономия составляет:
Время 11,7 Минут
Трафик 1,5 Мб.
Это если каждый из них всего 1 раз зайдет в день на страницу, что не соответствует действительности, так как фактов захода гораздо больше.

Но даже при использования кеширования DNS серверу требуется время на запрос у вышестоящего DNS сервера, оптимизировать все DNS запросы позволяет PDNSD.
Перейдем от теории к практике, сделаем свой кеширующий DNS с преферансом и барышнями.


pdnsd — кэширующий DNS proxy. Помимо кэширования DNS запросов (с возможностью задавать минимальный TTL), так же он умеет отсылать параллельные запросы к нескольким DNS серверам.

Установку я производил на чистый сервер в конфигурации Minimal, часть компонентов уже может быть установлено.

yum update
Обновляем все компоненты системы до последней версии.
yum -y install wget perl
Устанавливаем wget и perl в системе. wget нам нужен только на одном этапе, а perl требуется для работы PDNSD.
cd /tmp
wget http://members.home.nl/p.a.rombouts/pdnsd/releases/pdnsd-1.2.9a-par_sl6.x86_64.rpm
rpm -Uvh pdnsd-1.2.9a-par_sl6.x86_64.rpm

Скачиваем и устанавливаем pdnsd в систему. Ни чего сложного, проблем возникнуть не должно.

vi /etc/pdnsd.conf
Создаем базовый конфиг.

Данный конфиг имеет минимальные настройки необходимые для того что бы сразу запустить DNS сервер и начал его использовать.
global {
perm_cache=16384; //Максимальный размер кэша в килобайтах.
cache_dir="/var/cache/pdnsd"; //Путь к файлу кеша
run_as="pdnsd";
server_ip = 127.0.0.1; //Адрес сервера
paranoid=on;
status_ctl = on;
min_ttl=60m; // Минимальное время сохранения записи в кэше
max_ttl=1w; // Максимальное время сохранения записи в кэше
neg_ttl=5m; //Время кеширования отрицательных ответов
par_queries=3; //Количество одновременно опрашиваемых "родительских" DNS серверов
neg_domain_pol=on;
timeout=10;
}
server {
label = "main";
ip = 8.8.8.8,
8.8.4.4,
77.88.8.8,
77.88.8.1; //Адреса DNS серверов.
uptest = query; //Тест интерфейса
interface=eth0; //Интерфейс.
}

Стоит обратить внимание на следующие параметры
Секция global
server_ip — IP адрес сервера, если у нас сервер имеет внешний адрес к примеру 192.168.1.1, то необходимо указать его.
par_queries — количество параллельных запросов к родительским DNS серверам, в данном случае 3, если не один не ответит, то сервер сделает запрос на следующий адрес. В ином случае возвращается результат с первого ответившего.
Секция server
ip — Список родительских DNS серверов, в данном случае указаны DNS Яндекса и Google, рекомендуется первыми указать DNS сервера провайдера.

Посмотреть другие настройки можно в документации:
http://members.home.nl/p.a.rombouts/pdnsd/doc.html

chkconfig pdnsd on
service pdnsd start

Запускаем наш сервер pdnsd

В некоторых случаях необходимо оперативно обновить данные в кеше, очистить сразу весь кеш можно командой:
pdnsd-ctl empty-cache