Создание и настройка локального кэширующего DNS сервера (PDNSD)

pdnsd

Сегодня мы поговорим о создании и настройке локального DNS сервера. Что такое вообще DNS сервера и что они делают? Они преобразовывают доменные имена в IP адреса, в общем то, в интернете они выполняют функцию “регулировщиков движения”. Так зачем же создавать свой локальный DNS сервер, ведь кроме DNS`ок провайдера их и в интернете полно? Ответ прост – скорость отклика (а именно, такое понятие как латентность – latency). Локальный DNS будет быстрее их всех.

Как именно работают DNS сервера? Допустим, вы набираете адрес в веб-браузере: darkfess.ru , запрос отправляется на ваш ближайший DNS (обычно это DNS провайдера), если там ответа нет, то запрос идет выше (на региональные сервера) и тд (у DNS серверов присутствует строгая иерархия). Когда будет найден ответ, ваш браузер его получит и начнет загружать страницу. Вот время, которое прошло после нажатия клавиши Enter, до того момента, как страница начала загружаться – и есть время, потраченное на обработку запроса DNS серверами.

Как показывает практика, DNS сервера провайдеров часто падают и часть ресурсов (или все) в Интернете становятся недоступными. Поэтому, обрели популярность ряд сторонних DNS. Самые популярные и быстрые из них – Google Public DNS (8.8.8.8 и 8.8.4.4). Скорость интернета у провайдеров растет очень быстро, 1 мб, 10 мб, 100 мб… неизменна лишь скорость отклика, т.к. она уперлась уже в физические ограничения. Скорость света в оптоволокне — около 200 тыс. км в секунду, и соответственно, быстрее чем за ~150 ms, ответ от сервера через атлантический океан получить не получится. Такие дела.

Ладно, думаю все поняли, как это важно и круто. Давайте перейдем непосредственно к установке и настройке нашего DNS сервера.

Обратите внимание! Если у вас установлены пакеты с другими DNS-серверами, например bind9 – то их желательно удалить.

Итак, приступим. Первым делом, проверим наши сетевые настройки:

sudo nano /etc/network/interfaces

 

Далее в конфиге… Либо доверяем DHCP:

auto eth0
iface eth0 inet dhcp

 

Либо выставляем статические настройки (рекомендовано):

iface eth0 inet static
 address 10.0.0.100 // наш IP
 netmask 255.0.0.0
 gateway 10.0.0.1
 dns-nameservers 10.0.0.100 // с 12.04, DNS обозначать только тут

 

Устанавливаем пакет:

sudo apt-get install pdnsd

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

 

Заходим в первый конфиг:

sudo nano /etc/default/pdnsd

 

Ищем в нем строчку:

START_DAEMON=no

И меняем ее на:

START_DAEMON=yes

 

Все, наш DNS сервер заработает, после перезапуска системы, осталось только его настроить. Для этого, открываем другой конфиг командой:

sudo nano /etc/pdnsd.conf

 

Вот мой конфиг с комментариями (нас интересуют пара опций в блоке global, блок server я добавил сам):

 

global {
 perm_cache=30000; // Максимальный размер кэша в килобайтах
 cache_dir="/var/cache/pdnsd";
 run_as="pdnsd";
 server_ip = eth0; // Разрешаем все подключения на интерфейс eth0
 status_ctl = on;
 paranoid=on;
 min_ttl=60m; // Минимальное время сохранения записи в кэше
 max_ttl=1w; //  Максимальное время сохранения записи в кэше
 timeout=6; // Максимальный тайм-аут
 par_queries=2; // Количество одновременно опрашиваемых DNS серверов
}
source {
  owner=localhost;
  file="/etc/hosts";
 }
rr {
  name=localhost;
  reverse=on;
  a=127.0.0.1;
  owner=localhost;
  soa=localhost,root.localhost,42,86400,900,86400,86400;
 }
server {
  label = "darkdns";
  ip = 82.151.98.162 // DNS сервера моего провайдера 1
   ,   82.151.104.80 // DNS сервера моего провайдера 2
   ,   8.8.8.8 // DNS сервер Google Public DNS 1
   ,   8.8.4.4 // DNS сервер Google Public DNS 2
   ,   208.67.222.222 // DNS сервер OpenDNS 1
   ,   208.67.220.220 // DNS сервер OpenDNS 2
   ,   156.154.70.1 // DNS сервер DNS Advantage 1
   ,   156.154.71.1 // DNS сервер DNS Advantage 2
   ;
  timeout = 3; // Минимальный тайм-айт
  uptest = query;
  interval = 5m;
  ping_timeout = 300; // 30 seconds.
  purge_cache = off;
  exclude = .localdomain;
  policy = included;
  preset = off;
  }

 

Прелесть в том, что PDNSD сам по себе очень легок и почти на нагружает систему. Одновременно опрашивает несколько DNS серверов, которые указаны в этом конфиге, выбирает самый быстрый. Первый запрос он записывает, все последующие берет из кэша. Таким образом, веб-ресурсы которыми вы пользуетесь – всегда будут иметь наибольшую латентность. Этот “фокус” позволяет ускорить любой интернет, даже 100-мегабитный. А для разных радио-спотов с плохим коннектом, так и вообще может оказаться спасением.

Осталось настроить вашу сеть. Если у вас есть DHCP – укажите в его параметрах DNS сервер с IP адресом вашего вашего DNS (в моем случае это 10.10.0.100). Если DHCP нету – приведется прописать DNS сервера всем клиентам вручную, ручками.

 

Запускаем DNS сервер вручную:

sudo /etc/init.d/pdnsd start

 

Проверяем его работу (это уже можно делать с другой машины, не с сервера):

dig darkfess.ru

 

Будет выведено сообщение, в нем нас интересует эта строка:

;; Query time: 114 msec

 

Теперь, когда запись сохранилась в кэше, повторяем запрос:

dig darkfess.ru

 

Смотрим результат:

;; Query time: 1 msec

 

Все готово :)  Наслаждайтесь. Вот парочка полезных команд:

Статус DNS-сервера:

sudo pdnsd-ctl status

Очистить кэш:

sudo pdnsd-ctl empty-cache

PS. Проверить скорость ваших DNS серверов можно бенчмарком ‘namebench‘.

Создание и настройка локального кэширующего DNS сервера (PDNSD): 11 комментариев

  1. Большое спасибо за статью. Очень помогло и быстро работает.
    Еще интересно узнать, как свои адреса добавить в DNS?
    PS
    Может отдельно добавить, что бы удалили bind9 если он установлен. Я столкнулся с ошибкой и не мог понять в чем проблема.

    • Рад, что статья пригодилась :)

      Любые дополнительные сервера можно добавить в файл – sudo nano /etc/pdnsd.conf (рядом с гугловскими серверами, например).

      А про bind9 – да это понятное дело, что их лучше снести. Допишу об это в начале статьи, спасибо :)

  2. Здравствуйте! А если подключение интернета через pppoe, какие будут настройки? Нельзя ли сделать чтоб dns провайдера подхватывался сам?

    • Автоматом DNS провайдера не подхватится. В принципе, вы можете их и не указывать, всеравно все будет работать.

      Но если инет через PPPoE, то DNS провайдера нужно смотреть через сетевые настройки устройства, которое поднимает PPPoE сессию (локальный комп, либо роутер).

  3. Спасибо что отвечаете. В общем я тут покопался, инфы по настройкам не очень много (на русском), в итоге “методом тыка” в “auto-mode=” (каталог /etc/default/pdnsd) прописал “resolvconf” и соответственно правил pdnsd-resolvconf.conf, в нём в “server_ip =” указал мост (у меня все локальные интерфейсы объединены в мост), вроде всё работает.
    Не много не в тему, а какой dhcp-сервер использовать? Пока остановился на isc-dhcp-server.

    • Рад помочь. Я себе ставил dnsmasq. Или же можно isc-dhcp-server, да) Смотря для каких целей. Мне был нужен простейший.

  4. Здравствуйте, спасибо за статью, очень помогло.
    Вы не могли бы подсказать где копать, мне нужно чтобы на определенные адреса сервер выдавал бы постоянный IP мною подставленный
    например на
    *.vasyapupkin.ru – 192.168.0.12
    *.pardus.org – 192.168.0.12
    , и можно ли сделать чтобы он вобще на все вопросы один и тот же IP возвращал?
    Спасибо

    • А не проще ли тогда просто hosts подправить? Зачем все эти сложности с DHCP?

    • Спасибо за статью!
      DarkFess, всем в локальной сети не вариант прописывать в hosts… Так есть ли возможность добавить свои записи?

    • для домашних целей или маленькой сети его вполне хватает)

Добавить комментарий