DNS-прокси
Команда sd dns-proxy запускает локальный DNS-прокси сервер, который перехватывает DNS-запросы и фильтрует их через три движка перед перенаправлением к вышестоящему резолверу:
- Движок adblock — блокирует рекламу, трекеры и вредоносные домены из списков фильтров
- IOC-фид доменов — блокирует домены из индикаторов компрометации разведки угроз
- Пользовательский список блокировок DNS — блокирует домены из пользовательских списков
Запросы, совпадающие с любым фильтром, получают в ответ 0.0.0.0 (NXDOMAIN). Все остальные запросы перенаправляются на настроенный вышестоящий DNS-сервер. Каждый запрос и его статус разрешения записывается в файл JSONL.
Быстрый старт
# Запустить DNS-прокси с настройками по умолчанию (прослушивание 127.0.0.1:53, upstream 8.8.8.8:53)
sudo sd dns-proxyTIP
По умолчанию прокси прослушивает порт 53, что требует прав root. Для тестирования без привилегий используйте высокий порт, например --listen 127.0.0.1:5353.
Параметры команды
sd dns-proxy [OPTIONS]| Параметр | По умолчанию | Описание |
|---|---|---|
--listen | 127.0.0.1:53 | Адрес и порт для прослушивания |
--upstream | 8.8.8.8:53 | Вышестоящий DNS-сервер для перенаправления незаблокированных запросов |
--log-path | /tmp/prx-sd-dns.log | Путь к файлу журнала запросов JSONL |
Примеры использования
Базовое использование
Запустить прокси на адресе по умолчанию с Google DNS в качестве upstream:
sudo sd dns-proxyВывод:
>>> Starting DNS proxy (listen=127.0.0.1:53, upstream=8.8.8.8:53, log=/tmp/prx-sd-dns.log)
>>> Filter engines: adblock + dns_blocklist + ioc_domains
>>> Press Ctrl+C to stop.Пользовательский адрес прослушивания и upstream
Использовать Cloudflare DNS в качестве upstream и прослушивать пользовательский порт:
sudo sd dns-proxy --listen 127.0.0.1:5353 --upstream 1.1.1.1:53Пользовательский путь к журналу
Записывать журналы запросов в конкретное расположение:
sudo sd dns-proxy --log-path /var/log/prx-sd/dns-queries.jsonlСовместное использование с Adblock
DNS-прокси автоматически загружает списки фильтров adblock из ~/.prx-sd/adblock/. Для максимального охвата:
# Шаг 1: Включить и синхронизировать списки adblock
sudo sd adblock enable
sd adblock sync
# Шаг 2: Запустить DNS-прокси (он автоматически подхватывает правила adblock)
sudo sd dns-proxyПрокси читает те же кешированные списки фильтров, что использует sd adblock. Любые списки, добавленные через sd adblock add, автоматически становятся доступны прокси после его перезапуска.
Настройка системы для использования прокси
Linux (systemd-resolved)
Отредактируйте /etc/systemd/resolved.conf:
[Resolve]
DNS=127.0.0.1Затем перезапустите:
sudo systemctl restart systemd-resolvedLinux (resolv.conf)
echo "nameserver 127.0.0.1" | sudo tee /etc/resolv.confmacOS
sudo networksetup -setdnsservers Wi-Fi 127.0.0.1Для отмены изменений:
sudo networksetup -setdnsservers Wi-Fi emptyWARNING
Перенаправление всего DNS-трафика на локальный прокси означает, что если прокси остановлен, DNS-разрешение не будет работать пока вы не восстановите исходные настройки или не перезапустите прокси.
Формат журнала
DNS-прокси записывает JSONL (один JSON-объект на строку) в настроенный путь журнала. Каждая запись содержит:
{
"timestamp": "2026-03-20T14:30:00.123Z",
"query": "ads.example.com",
"type": "A",
"action": "blocked",
"filter": "adblock",
"upstream_ms": null
}{
"timestamp": "2026-03-20T14:30:00.456Z",
"query": "docs.example.com",
"type": "A",
"action": "forwarded",
"filter": null,
"upstream_ms": 12
}| Поле | Описание |
|---|---|
timestamp | Временная метка запроса в формате ISO 8601 |
query | Запрошенное имя домена |
type | Тип DNS-записи (A, AAAA, CNAME и т.д.) |
action | blocked (заблокировано) или forwarded (перенаправлено) |
filter | Какой фильтр сработал: adblock, ioc, blocklist или null |
upstream_ms | Время прохождения до вышестоящего DNS (null если заблокировано) |
Архитектура
Client DNS Query (port 53)
|
v
+------------------+
| sd dns-proxy |
| |
| 1. Adblock |---> blocked? --> respond 0.0.0.0
| 2. IOC domains |---> blocked? --> respond 0.0.0.0
| 3. DNS blocklist |---> blocked? --> respond 0.0.0.0
| |
| Not blocked: |
| Forward to |---> upstream DNS (e.g. 8.8.8.8)
| upstream |<--- response
| |
| Log to JSONL |
+------------------+
|
v
Client receives responseЗапуск как сервис
Для запуска DNS-прокси как постоянного сервиса systemd:
# Создать файл юнита systemd
sudo tee /etc/systemd/system/prx-sd-dns.service << 'EOF'
[Unit]
Description=PRX-SD DNS Proxy
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/bin/sd dns-proxy --listen 127.0.0.1:53 --upstream 8.8.8.8:53 --log-path /var/log/prx-sd/dns-queries.jsonl
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
EOF
# Включить и запустить
sudo systemctl daemon-reload
sudo systemctl enable --now prx-sd-dnsTIP
Для полностью управляемой фоновой работы рассмотрите использование sd daemon, который объединяет мониторинг файловой системы в реальном времени, автоматическое обновление сигнатур и может быть расширен для включения функциональности DNS-прокси.
Следующие шаги
- Настройте списки фильтров Adblock для комплексной блокировки доменов
- Настройте мониторинг в реальном времени для защиты файловой системы наряду с DNS-фильтрацией
- Просмотрите справочник конфигурации для настроек, связанных с прокси