Skip to content

cppdevcourse/exam-dns-server

Repository files navigation

Билет №2. DNS сервер

В этом билете необходимо будет реализовать сериализацию и десериализацию части пакета DNS.

Обзор проекта

В этом репозитории находится незавершенный исходный код примитивного DNS-сервера, который на все запросы должен отвечать NXDOMAIN (Non-eXistent Domain, домена не существует).

Пакеты DNS

Этот DNS сервер работает с двумя типами DNS пакетов:

  • query;
  • response.

Первые 12 байт обоих этих пакетов занимает заголовок DNS header. Его структура в данном билете не важна, вся работа с заголовком уже реализована.

В DNS query и DNS response с NXDOMAIN далее идет секция переменной длины, называемая question. Если response является ответом на query, то эта секция должна в них быть одинакова.

Question состоит из 3 полей:

  • name (доменное имя, переменная длина);
  • type (2 байта);
  • class (2 байта).

Основную сложность для сериализации/десериализации представляет поле name. Оно структурировано и разделено на поддомены. Длина каждого поддомена находится перед поддоменом. Завершается поле name нуль-терминатором.

Например, если клиент отправляет запрос на поиск домена "my.domain.ru", то в DNS question в поле name будут байты в следующей последовательности:

0x02 'm' 'y' 0x06 'd' 'o' 'm' 'a' 'i' 'n' 0x02 'r' 'u' 0x00

Ограничения

  • Проект не кроссплатформенный, соберется только под POSIX-совместимую операционную систему.

  • Сервер принимает только запросы с одним доменным именем.

Сборка

Для сборки проекта выполните:

cmake -B build/
cmake --build build/

Тестирование

Вручную проект можно протестировать в терминале. Потребуется утилита dig (или любая утилита, способная отправлять DNS запросы типа A на произвольный IP адрес и порт).

В одном окне терминала запустите сервер на каком-либо порту (в примере 9000):

./build/dns_server 5300
Listening on port 5300
...

В другом окне терминала отправьте DNS запрос:

dig @127.0.0.1 -p 5300 my.cool.domain.ru A
;; Warning: Message parser reports malformed message packet.

; <<>> DiG 9.20.15 <<>> @127.0.0.1 -p 5300 my.cool.domain.ru A
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: RESERVED12, id: 64404
;; flags: qr aa rd; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 0
;; WARNING: recursion requested but not available

;; Query time: 0 msec
;; SERVER: 127.0.0.1#5300(127.0.0.1) (UDP)
;; WHEN: Mon Jan 19 15:34:11 +05 2026
;; MSG SIZE  rcvd: 12

Поскольку в текущей реализации сервер незавершен, dig сообщает o том, что ответный пакет испорчен.

В логах самого сервера добавились строки:

Processing query with:
        Transaction ID: 64404
        Number of Questions: 1
        Question name:

Сервер корректно прочитал заголовок, определил идентификатор транзакции, количество questions и т.д. Но доменное имя из question он прочитать не смог.

Завершить работу обеих программ можно нажав Ctrl+C.

Задание

Что уже реализовано:

  • разбор аргументов командной строки;
  • UDP сервер (прием команд, отправка ответов);
  • система сборки;
  • сериализация и десериализация заголовка DNS пакета;
  • подготовка DNS response с ответом NXDOMAIN.

Что нужно реализовать:

  • десериализацию секции question из DNS query;
  • сериализацию секции question из DNS response.

Места, где в коде нужно внести изменения, помечены комментариями TODO:

// TODO: добавьте сериализацию

По желанию можно написать юнит-тесты.

About

Билет экзамена #2, DNS сервер

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors