Проектная лаборатория

Собственный DNS-сервер

0 / 8этапов пройдено

Этап 08 · Основные этапы

Пересылка DNS-запросов

Русский перевод заданий CodeCrafters. Примеры подготовлены для Go. Выбор языка меняет команды и результаты, но не текст задания.

На этом этапе вы реализуете DNS-сервер, пересылающий запросы.

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


На этом этапе тестирующая система запустит вашу программу следующим образом:

./your_server --resolver <address>
  • Здесь <address> имеет вид <ip>:<port>.

Затем она отправит на порт 2053 UDP-пакет с DNS-запросом. Ваша программа должна переслать DNS-запросы указанному DNS-серверу, а затем вернуть ответ исходному отправителю (то есть тестирующей системе).

Ваша программа должна отправить ответный DNS-пакет, содержащий:

  • раздел заголовка (как на этапе №5);
  • раздел вопросов (как на этапе №6);
  • раздел ответов (новое на этом этапе), повторяющий ответ DNS-сервера, которому вы переслали запрос.

О тестирующей системе можно сделать следующие предположения:

  • Она всегда отправляет запросы записей типа A. Поэтому логике разбора достаточно поддерживать этот тип.

О DNS-сервере, которому вы пересылаете запросы, можно сделать следующие предположения:

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

Не забудьте повторить в ответе идентификатор пакета, присланный тестирующей системой.

Проверка в вашей IDE

Нужны Node.js, Git, Go 1.24+ для тестеров и инструменты выбранного языка. Тестеры загружаются и запускаются локально; отдельным проектам нужны дополнительные системные зависимости.

Настройка проекта и IDE

1. Создайте проект один раз

node '/opt/graphlms/tools/project-lab/cli.mjs' init dns-server ./my-dns-server --language go

2. Откройте папку в IDE

cd ./my-dns-server

Реализуйте требования этапа в созданном проекте.

Запустите из папки проекта

node '/opt/graphlms/tools/project-lab/cli.mjs' submit --stage gt1

Запускайте submit из папки проекта. Это локальные проверки, а не сертификаты или результаты аккаунта CodeCrafters.

Результат проверки

go / ЛОКАЛЬНО

Подключение к локальной проверке…

Здесь появится результат

Запустите submit в терминале. Страница обновляет результаты каждые 8 секунд.

GraphLMS — инженерная лаборатория роста