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