5.5 KiB
5.5 KiB
DNS Bypass Config Generator
Этот проект автоматизирует генерацию конфигураций для Pi-hole / dnsmasq, чтобы маршрутизировать трафик к заблокированным доменам через VPN-туннель (WireGuard).
Скрипт generate-configs.sh:
- нормализует входные доменные имена;
- для каждого домена запрашивает внешний API (Chromium headless service);
- определяет, является ли домен сайтом (site), сервисом (service) или мертвым;
- формирует конфиги:
91-ipset-bbrkn.conf— правилаipsetдля маркировки трафика;92-resolve-bbrkn.conf— правилаserver=для резолвинга через Google DNS.
Классификация доменов
-
Сайт (site)
API возвращает JSON с полемrelatedDomains.
В конфиги попадает сам домен + все связанные домены. -
Сервис (service)
API возвращает ошибку:ERR_CERT_COMMON_NAME_INVALIDERR_CONNECTION_REFUSED
В конфиги попадает только сам домен.
-
Мертвый домен
API возвращает ошибку:ERR_NAME_NOT_RESOLVEDTimeout
Такие домены полностью исключаются из конфигов.
Переменные окружения
| Переменная | Значение (по умолчанию) | Описание |
|---|---|---|
DOMAINS_FILE |
domains.txt |
Входной файл со списком доменов |
IPSET_CONF |
/tmp/91-ipset-bbrkn.conf |
Файл с правилами ipset |
RESOLVE_CONF |
/tmp/92-resolve-bbrkn.conf |
Файл с правилами server= |
CHROME_SERVER |
http://127.0.0.1:3000 |
Адрес API headless Chromium |
DNS_SERVER |
8.8.8.8 |
DNS для резолвинга через VPN |
DEBUG |
0 |
Включить (1) / выключить (0) отладку |
DEBUG_LOG |
/tmp/generate-configs.debug.log |
Файл для подробного лога |
Запуск
# обычный запуск
./generate-configs.sh
# отладочный режим
DEBUG=1 ./generate-configs.sh
# dry-run (ничего не пишет в файлы)
./generate-configs.sh --dry-run
После запуска будут сгенерированы файлы:
$IPSET_CONF— список правил ipset;$RESOLVE_CONF— список правил server=.
Интеграция в CI/CD
Переменные окружения передаются в make и далее в скрипт:
jobs:
generate-configs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Run generator
run: |
make generate-configs
env:
DOMAINS_FILE: domains.txt
IPSET_CONF: ./out/91-ipset-bbrkn.conf
RESOLVE_CONF: ./out/92-resolve-bbrkn.conf
CHROME_SERVER: http://chrome-headless:3000
DNS_SERVER: 8.8.8.8
Файл Makefile прокидывает переменные дальше:
generate-configs:
./generate-configs.sh
Архитектура решения
flowchart TD
A[Клиент в локальной сети] -->|DNS запрос| B[Pi-hole DNS на шлюзе]
B -->|если домен заблокирован| C[Google DNS 8.8.8.8 через VPN]
C --> D[Ответ с IP]
D --> B
B -->|IP в ipset| E[iptables / netfilter]
E -->|маршрутизация по mark| F[VPN WireGuard]
F --> G[Интернет ресурс]
subgraph "CI/CD"
X[domains.txt] --> Y[generate-configs.sh]
Y --> P1[ipset conf]
Y --> P2[resolve conf]
end
Диаграмма потока обработки
sequenceDiagram
participant Client
participant PiHole
participant ChromeAPI
participant VPN
participant Internet
Client->>PiHole: DNS-запрос к домену
PiHole->>ChromeAPI: Проверка домена
ChromeAPI-->>PiHole: relatedDomains / error
PiHole->>VPN: Резолвинг через 8.8.8.8 (для заблокированных)
VPN->>Internet: Запрос к сайту
Internet-->>VPN: Ответ
VPN-->>PiHole: IP-адрес
PiHole-->>Client: Ответ DNS
Client->>Internet: Трафик с IP через VPN
Отчёт после запуска
Скрипт выводит статистику:
- количество строк во входном файле;
- сколько доменов нормализовано / отброшено;
- сколько API-ответов успешные, сервисные, мёртвые;
- список валидных основных сайтов.
Пример
===== DEBUG REPORT =====
Input file: domains.txt
Raw input lines: 100
Processed lines: 100
Normalized OK: 97
Normalized skipped: 3
API success (sites): 25
API error/ignored: 5
Related domains added: 122
Final unique domains: 140
---- VALID BASE SITES ----
example1.com
example2.org
example3.info
===== END DEBUG REPORT =====
Зависимости
bashcurljq
Лицензия
MIT