5.8 KiB
5.8 KiB
Domain-Based Routing для RHEL
Скрипт для настройки маршрутизации трафика на основе доменных имён с использованием firewalld, ipset и dnsmasq.
Возможности
- Автоматическое разрешение доменных имён в IP-адреса
- Добавление IP-адресов в
ipsetдля быстрой фильтрации - Настройка правил
firewalldдля перенаправления трафика - Интеграция с
dnsmasqдля локального DNS-кэширования - Автовосстановление
ipsetпри перезагрузке
Требования
- RHEL/CentOS 8+ с
firewalld,ipset,dnsmasq dig(пакетbind-utils)rootправа
Установка
-
Скопируйте
domain-routing.shна сервер:cp domain-routing.sh /usr/local/bin/ chmod +x /usr/local/bin/domain-routing.sh -
Создайте конфигурационный файл:
cp domain-routing.env.example /opt/domain-routing/domain-routing.env -
Отредактируйте
domain-routing.env:DOMAINS_FILE="/opt/domain-routing/domains.txt" DNSMASQ_CONF_DIR="/etc/dnsmasq.d" IPSET_NAME="domain_routing" FIREWALL_ZONE="domain_routing" -
Создайте файл со списком доменов:
cat > /opt/domain-routing/domains.txt << 'EOF' google.com amazon.com cloudflare.com EOF -
Запустите скрипт:
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
Как это работает
- Скрипт читает список доменов из файла
- Разрешает каждый домен в IP-адреса через
dig - Создаёт
ipsetи добавляет в него IP-адреса - Настраивает
firewalldдля использования ipset - Генерирует конфиг для
dnsmasq - Сохраняет 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