Skip to content

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

Packages

Used by

Contributors

Languages