224 lines
7.3 KiB
Markdown
224 lines
7.3 KiB
Markdown
# 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
|