commit 5d4d24b49febc4afdf6ff33e4d1d499ba686ae1d Author: Denis Shatskiy Date: Fri Jul 11 13:23:21 2025 +0700 Sure! Pl diff --git a/.gitea/workflows/docker.yml b/.gitea/workflows/docker.yml new file mode 100644 index 0000000..1fbe2b0 --- /dev/null +++ b/.gitea/workflows/docker.yml @@ -0,0 +1,32 @@ +name: Build and Push Docker Image + +on: + push: + branches: + - main + pull_request: + workflow_dispatch: + +jobs: + build: + runs-on: docker + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v2 + + - name: Login to Private Registry + uses: docker/login-action@v2 + with: + registry: git.shts.su + username: ${{ secrets.REGISTRY_USER }} + password: ${{ secrets.REGISTRY_PASS }} + + - name: Build and push Docker image + uses: docker/build-push-action@v4 + with: + context: . + push: true + tags: git.shts.su/bgp-server:latest \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9b379ac --- /dev/null +++ b/.gitignore @@ -0,0 +1,47 @@ +# Logs +logs/ +*.log + +# Docker +.dockerignore + +# Python +__pycache__/ +*.py[cod] +*$py.class +*.so +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +*.egg-info/ +.installed.cfg +*.egg + +# Virtual environments +venv/ +env/ +ENV/ + +# IDE +.vscode/ +.idea/ +*.swp +*.swo + +# OS +.DS_Store +Thumbs.db + +# Temporary files +*.tmp +*.temp \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..d72461c --- /dev/null +++ b/Dockerfile @@ -0,0 +1,32 @@ +FROM python:3.9-slim + +# Установка системных зависимостей +RUN apt-get update && apt-get install -y \ + iproute2 \ + iputils-ping \ + net-tools \ + && rm -rf /var/lib/apt/lists/* + +# Установка ExaBGP +RUN pip install exabgp + +# Создание структуры директорий +RUN mkdir -p /app/scripts /app/data /app/logs + +# Копирование файлов +COPY exabgp.conf /app/exabgp.conf +COPY scripts/ /app/scripts/ +COPY data/ /app/data/ + +# Установка прав доступа +RUN chmod +x /app/scripts/start.sh +RUN chmod +x /app/scripts/load_prefixes.py + +# Рабочая директория +WORKDIR /app + +# Открытие BGP порта +EXPOSE 179 + +# Команда запуска +CMD ["/app/scripts/start.sh"] \ No newline at end of file diff --git a/QUICKSTART.md b/QUICKSTART.md new file mode 100644 index 0000000..3366576 --- /dev/null +++ b/QUICKSTART.md @@ -0,0 +1,228 @@ +# Быстрый старт BGP сервера + +## Минимальные требования + +- Docker Desktop для Windows +- PowerShell +- RouterOS 7.14+ (на стороне клиента) + +## Быстрый запуск (5 минут) + +### 1. Клонирование и подготовка + +```powershell +# Клонирование репозитория (если нужно) +git clone +cd bgp-server + +# Создание необходимых директорий +mkdir logs +``` + +### 2. Настройка префиксов + +Отредактируйте файл `data/prefixes.txt`: + +``` +192.168.1.0/24 +10.0.0.0/8 +172.16.0.0/12 +``` + +### 3. Запуск сервера + +```powershell +# Запуск с автоматической сборкой +.\scripts\start-server.ps1 -Build + +# Или вручную +docker-compose up -d --build +``` + +### 4. Проверка работы + +```powershell +# Проверка статуса +docker-compose ps + +# Просмотр логов +docker-compose logs -f bgp-server + +# Мониторинг +docker exec bgp-server python3 /app/scripts/monitor.py +``` + +### 5. Настройка RouterOS + +Выполните в RouterOS: + +```routeros +/routing bgp instance add name=bgp-server as=65001 router-id=192.168.1.1 +/routing bgp network add network=192.168.1.0/24 +/routing bgp peer add name=bgp-server remote-address=192.168.1.100 remote-as=65000 instance=bgp-server +/routing bgp instance set bgp-server disabled=no +``` + +### 6. Проверка BGP сессии + +В RouterOS: +```routeros +/routing bgp peer print +``` + +Ожидаемый результат: +``` +Flags: X - disabled, I - invalid, D - dynamic, E - established + 0 name="bgp-server" ... state=established uptime=1m30s prefix-count=8 +``` + +## Полезные команды + +### Управление сервером + +```powershell +# Запуск +.\scripts\start-server.ps1 + +# Остановка +.\scripts\stop-server.ps1 + +# Перезапуск +docker-compose restart + +# Просмотр логов +docker-compose logs -f bgp-server +``` + +### Мониторинг + +```powershell +# Проверка статуса +docker-compose ps + +# Мониторинг ресурсов +docker stats bgp-server + +# Проверка BGP сессии +docker exec bgp-server exabgpcli show neighbor +``` + +### Обновление префиксов + +```powershell +# Перезагрузка префиксов без перезапуска +docker exec bgp-server python3 /app/scripts/reload_prefixes.py + +# Или перезапуск сервера +docker-compose restart +``` + +## Устранение неполадок + +### Проблема: Контейнер не запускается + +```powershell +# Проверка логов +docker-compose logs bgp-server + +# Проверка портов +netstat -an | findstr :179 + +# Пересборка образа +docker-compose build --no-cache +``` + +### Проблема: BGP сессия не устанавливается + +```powershell +# Проверка сетевого подключения +docker exec bgp-server ping 192.168.1.1 + +# Проверка конфигурации +docker exec bgp-server cat /app/exabgp.conf + +# Проверка логов +docker-compose logs bgp-server +``` + +### Проблема: Префиксы не анонсируются + +```powershell +# Проверка файлов с префиксами +docker exec bgp-server cat /app/data/prefixes.txt + +# Проверка логов загрузки префиксов +docker exec bgp-server cat /app/logs/prefixes.log + +# Перезагрузка префиксов +docker exec bgp-server python3 /app/scripts/reload_prefixes.py +``` + +## Настройка сети + +### Изменение IP адресов + +Отредактируйте `docker-compose.yml`: + +```yaml +environment: + - BGP_ROUTER_ID=192.168.1.100 # IP сервера + - BGP_NEIGHBOR_IP=192.168.1.1 # IP RouterOS +``` + +И `exabgp.conf`: + +```ini +neighbor 192.168.1.1 { # IP RouterOS + router-id 192.168.1.100; # IP сервера + local-address 192.168.1.100; # IP сервера + # ... +} +``` + +### Изменение AS номеров + +В `docker-compose.yml`: +```yaml +environment: + - BGP_LOCAL_AS=65000 # AS сервера + - BGP_NEIGHBOR_AS=65001 # AS RouterOS +``` + +В `exabgp.conf`: +```ini +neighbor 192.168.1.1 { + local-as 65000; # AS сервера + peer-as 65001; # AS RouterOS +} +``` + +## Безопасность + +### MD5 аутентификация + +В `exabgp.conf`: +```ini +neighbor 192.168.1.1 { + # ... существующие настройки ... + md5-password "your-secure-password"; +} +``` + +В RouterOS: +```routeros +/routing bgp peer set bgp-server tcp-md5-key="your-secure-password" +``` + +### Firewall + +```powershell +# Windows Firewall (PowerShell) +New-NetFirewallRule -DisplayName "BGP Server" -Direction Inbound -Protocol TCP -LocalPort 179 -Action Allow +``` + +## Готово! + +После выполнения всех шагов у вас должен работать BGP сервер, который раздает префиксы из текстовых файлов в RouterOS. + +Для получения дополнительной информации см. основной файл `README.md`. \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..047b5cc --- /dev/null +++ b/README.md @@ -0,0 +1,373 @@ +# 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. Запуск сервера + +```powershell +# Клонирование репозитория (если нужно) +git clone +cd bgp-server + +# Запуск с Docker Compose +docker-compose up -d +``` + +### 3. Проверка работы + +```powershell +# Просмотр логов +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`: + +```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; + } + } +} +``` + +### Шаг 3: Настройка Docker + +**docker-compose.yml:** +```yaml +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+ выполните следующие команды: + +```routeros +# Создание 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: Запуск и мониторинг + +```powershell +# Запуск сервера +docker-compose up -d + +# Просмотр логов в реальном времени +docker-compose logs -f bgp-server + +# Проверка статуса BGP сессии +docker exec bgp-server exabgpcli show neighbor +``` + +## Мониторинг и логирование + +### Просмотр логов + +```powershell +# Все логи +docker-compose logs bgp-server + +# Логи в реальном времени +docker-compose logs -f bgp-server + +# Логи за последние 100 строк +docker-compose logs --tail=100 bgp-server +``` + +### Проверка статуса + +```powershell +# Статус контейнера +docker-compose ps + +# Проверка BGP сессии +docker exec bgp-server exabgpcli show neighbor + +# Проверка загруженных префиксов +docker exec bgp-server cat /app/logs/prefixes.log +``` + +## Обновление префиксов + +### Автоматическое обновление + +Сервер автоматически перезагружает префиксы при изменении файлов в папке `data/`. + +### Ручное обновление + +```powershell +# Перезапуск сервера +docker-compose restart bgp-server + +# Или перезагрузка только процесса загрузки префиксов +docker exec bgp-server pkill -f load_prefixes.py +``` + +## Устранение неполадок + +### Проблема: BGP сессия не устанавливается + +1. Проверьте сетевое подключение: +```powershell +docker exec bgp-server ping 192.168.1.1 +``` + +2. Проверьте конфигурацию: +```powershell +docker exec bgp-server cat /app/exabgp.conf +``` + +3. Проверьте логи: +```powershell +docker-compose logs bgp-server +``` + +### Проблема: Префиксы не анонсируются + +1. Проверьте файлы с префиксами: +```powershell +docker exec bgp-server cat /app/data/prefixes.txt +``` + +2. Проверьте логи процесса загрузки: +```powershell +docker exec bgp-server cat /app/logs/prefixes.log +``` + +### Проблема: Docker контейнер не запускается + +1. Проверьте порты: +```powershell +netstat -an | findstr :179 +``` + +2. Проверьте Docker логи: +```powershell +docker-compose logs +``` + +## Безопасность + +### Рекомендации по безопасности + +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" +``` + +## Производительность + +### Оптимизация для больших объемов префиксов + +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 позволяет быстро настроить клиентскую сторону. + +Для продакшн использования рекомендуется: +- Настроить мониторинг и алертинг +- Добавить резервное копирование конфигурации +- Реализовать автоматическое восстановление после сбоев +- Настроить централизованное логирование \ No newline at end of file diff --git a/TESTING.md b/TESTING.md new file mode 100644 index 0000000..53f1360 --- /dev/null +++ b/TESTING.md @@ -0,0 +1,338 @@ +# Тестирование BGP сервера + +## Подготовка к тестированию + +### Требования для тестирования + +- Docker Desktop для Windows +- PowerShell +- RouterOS 7.14+ (физический или виртуальный) +- Сетевое подключение между сервером и RouterOS + +### Схема тестирования + +``` +[Windows Host] ←→ [RouterOS Device] + 192.168.1.100 192.168.1.1 + AS: 65000 AS: 65001 +``` + +## Пошаговое тестирование + +### Шаг 1: Подготовка окружения + +```powershell +# Клонирование репозитория +git clone +cd bgp-server + +# Создание директорий +mkdir logs + +# Проверка файлов +Get-ChildItem -Recurse +``` + +### Шаг 2: Настройка тестовых префиксов + +Отредактируйте `data/prefixes.txt`: + +``` +# Тестовые префиксы +192.168.100.0/24 +192.168.200.0/24 +10.10.10.0/24 +172.16.100.0/24 +``` + +### Шаг 3: Запуск BGP сервера + +```powershell +# Запуск с автоматической сборкой +.\scripts\start-server.ps1 -Build + +# Проверка статуса +docker-compose ps +``` + +Ожидаемый результат: +``` +Name Command State Ports +bgp-server /app/script Up 0.0.0.0:179->179/tcp +``` + +### Шаг 4: Проверка логов сервера + +```powershell +# Просмотр логов +docker-compose logs bgp-server + +# Проверка логов в реальном времени +docker-compose logs -f bgp-server +``` + +Ожидаемые сообщения: +``` +Starting BGP Server... +Validating ExaBGP configuration... +Starting ExaBGP... +ExaBGP started successfully with PID: XXX +``` + +### Шаг 5: Проверка загрузки префиксов + +```powershell +# Проверка логов загрузки префиксов +docker exec bgp-server cat /app/logs/prefixes.log +``` + +Ожидаемый результат: +``` +[2024-01-01 12:00:00] Starting prefix loader... +[2024-01-01 12:00:00] Loaded 4 prefixes from prefixes.txt +[2024-01-01 12:00:00] Total prefixes loaded: 4 +[2024-01-01 12:00:00] Announced prefix: 10.10.10.0/24 +[2024-01-01 12:00:00] Announced prefix: 172.16.100.0/24 +[2024-01-01 12:00:00] Announced prefix: 192.168.100.0/24 +[2024-01-01 12:00:00] Announced prefix: 192.168.200.0/24 +[2024-01-01 12:00:00] All prefixes announced successfully +``` + +### Шаг 6: Настройка RouterOS + +Выполните в RouterOS: + +```routeros +# Создание 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 +``` + +### Шаг 7: Проверка BGP сессии + +В RouterOS: + +```routeros +# Проверка статуса BGP пира +/routing bgp peer print +``` + +Ожидаемый результат: +``` +Flags: X - disabled, I - invalid, D - dynamic, E - established + 0 name="bgp-server" instance=bgp-server remote-address=192.168.1.100 remote-as=65000 + state=established uptime=1m30s prefix-count=4 updates-sent=4 updates-received=0 + withdrawn-sent=0 withdrawn-received=0 +``` + +### Шаг 8: Проверка полученных маршрутов + +В RouterOS: + +```routeros +# Просмотр полученных BGP маршрутов +/routing bgp routes print +``` + +Ожидаемый результат: +``` +Flags: * - best, b - backup + 0 * dst-address=10.10.10.0/24 gateway=192.168.1.100 immediate-gw=192.168.1.100 + bgp-local-pref=100 bgp-origin=igp bgp-as-path="" bgp-community="" bgp-ext-community="" + bgp-large-community="" bgp-med="" bgp-prepend="" bgp-atomic-aggregate=no bgp-aggregator-as="" + bgp-aggregator-id="" bgp-nexthop=192.168.1.100 bgp-identifier=192.168.1.100 + bgp-cluster-list="" bgp-dampening=no bgp-peer=bgp-server + + 1 * dst-address=172.16.100.0/24 gateway=192.168.1.100 immediate-gw=192.168.1.100 + bgp-local-pref=100 bgp-origin=igp bgp-as-path="" bgp-community="" bgp-ext-community="" + bgp-large-community="" bgp-med="" bgp-prepend="" bgp-atomic-aggregate=no bgp-aggregator-as="" + bgp-aggregator-id="" bgp-nexthop=192.168.1.100 bgp-identifier=192.168.1.100 + bgp-cluster-list="" bgp-dampening=no bgp-peer=bgp-server + + 2 * dst-address=192.168.100.0/24 gateway=192.168.1.100 immediate-gw=192.168.1.100 + bgp-local-pref=100 bgp-origin=igp bgp-as-path="" bgp-community="" bgp-ext-community="" + bgp-large-community="" bgp-med="" bgp-prepend="" bgp-atomic-aggregate=no bgp-aggregator-as="" + bgp-aggregator-id="" bgp-nexthop=192.168.1.100 bgp-identifier=192.168.1.100 + bgp-cluster-list="" bgp-dampening=no bgp-peer=bgp-server + + 3 * dst-address=192.168.200.0/24 gateway=192.168.1.100 immediate-gw=192.168.1.100 + bgp-local-pref=100 bgp-origin=igp bgp-as-path="" bgp-community="" bgp-ext-community="" + bgp-large-community="" bgp-med="" bgp-prepend="" bgp-atomic-aggregate=no bgp-aggregator-as="" + bgp-aggregator-id="" bgp-nexthop=192.168.1.100 bgp-identifier=192.168.1.100 + bgp-cluster-list="" bgp-dampening=no bgp-peer=bgp-server +``` + +### Шаг 9: Тестирование обновления префиксов + +```powershell +# Добавление нового префикса +echo "192.168.300.0/24" >> data/prefixes.txt + +# Перезагрузка префиксов +docker exec bgp-server python3 /app/scripts/reload_prefixes.py +``` + +Проверьте в RouterOS: +```routeros +/routing bgp routes print +``` + +Должен появиться новый маршрут `192.168.300.0/24`. + +### Шаг 10: Тестирование отзыва префиксов + +```powershell +# Удаление префикса из файла +# Отредактируйте data/prefixes.txt и удалите одну строку + +# Перезагрузка префиксов +docker exec bgp-server python3 /app/scripts/reload_prefixes.py +``` + +Проверьте в RouterOS: +```routeros +/routing bgp routes print +``` + +Удаленный префикс должен исчезнуть из таблицы маршрутов. + +## Автоматизированное тестирование + +### Скрипт тестирования + +Создайте файл `test-bgp.ps1`: + +```powershell +# Скрипт автоматизированного тестирования +Write-Host "=== BGP Server Testing ===" -ForegroundColor Green + +# Проверка Docker +Write-Host "1. Checking Docker..." -ForegroundColor Yellow +try { + docker --version | Out-Null + Write-Host "✓ Docker is available" -ForegroundColor Green +} catch { + Write-Host "✗ Docker is not available" -ForegroundColor Red + exit 1 +} + +# Проверка контейнера +Write-Host "2. Checking container status..." -ForegroundColor Yellow +$containerStatus = docker ps --filter name=bgp-server --format "{{.Status}}" +if ($containerStatus) { + Write-Host "✓ Container is running: $containerStatus" -ForegroundColor Green +} else { + Write-Host "✗ Container is not running" -ForegroundColor Red + exit 1 +} + +# Проверка BGP процесса +Write-Host "3. Checking BGP process..." -ForegroundColor Yellow +$bgpProcess = docker exec bgp-server pgrep -f exabgp +if ($bgpProcess) { + Write-Host "✓ BGP process is running" -ForegroundColor Green +} else { + Write-Host "✗ BGP process is not running" -ForegroundColor Red +} + +# Проверка префиксов +Write-Host "4. Checking prefixes..." -ForegroundColor Yellow +$prefixCount = docker exec bgp-server cat /app/data/prefixes.txt | Select-String -Pattern "^\d" | Measure-Object | Select-Object -ExpandProperty Count +Write-Host "✓ Found $prefixCount prefixes" -ForegroundColor Green + +# Проверка логов +Write-Host "5. Checking logs..." -ForegroundColor Yellow +$logEntries = docker exec bgp-server cat /app/logs/prefixes.log | Measure-Object -Line | Select-Object -ExpandProperty Lines +Write-Host "✓ Found $logEntries log entries" -ForegroundColor Green + +Write-Host "=== Testing Complete ===" -ForegroundColor Green +``` + +### Запуск тестирования + +```powershell +.\test-bgp.ps1 +``` + +## Тестирование производительности + +### Тест с большим количеством префиксов + +```powershell +# Создание файла с большим количеством префиксов +$prefixes = @() +for ($i = 1; $i -le 1000; $i++) { + $prefixes += "192.168.$i.0/24" +} +$prefixes | Out-File -FilePath "data/large_prefixes.txt" -Encoding UTF8 + +# Замена основного файла +Move-Item "data/prefixes.txt" "data/prefixes_backup.txt" +Move-Item "data/large_prefixes.txt" "data/prefixes.txt" + +# Перезагрузка префиксов +docker exec bgp-server python3 /app/scripts/reload_prefixes.py +``` + +### Мониторинг производительности + +```powershell +# Мониторинг ресурсов +docker stats bgp-server + +# Проверка времени загрузки +Measure-Command { docker exec bgp-server python3 /app/scripts/load_prefixes.py } +``` + +## Тестирование отказоустойчивости + +### Тест перезапуска контейнера + +```powershell +# Перезапуск контейнера +docker-compose restart + +# Ожидание восстановления +Start-Sleep -Seconds 30 + +# Проверка статуса +docker-compose ps +``` + +### Тест сетевых сбоев + +```powershell +# Симуляция сетевого сбоя (требует настройки) +# Отключение сетевого интерфейса на RouterOS + +# Проверка восстановления +# Включение сетевого интерфейса + +# Проверка BGP сессии +docker exec bgp-server exabgpcli show neighbor +``` + +## Очистка после тестирования + +```powershell +# Остановка сервера +.\scripts\stop-server.ps1 + +# Удаление контейнера +docker-compose down + +# Очистка образов (опционально) +docker system prune -f +``` + +## Заключение + +После успешного прохождения всех тестов BGP сервер готов к продакшн использованию. Регулярно выполняйте тестирование для обеспечения стабильной работы. \ No newline at end of file diff --git a/alternative-solutions.md b/alternative-solutions.md new file mode 100644 index 0000000..d44d50f --- /dev/null +++ b/alternative-solutions.md @@ -0,0 +1,293 @@ +# Альтернативные решения для BGP сервера + +## Обзор решений + +В данном документе представлены альтернативные решения для создания BGP сервера, который раздает префиксы из текстовых файлов. + +## 1. Bird BGP Daemon + +### Преимущества +- Высокая производительность +- Поддержка IPv6 +- Гибкая конфигурация +- Активная разработка + +### Недостатки +- Сложная конфигурация +- Меньше документации на русском языке + +### Dockerfile +```dockerfile +FROM ubuntu:20.04 + +# Установка Bird +RUN apt-get update && apt-get install -y bird + +# Создание директорий +RUN mkdir -p /etc/bird /var/log/bird + +# Копирование конфигурации +COPY bird.conf /etc/bird/bird.conf + +# Открытие BGP порта +EXPOSE 179 + +# Запуск Bird +CMD ["bird", "-f", "-d"] +``` + +### Конфигурация (bird.conf) +``` +# Основная конфигурация Bird +log stderr all; +log "/var/log/bird.log" all; + +# Настройки BGP +router id 192.168.1.100; + +# Протокол для загрузки префиксов из файла +protocol static { + route 192.168.1.0/24 via 192.168.1.100; + route 10.0.0.0/8 via 192.168.1.100; + route 172.16.0.0/12 via 192.168.1.100; +} + +# BGP протокол +protocol bgp bgp_peer { + local as 65000; + neighbor 192.168.1.1 as 65001; + export where proto = "static"; + import none; +} +``` + +## 2. FRRouting (FRR) + +### Преимущества +- Полная совместимость с Cisco IOS +- Поддержка множества протоколов +- Хорошая документация +- Активное сообщество + +### Недостатки +- Больший размер образа +- Более сложная настройка + +### Dockerfile +```dockerfile +FROM ubuntu:20.04 + +# Установка FRR +RUN apt-get update && apt-get install -y frr + +# Создание директорий +RUN mkdir -p /etc/frr /var/log/frr + +# Копирование конфигурации +COPY frr.conf /etc/frr/frr.conf + +# Открытие BGP порта +EXPOSE 179 + +# Запуск FRR +CMD ["/usr/lib/frr/frrinit", "start"] +``` + +### Конфигурация (frr.conf) +``` +! FRR configuration +hostname bgp-server +password zebra +enable password zebra + +! BGP configuration +router bgp 65000 + bgp router-id 192.168.1.100 + neighbor 192.168.1.1 remote-as 65001 + neighbor 192.168.1.1 description RouterOS + ! + address-family ipv4 unicast + network 192.168.1.0/24 + network 10.0.0.0/8 + network 172.16.0.0/12 + neighbor 192.168.1.1 activate + exit-address-family +``` + +## 3. GoBGP + +### Преимущества +- Современный подход +- Высокая производительность +- Поддержка gRPC API +- Легкая интеграция с Go приложениями + +### Недостатки +- Меньше готовых примеров +- Требует знания Go для расширения + +### Dockerfile +```dockerfile +FROM golang:1.19-alpine + +# Установка GoBGP +RUN go install github.com/osrg/gobgp/cmd/gobgpd@latest + +# Создание директорий +RUN mkdir -p /etc/gobgp + +# Копирование конфигурации +COPY gobgpd.conf /etc/gobgpd.conf + +# Открытие BGP порта +EXPOSE 179 + +# Запуск GoBGP +CMD ["gobgpd", "-f", "/etc/gobgpd.conf"] +``` + +### Конфигурация (gobgpd.conf) +```toml +[global.config] +as = 65000 +router-id = "192.168.1.100" + +[[neighbors]] +[neighbors.config] +neighbor-address = "192.168.1.1" +peer-as = 65001 + +[[neighbors.afi-safis]] +[neighbors.afi-safis.config] +afi-safi-name = "ipv4-unicast" + +[[defined-sets.prefix-sets]] +prefix-set-name = "prefixes" +[[defined-sets.prefix-sets.prefix-list]] +ip-prefix = "192.168.1.0/24" +[[defined-sets.prefix-sets.prefix-list]] +ip-prefix = "10.0.0.0/8" +[[defined-sets.prefix-sets.prefix-list]] +ip-prefix = "172.16.0.0/12" +``` + +## 4. Quagga (устаревший) + +### Преимущества +- Простая конфигурация +- Много документации +- Стабильность + +### Недостатки +- Устаревший проект +- Отсутствие обновлений +- Проблемы с безопасностью + +### Dockerfile +```dockerfile +FROM ubuntu:18.04 + +# Установка Quagga +RUN apt-get update && apt-get install -y quagga + +# Создание директорий +RUN mkdir -p /etc/quagga /var/log/quagga + +# Копирование конфигурации +COPY zebra.conf /etc/quagga/zebra.conf +COPY bgpd.conf /etc/quagga/bgpd.conf + +# Открытие BGP порта +EXPOSE 179 + +# Запуск Quagga +CMD ["/usr/lib/quagga/zebra", "-f", "/etc/quagga/zebra.conf"] +``` + +## 5. Собственное решение на Python + +### Преимущества +- Полный контроль +- Легкая кастомизация +- Простота отладки + +### Недостатки +- Требует разработки +- Меньше производительность +- Необходимость поддержки + +### Пример реализации +```python +import asyncio +import ipaddress +from pybgp import BGP + +class BGPServer: + def __init__(self, local_as, router_id, neighbor_ip, neighbor_as): + self.local_as = local_as + self.router_id = router_id + self.neighbor_ip = neighbor_ip + self.neighbor_as = neighbor_as + self.prefixes = set() + + async def load_prefixes(self, filename): + """Загрузка префиксов из файла""" + with open(filename, 'r') as f: + for line in f: + line = line.strip() + if line and not line.startswith('#'): + try: + ipaddress.ip_network(line) + self.prefixes.add(line) + except ValueError: + print(f"Invalid prefix: {line}") + + async def announce_prefixes(self): + """Анонсирование префиксов""" + for prefix in self.prefixes: + # Логика анонсирования + pass + +async def main(): + server = BGPServer(65000, "192.168.1.100", "192.168.1.1", 65001) + await server.load_prefixes("prefixes.txt") + await server.announce_prefixes() + +if __name__ == "__main__": + asyncio.run(main()) +``` + +## Сравнение решений + +| Решение | Простота | Производительность | Документация | Поддержка | +|---------|----------|-------------------|--------------|-----------| +| ExaBGP | ⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐ | +| Bird | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | +| FRR | ⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | +| GoBGP | ⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐⭐ | +| Quagga | ⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐ | +| Python | ⭐⭐⭐⭐⭐ | ⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | + +## Рекомендации + +### Для простых задач +- **ExaBGP** - лучший выбор для быстрого прототипирования +- **Python решение** - для полного контроля + +### Для продакшн использования +- **Bird** - для высокой производительности +- **FRR** - для совместимости с Cisco + +### Для современных проектов +- **GoBGP** - для интеграции с микросервисами +- **ExaBGP** - для простых сценариев + +## Заключение + +Выбор решения зависит от конкретных требований: +- Простота настройки → ExaBGP +- Производительность → Bird/FRR +- Современность → GoBGP +- Контроль → Python решение + +Для большинства случаев ExaBGP является оптимальным выбором благодаря простоте настройки и достаточной производительности. \ No newline at end of file diff --git a/data/additional_prefixes.txt b/data/additional_prefixes.txt new file mode 100644 index 0000000..c2e977e --- /dev/null +++ b/data/additional_prefixes.txt @@ -0,0 +1,10 @@ +# Дополнительные префиксы +# Этот файл может содержать дополнительные сети для анонсирования + +# Тестовые сети +192.168.100.0/24 +192.168.200.0/24 + +# Специальные сети +10.10.10.0/24 +10.20.20.0/24 \ No newline at end of file diff --git a/data/prefixes.txt b/data/prefixes.txt new file mode 100644 index 0000000..2f5f034 --- /dev/null +++ b/data/prefixes.txt @@ -0,0 +1,14 @@ +# Основные префиксы для анонсирования +# Формат: IP/маска (например: 192.168.1.0/24) + +# Приватные сети +192.168.1.0/24 +192.168.2.0/24 +192.168.10.0/24 +10.0.0.0/8 +172.16.0.0/12 + +# Дополнительные сети +203.0.113.0/24 +198.51.100.0/24 +203.0.113.1/32 \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..bb5814e --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,28 @@ +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 + cap_add: + - NET_ADMIN # Для работы с сетевыми интерфейсами + +networks: + bgp-network: + driver: bridge + ipam: + config: + - subnet: 192.168.1.0/24 \ No newline at end of file diff --git a/exabgp.conf b/exabgp.conf new file mode 100644 index 0000000..862dde0 --- /dev/null +++ b/exabgp.conf @@ -0,0 +1,42 @@ +# Основная конфигурация ExaBGP +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; + } + } +} + +# Глобальные настройки логирования +log { + destination /app/logs/exabgp.log; + level INFO; +} \ No newline at end of file diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..045d90a --- /dev/null +++ b/requirements.txt @@ -0,0 +1,4 @@ +exabgp>=4.2.0 +ipaddress +pathlib +typing \ No newline at end of file diff --git a/routeros-setup.md b/routeros-setup.md new file mode 100644 index 0000000..a381cf0 --- /dev/null +++ b/routeros-setup.md @@ -0,0 +1,255 @@ +# Настройка RouterOS для работы с BGP сервером + +## Требования + +- RouterOS 7.14 или выше +- Доступ к командной строке RouterOS (WinBox, SSH, или Console) +- Сетевое подключение к BGP серверу + +## Схема подключения + +``` +RouterOS (192.168.1.1) ←→ BGP Server (192.168.1.100) +AS: 65001 AS: 65000 +``` + +## Пошаговая настройка + +### Шаг 1: Проверка сетевого подключения + +Убедитесь, что RouterOS может достичь BGP сервера: + +```routeros +/ping 192.168.1.100 count=4 +``` + +Ожидаемый результат: +``` +HOST SIZE TTL TIME STATUS +192.168.1.100 56 64 0.5ms echo reply +192.168.1.100 56 64 0.4ms echo reply +192.168.1.100 56 64 0.5ms echo reply +192.168.1.100 56 64 0.4ms echo reply +sent=4 received=4 packet-loss=0% min-rtt=0.4ms avg-rtt=0.5ms max-rtt=0.5ms +``` + +### Шаг 2: Создание BGP экземпляра + +```routeros +/routing bgp instance +add name=bgp-server as=65001 router-id=192.168.1.1 +``` + +### Шаг 3: Настройка BGP сети + +```routeros +/routing bgp network +add network=192.168.1.0/24 +``` + +### Шаг 4: Настройка BGP пира + +```routeros +/routing bgp peer +add name=bgp-server remote-address=192.168.1.100 remote-as=65000 instance=bgp-server +``` + +### Шаг 5: Включение BGP экземпляра + +```routeros +/routing bgp instance set bgp-server disabled=no +``` + +### Шаг 6: Проверка статуса BGP сессии + +```routeros +/routing bgp peer print +``` + +Ожидаемый результат: +``` +Flags: X - disabled, I - invalid, D - dynamic, E - established + 0 name="bgp-server" instance=bgp-server remote-address=192.168.1.100 remote-as=65000 + tcp-md5-key="" nexthop-choice=default multihop=no route-reflect=no hold-time=3m + keepalive-time=1m address-families=ip,ipv6 default-originate=never remove-private-as=no + as-override=no passive=no use-bfd=no cisco-vpls-nlri-len-fmt=no add-path=0/0 + remove-private-as-if-export=no in-filter="" out-filter="" + state=established uptime=1m30s prefix-count=8 updates-sent=8 updates-received=0 + withdrawn-sent=0 withdrawn-received=0 +``` + +## Дополнительные настройки + +### Настройка MD5 аутентификации (рекомендуется) + +```routeros +/routing bgp peer set bgp-server tcp-md5-key="your-secure-password" +``` + +### Настройка фильтров (опционально) + +Создание фильтра для входящих маршрутов: + +```routeros +/routing filter +add name=bgp-in chain=input protocol=bgp +add name=bgp-in chain=input protocol=bgp action=accept +``` + +Применение фильтра к BGP пиру: + +```routeros +/routing bgp peer set bgp-server in-filter=bgp-in +``` + +### Настройка таймаутов + +```routeros +/routing bgp peer set bgp-server hold-time=90s keepalive-time=30s +``` + +## Мониторинг и диагностика + +### Проверка статуса BGP сессии + +```routeros +/routing bgp peer print detail +``` + +### Просмотр полученных маршрутов + +```routeros +/routing bgp routes print +``` + +### Просмотр логов BGP + +```routeros +/log print where topics~"bgp" +``` + +### Проверка статистики BGP + +```routeros +/routing bgp peer print stats +``` + +## Устранение неполадок + +### Проблема: BGP сессия не устанавливается + +1. Проверьте сетевое подключение: +```routeros +/ping 192.168.1.100 +``` + +2. Проверьте настройки BGP пира: +```routeros +/routing bgp peer print detail +``` + +3. Проверьте логи: +```routeros +/log print where topics~"bgp" +``` + +### Проблема: Маршруты не получаются + +1. Проверьте статус сессии: +```routeros +/routing bgp peer print +``` + +2. Проверьте фильтры: +```routeros +/routing filter print +``` + +3. Проверьте полученные маршруты: +```routeros +/routing bgp routes print +``` + +### Проблема: Неправильные AS номера + +Убедитесь, что AS номера настроены правильно: + +```routeros +/routing bgp instance print +/routing bgp peer print +``` + +## Полезные команды + +### Экспорт конфигурации BGP + +```routeros +/export compact where routing~"bgp" +``` + +### Сброс BGP сессии + +```routeros +/routing bgp peer reset bgp-server +``` + +### Просмотр детальной информации о пире + +```routeros +/routing bgp peer print detail where name="bgp-server" +``` + +### Мониторинг в реальном времени + +```routeros +/routing bgp peer monitor bgp-server +``` + +## Безопасность + +### Рекомендации по безопасности + +1. **Используйте MD5 аутентификацию** +2. **Настройте фильтры для входящих маршрутов** +3. **Ограничьте доступ к BGP порту (179)** +4. **Регулярно проверяйте логи** + +### Настройка firewall для BGP + +```routeros +/ip firewall filter +add chain=input protocol=tcp dst-port=179 src-address=192.168.1.100 action=accept comment="BGP from server" +add chain=input protocol=tcp dst-port=179 action=drop comment="Block other BGP" +``` + +## Автоматизация + +### Скрипт для автоматической настройки + +Создайте файл `bgp-setup.rsc`: + +```routeros +# BGP Setup Script +/routing bgp instance +add name=bgp-server as=65001 router-id=192.168.1.1 + +/routing bgp network +add network=192.168.1.0/24 + +/routing bgp peer +add name=bgp-server remote-address=192.168.1.100 remote-as=65000 instance=bgp-server + +/routing bgp instance set bgp-server disabled=no + +:log info "BGP setup completed" +``` + +Загрузите и выполните скрипт: + +```routeros +/import bgp-setup.rsc +``` + +## Заключение + +После выполнения всех шагов RouterOS должен успешно установить BGP сессию с сервером и начать получать маршруты. Регулярно проверяйте статус сессии и логи для обеспечения стабильной работы. \ No newline at end of file diff --git a/scripts/load_prefixes.py b/scripts/load_prefixes.py new file mode 100644 index 0000000..7585fa6 --- /dev/null +++ b/scripts/load_prefixes.py @@ -0,0 +1,160 @@ +#!/usr/bin/env python3 +""" +Скрипт для загрузки префиксов из текстовых файлов в ExaBGP +""" + +import sys +import os +import time +import json +import ipaddress +from pathlib import Path +from typing import List, Set + +# Настройки +DATA_DIR = "/app/data" +LOG_FILE = "/app/logs/prefixes.log" +PREFIX_FILES = ["prefixes.txt", "additional_prefixes.txt"] + +def log_message(message: str): + """Запись сообщения в лог""" + timestamp = time.strftime("%Y-%m-%d %H:%M:%S") + log_entry = f"[{timestamp}] {message}" + + # Вывод в stdout для ExaBGP + print(log_entry, flush=True) + + # Запись в файл + with open(LOG_FILE, "a") as f: + f.write(log_entry + "\n") + +def validate_prefix(prefix: str) -> bool: + """Валидация IP префикса""" + try: + ipaddress.ip_network(prefix, strict=False) + return True + except ValueError: + return False + +def load_prefixes_from_file(file_path: Path) -> Set[str]: + """Загрузка префиксов из файла""" + prefixes = set() + + if not file_path.exists(): + log_message(f"File not found: {file_path}") + return prefixes + + try: + with open(file_path, 'r') as f: + for line_num, line in enumerate(f, 1): + line = line.strip() + + # Пропуск пустых строк и комментариев + if not line or line.startswith('#'): + continue + + # Валидация префикса + if validate_prefix(line): + prefixes.add(line) + else: + log_message(f"Invalid prefix in {file_path}:{line_num}: {line}") + + except Exception as e: + log_message(f"Error reading {file_path}: {e}") + + return prefixes + +def load_all_prefixes() -> Set[str]: + """Загрузка всех префиксов из всех файлов""" + all_prefixes = set() + + for filename in PREFIX_FILES: + file_path = Path(DATA_DIR) / filename + prefixes = load_prefixes_from_file(file_path) + all_prefixes.update(prefixes) + log_message(f"Loaded {len(prefixes)} prefixes from {filename}") + + return all_prefixes + +def announce_prefixes(prefixes: Set[str]): + """Анонсирование префиксов через ExaBGP API""" + for prefix in sorted(prefixes): + # Формат команды для ExaBGP + command = { + "command": "announce route", + "neighbor": { + "ip": "192.168.1.1", + "description": "RouterOS peer" + }, + "attribute": { + "origin": "igp", + "as-path": [65000], + "next-hop": "192.168.1.100" + }, + "nlri": prefix + } + + # Отправка команды в ExaBGP + print(json.dumps(command), flush=True) + log_message(f"Announced prefix: {prefix}") + +def withdraw_prefixes(prefixes: Set[str]): + """Отзыв префиксов через ExaBGP API""" + for prefix in sorted(prefixes): + command = { + "command": "withdraw route", + "neighbor": { + "ip": "192.168.1.1", + "description": "RouterOS peer" + }, + "nlri": prefix + } + + print(json.dumps(command), flush=True) + log_message(f"Withdrew prefix: {prefix}") + +def main(): + """Основная функция""" + log_message("Starting prefix loader...") + + # Создание директории для логов + os.makedirs(os.path.dirname(LOG_FILE), exist_ok=True) + + # Загрузка префиксов + prefixes = load_all_prefixes() + log_message(f"Total prefixes loaded: {len(prefixes)}") + + if not prefixes: + log_message("No valid prefixes found. Exiting.") + return + + # Анонсирование префиксов + announce_prefixes(prefixes) + log_message("All prefixes announced successfully") + + # Ожидание команд от ExaBGP + try: + while True: + line = sys.stdin.readline() + if not line: + break + + # Обработка команд от ExaBGP + try: + data = json.loads(line.strip()) + log_message(f"Received command: {data}") + except json.JSONDecodeError: + log_message(f"Invalid JSON received: {line.strip()}") + + except KeyboardInterrupt: + log_message("Received interrupt signal") + except Exception as e: + log_message(f"Error in main loop: {e}") + finally: + # Отзыв всех префиксов при завершении + log_message("Withdrawing all prefixes...") + withdraw_prefixes(prefixes) + log_message("Prefix loader stopped") + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/scripts/monitor.py b/scripts/monitor.py new file mode 100644 index 0000000..cf3d0e6 --- /dev/null +++ b/scripts/monitor.py @@ -0,0 +1,93 @@ +#!/usr/bin/env python3 +""" +Скрипт мониторинга BGP сервера +""" + +import subprocess +import json +import time +import sys +from datetime import datetime + +def run_command(cmd): + """Выполнение команды и возврат результата""" + try: + result = subprocess.run(cmd, shell=True, capture_output=True, text=True) + return result.returncode == 0, result.stdout, result.stderr + except Exception as e: + return False, "", str(e) + +def check_container_status(): + """Проверка статуса Docker контейнера""" + success, output, error = run_command("docker ps --filter name=bgp-server --format '{{.Status}}'") + if success and output.strip(): + return True, output.strip() + return False, "Container not running" + +def check_bgp_session(): + """Проверка BGP сессии""" + success, output, error = run_command("docker exec bgp-server exabgpcli show neighbor") + if success: + return True, output + return False, "Cannot check BGP session" + +def check_prefixes(): + """Проверка загруженных префиксов""" + try: + with open("/app/logs/prefixes.log", "r") as f: + lines = f.readlines() + return True, f"Found {len(lines)} log entries" + except FileNotFoundError: + return False, "Prefix log not found" + +def check_network_connectivity(): + """Проверка сетевого подключения""" + success, output, error = run_command("docker exec bgp-server ping -c 1 192.168.1.1") + return success, "Network connectivity OK" if success else "Network connectivity failed" + +def main(): + """Основная функция мониторинга""" + print("=== BGP Server Monitoring ===") + print(f"Time: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}") + print() + + # Проверка контейнера + print("1. Container Status:") + status, details = check_container_status() + print(f" Status: {'✓ Running' if status else '✗ Stopped'}") + print(f" Details: {details}") + print() + + # Проверка сети + print("2. Network Connectivity:") + net_ok, net_details = check_network_connectivity() + print(f" Status: {'✓ OK' if net_ok else '✗ Failed'}") + print(f" Details: {net_details}") + print() + + # Проверка BGP сессии + print("3. BGP Session:") + bgp_ok, bgp_details = check_bgp_session() + print(f" Status: {'✓ Active' if bgp_ok else '✗ Inactive'}") + if bgp_ok: + print(f" Details: {bgp_details[:200]}...") + else: + print(f" Details: {bgp_details}") + print() + + # Проверка префиксов + print("4. Prefixes:") + prefix_ok, prefix_details = check_prefixes() + print(f" Status: {'✓ Loaded' if prefix_ok else '✗ Not loaded'}") + print(f" Details: {prefix_details}") + print() + + # Общий статус + overall_status = status and net_ok and bgp_ok and prefix_ok + print("=== Overall Status ===") + print(f"Status: {'✓ HEALTHY' if overall_status else '✗ UNHEALTHY'}") + + return 0 if overall_status else 1 + +if __name__ == "__main__": + sys.exit(main()) \ No newline at end of file diff --git a/scripts/reload_prefixes.py b/scripts/reload_prefixes.py new file mode 100644 index 0000000..51faeb2 --- /dev/null +++ b/scripts/reload_prefixes.py @@ -0,0 +1,104 @@ +#!/usr/bin/env python3 +""" +Скрипт для перезагрузки префиксов без перезапуска BGP сервера +""" + +import subprocess +import sys +import time +from pathlib import Path + +def run_command(cmd): + """Выполнение команды""" + try: + result = subprocess.run(cmd, shell=True, capture_output=True, text=True) + return result.returncode == 0, result.stdout, result.stderr + except Exception as e: + return False, "", str(e) + +def reload_prefixes(): + """Перезагрузка префиксов""" + print("Reloading prefixes...") + + # Остановка процесса загрузки префиксов + print("Stopping prefix loader process...") + success, output, error = run_command("docker exec bgp-server pkill -f load_prefixes.py") + + if not success: + print("Warning: Could not stop prefix loader process") + + # Ожидание завершения процесса + time.sleep(2) + + # Проверка что процесс остановлен + success, output, error = run_command("docker exec bgp-server pgrep -f load_prefixes.py") + if success: + print("Error: Prefix loader process is still running") + return False + + print("Prefix loader process stopped successfully") + + # Запуск нового процесса загрузки префиксов + print("Starting new prefix loader process...") + success, output, error = run_command("docker exec bgp-server /app/scripts/load_prefixes.py &") + + if success: + print("Prefix loader process started successfully") + return True + else: + print(f"Error starting prefix loader: {error}") + return False + +def check_status(): + """Проверка статуса после перезагрузки""" + print("Checking status...") + time.sleep(5) + + # Проверка процесса + success, output, error = run_command("docker exec bgp-server pgrep -f load_prefixes.py") + if success: + print("✓ Prefix loader process is running") + else: + print("✗ Prefix loader process is not running") + return False + + # Проверка логов + success, output, error = run_command("docker exec bgp-server tail -n 5 /app/logs/prefixes.log") + if success: + print("Recent log entries:") + print(output) + else: + print("No recent log entries found") + + return True + +def main(): + """Основная функция""" + print("=== BGP Prefix Reloader ===") + + # Проверка что контейнер запущен + success, output, error = run_command("docker ps --filter name=bgp-server --format '{{.Status}}'") + if not success or not output.strip(): + print("Error: BGP server container is not running") + print("Please start the container first: docker-compose up -d") + return 1 + + print("BGP server container is running") + + # Перезагрузка префиксов + if reload_prefixes(): + print("Prefix reload completed successfully") + + # Проверка статуса + if check_status(): + print("✓ All checks passed") + return 0 + else: + print("✗ Some checks failed") + return 1 + else: + print("✗ Prefix reload failed") + return 1 + +if __name__ == "__main__": + sys.exit(main()) \ No newline at end of file diff --git a/scripts/start-server.ps1 b/scripts/start-server.ps1 new file mode 100644 index 0000000..3aebafb --- /dev/null +++ b/scripts/start-server.ps1 @@ -0,0 +1,96 @@ +# PowerShell скрипт для запуска BGP сервера + +param( + [switch]$Build, + [switch]$Logs, + [switch]$Monitor +) + +Write-Host "=== BGP Server Management ===" -ForegroundColor Green + +# Проверка Docker +Write-Host "Checking Docker..." -ForegroundColor Yellow +try { + docker --version | Out-Null + Write-Host "✓ Docker is available" -ForegroundColor Green +} catch { + Write-Host "✗ Docker is not available. Please install Docker Desktop." -ForegroundColor Red + exit 1 +} + +# Проверка Docker Compose +Write-Host "Checking Docker Compose..." -ForegroundColor Yellow +try { + docker-compose --version | Out-Null + Write-Host "✓ Docker Compose is available" -ForegroundColor Green +} catch { + Write-Host "✗ Docker Compose is not available." -ForegroundColor Red + exit 1 +} + +# Создание необходимых директорий +Write-Host "Creating directories..." -ForegroundColor Yellow +if (!(Test-Path "logs")) { + New-Item -ItemType Directory -Path "logs" | Out-Null + Write-Host "✓ Created logs directory" -ForegroundColor Green +} + +if (!(Test-Path "data")) { + New-Item -ItemType Directory -Path "data" | Out-Null + Write-Host "✓ Created data directory" -ForegroundColor Green +} + +# Сборка образа если требуется +if ($Build) { + Write-Host "Building Docker image..." -ForegroundColor Yellow + docker-compose build + if ($LASTEXITCODE -ne 0) { + Write-Host "✗ Build failed" -ForegroundColor Red + exit 1 + } + Write-Host "✓ Build completed" -ForegroundColor Green +} + +# Остановка существующего контейнера +Write-Host "Stopping existing container..." -ForegroundColor Yellow +docker-compose down 2>$null +Write-Host "✓ Existing container stopped" -ForegroundColor Green + +# Запуск сервера +Write-Host "Starting BGP server..." -ForegroundColor Yellow +docker-compose up -d + +if ($LASTEXITCODE -eq 0) { + Write-Host "✓ BGP server started successfully" -ForegroundColor Green + + # Ожидание запуска + Write-Host "Waiting for server to initialize..." -ForegroundColor Yellow + Start-Sleep -Seconds 10 + + # Проверка статуса + Write-Host "Checking server status..." -ForegroundColor Yellow + $status = docker-compose ps + Write-Host $status + + if ($Logs) { + Write-Host "Showing logs..." -ForegroundColor Yellow + docker-compose logs -f bgp-server + } + + if ($Monitor) { + Write-Host "Starting monitoring..." -ForegroundColor Yellow + docker exec bgp-server python3 /app/scripts/monitor.py + } + +} else { + Write-Host "✗ Failed to start BGP server" -ForegroundColor Red + Write-Host "Check logs with: docker-compose logs bgp-server" -ForegroundColor Yellow + exit 1 +} + +Write-Host "=== Setup Complete ===" -ForegroundColor Green +Write-Host "Useful commands:" -ForegroundColor Cyan +Write-Host " View logs: docker-compose logs -f bgp-server" -ForegroundColor White +Write-Host " Check status: docker-compose ps" -ForegroundColor White +Write-Host " Stop server: docker-compose down" -ForegroundColor White +Write-Host " Monitor: docker exec bgp-server python3 /app/scripts/monitor.py" -ForegroundColor White \ No newline at end of file diff --git a/scripts/start.sh b/scripts/start.sh new file mode 100644 index 0000000..446720c --- /dev/null +++ b/scripts/start.sh @@ -0,0 +1,55 @@ +#!/bin/bash + +# Скрипт запуска BGP сервера + +set -e + +echo "Starting BGP Server..." + +# Создание директорий если не существуют +mkdir -p /app/logs + +# Проверка наличия файлов с префиксами +if [ ! -f "/app/data/prefixes.txt" ]; then + echo "Warning: /app/data/prefixes.txt not found. Creating empty file." + echo "# Default prefixes file" > /app/data/prefixes.txt + echo "192.168.1.0/24" >> /app/data/prefixes.txt +fi + +# Проверка конфигурации +echo "Validating ExaBGP configuration..." +exabgp --validate /app/exabgp.conf + +# Запуск ExaBGP в фоновом режиме +echo "Starting ExaBGP..." +exabgp /app/exabgp.conf & + +# Сохранение PID +EXABGP_PID=$! +echo $EXABGP_PID > /app/logs/exabgp.pid + +# Ожидание запуска +sleep 5 + +# Проверка статуса +if kill -0 $EXABGP_PID 2>/dev/null; then + echo "ExaBGP started successfully with PID: $EXABGP_PID" +else + echo "Failed to start ExaBGP" + exit 1 +fi + +# Функция для graceful shutdown +cleanup() { + echo "Shutting down BGP server..." + if [ -f "/app/logs/exabgp.pid" ]; then + kill $(cat /app/logs/exabgp.pid) 2>/dev/null || true + fi + exit 0 +} + +# Обработка сигналов +trap cleanup SIGTERM SIGINT + +# Ожидание завершения +wait $EXABGP_PID \ No newline at end of file diff --git a/scripts/stop-server.ps1 b/scripts/stop-server.ps1 new file mode 100644 index 0000000..e0f29be --- /dev/null +++ b/scripts/stop-server.ps1 @@ -0,0 +1,33 @@ +# PowerShell скрипт для остановки BGP сервера + +Write-Host "=== Stopping BGP Server ===" -ForegroundColor Yellow + +# Проверка что контейнер запущен +$containerStatus = docker ps --filter name=bgp-server --format "{{.Status}}" +if (!$containerStatus) { + Write-Host "BGP server is not running" -ForegroundColor Yellow + exit 0 +} + +Write-Host "BGP server is running. Stopping..." -ForegroundColor Yellow + +# Остановка контейнера +docker-compose down + +if ($LASTEXITCODE -eq 0) { + Write-Host "✓ BGP server stopped successfully" -ForegroundColor Green +} else { + Write-Host "✗ Failed to stop BGP server" -ForegroundColor Red + exit 1 +} + +# Проверка что контейнер остановлен +$containerStatus = docker ps --filter name=bgp-server --format "{{.Status}}" +if (!$containerStatus) { + Write-Host "✓ Container is stopped" -ForegroundColor Green +} else { + Write-Host "✗ Container is still running" -ForegroundColor Red + exit 1 +} + +Write-Host "=== BGP Server Stopped ===" -ForegroundColor Green \ No newline at end of file