Проектная лаборатория
Собственный DNS-сервер
Этап 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 go2. Откройте папку в IDE
cd ./my-dns-serverРеализуйте требования этапа в созданном проекте.
Запустите из папки проекта
node '/opt/graphlms/tools/project-lab/cli.mjs' submit --stage gt1Запускайте submit из папки проекта. Это локальные проверки, а не сертификаты или результаты аккаунта CodeCrafters.
Результат проверки
go / ЛОКАЛЬНОПодключение к локальной проверке…
Здесь появится результат
Запустите submit в терминале. Страница обновляет результаты каждые 8 секунд.