0,0
рейтинг
17 ноября 2012 в 06:37

Администрирование → Делаем свой локальный DNS (PDNSD), с блэкджеком и быстрее Google Public DNS

С каждым годом скорость интернета — как последней мили, так и магистральных каналов становится все выше. Лишь одно неизменно — латентность уже уперлась в физические ограничения: скорость света в оптоволокне — около 200тыс километров в секунду, и соответственно, быстрее чем за ~150ms ответ от сервера через атлантический океан не получить в обозримой перспективе (хотя конечно есть изыски, вроде оптоволокна с воздушной сердцевиной или радиорелейной связи, но это для простых смертных едва-ли доступно).

Когда мы пытаемся например из России открыть web-сайт, расположенный в США (его NS сервера вероятно там же), и домен не нашелся в DNS-кэше вашего провайдера — то ждать придется долго даже на гигабитном интернете, возможно даже целую секунду: пока мы через океан получим имена NS серверов домена, пока разрезолвим их IP, пока отправим и получим собственно сам DNS запрос…

Пару лет назад Google завела свои публичные DNS сервера, а для агитации перехода на них — они разработали утилитку NameBench, которая прогоняет тесты DNS по вашей истории серфинга и показывает, насколько Google DNS быстрее DNS сервера вашего провайдера.

Но мне удалось сделать свой DNS сервер, который работает быстрее Google Public DNS, и в этой краткой заметке хочу поделится результатами.

PDNSD

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

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

Ставится в Ubuntu — банальным apt-get.

Пара моментов в конфиге


global {
	perm_cache=10240; //Максимальный размер кэша в килобайтах. 
                      //По дефолту было 1024, все записи у меня не влазили.
	cache_dir="/var/cache/pdnsd";
[...]
	min_ttl=60m;    // Минимальное время сохранения записи в кэше.
                   //Даже если TTL придет меньше 60минут - будет 60минут
	max_ttl=1w;	   // Максимальное время сохранения записи в кэше
	neg_ttl=5m; //Время кеширования отрицательных ответов (т.е. если домен не найден)
[..]
	par_queries=3; //Количество одновременно опрашиваемых "родительских" DNS серверов
}

server {
	label = "main";
	ip = 	85.21.192.5 //Тут 4 сервера, если первые 3 не ответят, то будет отправлен запрос на 4-й
	,       213.234.192.7 //Первые 2 сервера - это сервер вашего провайдера, и какого-нибудь соседнего
	,	8.8.4.4 //Это Google Public DNS - у них закэшировано все редкое и резолвят они быстро
	,	8.8.8.8
	;
[..]
}


В принципе, кэширование можно сделать менее агрессивным (min_ttl=1m например), но за год работы проблем особых не возникло. В случае проблем — при желании можно вытереть одну запись из кэша:
sudo pdnsd-ctl record 3.14.by delete
или сразу все:
sudo pdnsd-ctl empty-cache


Результаты тестирования в NameBench



Видим, что для 50% запросов ответ мы получаем менее чем за 10мс, для 85% быстрее Google Public DNS, ну а дальше результаты естественно совпадают с гуглом.

По результатам тестов NameBench нам радостно сообщает:
8.8.8.8 	Slower replica of SYS-192.167.0.98 [192.167.0.98]
8.8.4.4 	Slower replica of SYS-192.167.0.98 [192.167.0.98]

Таким образом, умный кэширующий DNS прокси с параллельными запросами — позволяет ускорить даже 100-мегабитный интернет. А уж для медленных (радио)линков с большой латентностью и потерей пакетов — и вовсе разница может быть как между небом и землей.
Михаил Сваричевский @BarsMonster
карма
965,7
рейтинг 0,0
Пользователь
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое Администрирование

Комментарии (67)

  • НЛО прилетело и опубликовало эту надпись здесь
    • 0
      Bind — более каноничен, насколько я понимаю.
      Не спамит запросами, как я специально сделал, не дает нарушать правила работы с TTL :-)
      Т.е. работает правильно, но медленнее.
    • +2
      Bind — большой и тяжелый монстр.
      Если вы держите полноценный NS сервер с кучей зон — то конечно да, альтернативы бинду нет.
      Если вам нужен просто днс-кэш с некоторыми доп. фишками — pdnsd будет в самый раз.
      • 0
        Серьезно нет?
        А как же NSD, PowedDNS?
        Я уже забыл когда последний раз bind ставил…
  • 0
    А чем 8.8.8.8 от 8.8.4.4 отличается?
    • 0
      Просто 2 разных IP гуглового DNS. Надеюсь у них они будут падать по очереди, а не одновременно.
      • 0
        А NameBench долго должен работать? Что-то у меня он уже полчаса думает.
        • +1
          Это смотря как настроить, можно отключить галочку «Include best regional servers» — тогда он не будет проверять все 4000 DNS серверов из базы )
          • 0
            Как оказалось, это проблема версии для mac os, когда зависает на строке Waiting for wildcard cache queries
            Проблема и решение описано вот тут. Все решение, собственно — замена одного параметра в одной строке.
      • +2
        Добавили бы тогда от Level 3 (4.2.2.1), вместо второго гугловского. Чтобы совсем fail-safe. :)
  • +13
    Также еще есть легкий DNS\DHCP сервер dnsmasq, давно им пользуюсь и никаких проблем!
    • 0
      Возможность отправлять запрос сразу на все серверы у него есть (--all-servers), а вот ttl override — только если исходники патчить.
      PS. Покажите вашу картинку с NameBench :-)
      • 0
        Выложу в понедельник, сейчас маленько далеко от него!
        • 0
          Картинка будет?
        • +2
          а в понедельник какого года? :)
          • +2


            Плохо без уведомлений, после выходных быстро все забывается!
      • 0
        --neg-ttl=Разве не оно в dnsmasq?

        Negative replies from upstream servers normally contain time-to-live information in SOA records which dnsmasq uses for caching. If the replies
        from upstream servers omit this information, dnsmasq does not cache the reply. This option gives a default value for time-to-live (in seconds)
        which dnsmasq uses to cache negative replies even in the absence of an SOA record.
    • +1
      + в убунте он есть и работает из коробки, кажется с версии 12.04. Правда настраивает и запускает его NetworkManager, для смены конфигов придётся с ним договариваться.
  • 0
    Спасибо за поднятие интересной темы. Никогда не задумывался о скорости работы ДНС серверов. Поизучаю свой роутер теперь на вопрос сабжа.
    PDNSD сильно систему нагружает (для роутера актуально)?
    • 0
      Сильно сомневаюсь, он прост как топор. Вопрос лишь в памяти и месте для хранении кеша. Под Ubuntu x64 — жрет 16Мб резидентной памяти.
  • +14
    Краткое содержание статьи: «локальный кэширующий dns быстрее любого dns в интернете. © К.О.»
    • +2
      Поставьте «локальный кеширующий dns» с дефолтным конфигом и покажите картинку NameBench ;-)
      Результат быстрее не из-за локального кеша.
      • +1
        Не поверите, стоит локальный на Windows 2003 и мне NameBench сказал что: Your current primary DNS server is
        Fastest

        От гугла средний ответ 88 мс.
        • 0
          Локальный какой?
        • 0
          Естественно что на кешированных запросах он будет быстрее. Вы покажите результаты когда посылается fresh запрос.
      • +1
        Посыпаю голову пеплом и как можно тише удаляюсь обратно в свой угол: Вы были правы, мой домашний bind, стоящий в 50см от главного компьютера, работающий на п4 3гГц с гигабитной локальной сетью почти в 2 раза МЕДЛЕННЕЕ вторичного dns Гугла. Поражен!
  • +1
    Никто не сравнивал pdns и PowerDNS Recursor по производительности? Последний приходится перезапускать раз в месяц-полтора, но работает очень быстро и мало памяти кушает. Может, стоит на pdns заменить?
    • 0
      Ну, не знаю… За год pdnsd ни разу перезапускать не приходилось… Жрет как писал выше 16Мб.
      По производительности — не уверен, что есть куда быстрее — тут нас ограничивают родительские DNS сервера.

    • +1
      PowerDNS Recursor работает по другой схеме.
      Он полноценный рекурсор, он не ходит за подачками к другим рекурсорам.
      • 0
        как вариант, можно powerdns или bind оставить для клиентов, а за него вынести PDNSD.
  • +2
    Какие-то грустные результаты. Yota


    С pdnsd веселее чуть-чуть.


    Вывод — пусть живет.
  • 0
    Неймбенч показал, что неймсервер в моей локалке (с обычным роутером-китайцем) быстрее Google Public DNS. Мне повезло с провайдером?
  • 0
    Тоже решил попробовать у себя. Но у меня в роли сервера стоит xubuntu 12.04 и dns порт уже занят dnsmasq…
    При попытке его удаления:
    Пакеты, которые будут УДАЛЕНЫ:
    dnsmasq-base lxc lxctl network-manager network-manager-gnome
    При этом lxc мне нужен. Дайте совет.
    • +1
      Удалить dnsmasq, поставить lxc?
  • +1
    Забавный набор доменов для «censorship check»:

  • +1
    Коллеги, а есть сейчас что нибудь из DNS серверов, которое позволяет написать к себе плагин / предоставляет API чтобы в рантайме на некоторые запросы отвечать не результатами других серверов / содержимым конфиг файлов — а что я ему API верну? Я в свое вермя смотрел — но как-то эта область слабо окучена, если и есть техническая возможность то реализована она обычно «ну вы поменяйте программно текстовичок с именами и перезагрузите DNS — он и будет новое отвечать… через некоторое время». А хочется в реалтайме — чтобы как только моя программная часть решила, что «vasya» это не «1.2.3.4» а «4.3.2.1» — то следующей же запрос к DNS получил в ответ «4.3.2.1».
    • +1
      Вариантов как минимум два — MyDNS, который хранит инфу в MySQL базе, и есть реализация сервера на Perl — там просто поменять в исходнике обработчик запросов, и можно хоть википедию в ответах слать.
    • +4
      PowerDNS — безумный комбайн, который может работать с несколькими бэкендами одновременно, включая mysql, postgresql, mongodb (вроде пока экспериментально) и даже так называемый pipe-backend, когда для получения данных для ответа запускается пользовательская программа, в том числе и bash-скрипт. Подробнее про бэкенды можно почитать тут.
      • 0
        Кстати, именно этот бекенд позволил мне реализовать т.н. Geo-aware authoritative DNS в краткие сроки, причем намного дешевле чем любой другой вариант. Аптайм почти полтора года, пару тысяч req/s, ноль проблем. Вещь.
  • 0
    Не понял, что вместо айпишек 85.21.192.5 и 213.234.192.7 у себя прописывать?
    • +1
      Свои DNS-сервера от провайдера.
  • +1
    Большое спасибо за статью и особенно за namebench.py.
    Давно уже пользуюсь PDNSD в линуксе (по совету с Arch Wiki), но только в статье узнал про параллельный опрос DNS серверов (наверно невнимательно читал man).

    Кстати, рекомендую взять рекомендуемые NameBench сервера (наиболее быстрые и географически близкие) и добавить их в список опрашиваемых PDNSD. Я добавил еще два, помимо DNS от Google, прогнал NameBench еще раз и разница была заметна невооруженным взглядом.
  • +1
    В роутере стоит DNSMASQ, после теста NameBench оказалось, что DNS роутерский и есть самый Fastest)))
    Прошивка Wive NG всячески рекомендую
    • 0
      Вы на dnsmaq кэш сбросили?
  • +1
    Москва, провайдер ОнЛайм + dnsmasq (all-servers)

  • +3
    Под виндой воспользовался Acrylic DNS Proxy, позволяет указать до 4х DNS серверов. Оставил провайдерские, гугловский и ближайший из результатов NameBench.

    В результате получил ускорение в 4 раза:


    Acrylic прописался сервисом, есть 4 мегабайта памяти, процессор не грузит.
    Спасибо за совет, раньше при загрузке страниц были ужасные задержки.
  • 0
    У меня DNS сервер по умолчанию всего на 25% медленнее гугловского. Менять, я так понимаю, смысла нет?
    • 0
      Это уже вопрос индивидуальный :-)
  • 0
    Когда я использовал pdnsd пару лет назад, наткнулся на очень неприятный баг — некоторые домены третьего уровня (а конкретнее, у которых в CNAME ссылка на CNAME) разрешались им неправильно, в частности, широко известный i.imgur.com; в рассылке bugs.debian баг висит уже третий год. Интересно, починили его уже или нет.
    • 0
      Сейчас вроде все работает без проблем:

      host i.imgur.com 192.167.0.98
      Using domain server:
      Name: 192.167.0.98
      Address: 192.167.0.98#53
      Aliases:
      
      i.imgur.com is an alias for wpc.4220.edgecastcdn.net.
      wpc.4220.edgecastcdn.net is an alias for gsb1.wpc.v2cdn.net.
      gsb1.wpc.v2cdn.net has address 68.232.34.133
      • 0
        А если прописать pdnsd-сервер основным и ткнуться туда, например, wget'ом?
        • 0
          Тоже все работает:

          c:\my\tools\wget\bin>wget i.imgur.com
          SYSTEM_WGETRC = c:/progra~1/wget/etc/wgetrc
          syswgetrc = c:\my\tools\wget/etc/wgetrc
          --2012-11-19 06:05:13--  http://i.imgur.com/
          Распознаётся i.imgur.com... 68.232.34.133
          Устанавливается соединение с i.imgur.com|68.232.34.133|:80... соединение установлено.
          Запрос HTTP послан, ожидается ответ... 302 Found
          Адрес: http://imgur.com [переход]
          --2012-11-19 06:05:15--  http://imgur.com/
          Распознаётся imgur.com... 23.23.110.81, 23.23.110.58, 54.243.206.51
          Устанавливается соединение с imgur.com|23.23.110.81|:80... соединение установлено.
          Запрос HTTP послан, ожидается ответ... 200 OK
          Длина: нет информации [text/html]
          Сохраняется в каталог: `index.html'.
          
              [  <=>
          
          2012-11-19 06:05:15 (166 KB/s) - `index.html' сохранён [66854]
          
          
          c:\my\tools\wget\bin>nslookup i.imgur.com 192.167.0.98
          Server:  UnKnown
          Address:  192.167.0.98
          
          Non-authoritative answer:
          Name:    gsb1.wpc.v2cdn.net
          Address:  68.232.34.133
          Aliases:  i.imgur.com
                    wpc.4220.edgecastcdn.net
          • 0
            Круто, спасибо!
  • –2
    «Удалось достичь 120 миллисекундного ускорения!!! Интернет летает!!!» Под Windows поиск наиболее шустрого для вас DNS DNS Benchmark.

    Все смешалось: линуксойды, виндовские нубы.
    • +2
      Пардон, по молодости лет упустил факт кроссплатформенности самого NameBench.
  • +1
    пробовал ставить pdns на FreeBSD.
    Вечером, в часы пик не успевала отвечать на запросы. (примерна 300-400 запросов в секунду).
    В итоге вернулся на Bind
    • 0
      Хороший у вас вечерний серфинг…
      • 0
        это сервер интернет-провайдера.
        чувствую, что график врет, ибо должно быть больше раз эдак в 300.
  • 0
    8.8.8.8 и 8.8.4.4 — это anycast-адреса, а сервера, за ними стоящие, могут быть разные, так что результаты теста могут отличаться.

    Попробуйте unbound, в нем еще есть возможность подмены некоторых ответов на свои. Очень облегчает жизнь, не говоря уже о классе самого ПО и его устойчивости к нагрузкам.
  • 0
    Вот первая проблема. Перестает работать видео ютуба. Сайт работает, а вот видео не запускается. Очистка кеша не помогла.
    • 0
      Я слышал что сегодня ютуб побывал в говнореестре «по ошибке», и вроде его уже убрали «но».
      Если что — мопед не мой, я в Украине обитаю, не сильно отслеживаю что именно происходит у вас, только тенденции.
      • 0
        С гуглоского днс-а открывается, с провадерского открывается, с локального нет. Точнее не открывается, видео показывает. Открывается-то со всех.
        • 0
          Ну такой проксирующий DNS рассчитывает на синхронность серверов, а в реалиях говнореестра это может нарушаться.
          Для более точной диагностики нужно проверить какие именно адреса резолвятся с другими серверами, и не резолвятся с «ускорителем». Проверить что там отдается неправильно (т.е. какой ответ то реально отдается, может там 127.0.0.1 вообще). Определить какой именно сервер опрашивается для получения ответа. Сверить его ответ с ответом «ускорителя».
          Возможно поймаете глюк, а возможно реально окажется что какой-то
          supervideoserver10050042.youtube.com именно на ns123434.fanat-govnoreestra.ru не резолвится, а он зараза у вас самый быстрый для ютубы оказался.
    • 0
      ютуб работает классно. У меня на FreeBSD он перестает резолвить новые адреса через определенное время. хотя из кеша отдает нормально
      • 0
        Просто обновите версию
        либо в крон rndc reload
  • 0
    Народ. подскажите. А можно как то вставить туда свои локальные адреса (сайты) ?! Реально он быстрый но надо еще свои прописать.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.