Высокопроизводительный DNS-прокси, написанный на Go, предназначенный для работы на роутерах (в т.ч. aarch64) и обычных серверах.
Поддерживает основной DNS-сервер, fallback-серверы, эвристику доступности, а также eBPF-подобный scoring алгоритм, аналогичный AdGuard Home (формула №1: RTT + penalty + decay).
- Приём DNS-запросов по UDP на порту 53
- Прокси-передача запросов на основной DNS-сервер
- Автоматический переход в fallback-режим при недоступности основного DNS
- TTL для состояния primary down (по умолчанию 5 минут)
- Несколько fallback-серверов
- Балансировка нагрузок на fallback-серверы:
- На основе их задержек (RTT)
- С использованием eBPF-подобного scoring:
score = RTT * decay + penalty_on_fail
- Автоматическая адаптация весов при получении ответов
- Поддержка atomic-операций для минимизации блокировок
- Поддержка PID-файла
- Логирование в файл
- Кросс-компиляция для Linux/aarch64
Каждому fallback-серверу присваивается внутренний score. После каждого DNS-запроса score обновляется по формуле:
score = score * decay + rtt + penalty(on_failure)
- decay — коэффициент сглаживания
- rtt — реальное время ответа сервера
- penalty — штраф при ошибках
Выбирается сервер с минимальным score.
go build ./cmd/dns-proxyGOOS=linux GOARCH=arm64 go build -o dns-proxy ./cmd/dns-proxy- Пример config.yaml
- Прописка сервиса в Keenetic /opt/etc/init.d/S99dnsproxy
./dns-proxy --config config.yaml --pid /var/run/dns-proxy.pid --log /var/log/dns-proxy.log