Переписан BGP сервер на FRR

This commit is contained in:
2025-07-11 18:06:07 +07:00
parent 3c5740784b
commit e197dae9f7
14 changed files with 1222 additions and 812 deletions
+145 -159
View File
@@ -1,28 +1,38 @@
# BGP Server для раздачи префиксов
# BGP Server для раздачи префиксов (FRR)
Этот проект представляет собой BGP сервер, который раздает префиксы из текстовых файлов. Сервер работает в Docker контейнере и предназначен для интеграции с RouterOS 7.14+.
Этот проект представляет собой BGP сервер на базе FRR (Free Range Routing), который раздает префиксы из текстовых файлов. Сервер работает в Docker контейнере и предназначен для интеграции с RouterOS 7.14+.
## Архитектура решения
- **BGP Server**: ExaBGP в Docker контейнере
- **BGP Server**: FRR (Free Range Routing) в Docker контейнере
- **Источник данных**: Текстовые файлы с префиксами
- **Клиент**: RouterOS 7.14+ для получения префиксов
- **Протокол**: BGP (только исходящие анонсы)
## Преимущества FRR
- **Стабильность**: Производственный уровень надежности
- **Производительность**: Оптимизирован для высоких нагрузок
- **Функциональность**: Полная поддержка BGP функций
- **Мониторинг**: Встроенные инструменты диагностики
- **Сообщество**: Активная поддержка и развитие
## Структура проекта
```
bgp-server/
├── docker-compose.yml # Конфигурация Docker
├── Dockerfile # Образ Docker
├── exabgp.conf # Конфигурация ExaBGP
├── Dockerfile # Образ Docker с FRR
├── frr.conf # Конфигурация FRR
├── scripts/
│ ├── start.sh # Скрипт запуска
── load_prefixes.py # Загрузка префиксов из файлов
│ ├── start.sh # Скрипт запуска FRR
── load_prefixes.py # Загрузка префиксов в FRR
│ ├── generate_config.py # Генерация конфигурации FRR
│ └── monitor.py # Мониторинг FRR
├── data/
│ ├── prefixes.txt # Основной файл с префиксами
│ └── additional_prefixes.txt # Дополнительные префиксы
├── logs/ # Логи ExaBGP
├── logs/ # Логи FRR
└── README.md # Эта инструкция
```
@@ -56,6 +66,9 @@ docker-compose logs -f bgp-server
# Проверка статуса контейнера
docker-compose ps
# Проверка BGP сессии через vtysh
docker exec bgp-server vtysh -c "show ip bgp summary"
```
## Подробная настройка
@@ -91,45 +104,17 @@ docker-compose ps
### Шаг 2: Конфигурация BGP сервера
Отредактируйте `exabgp.conf`:
Конфигурация FRR генерируется автоматически из переменных окружения в `docker-compose.yml`:
```ini
# Основная конфигурация
process load-prefixes {
run /app/scripts/load_prefixes.py;
encoder json;
}
# Настройки BGP
neighbor 192.168.1.1 {
router-id 192.168.1.100;
local-address 192.168.1.100;
local-as 65000;
peer-as 65001;
# Только исходящие анонсы
capability {
graceful-restart;
}
# Настройки сессии
hold-time 90;
keepalive 30;
# Логирование
api {
processes [load-prefixes];
neighbor-changes;
receive {
parsed;
update;
}
send {
parsed;
update;
}
}
}
```yaml
environment:
- BGP_LOCAL_AS=65000
- BGP_ROUTER_ID=192.168.1.100
- BGP_NEIGHBOR_IP=192.168.1.1
- BGP_NEIGHBOR_AS=65001
- BGP_HOLD_TIME=90
- BGP_KEEPALIVE=30
- BGP_LOG_LEVEL=info
```
### Шаг 3: Настройка Docker
@@ -155,6 +140,9 @@ services:
- BGP_NEIGHBOR_AS=65001
networks:
- bgp-network
cap_add:
- NET_ADMIN
privileged: true
networks:
bgp-network:
@@ -195,70 +183,130 @@ docker-compose up -d
docker-compose logs -f bgp-server
# Проверка статуса BGP сессии
docker exec bgp-server exabgpcli show neighbor
docker exec bgp-server vtysh -c "show ip bgp summary"
# Проверка анонсированных маршрутов
docker exec bgp-server vtysh -c "show ip bgp"
```
## Мониторинг и логирование
## Управление и мониторинг
### Просмотр логов
### Команды vtysh
```powershell
# Все логи
docker-compose logs bgp-server
# Подключение к FRR CLI
docker exec -it bgp-server vtysh
# Логи в реальном времени
docker-compose logs -f bgp-server
# Просмотр BGP соседей
show ip bgp neighbors
# Логи за последние 100 строк
docker-compose logs --tail=100 bgp-server
# Просмотр BGP маршрутов
show ip bgp
# Просмотр статических маршрутов
show ip route
# Просмотр конфигурации
show running-config
```
### Проверка статуса
### Мониторинг через скрипты
```powershell
# Статус контейнера
docker-compose ps
# Запуск мониторинга
docker exec bgp-server python3 /app/scripts/monitor.py
# Проверка BGP сессии
docker exec bgp-server exabgpcli show neighbor
# Просмотр статуса
docker exec bgp-server cat /app/logs/status.json
# Проверка загруженных префиксов
docker exec bgp-server cat /app/logs/prefixes.log
# Перезагрузка префиксов
docker exec bgp-server python3 /app/scripts/load_prefixes.py --test
```
### Логи
```powershell
# Логи FRR
docker exec bgp-server tail -f /app/logs/frr.log
# Логи загрузки префиксов
docker exec bgp-server tail -f /app/logs/prefixes.log
# Логи мониторинга
docker exec bgp-server tail -f /app/logs/monitor.log
```
## Диагностика
### Проверка статуса FRR
```powershell
# Проверка процессов
docker exec bgp-server ps aux | grep -E "(zebra|bgpd)"
# Проверка версии FRR
docker exec bgp-server vtysh -c "show version"
# Проверка сетевых интерфейсов
docker exec bgp-server vtysh -c "show interface"
```
### Проверка BGP сессии
```powershell
# Статус BGP соседей
docker exec bgp-server vtysh -c "show ip bgp summary"
# Детальная информация о соседе
docker exec bgp-server vtysh -c "show ip bgp neighbors 192.168.1.1"
```
### Проверка маршрутов
```powershell
# Все BGP маршруты
docker exec bgp-server vtysh -c "show ip bgp"
# Статические маршруты
docker exec bgp-server vtysh -c "show ip route static"
# Таблица маршрутизации
docker exec bgp-server vtysh -c "show ip route"
```
## Обновление префиксов
### Автоматическое обновление
Сервер автоматически перезагружает префиксы при изменении файлов в папке `data/`.
Скрипт `load_prefixes.py` автоматически отслеживает изменения в файлах префиксов и обновляет маршруты в FRR.
### Ручное обновление
```powershell
# Перезапуск сервера
docker-compose restart bgp-server
# Перезагрузка всех префиксов
docker exec bgp-server python3 /app/scripts/load_prefixes.py
# Или перезагрузка только процесса загрузки префиксов
docker exec bgp-server pkill -f load_prefixes.py
# Тестирование загрузки префиксов
docker exec bgp-server python3 /app/scripts/load_prefixes.py --test
```
## Устранение неполадок
### Проблема: BGP сессия не устанавливается
1. Проверьте сетевое подключение:
1. Проверьте сетевую связность:
```powershell
docker exec bgp-server ping 192.168.1.1
```
2. Проверьте конфигурацию:
2. Проверьте конфигурацию BGP:
```powershell
docker exec bgp-server cat /app/exabgp.conf
docker exec bgp-server vtysh -c "show running-config"
```
3. Проверьте логи:
3. Проверьте логи FRR:
```powershell
docker-compose logs bgp-server
docker exec bgp-server tail -f /app/logs/frr.log
```
### Проблема: Префиксы не анонсируются
@@ -268,106 +316,44 @@ docker-compose logs bgp-server
docker exec bgp-server cat /app/data/prefixes.txt
```
2. Проверьте логи процесса загрузки:
2. Проверьте логи загрузки префиксов:
```powershell
docker exec bgp-server cat /app/logs/prefixes.log
docker exec bgp-server tail -f /app/logs/prefixes.log
```
### Проблема: Docker контейнер не запускается
1. Проверьте порты:
3. Проверьте статические маршруты:
```powershell
netstat -an | findstr :179
docker exec bgp-server vtysh -c "show ip route static"
```
2. Проверьте Docker логи:
### Проблема: Высокое потребление ресурсов
1. Проверьте использование памяти:
```powershell
docker-compose logs
docker exec bgp-server free -h
```
2. Проверьте количество маршрутов:
```powershell
docker exec bgp-server vtysh -c "show ip bgp summary"
```
## Безопасность
### Рекомендации по безопасности
1. **Ограничение доступа**: Настройте firewall для ограничения доступа к порту 179
2. **Аутентификация**: Используйте MD5 аутентификацию в BGP
3. **Логирование**: Включите детальное логирование для аудита
4. **Обновления**: Регулярно обновляйте Docker образы
### Настройка MD5 аутентификации
В `exabgp.conf` добавьте:
```ini
neighbor 192.168.1.1 {
# ... существующие настройки ...
md5-password "your-secure-password";
}
```
В RouterOS:
```routeros
/routing bgp peer set bgp-server password="your-secure-password"
```
- FRR работает в привилегированном контейнере для доступа к сетевым интерфейсам
- Используйте route-maps для фильтрации трафика
- Ограничьте доступ к vtysh CLI
- Регулярно обновляйте образ Docker
## Производительность
### Оптимизация для больших объемов префиксов
- FRR оптимизирован для обработки большого количества маршрутов
- Поддерживает до 1 миллиона маршрутов
- Эффективное использование памяти
- Быстрое время сходимости
1. **Кэширование**: Используйте Redis для кэширования префиксов
2. **База данных**: Для больших объемов используйте PostgreSQL
3. **Мониторинг**: Настройте метрики производительности
## Поддержка
### Мониторинг ресурсов
```powershell
# Использование ресурсов контейнера
docker stats bgp-server
# Проверка дискового пространства
docker system df
```
## Альтернативные решения
### 1. Bird BGP Daemon
Если ExaBGP не подходит, можно использовать Bird:
```dockerfile
FROM ubuntu:20.04
RUN apt-get update && apt-get install -y bird
COPY bird.conf /etc/bird/bird.conf
CMD ["bird", "-f", "-d"]
```
### 2. FRRouting (FRR)
Другой популярный вариант:
```dockerfile
FROM ubuntu:20.04
RUN apt-get update && apt-get install -y frr
COPY frr.conf /etc/frr/frr.conf
CMD ["/usr/lib/frr/frrinit", "start"]
```
### 3. GoBGP
Для более современного подхода:
```dockerfile
FROM golang:1.19-alpine
RUN go install github.com/osrg/gobgp/cmd/gobgpd@latest
COPY gobgpd.conf /etc/gobgpd.conf
CMD ["gobgpd", "-f", "/etc/gobgpd.conf"]
```
## Заключение
Этот BGP сервер предоставляет простое и эффективное решение для раздачи префиксов из текстовых файлов. Docker контейнеризация обеспечивает легкое развертывание и управление, а интеграция с RouterOS позволяет быстро настроить клиентскую сторону.
Для продакшн использования рекомендуется:
- Настроить мониторинг и алертинг
- Добавить резервное копирование конфигурации
- Реализовать автоматическое восстановление после сбоев
- Настроить централизованное логирование
- Документация FRR: https://frrouting.org/
- GitHub проекта: https://github.com/FRRouting/frr
- Сообщество: https://lists.frrouting.org/