7.3 KiB
7.3 KiB
Domain-Based Routing для BIRD BGP
Скрипт для настройки маршрутизации трафика на основе доменных имён с использованием BIRD BGP.
Возможности
- Автоматическое разрешение доменных имён в IP-адреса (IPv4 и IPv6)
- Генерация конфигурационного файла для BIRD с route statements
- Автоматическая перезагрузка BIRD после изменения конфига
- MD5 хеш для отслеживания изменений
- Автовосстановление конфига при перезагрузке через systemd
Требования
- RHEL/CentOS 8+ с
BIRD dig(пакетbind-utils)rootправа
Установка
-
Скопируйте
domain-routing-bird.shна сервер:cp domain-routing-bird.sh /usr/local/bin/ chmod +x /usr/local/bin/domain-routing-bird.sh -
Создайте конфигурационный файл:
cp domain-routing-bird.env.example /opt/domain-routing/domain-routing-bird.env -
Отредактируйте
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" -
Создайте файл со списком доменов:
cat > /opt/domain-routing/domains.txt << 'EOF' google.com www.google.com amazon.com cloudflare.com EOF -
Запустите скрипт:
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
Как это работает
- Скрипт читает список доменов из файла
- Разрешает каждый домен в IP-адреса через
dig(A и AAAA записи) - Генерирует конфигурационный файл для BIRD с route statements
- Перезагружает BIRD через
birdc configure - Сохраняет MD5 хеш для отслеживания изменений
- Создаёт 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