Делаем свой локальный 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-мегабитный интернет. А уж для медленных (радио)линков с большой латентностью и потерей пакетов — и вовсе разница может быть как между небом и землей.
    Метки:
    Поделиться публикацией
    Похожие публикации
    Комментарии 68
    • НЛО прилетело и опубликовало эту надпись здесь
      • 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
                                                      Спасибо за софт под Windows=)
                                                    • 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
                                                      • –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
                                                                  Народ. подскажите. А можно как то вставить туда свои локальные адреса (сайты) ?! Реально он быстрый но надо еще свои прописать.

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