Быстро и просто поднимаем свой DNS

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

После несложных исследований был найден предполагаемый виновник - DNS сервер моего провайдера. Он, в принципе, работает быстро, но иногда сильно задумывается. Я смог это доказать себе при помощи namebench, который проверяет скорость резолвинга не при помощи синтетических тестов, но используя историю вашего брожения по интернатам.

При том, что средняя скорость была неплохая, пики торможения доходили почти до секунды, что, несомненно, безобразие. Конечно, дешево и сердито просто поменять DNS на более другой, например гугловый 8.8.8.8 / 8.8.4.4 или opendns или какой другой по вкусу (namebench предлагает список альтернатив), но раз уж я за это дело взялся, то решил довести до логического конца - завести свой собственный кэширующий DNS.

Ставить руками bind или его альтернативы - это конечно не наш путь. Проще всего поискать подходящий docker image и, если не найден, сделать его самому.

К счастью, такой уже есть и он даже работает. Там внутри bind и webmin для GUI управления. Я немного добавил в его docker-compose.yml, чтоб передать пароль для webmin и запретил IPv6, который приводил к ошибкам резолвинга. Вот такой compose получился в результате:

bind:
  image: sameersbn/bind:latest
  container_name: bind

  log_driver: "json-file"
  log_opt:
      max-size: "10m"
      max-file: "5"

  environment:
      - ROOT_PASSWORD=something-very-secure
  ports:
    - "53:53/udp"
    - "10000:10000"
  volumes:
    - ./data:/data
  restart: always
  command: /usr/sbin/named -4

Если вам не мешает IPv6, просто удалите строку command.

Чтоб это дело поднять у себя, надо просто сохранить это в подходящем месте (у меня /srv/bind) как docker-compose.yml и запустить примерно так:

cd /srv/bind
docker-compose up -d

После запуска натравите свой DNS на адрес того компьютера, что запускает контейнер с bind и все должно заработать. Если вам, для каких-то целей, надо локально переводить свой внутренние имена в адреса (и/или наоборот), то это тоже делается почти легко через webmin. Вот тут пример такого использования нарисован и в виде картинок и с понятным пояснением.

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

P.S. Я, конечно, пробовал воспользоваться DNS поддержкой которую обеспечивает мой ZyWall USG20, но оно работало медленно и как-то странно.