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

7.3 KiB
Raw Blame History

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

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

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

    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. Создайте файл со списком доменов:

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

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

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

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

sudo ./domain-routing-bird.sh

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

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

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

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

cat /etc/bird/conf.d/domain-routing.conf

Просмотр маршрутов в BIRD

birdc show route all

Перезагрузка BIRD вручную

sudo /usr/sbin/birdc configure

Удаление конфига

rm /etc/bird/conf.d/domain-routing.conf
sudo /usr/sbin/birdc configure

systemd-сервис

При установке создаётся systemd-сервис bird-domain-routing.service, который перезагружает BIRD при каждом запуске системы.

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

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

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

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