Skip to content

contrust/dns-server

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

36 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

DNS Сервер

DNS сервер на Python, который предоставляет итеративное разрешение DNS-запросов с возможностью кэширования. Сервер поддерживает как TCP, так и UDP протоколы и может обрабатывать множество клиентских подключений одновременно.

Возможности

  • Поддержка нескольких протоколов

    • Обработка TCP и UDP запросов
    • Поддержка IPv4 (A-записи) и IPv6 (AAAA-записи)
    • Потокобезопасная реализация
  • Система кэширования

    • LRU (Least Recently Used) кэш с поддержкой TTL
    • Постоянное хранение кэша
    • Автоматическая очистка устаревших записей
    • Настраиваемый размер кэша
  • Специальные возможности

    • Настраиваемый прокси-сервер для вышестоящего DNS-разрешения
    • Подробная система логирования
  • Потокобезопасность

    • Многопоточная обработка запросов
    • Потокобезопасные операции с кэшем
    • Настраиваемый размер пула потоков

Установка

  1. Клонируйте репозиторий:
git clone https://github.com/yourusername/dns-server.git
cd dns-server
  1. Установите зависимости:
make install

Использование

Быстрый старт с Makefile

Проект включает Makefile для упрощения основных операций:

# Генерация конфигурационного файла
make config

# Запуск сервера
make run

# Запуск сервера с подробным логированием
make run-verbose

# Запуск тестов
make test

# Очистка кэш-файлов и логов
make clean

# Показать справку по командам
make help

Примеры использования

Прямой DNS-запрос (A-запись)

# Первый запрос (без кэша)
$ 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  # Заметно быстрее благодаря кэшированию

Обратный DNS-запрос (PTR-запись)

# Первый запрос (без кэша)
$ 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: 53
  • max_threads: 5
  • cache_size: 100
  • log_file: 'log.txt'
  • cache_file: 'cache.pkl'
  • proxy_hostname: "a.root-servers.net"
  • proxy_port: 53

Запуск сервера

  1. Сгенерируйте конфигурацию (если еще не сделано):
sudo python3 -m server -g config.json
  1. Запустите сервер:
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.

About

simple dns-server which iteratively gets domain's public ip-address

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published