# Domain-Based Routing для RHEL Скрипт для настройки маршрутизации трафика на основе доменных имён с использованием `firewalld`, `ipset` и `dnsmasq`. ## Возможности - Автоматическое разрешение доменных имён в IP-адреса - Добавление IP-адресов в `ipset` для быстрой фильтрации - Настройка правил `firewalld` для перенаправления трафика - Интеграция с `dnsmasq` для локального DNS-кэширования - Автовосстановление `ipset` при перезагрузке ## Требования - RHEL/CentOS 8+ с `firewalld`, `ipset`, `dnsmasq` - `dig` (пакет `bind-utils`) - `root` права ## Установка 1. Скопируйте `domain-routing.sh` на сервер: ```bash cp domain-routing.sh /usr/local/bin/ chmod +x /usr/local/bin/domain-routing.sh ``` 2. Создайте конфигурационный файл: ```bash cp domain-routing.env.example /opt/domain-routing/domain-routing.env ``` 3. Отредактируйте `domain-routing.env`: ```bash DOMAINS_FILE="/opt/domain-routing/domains.txt" DNSMASQ_CONF_DIR="/etc/dnsmasq.d" IPSET_NAME="domain_routing" FIREWALL_ZONE="domain_routing" ``` 4. Создайте файл со списком доменов: ```bash cat > /opt/domain-routing/domains.txt << 'EOF' google.com amazon.com cloudflare.com EOF ``` 5. Запустите скрипт: ```bash sudo /usr/local/bin/domain-routing.sh ``` ## Использование ### Базовое использование ```bash sudo ./domain-routing.sh ``` ### С параметрами командной строки ```bash sudo ./domain-routing.sh \ --domains-file /path/to/domains.txt \ --ipset-name custom_ipset \ --firewall-zone custom_zone ``` ### Просмотр справки ```bash sudo ./domain-routing.sh --help ``` ## Конфигурация ### Основные переменные в `domain-routing.env` | Переменная | Описание | Обязательная | |------------|----------|-------------| | `DOMAINS_FILE` | Путь к файлу со списком доменов | Да | | `IPSET_NAME` | Имя создаваемого ipset | Да | | `FIREWALL_ZONE` | Имя зоны firewalld | Да | | `DNSMASQ_CONF_DIR` | Директория для конфигов dnsmasq | Да | | `RESOLV_CONF` | Путь к resolv.conf | Нет | ### Формат файла доменов Один домен на строку, комментарии начинаются с `#`: ``` # Комментарий google.com www.example.com ``` ## Как это работает 1. Скрипт читает список доменов из файла 2. Разрешает каждый домен в IP-адреса через `dig` 3. Создаёт `ipset` и добавляет в него IP-адреса 4. Настраивает `firewalld` для использования ipset 5. Генерирует конфиг для `dnsmasq` 6. Сохраняет ipset для автовосстановления при перезагрузке ## Управление ipset ### Просмотр ipset ```bash ipset list domain_routing ``` ### Удаление ipset ```bash ipset destroy domain_routing ``` ### Пересоздание ipset ```bash sudo ./domain-routing.sh ``` ## Автовосстановление При установке создаётся systemd-сервис `ipset-restore@domain_routing.service`, который восстанавливает ipset при каждом запуске системы. ### Управление сервисом ```bash # Проверка статуса systemctl status ipset-restore@domain_routing.service # Запуск вручную systemctl start ipset-restore@domain_routing.service # Отключение автовосстановления systemctl disable ipset-restore@domain_routing.service ``` ## Устранение неполадок ### Ошибка: "Не удалось разрешить ни один домен" - Проверьте доступность DNS: `dig google.com` - Убедитесь, что в файле доменов нет опечаток ### Ошибка: "firewalld: no zone" - Создайте зону вручную: `firewall-cmd --new-zone=test --permanent` ### Dnsmasq не перезагружается - Убедитесь, что dnsmasq установлен: `dnsmasq --version` - Запустите вручную: `systemctl start dnsmasq` ## Примеры ### Маршрутизация трафика Google через VPN ```bash # В domain-routing.env DOMAINS_FILE="/etc/domain-routing/google-domains.txt" IPSET_NAME="google_via_vpn" FIREWALL_ZONE="vpn_routing" # В /etc/domain-routing/google-domains.txt google.com www.google.com maps.google.com ``` ### Маршрутизация рекламных доменов в "чёрную дыру" ```bash # В domain-routing.env DOMAINS_FILE="/etc/domain-routing/ads-domains.txt" IPSET_NAME="ads_block" FIREWALL_ZONE="ads_block" # Добавьте правило в firewalld для блокировки firewall-cmd --zone=ads_block --add-rich-rule='rule family="ipv4" source ipset="ads_block" drop' --permanent firewall-cmd --reload ``` ## Безопасность - Скрипт должен запускаться от имени `root` - Файлы конфигурации содержат пути к системным ресурсам - храните их в защищённых местах - ipset используется только для IPv4 (можно расширить для IPv6) ## Лицензия MIT