# Domain-Based Routing для BIRD BGP Скрипт для настройки маршрутизации трафика на основе доменных имён с использованием `BIRD BGP`. ## Возможности - Автоматическое разрешение доменных имён в IP-адреса (IPv4 и IPv6) - Генерация конфигурационного файла для BIRD с route statements - Автоматическая перезагрузка BIRD после изменения конфига - MD5 хеш для отслеживания изменений - Автовосстановление конфига при перезагрузке через systemd ## Требования - RHEL/CentOS 8+ с `BIRD` - `dig` (пакет `bind-utils`) - `root` права ## Установка 1. Скопируйте `domain-routing-bird.sh` на сервер: ```bash cp domain-routing-bird.sh /usr/local/bin/ chmod +x /usr/local/bin/domain-routing-bird.sh ``` 2. Создайте конфигурационный файл: ```bash cp domain-routing-bird.env.example /opt/domain-routing/domain-routing-bird.env ``` 3. Отредактируйте `domain-routing-bird.env`: ```bash DOMAINS_FILE="/opt/domain-routing/domains.txt" BIRD_CONF_DIR="/etc/bird/conf.d" BIRD_CONF_FILE="domain-routing.conf" ROUTE_GATEWAY="10.0.0.1" ROUTE_INTERFACE="eth0" ENABLE_IPV4="true" ENABLE_IPV6="false" ``` 4. Создайте файл со списком доменов: ```bash cat > /opt/domain-routing/domains.txt << 'EOF' google.com www.google.com amazon.com cloudflare.com EOF ``` 5. Запустите скрипт: ```bash sudo /usr/local/bin/domain-routing-bird.sh ``` ## Использование ### Базовое использование ```bash sudo ./domain-routing-bird.sh ``` ### С параметрами командной строки ```bash sudo ./domain-routing-bird.sh \ --domains-file /path/to/domains.txt \ --bird-conf-dir /etc/bird/conf.d \ --bird-conf-file domain-routing.conf \ --gateway 10.0.0.1 \ --interface eth0 ``` ### Просмотр справки ```bash sudo ./domain-routing-bird.sh --help ``` ## Конфигурация ### Основные переменные в `domain-routing-bird.env` | Переменная | Описание | Обязательная | |------------|----------|-------------| | `DOMAINS_FILE` | Путь к файлу со списком доменов | Да | | `BIRD_CONF_DIR` | Директория конфигов BIRD | Да | | `BIRD_CONF_FILE` | Имя файла конфига | Да | | `ROUTE_GATEWAY` | Шлюз для маршрутов | Да | | `ROUTE_INTERFACE` | Интерфейс для маршрутов | Да | | `ENABLE_IPV4` | Включить IPv4 (true/false) | Нет (по умолчанию true) | | `ENABLE_IPV6` | Включить IPv6 (true/false) | Нет (по умолчанию false) | ### Формат файла доменов Один домен на строку, комментарии начинаются с `#`: ``` # Комментарий google.com www.example.com ``` ## Как это работает 1. Скрипт читает список доменов из файла 2. Разрешает каждый домен в IP-адреса через `dig` (A и AAAA записи) 3. Генерирует конфигурационный файл для BIRD с route statements 4. Перезагружает BIRD через `birdc configure` 5. Сохраняет MD5 хеш для отслеживания изменений 6. Создаёт systemd-сервис для автовосстановления при перезагрузке ## Структура конфига BIRD ``` # Auto-generated domain routing config # Generated: 2026-07-03 # Source: /opt/domain-routing/domains.txt route 8.8.8.0/24 via 10.0.0.1 on eth0; route 1.1.1.0/24 via 10.0.0.1 on eth0; ``` ## Управление конфигом ### Просмотр конфига BIRD ```bash cat /etc/bird/conf.d/domain-routing.conf ``` ### Просмотр маршрутов в BIRD ```bash birdc show route all ``` ### Перезагрузка BIRD вручную ```bash sudo /usr/sbin/birdc configure ``` ### Удаление конфига ```bash rm /etc/bird/conf.d/domain-routing.conf sudo /usr/sbin/birdc configure ``` ## systemd-сервис При установке создаётся systemd-сервис `bird-domain-routing.service`, который перезагружает BIRD при каждом запуске системы. ### Управление сервисом ```bash # Проверка статуса systemctl status bird-domain-routing.service # Запуск вручную systemctl start bird-domain-routing.service # Отключение автовосстановления systemctl disable bird-domain-routing.service ``` ## Устранение неполадок ### Ошибка: "Не удалось разрешить ни один домен" - Проверьте доступность DNS: `dig google.com` - Убедитесь, что в файле доменов нет опечаток ### Ошибка: "birdc: connect: No such file or directory" - Убедитесь, что BIRD запущен: `systemctl status bird` - Запустите BIRD: `systemctl start bird` ### Ошибка: "route X.X.X.X: Invalid argument" - Проверьте, что шлюз `ROUTE_GATEWAY` доступен на интерфейсе `ROUTE_INTERFACE` - Проверьте маршруты: `ip route show` ### BIRD не применяет конфиг - Проверьте синтаксис: `birdc check` - Посмотрите логи: `journalctl -u bird` ## Примеры ### Маршрутизация трафика Google через VPN ```bash # В domain-routing-bird.env DOMAINS_FILE="/etc/domain-routing/google-domains.txt" BIRD_CONF_FILE="google-routes.conf" ROUTE_GATEWAY="10.8.0.1" ROUTE_INTERFACE="tun0" # В /etc/domain-routing/google-domains.txt google.com www.google.com maps.google.com ``` ### Маршрутизация рекламных доменов в "чёрную дыру" (через null0) ```bash # В domain-routing-bird.env ROUTE_GATEWAY="null0" # Конфиг будет содержать: route 8.8.8.0/24 via null0; ``` ## Сравнение с domain-routing.sh (firewalld/ipset) | Функция | domain-routing.sh | domain-routing-bird.sh | |---------|-------------------|------------------------| | Технология | firewalld + ipset | BIRD BGP | | Гибкость | Ограничена правилами firewalld | Полный контроль маршрутов | | Поддержка IPv6 | Ограничена | Полная | | Интеграция | Системный firewall | BGP routing | | Сложность | Простая | Более сложная | ## Безопасность - Скрипт должен запускаться от имени `root` - Файлы конфигурации содержат пути к системным ресурсам - храните их в защищённых местах - Рассмотрите использование `birdc check` для валидации конфига перед применением ## Лицензия MIT