Серия «Программирование»

6

Продолжение поста «Как написать DNS прокси для себя и настраивать через REST API»1

Серия Программирование

Новое

Продолжаю работу над своим пет-проектом. В первой версии оказывается плохо работали запросы к внешним DNS при запросе внешних зон. Исправил этот баг, и бонусом добавил возможность указать несколько upstream серверов (они опрашиваются параллельно и отдается первый успешный ответ).

Поправил запуск через docker. Там не совпадал порты по умолчанию с портами указанными в инструкции по запуску, если не передать переменную окружения с нужным портом.

Теперь при запуске схема базы обновится автоматически и не потребуется прописывать `docker compose exec ...`

Самое крупное изменение - SOA записи. Теперь при создании доменной зоны можно ввести refresh, retry и expire параметры, а при запросе SOA будет возвращать соответствующий ответ. Т.е. вручную не нужно прописывать SOA записи в зоне, но нужно прописать `ns.<zone>.` записи для корректной работы (но об этом позже).

При удалении доменной зоны теперь не остается в базе "висячих" записей.

Еще обновил работу кэширования и теперь удаленные доменные зоны не висят в кэше.

Настроил CI/CD процессы и автоматизировал выгрузку релизов в DockerHob. А еще поправил запуск тестов в пайплайнах, т.к. они по факту вообще не запускались 😬

Запланировано

В первую очередь хочу добавить автоматическое создание ns. записей при создании зоны т.к. SOA ответы будут уже содержать такие данные (не очень хорошо, что их по факту нет).

Не все приложение сейчас покрыто логами а если и покрыто, то в разнобой (где-то через пакет log а в других местах используется slog).

К логам, я считаю, стоит добавить и возможность мониторить сервис, поэтому добавлю метод /metrics для возможности собрать метрики в Prometheus. Выделю отдельный мультиплексер для возможности разделения доменных имен метрик и REST, чтобы можно было не светить метриками во внешние сети.

Дополнительно

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

Если интересно какие инструменты для планирования я использую - маякните в комментах. Если будет интересно, то расскажу про них и в целом про то что у меня развернуто на локалхосте.

upd: ссылка на репо https://github.com/vesh95/dnso для тех кому интересно взглянуть

Показать полностью
6

Как написать DNS прокси для себя и настраивать через REST API1

Серия Программирование

Я как любитель хоумлабинга и хранитель локалнета решил организовать себе локальную  DNS зону, чтобы не печатать длинные  ip адреса и не редачить hosts на всех машинах. После долгого простоя решил возобновить работу сервака. Накатил CentOS (роутер в DHCP прописал его как ubunu-server, ну и ладно), взял в помощь Алису, и провел вечер за настройкой bind2.

Через пару дней решил сделать pet-проект, чтобы прокачаться в go разработке, пошел за идеей к Алисе. Та запомнив, что я недавно ставил DNS предложила сделать свою реализацию (без блэкджека и всякого такого, и вообще РКН версию DNS сервера полностью урезанного интернета). Идея понравилась, но решил сделать с возможностью удобной конфигурации, раз уж начал.

За основу взял пакет github.com/miekg/dns и изучил блог разработчика (там есть примеры кода). Начал разбираться что и к чему. Под ночь мне уже не хотелось копаться в RFC, изучать термины и флаги сообщений к серверу, а просто сделать так, чтобы все заработало минимально.

Изначально я собирался хранить в базе пару name-ip, но потом вернулся к проектированию, чтобы дать возможность определять локальные зоны и отсекать по NXDOMAIN без опроса вышестоящих  DNS. Добавил кэширование, но пока TTL срабатывает во время проверки, надо бы прикрутить  time.AfterFunc удаление.

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

Страница со списком зон

Страница со списком зон

Модалка для добавления зон

Модалка для добавления зон

Проваливаемся в зону

Проваливаемся в зону

Добавляем домен

Добавляем домен

Конечно, навайбкожено на скорую руку, но планирую сделать ввод только домена, а зону приклеивать позже. Еще желательно прикрутить валидации с опорой на тип записи.

Запустил

Пример запроса DNS

Пример запроса DNS

Проект доступен в github: https://github.com/vesh95/dnso
Про имя проекта не спрашивайте, это я когда вводил имя случайно ввел лишний символ, решил оставить.

Если что-то сделано неправильно или увидели проблему - пишите в gh issues или комментариях. Может у кого-то появятся советы и рекомендации, дайте знать 😊

TODO
- На данный момент есть проблемы с командами запуска докера (напутаны порты для запуска и те что пробрасываются, см. переменные окружения, чтобы запустить с нужными)
- Переделать форму, чтобы указывать домены без зоны
- Добавить авторизацию в интерфейсе
- Добавить валидации

Показать полностью 5
Отличная работа, все прочитано!

Темы

Политика

Теги

Популярные авторы

Сообщества

18+

Теги

Популярные авторы

Сообщества

Игры

Теги

Популярные авторы

Сообщества

Юмор

Теги

Популярные авторы

Сообщества

Отношения

Теги

Популярные авторы

Сообщества

Здоровье

Теги

Популярные авторы

Сообщества

Путешествия

Теги

Популярные авторы

Сообщества

Спорт

Теги

Популярные авторы

Сообщества

Хобби

Теги

Популярные авторы

Сообщества

Сервис

Теги

Популярные авторы

Сообщества

Природа

Теги

Популярные авторы

Сообщества

Бизнес

Теги

Популярные авторы

Сообщества

Транспорт

Теги

Популярные авторы

Сообщества

Общение

Теги

Популярные авторы

Сообщества

Юриспруденция

Теги

Популярные авторы

Сообщества

Наука

Теги

Популярные авторы

Сообщества

IT

Теги

Популярные авторы

Сообщества

Животные

Теги

Популярные авторы

Сообщества

Кино и сериалы

Теги

Популярные авторы

Сообщества

Экономика

Теги

Популярные авторы

Сообщества

Кулинария

Теги

Популярные авторы

Сообщества

История

Теги

Популярные авторы

Сообщества

Недвижимость и ремонт

Теги

Популярные авторы

Сообщества