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

224 lines
7.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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