get-ip-prefix/README_DOMAIN_ROUTING.md
2026-07-03 16:21:48 +03:00

5.8 KiB
Raw Blame History

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 на сервер:

    cp domain-routing.sh /usr/local/bin/
    chmod +x /usr/local/bin/domain-routing.sh
    
  2. Создайте конфигурационный файл:

    cp domain-routing.env.example /opt/domain-routing/domain-routing.env
    
  3. Отредактируйте domain-routing.env:

    DOMAINS_FILE="/opt/domain-routing/domains.txt"
    DNSMASQ_CONF_DIR="/etc/dnsmasq.d"
    IPSET_NAME="domain_routing"
    FIREWALL_ZONE="domain_routing"
    
  4. Создайте файл со списком доменов:

    cat > /opt/domain-routing/domains.txt << 'EOF'
    google.com
    amazon.com
    cloudflare.com
    EOF
    
  5. Запустите скрипт:

    sudo /usr/local/bin/domain-routing.sh
    

Использование

Базовое использование

sudo ./domain-routing.sh

С параметрами командной строки

sudo ./domain-routing.sh \
  --domains-file /path/to/domains.txt \
  --ipset-name custom_ipset \
  --firewall-zone custom_zone

Просмотр справки

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

ipset list domain_routing

Удаление ipset

ipset destroy domain_routing

Пересоздание ipset

sudo ./domain-routing.sh

Автовосстановление

При установке создаётся systemd-сервис ipset-restore@domain_routing.service, который восстанавливает ipset при каждом запуске системы.

Управление сервисом

# Проверка статуса
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

# В 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

Маршрутизация рекламных доменов в "чёрную дыру"

# В 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