BGP Server для раздачи префиксов
Этот проект представляет собой BGP сервер, который раздает префиксы из текстовых файлов. Сервер работает в Docker контейнере и предназначен для интеграции с RouterOS 7.14+.
Архитектура решения
- BGP Server: ExaBGP в Docker контейнере
- Источник данных: Текстовые файлы с префиксами
- Клиент: RouterOS 7.14+ для получения префиксов
- Протокол: BGP (только исходящие анонсы)
Структура проекта
bgp-server/
├── docker-compose.yml # Конфигурация Docker
├── Dockerfile # Образ Docker
├── exabgp.conf # Конфигурация ExaBGP
├── scripts/
│ ├── start.sh # Скрипт запуска
│ └── load_prefixes.py # Загрузка префиксов из файлов
├── data/
│ ├── prefixes.txt # Основной файл с префиксами
│ └── additional_prefixes.txt # Дополнительные префиксы
├── logs/ # Логи ExaBGP
└── README.md # Эта инструкция
Быстрый старт
1. Подготовка файлов с префиксами
Создайте файл data/prefixes.txt с префиксами в формате:
192.168.1.0/24
10.0.0.0/8
172.16.0.0/12
2. Запуск сервера
# Клонирование репозитория (если нужно)
git clone <repository-url>
cd bgp-server
# Запуск с Docker Compose
docker-compose up -d
3. Проверка работы
# Просмотр логов
docker-compose logs -f bgp-server
# Проверка статуса контейнера
docker-compose ps
Подробная настройка
Требования
- Docker Desktop для Windows
- PowerShell
- RouterOS 7.14+ на стороне клиента
Шаг 1: Настройка файлов с префиксами
Создайте файлы с префиксами в папке data/:
data/prefixes.txt:
# Основные префиксы
192.168.1.0/24
192.168.2.0/24
10.0.0.0/8
172.16.0.0/12
# Комментарии начинаются с #
# Пустые строки игнорируются
data/additional_prefixes.txt:
# Дополнительные префиксы
203.0.113.0/24
198.51.100.0/24
Шаг 2: Конфигурация BGP сервера
Отредактируйте exabgp.conf:
# Основная конфигурация
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;
}
}
}
Шаг 3: Настройка Docker
docker-compose.yml:
version: '3.8'
services:
bgp-server:
build: .
container_name: bgp-server
restart: unless-stopped
ports:
- "179:179" # BGP порт
volumes:
- ./data:/app/data:ro
- ./logs:/app/logs
environment:
- BGP_LOCAL_AS=65000
- BGP_ROUTER_ID=192.168.1.100
- BGP_NEIGHBOR_IP=192.168.1.1
- BGP_NEIGHBOR_AS=65001
networks:
- bgp-network
networks:
bgp-network:
driver: bridge
ipam:
config:
- subnet: 192.168.1.0/24
Шаг 4: Настройка RouterOS
На стороне RouterOS 7.14+ выполните следующие команды:
# Создание BGP экземпляра
/routing bgp instance
add name=bgp-server as=65001 router-id=192.168.1.1
# Настройка BGP сети
/routing bgp network
add network=192.168.1.0/24
# Настройка BGP пира
/routing bgp peer
add name=bgp-server remote-address=192.168.1.100 remote-as=65000 instance=bgp-server
# Включение BGP
/routing bgp instance set bgp-server disabled=no
Шаг 5: Запуск и мониторинг
# Запуск сервера
docker-compose up -d
# Просмотр логов в реальном времени
docker-compose logs -f bgp-server
# Проверка статуса BGP сессии
docker exec bgp-server exabgpcli show neighbor
Мониторинг и логирование
Просмотр логов
# Все логи
docker-compose logs bgp-server
# Логи в реальном времени
docker-compose logs -f bgp-server
# Логи за последние 100 строк
docker-compose logs --tail=100 bgp-server
Проверка статуса
# Статус контейнера
docker-compose ps
# Проверка BGP сессии
docker exec bgp-server exabgpcli show neighbor
# Проверка загруженных префиксов
docker exec bgp-server cat /app/logs/prefixes.log
Обновление префиксов
Автоматическое обновление
Сервер автоматически перезагружает префиксы при изменении файлов в папке data/.
Ручное обновление
# Перезапуск сервера
docker-compose restart bgp-server
# Или перезагрузка только процесса загрузки префиксов
docker exec bgp-server pkill -f load_prefixes.py
Устранение неполадок
Проблема: BGP сессия не устанавливается
- Проверьте сетевое подключение:
docker exec bgp-server ping 192.168.1.1
- Проверьте конфигурацию:
docker exec bgp-server cat /app/exabgp.conf
- Проверьте логи:
docker-compose logs bgp-server
Проблема: Префиксы не анонсируются
- Проверьте файлы с префиксами:
docker exec bgp-server cat /app/data/prefixes.txt
- Проверьте логи процесса загрузки:
docker exec bgp-server cat /app/logs/prefixes.log
Проблема: Docker контейнер не запускается
- Проверьте порты:
netstat -an | findstr :179
- Проверьте Docker логи:
docker-compose logs
Безопасность
Рекомендации по безопасности
- Ограничение доступа: Настройте firewall для ограничения доступа к порту 179
- Аутентификация: Используйте MD5 аутентификацию в BGP
- Логирование: Включите детальное логирование для аудита
- Обновления: Регулярно обновляйте Docker образы
Настройка MD5 аутентификации
В exabgp.conf добавьте:
neighbor 192.168.1.1 {
# ... существующие настройки ...
md5-password "your-secure-password";
}
В RouterOS:
/routing bgp peer set bgp-server password="your-secure-password"
Производительность
Оптимизация для больших объемов префиксов
- Кэширование: Используйте Redis для кэширования префиксов
- База данных: Для больших объемов используйте PostgreSQL
- Мониторинг: Настройте метрики производительности
Мониторинг ресурсов
# Использование ресурсов контейнера
docker stats bgp-server
# Проверка дискового пространства
docker system df
Альтернативные решения
1. Bird BGP Daemon
Если ExaBGP не подходит, можно использовать Bird:
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)
Другой популярный вариант:
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
Для более современного подхода:
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 позволяет быстро настроить клиентскую сторону.
Для продакшн использования рекомендуется:
- Настроить мониторинг и алертинг
- Добавить резервное копирование конфигурации
- Реализовать автоматическое восстановление после сбоев
- Настроить централизованное логирование