DNS сервер на Python, который предоставляет итеративное разрешение DNS-запросов с возможностью кэширования. Сервер поддерживает как TCP, так и UDP протоколы и может обрабатывать множество клиентских подключений одновременно.
- 
Поддержка нескольких протоколов
- Обработка TCP и UDP запросов
 - Поддержка IPv4 (A-записи) и IPv6 (AAAA-записи)
 - Потокобезопасная реализация
 
 - 
Система кэширования
- LRU (Least Recently Used) кэш с поддержкой TTL
 - Постоянное хранение кэша
 - Автоматическая очистка устаревших записей
 - Настраиваемый размер кэша
 
 - 
Специальные возможности
- Настраиваемый прокси-сервер для вышестоящего DNS-разрешения
 - Подробная система логирования
 
 - 
Потокобезопасность
- Многопоточная обработка запросов
 - Потокобезопасные операции с кэшем
 - Настраиваемый размер пула потоков
 
 
- Клонируйте репозиторий:
 
git clone https://github.com/yourusername/dns-server.git
cd dns-server- Установите зависимости:
 
make installПроект включает Makefile для упрощения основных операций:
# Генерация конфигурационного файла
make config
# Запуск сервера
make run
# Запуск сервера с подробным логированием
make run-verbose
# Запуск тестов
make test
# Очистка кэш-файлов и логов
make clean
# Показать справку по командам
make help# Первый запрос (без кэша)
$ dig @127.0.0.2 google.com
; <<>> DiG 9.20.9 <<>> @127.0.0.2 google.com
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 54488
;; flags: qr; QUERY: 1, ANSWER: 6, AUTHORITY: 0, ADDITIONAL: 6
;; QUESTION SECTION:
;google.com.                    IN      A
;; ANSWER SECTION:
google.com.             300     IN      A       64.233.162.139
google.com.             300     IN      A       64.233.162.100
google.com.             300     IN      A       64.233.162.101
google.com.             300     IN      A       64.233.162.102
google.com.             300     IN      A       64.233.162.138
google.com.             300     IN      A       64.233.162.113
;; Query time: 229 msec
# Повторный запрос (из кэша)
$ dig @127.0.0.2 google.com
;; Query time: 1 msec  # Заметно быстрее благодаря кэшированию# Первый запрос (без кэша)
$ dig @127.0.0.2 -x 91.201.52.139
; <<>> DiG 9.20.9 <<>> @127.0.0.2 -x 91.201.52.139
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 4872
;; flags: qr; QUERY: 1, ANSWER: 1, AUTHORITY: 3, ADDITIONAL: 4
;; QUESTION SECTION:
;139.52.201.91.in-addr.arpa.    IN      PTR
;; ANSWER SECTION:
139.52.201.91.in-addr.arpa. 3600 IN     PTR     be24.netangels.ru.
;; AUTHORITY SECTION:
52.201.91.in-addr.arpa. 14400   IN      NS      ns3.netangels.ru.
52.201.91.in-addr.arpa. 14400   IN      NS      ns1.netangels.ru.
52.201.91.in-addr.arpa. 14400   IN      NS      ns2.netangels.ru.
;; Query time: 534 msec
# Повторный запрос (из кэша)
$ dig @127.0.0.2 -x 91.201.52.139
;; Query time: 2 msec  # Заметно быстрее благодаря кэшированиюСервер можно настроить с помощью JSON-файла конфигурации. Вы можете сгенерировать файл конфигурации по умолчанию с помощью:
sudo python3 -m server -g config.jsonПараметры конфигурации по умолчанию:
hostname: '127.0.0.2'port: 53max_threads: 5cache_size: 100log_file: 'log.txt'cache_file: 'cache.pkl'proxy_hostname: "a.root-servers.net"proxy_port: 53
- Сгенерируйте конфигурацию (если еще не сделано):
 
sudo python3 -m server -g config.json- Запустите сервер:
 
sudo python3 -m server -c config.jsonДополнительные опции:
-h, --help: Показать справочное сообщение-v, --verbose: Запустить сервер в режиме подробного логирования
Проект включает модульные тесты для системы кэширования. Для запуска тестов:
make testили
python -m unittest tests/test_timed_lru_cache.py -vТестовое покрытие включает:
- Базовые операции с кэшем (добавление, получение)
 - Истечение срока действия TTL
 - Вытеснение по LRU
 - Сохранение в файл
 - Потокобезопасность
 - Граничные случаи
 
dns-server/
├── server/
│   ├── __main__.py      # Точка входа сервера
│   ├── server.py        # Основная реализация сервера
│   ├── config.py        # Управление конфигурацией
│   └── timed_lru_cache.py  # Система кэширования
├── entities/
│   ├── dns_message.py   # Обработка DNS-сообщений
│   ├── flags.py         # DNS-флаги
│   ├── query.py         # Обработка DNS-запросов
│   └── question.py      # Обработка DNS-вопросов
├── tests/
│   └── test_timed_lru_cache.py  # Модульные тесты
├── Makefile            # Скрипты автоматизации
└── README.md
- Python 3.x
 - Права root/администратора (для привязки к порту 53)
 - Make (для использования Makefile)
 
Артём Борисов
Этот проект распространяется под лицензией MIT - подробности в файле LICENSE.