diff --git a/.gitea/workflows/docker.yml b/.gitea/workflows/docker.yml deleted file mode 100644 index a3ef751..0000000 --- a/.gitea/workflows/docker.yml +++ /dev/null @@ -1,32 +0,0 @@ -name: Build and Push Docker Image - -on: - push: - branches: - - main - pull_request: - workflow_dispatch: - -jobs: - build: - runs-on: ubuntu-latest - 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: ${{ gitea.actor }} - password: ${{ secrets.ACTIONS_PAT }} - - - name: Build and push Docker image - uses: docker/build-push-action@v4 - with: - context: . - push: true - tags: git.shts.su/infra/bgp-server:latest \ No newline at end of file diff --git a/.gitignore b/.gitignore deleted file mode 100644 index 9b379ac..0000000 --- a/.gitignore +++ /dev/null @@ -1,47 +0,0 @@ -# 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/DOCKER_RUN.md b/DOCKER_RUN.md deleted file mode 100644 index 5c4eac8..0000000 --- a/DOCKER_RUN.md +++ /dev/null @@ -1,533 +0,0 @@ -# Инструкция по запуску BGP Server из Docker Registry - -## Быстрый старт - -### 1. Создание файлов с префиксами - -Создайте папку `data` и файл с префиксами: - -```powershell -# Создание папки для данных -mkdir data - -# Создание файла с префиксами -@" -# Основные префиксы -192.168.1.0/24 -192.168.2.0/24 -10.0.0.0/8 -172.16.0.0/12 - -# Дополнительные префиксы -203.0.113.0/24 -198.51.100.0/24 -"@ | Out-File -FilePath "data/prefixes.txt" -Encoding UTF8 - -# Проверка создания файла -Get-Content data/prefixes.txt -``` - -### 2. Запуск контейнера из registry - -```powershell -# Запуск BGP сервера из registry с переменными окружения -docker run -d ` - --name bgp-server ` - --restart unless-stopped ` - -p 179:179 ` - -v ${PWD}/data:/app/data:ro ` - -v ${PWD}/logs:/app/logs ` - -e BGP_LOCAL_AS=65000 ` - -e BGP_ROUTER_ID=192.168.1.100 ` - -e BGP_NEIGHBOR_IP=192.168.1.1 ` - -e BGP_NEIGHBOR_AS=65001 ` - -e BGP_HOLD_TIME=90 ` - -e BGP_KEEPALIVE=30 ` - git.shts.su/infra/bgp-server:latest - -# Простой запуск с настройками по умолчанию -docker run -d ` - --name bgp-server ` - --restart unless-stopped ` - -p 179:179 ` - -v ${PWD}/data:/app/data:ro ` - -v ${PWD}/logs:/app/logs ` - git.shts.su/infra/bgp-server:latest - -# Пример с кастомными настройками -docker run -d ` - --name bgp-server-custom ` - --restart unless-stopped ` - -p 179:179 ` - -v ${PWD}/data:/app/data:ro ` - -v ${PWD}/logs:/app/logs ` - -e BGP_LOCAL_AS=65000 ` - -e BGP_ROUTER_ID=10.0.0.100 ` - -e BGP_NEIGHBOR_IP=10.0.0.1 ` - -e BGP_NEIGHBOR_AS=65001 ` - -e BGP_HOLD_TIME=180 ` - -e BGP_LOG_LEVEL=DEBUG ` - -e BGP_MD5_PASSWORD="your-secure-password" ` - git.shts.su/infra/bgp-server:latest -``` - -### 3. Проверка работы - -```powershell -# Просмотр логов -docker logs -f bgp-server - -# Проверка статуса контейнера -docker ps - -# Проверка BGP сессии -docker exec bgp-server exabgpcli show neighbor -``` - -## Подробная настройка - -### Структура файлов - -``` -your-project/ -├── data/ -│ ├── prefixes.txt # Основные префиксы -│ └── additional_prefixes.txt # Дополнительные префиксы -├── logs/ # Логи (создается автоматически) -└── DOCKER_RUN.md # Эта инструкция -``` - -### Формат файла с префиксами - -**data/prefixes.txt:** -``` -# Основные префиксы -192.168.1.0/24 -192.168.2.0/24 -10.0.0.0/8 -172.16.0.0/12 - -# Комментарии начинаются с # -# Пустые строки игнорируются - -# Можно добавлять дополнительные префиксы -203.0.113.0/24 -198.51.100.0/24 -``` - -**data/additional_prefixes.txt:** -``` -# Дополнительные префиксы -172.20.0.0/16 -172.21.0.0/16 -``` - -### Полная команда запуска с настройками - -```powershell -docker run -d ` - --name bgp-server ` - --restart unless-stopped ` - -p 179:179 ` - -v ${PWD}/data:/app/data:ro ` - -v ${PWD}/logs:/app/logs ` - -e BGP_LOCAL_AS=65000 ` - -e BGP_ROUTER_ID=192.168.1.100 ` - -e BGP_NEIGHBOR_IP=192.168.1.1 ` - -e BGP_NEIGHBOR_AS=65001 ` - -e BGP_HOLD_TIME=90 ` - -e BGP_KEEPALIVE=30 ` - git.shts.su/infra/bgp-server:latest -``` - -### Переменные окружения - -| Переменная | Описание | По умолчанию | -|------------|----------|--------------| -| `BGP_LOCAL_AS` | AS номер сервера | 65000 | -| `BGP_ROUTER_ID` | Router ID сервера | 192.168.1.100 | -| `BGP_NEIGHBOR_IP` | IP адрес BGP пира | 192.168.1.1 | -| `BGP_NEIGHBOR_AS` | AS номер пира | 65001 | -| `BGP_HOLD_TIME` | Hold time в секундах | 90 | -| `BGP_KEEPALIVE` | Keepalive в секундах | 30 | -| `BGP_MD5_PASSWORD` | MD5 пароль для аутентификации | (не используется) | -| `BGP_LOG_LEVEL` | Уровень логирования (DEBUG, INFO, WARNING, ERROR) | INFO | - -### Просмотр сгенерированной конфигурации - -```powershell -# Просмотр текущей конфигурации ExaBGP -docker exec bgp-server cat /app/exabgp.conf - -# Просмотр переменных окружения -docker exec bgp-server env | findstr BGP_ -``` - -## Управление контейнером - -### Основные команды - -```powershell -# Запуск контейнера -docker start bgp-server - -# Остановка контейнера -docker stop bgp-server - -# Перезапуск контейнера -docker restart bgp-server - -# Удаление контейнера -docker rm -f bgp-server - -# Просмотр логов -docker logs bgp-server - -# Логи в реальном времени -docker logs -f bgp-server -``` - -### Обновление контейнера - -```powershell -# Безопасное обновление (рекомендуется) -docker stop bgp-server -docker rm bgp-server -docker pull git.shts.su/infra/bgp-server:latest -docker run -d ` - --name bgp-server ` - --restart unless-stopped ` - -p 179:179 ` - -v ${PWD}/data:/app/data:ro ` - -v ${PWD}/logs:/app/logs ` - git.shts.su/infra/bgp-server:latest - -# Быстрое обновление (если настройки не изменились) -docker pull git.shts.su/infra/bgp-server:latest -docker restart bgp-server - -# Использование скрипта обновления -.\scripts\update-container.ps1 - -# Принудительное обновление без подтверждения -.\scripts\update-container.ps1 -Force -``` - -### Обновление префиксов - -```powershell -# 1. Отредактируйте файл prefixes.txt -notepad data/prefixes.txt - -# 2. Перезапустите контейнер -docker restart bgp-server - -# 3. Проверьте логи -docker logs bgp-server -``` - -### Проверка работы - -```powershell -# Статус контейнера -docker ps - -# Проверка BGP сессии -docker exec bgp-server exabgpcli show neighbor - -# Проверка загруженных префиксов -docker exec bgp-server cat /app/logs/prefixes.log - -# Проверка содержимого файлов -docker exec bgp-server cat /app/data/prefixes.txt - -# Использование ресурсов -docker stats bgp-server -``` - -## Настройка RouterOS (клиент) - -### Определение версии RouterOS - -Сначала определите, какой синтаксис поддерживает ваша версия RouterOS: - -```routeros -# Проверка версии RouterOS -/system resource print - -# Проверка доступных команд BGP -/routing/bgp/print -/routing bgp print -``` - -**Если команда `/routing/bgp/print` работает** - используйте новый синтаксис (RouterOS 7.14+) -**Если команда `/routing bgp print` работает** - используйте старый синтаксис - -### Адаптация конфигурации под ваши настройки - -Замените следующие параметры в командах на ваши значения: - -| Параметр | Описание | Ваше значение | -|----------|----------|---------------| -| `as=65001` | Ваш AS номер | Ваш AS номер | -| `router-id=192.168.0.254` | Ваш Router ID | IP адрес вашего роутера | -| `local.address=192.168.0.254` | Ваш локальный IP | IP адрес вашего роутера | -| `remote.address=192.168.100.99` | IP BGP сервера | IP адрес Docker контейнера | -| `remote.as=65000` | AS BGP сервера | AS номер BGP сервера (по умолчанию 65000) | - -### Команды для RouterOS 7.14+ - -**Используйте рабочую конфигурацию с template и connection (см. ниже)** - -### Настройка RouterOS 7.14 (рабочая конфигурация) - -**Использование template и connection:** - -```routeros -# Создать шаблон BGP с вашим AS и router-id -/routing bgp template -add as=65001 disabled=no name=bgp-server output.network=bgp-networks .no-client-to-client-reflection=yes router-id=192.168.0.254 routing-table=main - -# Фильтр на запрет экспорта маршрутов (подстраховка) -/routing filter rule -add chain=discard disabled=no rule="reject;" - -# Фильтр на импорт маршрутов с изменением next-hop -/routing filter rule -add chain=bgp-server-in disabled=no rule="set gw 192.168.100.99; accept;" - -# Настройка BGP пира -/routing bgp connection -add connect=yes disabled=no input.filter=bgp-server-in listen=yes local.address=192.168.0.254 .role=ebgp multihop=yes name=bgp-server.network output.filter-chain=discard remote.address=192.168.100.99/32 .as=65000 .port=179 routing-table=main templates=bgp-server - -# Проверка статуса -/routing bgp connection print -/routing bgp route print -``` - -### Объяснение параметров конфигурации - -**BGP Template:** -- `as=65001` - ваш AS номер -- `router-id=192.168.0.254` - ваш Router ID (IP адрес роутера) -- `output.network=bgp-networks` - сеть для экспорта (создается автоматически) -- `.no-client-to-client-reflection=yes` - отключение отражения между клиентами - -**Routing Filter Rules:** -- `chain=discard` - цепочка для отклонения экспортируемых маршрутов -- `chain=bgp-server-in` - цепочка для обработки входящих маршрутов -- `set gw 192.168.100.99` - установка next-hop на IP BGP сервера - -**BGP Connection:** -- `connect=yes` - активное подключение -- `listen=yes` - ожидание входящих подключений -- `local.address=192.168.0.254` - ваш локальный IP -- `remote.address=192.168.100.99/32` - IP BGP сервера -- `remote.as=65000` - AS номер BGP сервера -- `templates=bgp-server` - использование созданного шаблона - -### Команды для удаления конфигурации - -Если нужно удалить конфигурацию и начать заново: - -```routeros -# Удаление BGP connection -/routing bgp connection remove bgp-server.network - -# Удаление фильтров -/routing filter rule remove [find chain=bgp-server-in] -/routing filter rule remove [find chain=discard] - -# Удаление BGP template -/routing bgp template remove bgp-server - -# Проверка удаления -/routing bgp connection print -/routing filter rule print -/routing bgp template print -``` - -## Устранение неполадок - -### Проблема: Контейнер не запускается - -```powershell -# Проверьте логи -docker logs bgp-server - -# Проверьте, не занят ли порт 179 -netstat -an | findstr :179 - -# Проверьте права доступа к папкам -ls -la data/ -ls -la logs/ -``` - -### Проблема: BGP сессия не устанавливается - -```powershell -# Проверьте сетевое подключение -docker exec bgp-server ping 192.168.1.1 - -# Проверьте конфигурацию -docker exec bgp-server cat /app/exabgp.conf - -# Проверьте логи BGP -docker logs bgp-server | findstr "BGP" -``` - -### Проблема: Префиксы не анонсируются - -```powershell -# Проверьте файлы с префиксами -docker exec bgp-server cat /app/data/prefixes.txt - -# Проверьте логи процесса загрузки -docker exec bgp-server cat /app/logs/prefixes.log - -# Проверьте статус процесса -docker exec bgp-server ps aux | findstr load_prefixes -``` - -### Проблема: Ошибки ExaBGP конфигурации - -```powershell -# Проверьте конфигурацию ExaBGP -docker exec bgp-server cat /app/exabgp.conf - -# Валидация конфигурации -docker exec bgp-server exabgp --validate /app/exabgp.conf - -# Проверьте named pipes -docker exec bgp-server ls -la /run/exabgp/ -docker exec bgp-server ls -la /var/run/exabgp/ - -# Проверьте логи ExaBGP -docker exec bgp-server cat /app/logs/exabgp.log - -# Проверьте переменные окружения -docker exec bgp-server env | findstr BGP_ -``` - -### Проблема: Файл prefixes.txt не найден - -```powershell -# Проверьте монтирование volume -docker exec bgp-server ls -la /app/data/ - -# Создайте файл вручную -docker exec bgp-server bash -c "echo '192.168.1.0/24' > /app/data/prefixes.txt" - -# Перезапустите контейнер -docker restart bgp-server -``` - -### Проблема: BGP сессия не устанавливается в RouterOS - -```routeros -# Проверьте доступные команды BGP -/routing/bgp/print - -# Проверьте экземпляры BGP -/routing/bgp/instance/print - -# Проверьте пиры -/routing/bgp/peer/print - -# Проверьте маршруты -/routing/bgp/route/print - -# Проверьте логи BGP -/log print where topics~"bgp" -``` - -### Проблема: Неправильный синтаксис команд RouterOS - -Если команды `/routing/bgp/` не работают, попробуйте старый синтаксис: - -```routeros -# Старый синтаксис RouterOS -/routing bgp instance add name=bgp-server as=65001 router-id=192.168.1.1 -/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 -``` - -### Диагностика версии RouterOS - -```routeros -# Проверка версии RouterOS -/system resource print - -# Проверка доступных команд BGP -/routing/bgp/print -/routing bgp print - -# Проверка доступных подкоманд -/routing/bgp/instance/print -/routing bgp instance print - -# Если команды не найдены, используйте старый синтаксис -``` - -## Примеры использования - -### Пример 1: Простой запуск - -```powershell -# Создание файла с префиксами -"192.168.1.0/24`n10.0.0.0/8" | Out-File -FilePath "data/prefixes.txt" -Encoding UTF8 - -# Запуск контейнера -docker run -d --name bgp-server -p 179:179 -v ${PWD}/data:/app/data:ro git.shts.su/infra/bgp-server:latest -``` - -### Пример 2: Запуск с кастомными настройками - -```powershell -docker run -d ` - --name bgp-server ` - -p 179:179 ` - -v ${PWD}/data:/app/data:ro ` - -v ${PWD}/logs:/app/logs ` - -e BGP_LOCAL_AS=65000 ` - -e BGP_ROUTER_ID=10.0.0.100 ` - -e BGP_NEIGHBOR_IP=10.0.0.1 ` - -e BGP_NEIGHBOR_AS=65001 ` - git.shts.su/infra/bgp-server:latest -``` - -### Пример 3: Запуск с несколькими файлами префиксов - -```powershell -# Создание нескольких файлов -"192.168.1.0/24`n192.168.2.0/24" | Out-File -FilePath "data/prefixes.txt" -Encoding UTF8 -"10.0.0.0/8`n172.16.0.0/12" | Out-File -FilePath "data/additional_prefixes.txt" -Encoding UTF8 - -# Запуск контейнера -docker run -d --name bgp-server -p 179:179 -v ${PWD}/data:/app/data:ro git.shts.su/infra/bgp-server:latest -``` - -## Безопасность - -### Рекомендации - -1. **Ограничение доступа**: Настройте firewall для ограничения доступа к порту 179 -2. **Аутентификация**: Используйте MD5 аутентификацию в BGP -3. **Логирование**: Включите детальное логирование для аудита -4. **Обновления**: Регулярно обновляйте Docker образы - -### Настройка MD5 аутентификации - -Добавьте переменную окружения: -```powershell --e BGP_MD5_PASSWORD="your-secure-password" -``` - -В RouterOS: -```routeros -# Для RouterOS 7.14+ (новый синтаксис) -/routing/bgp/peer set bgp-server password="your-secure-password" - -# Для старых версий RouterOS -/routing bgp peer set bgp-server password="your-secure-password" -``` \ No newline at end of file diff --git a/Dockerfile b/Dockerfile deleted file mode 100644 index 65d31b9..0000000 --- a/Dockerfile +++ /dev/null @@ -1,51 +0,0 @@ -FROM ubuntu:22.04 - -# Установка системных зависимостей и FRR -RUN apt-get update && apt-get install -y \ - frr \ - frr-pythontools \ - python3 \ - python3-pip \ - iproute2 \ - iputils-ping \ - net-tools \ - procps \ - vim \ - curl \ - && rm -rf /var/lib/apt/lists/* - -# Установка Python зависимостей -RUN pip3 install watchdog - -# Создание структуры директорий -RUN mkdir -p /app/scripts /app/data /app/logs /etc/frr - -# Копирование файлов -COPY frr.conf /etc/frr/frr.conf -COPY scripts/ /app/scripts/ -COPY data/ /app/data/ - -# Установка прав доступа -RUN chmod +x /app/scripts/start.sh -RUN chmod +x /app/scripts/load_prefixes.py -RUN chmod +x /app/scripts/generate_config.py -RUN chmod +x /app/scripts/monitor.py - -# Рабочая директория -WORKDIR /app - -# Открытие BGP порта -EXPOSE 179 - -# Установка переменных окружения по умолчанию -ENV BGP_LOCAL_AS=65000 -ENV BGP_ROUTER_ID=192.168.100.99 -ENV BGP_NEIGHBOR_IP=192.168.0.254 -ENV BGP_NEIGHBOR_AS=65001 -ENV BGP_HOLD_TIME=90 -ENV BGP_KEEPALIVE=30 -ENV BGP_LOG_LEVEL=info -ENV FRR_DAEMONS="bgpd zebra" - -# Команда запуска -ENTRYPOINT ["/app/scripts/start.sh"] \ No newline at end of file diff --git a/QUICKSTART.md b/QUICKSTART.md deleted file mode 100644 index a4429e0..0000000 --- a/QUICKSTART.md +++ /dev/null @@ -1,324 +0,0 @@ -# Быстрый старт BGP Server (FRR) - -Этот документ поможет вам быстро запустить BGP сервер на базе FRR для раздачи префиксов. - -## Предварительные требования - -- Docker Desktop для Windows -- PowerShell -- RouterOS 7.14+ (для клиентской стороны) - -## Шаг 1: Подготовка файлов - -### Создание файла с префиксами - -Создайте файл `data/prefixes.txt` с вашими префиксами: - -``` -# Основные префиксы -192.168.1.0/24 -192.168.2.0/24 -10.0.0.0/8 -172.16.0.0/12 - -# Дополнительные префиксы -203.0.113.0/24 -198.51.100.0/24 -``` - -### Создание дополнительного файла (опционально) - -Создайте файл `data/additional_prefixes.txt` для дополнительных префиксов: - -``` -# Дополнительные префиксы -192.168.100.0/24 -192.168.200.0/24 -``` - -## Шаг 2: Запуск сервера - -### Вариант A: Использование PowerShell скрипта (рекомендуется) - -```powershell -# Запуск с автоматической сборкой образа -.\scripts\start-server.ps1 -Build - -# Или запуск без пересборки -.\scripts\start-server.ps1 -``` - -### Вариант B: Использование Docker Compose - -```powershell -# Сборка и запуск -docker-compose up -d --build - -# Или только запуск -docker-compose up -d -``` - -### Вариант C: Ручной запуск - -```powershell -# Сборка образа -docker build -t bgp-server-frr . - -# Запуск контейнера -docker run -d \ - --name bgp-server \ - --restart unless-stopped \ - -p 179:179 \ - -v ${PWD}/data:/app/data:ro \ - -v ${PWD}/logs:/app/logs \ - --cap-add NET_ADMIN \ - --privileged \ - bgp-server-frr -``` - -## Шаг 3: Проверка работы - -### Проверка статуса контейнера - -```powershell -# Статус контейнера -docker ps - -# Логи контейнера -docker logs bgp-server -``` - -### Проверка FRR - -```powershell -# Версия FRR -docker exec bgp-server vtysh -c "show version" - -# Статус BGP -docker exec bgp-server vtysh -c "show ip bgp summary" - -# Анонсированные маршруты -docker exec bgp-server vtysh -c "show ip bgp" -``` - -### Проверка загруженных префиксов - -```powershell -# Логи загрузки префиксов -docker exec bgp-server tail -f /app/logs/prefixes.log - -# Тестирование загрузки -docker exec bgp-server python3 /app/scripts/load_prefixes.py --test -``` - -## Шаг 4: Настройка RouterOS - -### Базовая настройка BGP - -```routeros -# Создание BGP экземпляра -/routing bgp instance -add name=bgp-server as=65001 router-id=192.168.0.254 - -# Настройка BGP сети -/routing bgp network -add network=192.168.0.0/24 - -# Настройка BGP пира -/routing bgp peer -add name=bgp-server remote-address=192.168.100.99 remote-as=65000 instance=bgp-server - -# Включение BGP -/routing bgp instance set bgp-server disabled=no -``` - -### Проверка BGP сессии - -```routeros -# Статус BGP -/routing bgp peer print - -# Полученные маршруты -/routing bgp route print -``` - -## Шаг 5: Мониторинг - -### Просмотр логов - -```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 -``` - -### Статус системы - -```powershell -# Статус в JSON формате -docker exec bgp-server cat /app/logs/status.json - -# Запуск мониторинга -docker exec bgp-server python3 /app/scripts/monitor.py -``` - -### Команды vtysh - -```powershell -# Подключение к FRR CLI -docker exec -it bgp-server vtysh - -# Полезные команды внутри vtysh: -show ip bgp summary # Сводка BGP -show ip bgp # Все BGP маршруты -show ip route # Таблица маршрутизации -show interface # Интерфейсы -show running-config # Конфигурация -``` - -## Управление - -### Остановка сервера - -```powershell -# Остановка с сохранением контейнера -.\scripts\stop-server.ps1 - -# Остановка с удалением контейнера -.\scripts\stop-server.ps1 -Force -``` - -### Перезагрузка префиксов - -```powershell -# Перезагрузка без перезапуска сервера -docker exec bgp-server python3 /app/scripts/reload_prefixes.py -``` - -### Обновление контейнера - -```powershell -# Обновление с пересборкой -.\scripts\update-container.ps1 -Force -``` - -## Диагностика - -### Проблема: Контейнер не запускается - -```powershell -# Проверка логов -docker logs bgp-server - -# Проверка портов -netstat -an | findstr :179 - -# Проверка Docker -docker system info -``` - -### Проблема: BGP сессия не устанавливается - -```powershell -# Проверка сетевой связности -docker exec bgp-server ping 192.168.0.254 - -# Проверка конфигурации FRR -docker exec bgp-server vtysh -c "show running-config" - -# Проверка статуса BGP -docker exec bgp-server vtysh -c "show ip bgp summary" -``` - -### Проблема: Префиксы не анонсируются - -```powershell -# Проверка файлов префиксов -docker exec bgp-server cat /app/data/prefixes.txt - -# Проверка логов загрузки -docker exec bgp-server tail -f /app/logs/prefixes.log - -# Проверка статических маршрутов -docker exec bgp-server vtysh -c "show ip route static" -``` - -## Настройка переменных окружения - -Вы можете настроить BGP параметры через переменные окружения: - -```powershell -# Запуск с кастомными настройками -docker run -d \ - --name bgp-server \ - -p 179:179 \ - -v ${PWD}/data:/app/data:ro \ - -v ${PWD}/logs:/app/logs \ - -e BGP_LOCAL_AS=65000 \ - -e BGP_ROUTER_ID=192.168.100.99 \ - -e BGP_NEIGHBOR_IP=192.168.0.254 \ - -e BGP_NEIGHBOR_AS=65001 \ - -e BGP_HOLD_TIME=90 \ - -e BGP_KEEPALIVE=30 \ - --cap-add NET_ADMIN \ - --privileged \ - bgp-server-frr -``` - -## Полезные команды - -### Мониторинг в реальном времени - -```powershell -# Логи в реальном времени -docker logs -f bgp-server - -# Статус BGP каждые 5 секунд -while ($true) { - docker exec bgp-server vtysh -c "show ip bgp summary" - Start-Sleep 5 - Clear-Host -} -``` - -### Резервное копирование - -```powershell -# Копирование файлов префиксов -Copy-Item data/prefixes.txt data/prefixes.txt.backup - -# Экспорт конфигурации FRR -docker exec bgp-server vtysh -c "show running-config" > frr-config.backup -``` - -### Очистка - -```powershell -# Остановка и удаление контейнера -docker stop bgp-server -docker rm bgp-server - -# Удаление образа -docker rmi bgp-server-frr - -# Очистка логов -Remove-Item logs/* -Recurse -Force -``` - -## Следующие шаги - -1. **Настройка мониторинга**: Настройте алерты для критических событий -2. **Резервное копирование**: Настройте автоматическое резервное копирование конфигурации -3. **Безопасность**: Настройте firewall и аутентификацию BGP -4. **Масштабирование**: Рассмотрите использование нескольких экземпляров для высокой доступности - -## Поддержка - -- Документация FRR: https://frrouting.org/ -- GitHub проекта: https://github.com/FRRouting/frr -- Сообщество: https://lists.frrouting.org/ \ No newline at end of file diff --git a/README.md b/README.md index bab8641..f06a42e 100644 --- a/README.md +++ b/README.md @@ -1,359 +1,205 @@ -# BGP Server для раздачи префиксов (FRR) +# BGP Server с FRRouting -Этот проект представляет собой BGP сервер на базе FRR (Free Range Routing), который раздает префиксы из текстовых файлов. Сервер работает в Docker контейнере и предназначен для интеграции с RouterOS 7.14+. +Этот проект предоставляет готовое решение для запуска BGP сервера с использованием контейнера FRRouting, который анонсирует префиксы всем подключенным клиентам с разделением по community. -## Архитектура решения +## Требования -- **BGP Server**: FRR (Free Range Routing) в Docker контейнере -- **Источник данных**: Текстовые файлы с префиксами -- **Клиент**: RouterOS 7.14+ для получения префиксов -- **Протокол**: BGP (только исходящие анонсы) - -## Преимущества FRR - -- **Стабильность**: Производственный уровень надежности -- **Производительность**: Оптимизирован для высоких нагрузок -- **Функциональность**: Полная поддержка BGP функций -- **Мониторинг**: Встроенные инструменты диагностики -- **Сообщество**: Активная поддержка и развитие +- Docker Desktop для Windows +- Docker Compose +- PowerShell ## Структура проекта ``` bgp-server/ -├── docker-compose.yml # Конфигурация Docker -├── Dockerfile # Образ Docker с FRR -├── frr.conf # Конфигурация FRR -├── scripts/ -│ ├── start.sh # Скрипт запуска FRR -│ ├── load_prefixes.py # Загрузка префиксов в FRR -│ ├── generate_config.py # Генерация конфигурации FRR -│ └── monitor.py # Мониторинг FRR -├── data/ -│ ├── prefixes.txt # Основной файл с префиксами -│ └── additional_prefixes.txt # Дополнительные префиксы -├── logs/ # Логи FRR -└── README.md # Эта инструкция +├── docker-compose.yml # Конфигурация Docker контейнера +├── frr.conf # Конфигурация FRRouting +├── prefixes.txt # Файл с префиксами и community +├── start-bgp-server.ps1 # Скрипт запуска для PowerShell +└── README.md # Эта инструкция ``` -## Быстрый старт +## Быстрый запуск -### 1. Подготовка файлов с префиксами +1. **Запустите Docker Desktop** -Создайте файл `data/prefixes.txt` с префиксами в формате: -``` -192.168.1.0/24 -10.0.0.0/8 -172.16.0.0/12 -``` +2. **Запустите BGP сервер:** + ```powershell + .\start-bgp-server.ps1 + ``` -### 2. Запуск сервера +## Ручной запуск + +Если вы предпочитаете запускать вручную: ```powershell -# Клонирование репозитория (если нужно) -git clone -cd bgp-server +# Остановить существующие контейнеры +docker-compose down -# Запуск с Docker Compose -docker-compose up -d -``` - -### 3. Проверка работы - -```powershell -# Просмотр логов -docker-compose logs -f bgp-server - -# Проверка статуса контейнера -docker-compose ps - -# Проверка BGP сессии через vtysh -docker exec bgp-server vtysh -c "show ip bgp summary" -``` - -## Подробная настройка - -### Требования - -- 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 сервера - -Конфигурация FRR генерируется автоматически из переменных окружения в `docker-compose.yml`: - -```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 - -**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.100.99 - - BGP_NEIGHBOR_IP=192.168.0.254 - - BGP_NEIGHBOR_AS=65001 - networks: - - bgp-network - cap_add: - - NET_ADMIN - privileged: true - -networks: - bgp-network: - driver: bridge - ipam: - config: - - subnet: 192.168.100.0/24 -``` - -### Шаг 4: Настройка RouterOS - -На стороне RouterOS 7.14+ выполните следующие команды: - -```routeros -# Создание BGP экземпляра -/routing bgp instance -add name=bgp-server as=65001 router-id=192.168.0.254 - -# Настройка BGP сети -/routing bgp network -add network=192.168.0.0/24 - -# Настройка BGP пира -/routing bgp peer -add name=bgp-server remote-address=192.168.100.99 remote-as=65000 instance=bgp-server - -# Включение BGP -/routing bgp instance set bgp-server disabled=no -``` - -### Шаг 5: Запуск и мониторинг - -```powershell -# Запуск сервера +# Запустить BGP сервер docker-compose up -d +# Проверить статус +docker ps + +# Посмотреть логи +docker-compose logs bgp-server +``` + +## Конфигурация + +### Префиксы (prefixes.txt) + +Файл содержит префиксы в формате: +``` +prefix community1:community2:community3 +``` + +Пример: +``` +192.168.1.0/24 65000:100:65000:200 +10.0.0.0/8 65000:101:65000:201 +``` + +### BGP настройки (frr.conf) + +- **ASN**: 65000 +- **Router ID**: 192.168.1.1 +- **Порт BGP**: 179 +- **Порт vtysh**: 2601 + +## Управление сервером + +### Подключение к vtysh (консоль управления) + +```powershell +docker exec -it bgp-server vtysh +``` + +### Полезные команды vtysh + +```bash +# Показать статус BGP +show ip bgp summary + +# Показать анонсированные префиксы +show ip bgp + +# Показать community +show ip bgp community + +# Показать соседей +show ip bgp neighbors + +# Показать IPv6 информацию +show ipv6 bgp summary +``` + +### Просмотр логов + +```powershell # Просмотр логов в реальном времени docker-compose logs -f bgp-server -# Проверка статуса BGP сессии -docker exec bgp-server vtysh -c "show ip bgp summary" - -# Проверка анонсированных маршрутов -docker exec bgp-server vtysh -c "show ip bgp" +# Просмотр последних логов +docker-compose logs bgp-server ``` -## Управление и мониторинг - -### Команды vtysh +### Остановка сервера ```powershell -# Подключение к FRR CLI -docker exec -it bgp-server vtysh - -# Просмотр BGP соседей -show ip bgp neighbors - -# Просмотр BGP маршрутов -show ip bgp - -# Просмотр статических маршрутов -show ip route - -# Просмотр конфигурации -show running-config +docker-compose down ``` -### Мониторинг через скрипты +## Подключение клиентов + +### Настройка BGP клиента + +Клиенты могут подключаться к BGP серверу по адресу: +- **IP**: IP адрес хоста, где запущен контейнер +- **Порт**: 179 +- **ASN**: 65000 (внешний ASN) + +### Пример конфигурации клиента (Cisco) + +``` +router bgp 65001 + neighbor 192.168.1.1 remote-as 65000 + neighbor 192.168.1.1 send-community + network 192.168.2.0/24 +``` + +### Пример конфигурации клиента (Juniper) + +``` +protocols { + bgp { + group external { + type external; + peer-as 65000; + neighbor 192.168.1.1 { + send-community; + } + } + } +} +``` + +## Мониторинг + +### Проверка статуса контейнера ```powershell -# Запуск мониторинга -docker exec bgp-server python3 /app/scripts/monitor.py - -# Просмотр статуса -docker exec bgp-server cat /app/logs/status.json - -# Перезагрузка префиксов -docker exec bgp-server python3 /app/scripts/load_prefixes.py --test +docker ps --filter "name=bgp-server" ``` -### Логи +### Проверка сетевых портов ```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 +netstat -an | findstr :179 +netstat -an | findstr :2601 ``` -## Диагностика - -### Проверка статуса FRR +### Проверка логов FRRouting ```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" +docker exec bgp-server cat /var/log/frr/frr.log ``` -### Проверка BGP сессии +## Troubleshooting -```powershell -# Статус BGP соседей -docker exec bgp-server vtysh -c "show ip bgp summary" +### Проблема: Контейнер не запускается -# Детальная информация о соседе -docker exec bgp-server vtysh -c "show ip bgp neighbors 192.168.0.254" -``` +1. Проверьте, что Docker Desktop запущен +2. Проверьте логи: `docker-compose logs bgp-server` +3. Убедитесь, что порты 179 и 2601 не заняты -### Проверка маршрутов +### Проблема: BGP сессии не устанавливаются -```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" -``` - -## Обновление префиксов - -### Автоматическое обновление - -Скрипт `load_prefixes.py` автоматически отслеживает изменения в файлах префиксов и обновляет маршруты в FRR. - -### Ручное обновление - -```powershell -# Перезагрузка всех префиксов -docker exec bgp-server python3 /app/scripts/load_prefixes.py - -# Тестирование загрузки префиксов -docker exec bgp-server python3 /app/scripts/load_prefixes.py --test -``` - -## Устранение неполадок - -### Проблема: BGP сессия не устанавливается - -1. Проверьте сетевую связность: -```powershell -docker exec bgp-server ping 192.168.0.254 -``` - -2. Проверьте конфигурацию BGP: -```powershell -docker exec bgp-server vtysh -c "show running-config" -``` - -3. Проверьте логи FRR: -```powershell -docker exec bgp-server tail -f /app/logs/frr.log -``` +1. Проверьте настройки firewall +2. Убедитесь, что клиент правильно настроен +3. Проверьте логи BGP: `docker exec -it bgp-server vtysh -c "show ip bgp summary"` ### Проблема: Префиксы не анонсируются -1. Проверьте файлы с префиксами: -```powershell -docker exec bgp-server cat /app/data/prefixes.txt -``` - -2. Проверьте логи загрузки префиксов: -```powershell -docker exec bgp-server tail -f /app/logs/prefixes.log -``` - -3. Проверьте статические маршруты: -```powershell -docker exec bgp-server vtysh -c "show ip route static" -``` - -### Проблема: Высокое потребление ресурсов - -1. Проверьте использование памяти: -```powershell -docker exec bgp-server free -h -``` - -2. Проверьте количество маршрутов: -```powershell -docker exec bgp-server vtysh -c "show ip bgp summary" -``` +1. Проверьте конфигурацию в `frr.conf` +2. Убедитесь, что префиксы правильно прописаны +3. Проверьте community настройки ## Безопасность -- FRR работает в привилегированном контейнере для доступа к сетевым интерфейсам -- Используйте route-maps для фильтрации трафика -- Ограничьте доступ к vtysh CLI -- Регулярно обновляйте образ Docker +⚠️ **Важно**: Этот BGP сервер настроен для тестирования и разработки. Для продакшена: -## Производительность - -- FRR оптимизирован для обработки большого количества маршрутов -- Поддерживает до 1 миллиона маршрутов -- Эффективное использование памяти -- Быстрое время сходимости +1. Измените пароли по умолчанию +2. Настройте firewall правила +3. Используйте более строгие настройки безопасности +4. Ограничьте доступ к vtysh ## Поддержка -- Документация FRR: https://frrouting.org/ -- GitHub проекта: https://github.com/FRRouting/frr -- Сообщество: https://lists.frrouting.org/ \ No newline at end of file +При возникновении проблем: + +1. Проверьте логи контейнера +2. Убедитесь в правильности конфигурации +3. Проверьте сетевые настройки +4. Обратитесь к документации FRRouting: https://frrouting.org/ \ No newline at end of file diff --git a/TESTING.md b/TESTING.md deleted file mode 100644 index 53f1360..0000000 --- a/TESTING.md +++ /dev/null @@ -1,338 +0,0 @@ -# Тестирование 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 deleted file mode 100644 index d44d50f..0000000 --- a/alternative-solutions.md +++ /dev/null @@ -1,293 +0,0 @@ -# Альтернативные решения для 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/check-bgp-status.ps1 b/check-bgp-status.ps1 new file mode 100644 index 0000000..da942ff --- /dev/null +++ b/check-bgp-status.ps1 @@ -0,0 +1,67 @@ +# PowerShell script to check BGP server status +# BGP Server Status Check Script + +Write-Host "Checking BGP Server Status..." -ForegroundColor Cyan + +# Check if Docker is running +try { + docker version | Out-Null + Write-Host "✓ Docker is running" -ForegroundColor Green +} catch { + Write-Host "✗ Docker is not running" -ForegroundColor Red + exit 1 +} + +# Check container status +Write-Host "`nContainer Status:" -ForegroundColor Yellow +$containerStatus = docker ps --filter "name=bgp-server" --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}" +if ($containerStatus -and $containerStatus -notmatch "NAMES") { + Write-Host $containerStatus -ForegroundColor Green +} else { + Write-Host "✗ BGP container is not running" -ForegroundColor Red + Write-Host "To start the server, run: .\start-bgp-server.ps1" -ForegroundColor Yellow + exit 1 +} + +# Check network ports +Write-Host "`nNetwork Ports:" -ForegroundColor Yellow +$bgpPort = netstat -an | findstr ":179" +$vtyshPort = netstat -an | findstr ":2601" + +if ($bgpPort) { + Write-Host "✓ BGP port 179 is listening" -ForegroundColor Green +} else { + Write-Host "✗ BGP port 179 is not listening" -ForegroundColor Red +} + +if ($vtyshPort) { + Write-Host "✓ vtysh port 2601 is listening" -ForegroundColor Green +} else { + Write-Host "✗ vtysh port 2601 is not listening" -ForegroundColor Red +} + +# Check BGP status inside container +Write-Host "`nBGP Status:" -ForegroundColor Yellow +try { + $bgpSummary = docker exec bgp-server vtysh -c "show ip bgp summary" 2>$null + if ($bgpSummary) { + Write-Host "✓ BGP daemon is running" -ForegroundColor Green + Write-Host "BGP Summary:" -ForegroundColor Cyan + Write-Host $bgpSummary -ForegroundColor White + } else { + Write-Host "✗ BGP daemon is not responding" -ForegroundColor Red + } +} catch { + Write-Host "✗ Cannot connect to BGP daemon" -ForegroundColor Red +} + +# Check recent logs +Write-Host "`nRecent Logs:" -ForegroundColor Yellow +$recentLogs = docker-compose logs --tail=10 bgp-server 2>$null +if ($recentLogs) { + Write-Host $recentLogs -ForegroundColor White +} else { + Write-Host "No recent logs available" -ForegroundColor Gray +} + +Write-Host "`nStatus check completed!" -ForegroundColor Green \ No newline at end of file diff --git a/data/additional_prefixes.txt b/data/additional_prefixes.txt deleted file mode 100644 index c2e977e..0000000 --- a/data/additional_prefixes.txt +++ /dev/null @@ -1,10 +0,0 @@ -# Дополнительные префиксы -# Этот файл может содержать дополнительные сети для анонсирования - -# Тестовые сети -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 deleted file mode 100644 index a6c761a..0000000 --- a/data/prefixes.txt +++ /dev/null @@ -1,9 +0,0 @@ -# Основные префиксы -192.168.100.0/24 -192.168.101.0/24 -10.0.0.0/8 -172.16.0.0/12 - -# Дополнительные префиксы -203.0.113.0/24 -198.51.100.0/24 \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index 5b2bff6..211f77f 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -2,31 +2,30 @@ version: '3.8' services: bgp-server: - build: . + image: quay.io/frrouting/frr:latest container_name: bgp-server - restart: unless-stopped - ports: - - "179:179" # BGP порт + hostname: bgp-server + privileged: true + network_mode: host volumes: - - ./data:/app/data:ro - - ./logs:/app/logs + - ./frr.conf:/etc/frr/frr.conf:ro + - ./prefixes.txt:/etc/frr/prefixes.txt:ro + - frr-logs:/var/log/frr + - frr-run:/var/run/frr environment: - - BGP_LOCAL_AS=65000 - - BGP_ROUTER_ID=192.168.100.99 - - BGP_NEIGHBOR_IP=192.168.0.254 - - BGP_NEIGHBOR_AS=65001 - - BGP_HOLD_TIME=90 - - BGP_KEEPALIVE=30 - - BGP_LOG_LEVEL=info - networks: - - bgp-network + - FRR_USER=frr + - FRR_VTYSH_PASSWORD=zebra + ports: + - "179:179" # BGP port + - "2601:2601" # vtysh port + restart: unless-stopped + command: ["/usr/lib/frr/frrinit.sh", "start"] cap_add: - - NET_ADMIN # Для работы с сетевыми интерфейсами - privileged: true # Для работы с FRR демонами + - NET_ADMIN + - SYS_ADMIN + security_opt: + - seccomp:unconfined -networks: - bgp-network: - driver: bridge - ipam: - config: - - subnet: 192.168.100.0/24 \ No newline at end of file +volumes: + frr-logs: + frr-run: \ No newline at end of file diff --git a/frr.conf b/frr.conf index b1e7cd6..281f003 100644 --- a/frr.conf +++ b/frr.conf @@ -1,46 +1,69 @@ -# FRR Configuration File -# Этот файл будет перезаписан динамически сгенерированной конфигурацией -# из переменных окружения при запуске контейнера. -# -# Для просмотра текущей конфигурации используйте: -# docker exec bgp-server cat /etc/frr/frr.conf +# FRRouting configuration file +# BGP Server Configuration -# Глобальные настройки -frr version 8.5.2 -frr defaults traditional -hostname bgp-server -log syslog info -service integrated-vtysh-config +# Enable password for vtysh +password zebra +enable password zebra -# Настройки BGP +# Router ID +router-id 192.168.1.1 + +# BGP configuration router bgp 65000 - bgp router-id 192.168.100.99 - bgp log-neighbor-changes - neighbor 192.168.0.254 remote-as 65001 - neighbor 192.168.0.254 description RouterOS Client - neighbor 192.168.0.254 timers 30 90 - neighbor 192.168.0.254 capability graceful-restart - neighbor 192.168.0.254 soft-reconfiguration inbound -! - address-family ipv4 unicast - neighbor 192.168.0.254 activate - neighbor 192.168.0.254 route-map OUTBOUND out - neighbor 192.168.0.254 route-map INBOUND in - exit-address-family -! + bgp router-id 192.168.1.1 + + # Network configuration + network 192.168.1.0/24 + network 10.0.0.0/8 + network 172.16.0.0/12 + network 203.0.113.0/24 + network 198.51.100.0/24 + network 192.0.2.0/24 + network 8.8.8.0/24 + network 1.1.1.0/24 + network 9.9.9.0/24 + + # IPv6 networks + network 2001:db8::/32 + network 2001:db8:1::/48 + network 2001:db8:2::/48 + + # Community configuration + neighbor 0.0.0.0/0 remote-as external + neighbor 0.0.0.0/0 send-community + neighbor 0.0.0.0/0 send-community extended + + # IPv6 neighbors + neighbor ::/0 remote-as external + neighbor ::/0 send-community + neighbor ::/0 send-community extended + + # Route redistribution + redistribute connected + redistribute static -# Route maps для фильтрации -route-map OUTBOUND permit 10 - description Allow all outbound routes -! -route-map INBOUND deny 10 - description Deny all inbound routes (receive-only mode) -! +# Static routes with communities +ip route 192.168.1.0/24 null0 community 65000:100:65000:200 +ip route 10.0.0.0/8 null0 community 65000:101:65000:201 +ip route 172.16.0.0/12 null0 community 65000:102:65000:202 +ip route 203.0.113.0/24 null0 community 65000:110:65000:210 +ip route 198.51.100.0/24 null0 community 65000:111:65000:211 +ip route 192.0.2.0/24 null0 community 65000:112:65000:212 +ip route 8.8.8.0/24 null0 community 65000:120:65000:220 +ip route 1.1.1.0/24 null0 community 65000:121:65000:221 +ip route 9.9.9.0/24 null0 community 65000:122:65000:222 -# Настройки интерфейса +# IPv6 static routes +ipv6 route 2001:db8::/32 null0 community 65000:300:65000:400 +ipv6 route 2001:db8:1::/48 null0 community 65000:301:65000:401 +ipv6 route 2001:db8:2::/48 null0 community 65000:302:65000:402 + +# Interface configuration interface eth0 - ip address 192.168.100.99/24 -! + ip address 192.168.1.1/24 + ipv6 address 2001:db8::1/64 + no shutdown -# Статические маршруты (будут добавлены динамически) -# ip route 192.168.1.0/24 Null0 \ No newline at end of file +# Logging +log file /var/log/frr/frr.log +log timestamp precision 6 \ No newline at end of file diff --git a/prefixes.txt b/prefixes.txt new file mode 100644 index 0000000..b5d60c5 --- /dev/null +++ b/prefixes.txt @@ -0,0 +1,23 @@ +# BGP Prefixes with Communities +# Format: prefix community1:community2:community3 +# Communities format: ASN:value (e.g., 65000:100) + +# Public IP ranges +192.168.1.0/24 65000:100:65000:200 +10.0.0.0/8 65000:101:65000:201 +172.16.0.0/12 65000:102:65000:202 + +# Specific subnets +203.0.113.0/24 65000:110:65000:210 +198.51.100.0/24 65000:111:65000:211 +192.0.2.0/24 65000:112:65000:212 + +# IPv6 prefixes +2001:db8::/32 65000:300:65000:400 +2001:db8:1::/48 65000:301:65000:401 +2001:db8:2::/48 65000:302:65000:402 + +# Additional prefixes for testing +8.8.8.0/24 65000:120:65000:220 +1.1.1.0/24 65000:121:65000:221 +9.9.9.0/24 65000:122:65000:222 \ No newline at end of file diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index 8704a9c..0000000 --- a/requirements.txt +++ /dev/null @@ -1 +0,0 @@ -watchdog>=2.1.0 \ No newline at end of file diff --git a/routeros-setup.md b/routeros-setup.md deleted file mode 100644 index a381cf0..0000000 --- a/routeros-setup.md +++ /dev/null @@ -1,255 +0,0 @@ -# Настройка 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/generate_config.py b/scripts/generate_config.py deleted file mode 100644 index 580f555..0000000 --- a/scripts/generate_config.py +++ /dev/null @@ -1,95 +0,0 @@ -#!/usr/bin/env python3 -""" -Скрипт для генерации конфигурации FRR из переменных окружения -""" - -import os -import sys -from pathlib import Path - -def get_env_var(name, default): - """Получение переменной окружения с значением по умолчанию""" - return os.environ.get(name, default) - -def generate_frr_config(): - """Генерация конфигурации FRR""" - - # Получение настроек из переменных окружения - local_as = get_env_var('BGP_LOCAL_AS', '65000') - router_id = get_env_var('BGP_ROUTER_ID', '192.168.100.99') - neighbor_ip = get_env_var('BGP_NEIGHBOR_IP', '192.168.0.254') - neighbor_as = get_env_var('BGP_NEIGHBOR_AS', '65001') - hold_time = get_env_var('BGP_HOLD_TIME', '90') - keepalive = get_env_var('BGP_KEEPALIVE', '30') - log_level = get_env_var('BGP_LOG_LEVEL', 'info') - - # Конфигурация FRR - config = f"""# FRR Configuration File -# Generated automatically from environment variables - -# Глобальные настройки -frr version 8.5.2 -frr defaults traditional -hostname bgp-server -log syslog {log_level} -service integrated-vtysh-config - -# Настройки BGP -router bgp {local_as} - bgp router-id {router_id} - bgp log-neighbor-changes - neighbor {neighbor_ip} remote-as {neighbor_as} - neighbor {neighbor_ip} description RouterOS Client - neighbor {neighbor_ip} timers {keepalive} {hold_time} - neighbor {neighbor_ip} capability graceful-restart - neighbor {neighbor_ip} soft-reconfiguration inbound -! - address-family ipv4 unicast - neighbor {neighbor_ip} activate - neighbor {neighbor_ip} route-map OUTBOUND out - neighbor {neighbor_ip} route-map INBOUND in - exit-address-family -! - -# Route maps для фильтрации -route-map OUTBOUND permit 10 - description Allow all outbound routes -! -route-map INBOUND deny 10 - description Deny all inbound routes (receive-only mode) -! - -# Настройки интерфейса -interface eth0 - ip address {router_id}/24 -! - -# Статические маршруты (будут добавлены динамически) -# ip route 192.168.1.0/24 Null0 -""" - - return config - -def main(): - """Основная функция""" - try: - # Генерация конфигурации - config = generate_frr_config() - - # Запись в файл - config_path = Path('/etc/frr/frr.conf') - config_path.parent.mkdir(parents=True, exist_ok=True) - - with open(config_path, 'w') as f: - f.write(config) - - print(f"FRR configuration generated: {config_path}") - print("Configuration content:") - print(config) - - except Exception as e: - print(f"Error generating FRR configuration: {e}", file=sys.stderr) - sys.exit(1) - -if __name__ == "__main__": - main() \ No newline at end of file diff --git a/scripts/load_prefixes.py b/scripts/load_prefixes.py deleted file mode 100644 index a69106b..0000000 --- a/scripts/load_prefixes.py +++ /dev/null @@ -1,245 +0,0 @@ -#!/usr/bin/env python3 -""" -Скрипт для загрузки префиксов из текстовых файлов в FRR -""" - -import sys -import os -import time -import subprocess -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 - print(log_entry, flush=True) - - # Запись в файл (с обработкой ошибок) - try: - with open(LOG_FILE, "a") as f: - f.write(log_entry + "\n") - except (PermissionError, OSError) as e: - # Если не можем записать в файл, просто выводим в stderr - print(f"Warning: Could not write to log file: {e}", file=sys.stderr, flush=True) - -def log_error(message: str): - """Запись ошибки в лог""" - log_message(f"ERROR: {message}") - -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 run_vtysh_command(command: str) -> bool: - """Выполнение команды через vtysh""" - try: - result = subprocess.run( - ['vtysh', '-c', command], - capture_output=True, - text=True, - timeout=30 - ) - - if result.returncode != 0: - log_error(f"vtysh command failed: {command}") - log_error(f"stderr: {result.stderr}") - return False - - return True - except subprocess.TimeoutExpired: - log_error(f"vtysh command timeout: {command}") - return False - except Exception as e: - log_error(f"Error running vtysh command '{command}': {e}") - return False - -def announce_prefixes(prefixes: Set[str]): - """Анонсирование префиксов через FRR""" - log_message(f"Announcing {len(prefixes)} prefixes...") - - for prefix in sorted(prefixes): - # Добавление статического маршрута в FRR - command = f"ip route {prefix} Null0" - if run_vtysh_command(command): - log_message(f"Announced prefix: {prefix}") - else: - log_error(f"Failed to announce prefix: {prefix}") - -def withdraw_prefixes(prefixes: Set[str]): - """Отзыв префиксов через FRR""" - log_message(f"Withdrawing {len(prefixes)} prefixes...") - - for prefix in sorted(prefixes): - # Удаление статического маршрута из FRR - command = f"no ip route {prefix} Null0" - if run_vtysh_command(command): - log_message(f"Withdrew prefix: {prefix}") - else: - log_error(f"Failed to withdraw prefix: {prefix}") - -def check_frr_status() -> bool: - """Проверка статуса FRR""" - try: - result = subprocess.run( - ['vtysh', '-c', 'show version'], - capture_output=True, - text=True, - timeout=10 - ) - return result.returncode == 0 - except Exception: - return False - -def wait_for_frr(): - """Ожидание запуска FRR""" - log_message("Waiting for FRR to start...") - max_attempts = 30 - attempt = 0 - - while attempt < max_attempts: - if check_frr_status(): - log_message("FRR is ready") - return True - - attempt += 1 - time.sleep(2) - if attempt % 5 == 0: - log_message(f"Still waiting for FRR... (attempt {attempt}/{max_attempts})") - - log_error("FRR did not start within expected time") - return False - -def main(): - """Основная функция""" - # Создание директории для логов в начале - try: - os.makedirs(os.path.dirname(LOG_FILE), exist_ok=True) - except (PermissionError, OSError): - pass # Игнорируем ошибки создания директории - - # Проверка тестового режима - if len(sys.argv) > 1 and sys.argv[1] == '--test': - print("Testing prefix loader...") - prefixes = load_all_prefixes() - print(f"Found {len(prefixes)} prefixes: {list(prefixes)}") - return - - # Проверка режима отзыва - if len(sys.argv) > 1 and sys.argv[1] == '--withdraw': - log_message("Withdraw mode: loading and withdrawing all prefixes...") - prefixes = load_all_prefixes() - if wait_for_frr(): - withdraw_prefixes(prefixes) - return - - log_message("Starting prefix loader...") - - # Ожидание запуска FRR - if not wait_for_frr(): - log_error("Cannot proceed without FRR") - return - - # Загрузка префиксов - 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") - - # Мониторинг изменений в файлах - log_message("Starting file monitoring...") - - try: - while True: - time.sleep(30) # Проверка каждые 30 секунд - - # Перезагрузка префиксов - new_prefixes = load_all_prefixes() - - # Определение изменений - added = new_prefixes - prefixes - removed = prefixes - new_prefixes - - if added: - log_message(f"Adding {len(added)} new prefixes: {list(added)}") - announce_prefixes(added) - - if removed: - log_message(f"Removing {len(removed)} prefixes: {list(removed)}") - withdraw_prefixes(removed) - - if added or removed: - prefixes = new_prefixes - log_message(f"Updated prefix count: {len(prefixes)}") - - 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 deleted file mode 100644 index 94d0268..0000000 --- a/scripts/monitor.py +++ /dev/null @@ -1,194 +0,0 @@ -#!/usr/bin/env python3 -""" -Скрипт мониторинга FRR BGP сервера -""" - -import sys -import os -import time -import subprocess -import json -from pathlib import Path -from typing import Dict, Any - -# Настройки -LOG_FILE = "/app/logs/monitor.log" -STATUS_FILE = "/app/logs/status.json" - -def log_message(message: str): - """Запись сообщения в лог""" - timestamp = time.strftime("%Y-%m-%d %H:%M:%S") - log_entry = f"[{timestamp}] {message}" - - print(log_entry, flush=True) - - try: - with open(LOG_FILE, "a") as f: - f.write(log_entry + "\n") - except (PermissionError, OSError): - pass - -def run_vtysh_command(command: str) -> str: - """Выполнение команды через vtysh""" - try: - result = subprocess.run( - ['vtysh', '-c', command], - capture_output=True, - text=True, - timeout=30 - ) - - if result.returncode == 0: - return result.stdout.strip() - else: - log_message(f"vtysh command failed: {command}") - return "" - except Exception as e: - log_message(f"Error running vtysh command '{command}': {e}") - return "" - -def get_bgp_summary() -> Dict[str, Any]: - """Получение сводки BGP""" - summary = run_vtysh_command("show ip bgp summary") - - if not summary: - return {"error": "Could not get BGP summary"} - - # Парсинг вывода BGP summary - lines = summary.split('\n') - neighbors = [] - - for line in lines: - if 'BGP neighbor' in line and 'remote AS' in line: - parts = line.split() - if len(parts) >= 8: - neighbor = { - "ip": parts[2].rstrip(','), - "remote_as": parts[7], - "state": parts[-1] if len(parts) > 7 else "Unknown" - } - neighbors.append(neighbor) - - return { - "neighbors": neighbors, - "raw_output": summary - } - -def get_bgp_routes() -> Dict[str, Any]: - """Получение BGP маршрутов""" - routes = run_vtysh_command("show ip bgp") - - if not routes: - return {"error": "Could not get BGP routes"} - - # Подсчет маршрутов - route_count = 0 - for line in routes.split('\n'): - if line.strip() and not line.startswith('BGP table') and not line.startswith('*>'): - if any(char.isdigit() for char in line): - route_count += 1 - - return { - "route_count": route_count, - "raw_output": routes - } - -def get_frr_status() -> Dict[str, Any]: - """Получение статуса FRR""" - version = run_vtysh_command("show version") - - if not version: - return {"error": "Could not get FRR version"} - - return { - "version": version.split('\n')[0] if version else "Unknown", - "raw_output": version - } - -def get_system_status() -> Dict[str, Any]: - """Получение системного статуса""" - try: - # Проверка процессов FRR - zebra_running = subprocess.run(['pgrep', 'zebra'], capture_output=True).returncode == 0 - bgpd_running = subprocess.run(['pgrep', 'bgpd'], capture_output=True).returncode == 0 - - # Проверка использования памяти - memory_info = {} - try: - with open('/proc/meminfo', 'r') as f: - for line in f: - if 'MemTotal:' in line: - memory_info['total'] = line.split()[1] - elif 'MemAvailable:' in line: - memory_info['available'] = line.split()[1] - except: - pass - - return { - "zebra_running": zebra_running, - "bgpd_running": bgpd_running, - "memory": memory_info - } - except Exception as e: - return {"error": f"Could not get system status: {e}"} - -def save_status(status: Dict[str, Any]): - """Сохранение статуса в файл""" - try: - with open(STATUS_FILE, 'w') as f: - json.dump(status, f, indent=2) - except Exception as e: - log_message(f"Error saving status: {e}") - -def main(): - """Основная функция""" - log_message("Starting FRR monitor...") - - # Создание директории для логов - try: - os.makedirs(os.path.dirname(LOG_FILE), exist_ok=True) - os.makedirs(os.path.dirname(STATUS_FILE), exist_ok=True) - except (PermissionError, OSError): - pass - - while True: - try: - # Сбор статуса - status = { - "timestamp": time.strftime("%Y-%m-%d %H:%M:%S"), - "frr": get_frr_status(), - "bgp_summary": get_bgp_summary(), - "bgp_routes": get_bgp_routes(), - "system": get_system_status() - } - - # Сохранение статуса - save_status(status) - - # Логирование важной информации - bgp_summary = status["bgp_summary"] - if "neighbors" in bgp_summary: - for neighbor in bgp_summary["neighbors"]: - log_message(f"BGP neighbor {neighbor['ip']} (AS {neighbor['remote_as']}): {neighbor['state']}") - - bgp_routes = status["bgp_routes"] - if "route_count" in bgp_routes: - log_message(f"BGP routes: {bgp_routes['route_count']}") - - system = status["system"] - if "zebra_running" in system and "bgpd_running" in system: - if not system["zebra_running"] or not system["bgpd_running"]: - log_message("WARNING: FRR daemons not running properly") - - # Ожидание перед следующей проверкой - time.sleep(60) # Проверка каждую минуту - - except KeyboardInterrupt: - log_message("Monitor stopped by user") - break - except Exception as e: - log_message(f"Error in monitor loop: {e}") - time.sleep(30) # Короткая пауза при ошибке - -if __name__ == "__main__": - main() \ No newline at end of file diff --git a/scripts/reload_prefixes.py b/scripts/reload_prefixes.py deleted file mode 100644 index 1fc361d..0000000 --- a/scripts/reload_prefixes.py +++ /dev/null @@ -1,206 +0,0 @@ -#!/usr/bin/env python3 -""" -Скрипт для перезагрузки префиксов в FRR -""" - -import sys -import os -import time -import subprocess -import ipaddress -from pathlib import Path -from typing import Set - -# Настройки -DATA_DIR = "/app/data" -LOG_FILE = "/app/logs/reload.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}" - - print(log_entry, flush=True) - - try: - with open(LOG_FILE, "a") as f: - f.write(log_entry + "\n") - except (PermissionError, OSError): - pass - -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 get_current_routes() -> Set[str]: - """Получение текущих статических маршрутов из FRR""" - try: - result = subprocess.run( - ['vtysh', '-c', 'show ip route static'], - capture_output=True, - text=True, - timeout=30 - ) - - if result.returncode != 0: - log_message("Could not get current routes from FRR") - return set() - - routes = set() - for line in result.stdout.split('\n'): - line = line.strip() - if line and 'via Null0' in line: - # Парсинг строки маршрута - parts = line.split() - if len(parts) >= 2: - route = parts[1] - if validate_prefix(route): - routes.add(route) - - return routes - except Exception as e: - log_message(f"Error getting current routes: {e}") - return set() - -def run_vtysh_command(command: str) -> bool: - """Выполнение команды через vtysh""" - try: - result = subprocess.run( - ['vtysh', '-c', command], - capture_output=True, - text=True, - timeout=30 - ) - - if result.returncode != 0: - log_message(f"vtysh command failed: {command}") - return False - - return True - except Exception as e: - log_message(f"Error running vtysh command '{command}': {e}") - return False - -def announce_prefixes(prefixes: Set[str]): - """Анонсирование префиксов через FRR""" - log_message(f"Announcing {len(prefixes)} prefixes...") - - for prefix in sorted(prefixes): - command = f"ip route {prefix} Null0" - if run_vtysh_command(command): - log_message(f"Announced prefix: {prefix}") - else: - log_message(f"Failed to announce prefix: {prefix}") - -def withdraw_prefixes(prefixes: Set[str]): - """Отзыв префиксов через FRR""" - log_message(f"Withdrawing {len(prefixes)} prefixes...") - - for prefix in sorted(prefixes): - command = f"no ip route {prefix} Null0" - if run_vtysh_command(command): - log_message(f"Withdrew prefix: {prefix}") - else: - log_message(f"Failed to withdraw prefix: {prefix}") - -def check_frr_status() -> bool: - """Проверка статуса FRR""" - try: - result = subprocess.run( - ['vtysh', '-c', 'show version'], - capture_output=True, - text=True, - timeout=10 - ) - return result.returncode == 0 - except Exception: - return False - -def main(): - """Основная функция""" - log_message("Starting prefix reload...") - - # Проверка статуса FRR - if not check_frr_status(): - log_message("ERROR: FRR is not running") - return 1 - - # Загрузка новых префиксов - new_prefixes = load_all_prefixes() - log_message(f"Loaded {len(new_prefixes)} prefixes from files") - - # Получение текущих маршрутов - current_routes = get_current_routes() - log_message(f"Found {len(current_routes)} current routes in FRR") - - # Определение изменений - to_add = new_prefixes - current_routes - to_remove = current_routes - new_prefixes - - log_message(f"Changes: {len(to_add)} to add, {len(to_remove)} to remove") - - # Применение изменений - if to_remove: - withdraw_prefixes(to_remove) - - if to_add: - announce_prefixes(to_add) - - # Финальная проверка - final_routes = get_current_routes() - log_message(f"Final route count: {len(final_routes)}") - - if len(final_routes) == len(new_prefixes): - log_message("Reload completed successfully!") - return 0 - else: - log_message("WARNING: Route count mismatch after reload") - 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 deleted file mode 100644 index 398ef7f..0000000 --- a/scripts/start-server.ps1 +++ /dev/null @@ -1,123 +0,0 @@ -# Скрипт запуска BGP Server (FRR) - -param( - [string]$ContainerName = "bgp-server", - [string]$DataPath = "./data", - [string]$LogsPath = "./logs", - [switch]$Build, - [switch]$Force -) - -Write-Host "=== BGP Server (FRR) Startup Script ===" -ForegroundColor Green - -# Проверка существования контейнера -$containerExists = docker ps -a --filter "name=$ContainerName" --format "table {{.Names}}" | Select-String $ContainerName - -if ($containerExists) { - Write-Host "Found existing container: $ContainerName" -ForegroundColor Yellow - - if (-not $Force) { - $response = Read-Host "Do you want to stop and remove the existing container? (y/N)" - if ($response -ne "y" -and $response -ne "Y") { - Write-Host "Operation cancelled." -ForegroundColor Red - exit 0 - } - } - - # Остановка и удаление старого контейнера - Write-Host "Stopping container..." -ForegroundColor Yellow - docker stop $ContainerName - - Write-Host "Removing container..." -ForegroundColor Yellow - docker rm $ContainerName -} - -# Создание директорий если не существуют -if (-not (Test-Path $DataPath)) { - Write-Host "Creating data directory: $DataPath" -ForegroundColor Yellow - New-Item -ItemType Directory -Path $DataPath -Force | Out-Null -} - -if (-not (Test-Path $LogsPath)) { - Write-Host "Creating logs directory: $LogsPath" -ForegroundColor Yellow - New-Item -ItemType Directory -Path $LogsPath -Force | Out-Null -} - -# Создание файла с префиксами если не существует -$prefixesFile = Join-Path $DataPath "prefixes.txt" -if (-not (Test-Path $prefixesFile)) { - Write-Host "Creating default prefixes file..." -ForegroundColor Yellow - @" -# Default prefixes file -# Add your prefixes here, one per line -192.168.100.0/24 -10.0.0.0/8 -172.16.0.0/12 -"@ | Out-File -FilePath $prefixesFile -Encoding UTF8 -} - -# Сборка образа если требуется -if ($Build) { - Write-Host "Building Docker image..." -ForegroundColor Yellow - docker build -t bgp-server-frr . - - if ($LASTEXITCODE -ne 0) { - Write-Host "Failed to build image. Exiting." -ForegroundColor Red - exit 1 - } -} - -# Запуск контейнера -Write-Host "Starting BGP Server container..." -ForegroundColor Yellow -$currentPath = Get-Location -$dataVolume = "${currentPath}\${DataPath}:/app/data:ro" -$logsVolume = "${currentPath}\${LogsPath}:/app/logs" - -docker run -d ` - --name $ContainerName ` - --restart unless-stopped ` - -p 179:179 ` - -v $dataVolume ` - -v $logsVolume ` - --cap-add NET_ADMIN ` - --privileged ` - bgp-server-frr - -if ($LASTEXITCODE -eq 0) { - Write-Host "Container started successfully!" -ForegroundColor Green - - # Ожидание запуска - Write-Host "Waiting for container to start..." -ForegroundColor Yellow - Start-Sleep -Seconds 10 - - # Проверка статуса - $status = docker ps --filter "name=$ContainerName" --format "table {{.Status}}" - Write-Host "Container status: $status" -ForegroundColor Cyan - - # Проверка FRR статуса - Write-Host "Checking FRR status..." -ForegroundColor Cyan - docker exec $ContainerName vtysh -c "show version" 2>$null - - if ($LASTEXITCODE -eq 0) { - Write-Host "FRR is running successfully!" -ForegroundColor Green - - # Показ BGP статуса - Write-Host "BGP Summary:" -ForegroundColor Cyan - docker exec $ContainerName vtysh -c "show ip bgp summary" 2>$null - - # Показ логов - Write-Host "Recent logs:" -ForegroundColor Cyan - docker logs --tail=10 $ContainerName - - Write-Host "`nBGP Server (FRR) is ready!" -ForegroundColor Green - Write-Host "To view logs: docker logs -f $ContainerName" -ForegroundColor Cyan - Write-Host "To check BGP status: docker exec $ContainerName vtysh -c 'show ip bgp summary'" -ForegroundColor Cyan - Write-Host "To access FRR CLI: docker exec -it $ContainerName vtysh" -ForegroundColor Cyan - } else { - Write-Host "FRR failed to start properly. Check logs:" -ForegroundColor Red - docker logs $ContainerName - } -} else { - Write-Host "Failed to start container. Check the error above." -ForegroundColor Red - exit 1 -} \ No newline at end of file diff --git a/scripts/start.sh b/scripts/start.sh deleted file mode 100644 index c78e455..0000000 --- a/scripts/start.sh +++ /dev/null @@ -1,189 +0,0 @@ -#!/bin/bash - -# Скрипт запуска BGP сервера на FRR - -set -e - -echo "Starting BGP Server (FRR)..." - -# Создание директорий если не существуют -mkdir -p /app/logs -mkdir -p /app/run -mkdir -p /app/data -mkdir -p /var/run/frr -mkdir -p /etc/frr - -# Установка правильных прав доступа -chmod 755 /app/logs -chmod 755 /app/run -chmod 755 /app/data -chmod 755 /var/run/frr -chmod 755 /etc/frr - -# Проверка наличия файлов с префиксами -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 "Creating log files with proper permissions..." -touch /app/logs/prefixes.log -touch /app/logs/frr.log -chmod 666 /app/logs/prefixes.log -chmod 666 /app/logs/frr.log - -echo "Prefixes file content:" -cat /app/data/prefixes.txt -echo "---" - -# Проверка прав доступа к файлам -echo "Checking file permissions:" -ls -la /app/data/ -ls -la /app/scripts/ -echo "---" - -# Генерация конфигурации из переменных окружения -echo "Generating FRR configuration from environment variables..." -echo "Environment variables:" -env | grep BGP_ || echo "No BGP_ variables found" -echo "---" - -python3 /app/scripts/generate_config.py - -# Проверка конфигурации -echo "Validating FRR configuration..." -echo "Configuration file content:" -cat /etc/frr/frr.conf -echo "---" - -# Проверка синтаксиса конфигурации FRR -if vtysh -c "show running-config" > /dev/null 2>&1; then - echo "FRR configuration validation passed" -else - echo "FRR configuration validation failed" - echo "Full config content:" - cat /etc/frr/frr.conf - exit 1 -fi - -# Тестовый запуск скрипта загрузки префиксов -echo "Testing prefix loader script..." -python3 /app/scripts/load_prefixes.py --test 2>&1 || echo "Prefix loader test failed (this is normal)" -echo "---" - -# Проверка сетевого подключения -echo "Checking network connectivity..." -NEIGHBOR_IP=${BGP_NEIGHBOR_IP:-192.168.1.1} -if ping -c 1 $NEIGHBOR_IP > /dev/null 2>&1; then - echo "Network connectivity to $NEIGHBOR_IP: OK" -else - echo "Warning: Cannot reach $NEIGHBOR_IP. BGP session may not establish." -fi - -# Запуск FRR демонов -echo "Starting FRR daemons..." - -# Запуск zebra (обязательный демон для FRR) -echo "Starting zebra daemon..." -zebra -d -f /etc/frr/frr.conf -A 127.0.0.1 -z /var/run/frr/zebra.api -sleep 2 - -# Запуск bgpd -echo "Starting bgpd daemon..." -bgpd -d -f /etc/frr/frr.conf -A 127.0.0.1 -z /var/run/frr/zebra.api -sleep 2 - -# Проверка что демоны запустились -echo "Checking if FRR daemons are running..." -ps aux | grep -E "(zebra|bgpd)" | grep -v grep || echo "No FRR daemons found in ps" - -# Сохранение PID файлов -echo "Saving PID files..." -pgrep zebra > /app/logs/zebra.pid 2>/dev/null || echo "zebra PID not found" -pgrep bgpd > /app/logs/bgpd.pid 2>/dev/null || echo "bgpd PID not found" - -# Ожидание запуска -sleep 5 - -# Проверка статуса через vtysh -echo "Checking FRR status via vtysh..." -if vtysh -c "show version" > /dev/null 2>&1; then - echo "FRR started successfully" - echo "FRR version:" - vtysh -c "show version" 2>/dev/null || echo "Could not get version" - - echo "BGP neighbors:" - vtysh -c "show ip bgp neighbors" 2>/dev/null || echo "Could not get BGP neighbors" - - echo "BGP summary:" - vtysh -c "show ip bgp summary" 2>/dev/null || echo "Could not get BGP summary" -else - echo "Failed to start FRR. Checking logs:" - cat /app/logs/frr.log 2>/dev/null || echo "No FRR logs found" - exit 1 -fi - -# Запуск скрипта загрузки префиксов в фоновом режиме -echo "Starting prefix loader in background..." -python3 /app/scripts/load_prefixes.py > /app/logs/prefixes.log 2>&1 & -PREFIX_LOADER_PID=$! -echo $PREFIX_LOADER_PID > /app/logs/prefix_loader.pid - -# Запуск монитора в фоновом режиме -echo "Starting monitor in background..." -python3 /app/scripts/monitor.py > /app/logs/monitor.log 2>&1 & -MONITOR_PID=$! -echo $MONITOR_PID > /app/logs/monitor.pid - -echo "All services started successfully!" -echo "Recent logs:" -tail -10 /app/logs/prefixes.log 2>/dev/null || echo "No prefix logs yet" -echo "---" - -# Функция для graceful shutdown -cleanup() { - echo "Received shutdown signal. Cleaning up..." - - # Остановка скриптов - if [ -f "/app/logs/prefix_loader.pid" ]; then - kill $(cat /app/logs/prefix_loader.pid) 2>/dev/null || true - fi - - if [ -f "/app/logs/monitor.pid" ]; then - kill $(cat /app/logs/monitor.pid) 2>/dev/null || true - fi - - # Отзыв всех префиксов - echo "Withdrawing all prefixes..." - python3 /app/scripts/load_prefixes.py --withdraw > /dev/null 2>&1 || true - - # Остановка FRR демонов - echo "Stopping FRR daemons..." - killall bgpd 2>/dev/null || true - killall zebra 2>/dev/null || true - - echo "Cleanup completed." - exit 0 -} - -# Установка обработчиков сигналов -trap cleanup SIGTERM SIGINT - -# Ожидание завершения -echo "BGP Server is running. Press Ctrl+C to stop." -while true; do - sleep 10 - - # Проверка что демоны все еще работают - if ! pgrep zebra > /dev/null; then - echo "ERROR: zebra daemon stopped unexpectedly" - exit 1 - fi - - if ! pgrep bgpd > /dev/null; then - echo "ERROR: bgpd daemon stopped unexpectedly" - exit 1 - fi -done \ No newline at end of file diff --git a/scripts/stop-server.ps1 b/scripts/stop-server.ps1 deleted file mode 100644 index bf4ddb4..0000000 --- a/scripts/stop-server.ps1 +++ /dev/null @@ -1,66 +0,0 @@ -# Скрипт остановки BGP Server (FRR) - -param( - [string]$ContainerName = "bgp-server", - [switch]$Force -) - -Write-Host "=== BGP Server (FRR) Stop Script ===" -ForegroundColor Green - -# Проверка существования контейнера -$containerExists = docker ps -a --filter "name=$ContainerName" --format "table {{.Names}}" | Select-String $ContainerName - -if (-not $containerExists) { - Write-Host "Container $ContainerName not found." -ForegroundColor Yellow - exit 0 -} - -# Проверка статуса контейнера -$containerRunning = docker ps --filter "name=$ContainerName" --format "table {{.Names}}" | Select-String $ContainerName - -if ($containerRunning) { - Write-Host "Container $ContainerName is running. Stopping..." -ForegroundColor Yellow - - if (-not $Force) { - $response = Read-Host "Do you want to stop the container? (y/N)" - if ($response -ne "y" -and $response -ne "Y") { - Write-Host "Operation cancelled." -ForegroundColor Red - exit 0 - } - } - - # Graceful shutdown - отзыв префиксов - Write-Host "Withdrawing prefixes..." -ForegroundColor Yellow - docker exec $ContainerName python3 /app/scripts/load_prefixes.py --withdraw 2>$null - - # Остановка контейнера - Write-Host "Stopping container..." -ForegroundColor Yellow - docker stop $ContainerName - - if ($LASTEXITCODE -eq 0) { - Write-Host "Container stopped successfully!" -ForegroundColor Green - } else { - Write-Host "Failed to stop container." -ForegroundColor Red - exit 1 - } -} else { - Write-Host "Container $ContainerName is not running." -ForegroundColor Yellow -} - -# Удаление контейнера если требуется -if ($Force) { - Write-Host "Removing container..." -ForegroundColor Yellow - docker rm $ContainerName 2>$null - - if ($LASTEXITCODE -eq 0) { - Write-Host "Container removed successfully!" -ForegroundColor Green - } else { - Write-Host "Container was already removed or removal failed." -ForegroundColor Yellow - } -} else { - Write-Host "Container stopped but not removed." -ForegroundColor Cyan - Write-Host "To remove container, run: docker rm $ContainerName" -ForegroundColor Cyan - Write-Host "Or use -Force parameter to stop and remove in one command." -ForegroundColor Cyan -} - -Write-Host "BGP Server (FRR) stopped successfully!" -ForegroundColor Green \ No newline at end of file diff --git a/scripts/update-container.ps1 b/scripts/update-container.ps1 deleted file mode 100644 index 19f219b..0000000 --- a/scripts/update-container.ps1 +++ /dev/null @@ -1,92 +0,0 @@ -# Скрипт для безопасного обновления BGP Server контейнера - -param( - [string]$ContainerName = "bgp-server", - [string]$ImageName = "git.shts.su/infra/bgp-server:latest", - [string]$DataPath = "./data", - [string]$LogsPath = "./logs", - [switch]$Force -) - -Write-Host "=== BGP Server Container Update Script ===" -ForegroundColor Green - -# Проверка существования контейнера -$containerExists = docker ps -a --filter "name=$ContainerName" --format "table {{.Names}}" | Select-String $ContainerName - -if ($containerExists) { - Write-Host "Found existing container: $ContainerName" -ForegroundColor Yellow - - if (-not $Force) { - $response = Read-Host "Do you want to update the container? (y/N)" - if ($response -ne "y" -and $response -ne "Y") { - Write-Host "Update cancelled." -ForegroundColor Red - exit 0 - } - } - - # Остановка и удаление старого контейнера - Write-Host "Stopping container..." -ForegroundColor Yellow - docker stop $ContainerName - - Write-Host "Removing container..." -ForegroundColor Yellow - docker rm $ContainerName -} else { - Write-Host "No existing container found. Creating new one..." -ForegroundColor Green -} - -# Создание директорий если не существуют -if (-not (Test-Path $DataPath)) { - Write-Host "Creating data directory: $DataPath" -ForegroundColor Yellow - New-Item -ItemType Directory -Path $DataPath -Force | Out-Null -} - -if (-not (Test-Path $LogsPath)) { - Write-Host "Creating logs directory: $LogsPath" -ForegroundColor Yellow - New-Item -ItemType Directory -Path $LogsPath -Force | Out-Null -} - -# Загрузка нового образа -Write-Host "Pulling latest image..." -ForegroundColor Yellow -docker pull $ImageName - -if ($LASTEXITCODE -ne 0) { - Write-Host "Failed to pull image. Exiting." -ForegroundColor Red - exit 1 -} - -# Запуск нового контейнера -Write-Host "Starting new container..." -ForegroundColor Yellow -$currentPath = Get-Location -$dataVolume = "${currentPath}\${DataPath}:/app/data:ro" -$logsVolume = "${currentPath}\${LogsPath}:/app/logs" - -docker run -d ` - --name $ContainerName ` - --restart unless-stopped ` - -p 179:179 ` - -v $dataVolume ` - -v $logsVolume ` - $ImageName - -if ($LASTEXITCODE -eq 0) { - Write-Host "Container started successfully!" -ForegroundColor Green - - # Ожидание запуска - Write-Host "Waiting for container to start..." -ForegroundColor Yellow - Start-Sleep -Seconds 5 - - # Проверка статуса - $status = docker ps --filter "name=$ContainerName" --format "table {{.Status}}" - Write-Host "Container status: $status" -ForegroundColor Cyan - - # Показ логов - Write-Host "Recent logs:" -ForegroundColor Cyan - docker logs --tail=10 $ContainerName - - Write-Host "`nContainer update completed successfully!" -ForegroundColor Green - Write-Host "To view logs: docker logs -f $ContainerName" -ForegroundColor Cyan - Write-Host "To check status: docker ps" -ForegroundColor Cyan -} else { - Write-Host "Failed to start container. Check the error above." -ForegroundColor Red - exit 1 -} \ No newline at end of file diff --git a/start-bgp-server.ps1 b/start-bgp-server.ps1 new file mode 100644 index 0000000..7073182 --- /dev/null +++ b/start-bgp-server.ps1 @@ -0,0 +1,49 @@ +# PowerShell script to start BGP server +# BGP Server Startup Script + +Write-Host "Starting BGP Server with FRRouting..." -ForegroundColor Green + +# Check if Docker is running +try { + docker version | Out-Null + Write-Host "Docker is running" -ForegroundColor Green +} catch { + Write-Host "Error: Docker is not running. Please start Docker Desktop first." -ForegroundColor Red + exit 1 +} + +# Check if docker-compose is available +try { + docker-compose --version | Out-Null + Write-Host "Docker Compose is available" -ForegroundColor Green +} catch { + Write-Host "Error: Docker Compose is not available. Please install Docker Compose." -ForegroundColor Red + exit 1 +} + +# Stop any existing containers +Write-Host "Stopping any existing BGP containers..." -ForegroundColor Yellow +docker-compose down + +# Start the BGP server +Write-Host "Starting BGP server..." -ForegroundColor Yellow +docker-compose up -d + +# Wait for container to start +Start-Sleep -Seconds 5 + +# Check container status +$containerStatus = docker ps --filter "name=bgp-server" --format "table {{.Names}}\t{{.Status}}" +Write-Host "Container status:" -ForegroundColor Cyan +Write-Host $containerStatus + +# Show logs +Write-Host "`nBGP Server logs:" -ForegroundColor Cyan +docker-compose logs bgp-server + +Write-Host "`nBGP Server is running!" -ForegroundColor Green +Write-Host "BGP port: 179" -ForegroundColor White +Write-Host "vtysh port: 2601" -ForegroundColor White +Write-Host "`nTo connect to vtysh: docker exec -it bgp-server vtysh" -ForegroundColor Yellow +Write-Host "To view logs: docker-compose logs -f bgp-server" -ForegroundColor Yellow +Write-Host "To stop server: docker-compose down" -ForegroundColor Yellow \ No newline at end of file diff --git a/stop-bgp-server.ps1 b/stop-bgp-server.ps1 new file mode 100644 index 0000000..18961ee --- /dev/null +++ b/stop-bgp-server.ps1 @@ -0,0 +1,28 @@ +# PowerShell script to stop BGP server +# BGP Server Stop Script + +Write-Host "Stopping BGP Server..." -ForegroundColor Yellow + +# Stop the BGP server +Write-Host "Stopping BGP containers..." -ForegroundColor Yellow +docker-compose down + +# Remove volumes (optional - uncomment if you want to clean up completely) +# Write-Host "Removing volumes..." -ForegroundColor Yellow +# docker-compose down -v + +# Check if containers are stopped +$runningContainers = docker ps --filter "name=bgp-server" --format "{{.Names}}" +if ($runningContainers) { + Write-Host "Warning: Some BGP containers are still running:" -ForegroundColor Red + Write-Host $runningContainers -ForegroundColor Red +} else { + Write-Host "BGP Server stopped successfully!" -ForegroundColor Green +} + +# Show stopped containers +$stoppedContainers = docker ps -a --filter "name=bgp-server" --format "table {{.Names}}\t{{.Status}}" +Write-Host "`nContainer status:" -ForegroundColor Cyan +Write-Host $stoppedContainers + +Write-Host "`nTo start the server again, run: .\start-bgp-server.ps1" -ForegroundColor Yellow \ No newline at end of file diff --git a/update-prefixes.ps1 b/update-prefixes.ps1 new file mode 100644 index 0000000..1fe665e --- /dev/null +++ b/update-prefixes.ps1 @@ -0,0 +1,40 @@ +# PowerShell script to update BGP prefixes +# BGP Prefixes Update Script + +param( + [string]$PrefixesFile = "prefixes.txt" +) + +Write-Host "Updating BGP Prefixes..." -ForegroundColor Cyan + +# Check if container is running +$containerStatus = docker ps --filter "name=bgp-server" --format "{{.Names}}" +if (-not $containerStatus) { + Write-Host "Error: BGP container is not running. Please start it first." -ForegroundColor Red + Write-Host "Run: .\start-bgp-server.ps1" -ForegroundColor Yellow + exit 1 +} + +# Check if prefixes file exists +if (-not (Test-Path $PrefixesFile)) { + Write-Host "Error: Prefixes file '$PrefixesFile' not found." -ForegroundColor Red + exit 1 +} + +# Copy new prefixes file to container +Write-Host "Copying new prefixes file to container..." -ForegroundColor Yellow +docker cp $PrefixesFile bgp-server:/etc/frr/prefixes.txt + +# Reload BGP configuration +Write-Host "Reloading BGP configuration..." -ForegroundColor Yellow +docker exec bgp-server vtysh -c "configure terminal" -c "router bgp 65000" -c "clear ip bgp *" -c "end" + +# Wait a moment for BGP to stabilize +Start-Sleep -Seconds 3 + +# Show updated BGP table +Write-Host "`nUpdated BGP table:" -ForegroundColor Green +docker exec bgp-server vtysh -c "show ip bgp" + +Write-Host "`nPrefixes updated successfully!" -ForegroundColor Green +Write-Host "To view current prefixes: docker exec -it bgp-server vtysh -c 'show ip bgp'" -ForegroundColor Yellow \ No newline at end of file