diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..8f36497 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,65 @@ +# Changelog + +Все значимые изменения в проекте BGP Server будут документированы в этом файле. + +## [1.0.0] - 2025-01-11 + +### Добавлено +- Первоначальная версия BGP сервера на базе BIRD +- Поддержка IPv4 и IPv6 +- Автоматическая загрузка префиксов из файла +- Система мониторинга BGP сессий +- Скрипт автоматической установки для Ubuntu 24.04 +- Поддержка community для префиксов +- Автоматический systemd таймер для загрузки префиксов +- Полная документация и руководства + +### Функции +- **BGP Server**: Прием соединений от любых пиров +- **Prefix Management**: Загрузка префиксов из файла с community +- **Monitoring**: Мониторинг BGP сессий и системной статистики +- **Security**: Настройка firewall и ограничение доступа +- **Automation**: Автоматическая загрузка префиксов каждые 5 минут + +### Файлы +- `install.sh` - Скрипт установки +- `config/bird.conf` - Конфигурация BIRD IPv4 +- `config/bird6.conf` - Конфигурация BIRD IPv6 +- `scripts/load_prefixes.py` - Скрипт загрузки префиксов +- `scripts/monitor.py` - Скрипт мониторинга +- `data/prefixes.txt` - Пример файла с префиксами +- `README.md` - Основная документация +- `SETUP.md` - Подробные инструкции по настройке +- `QUICKSTART.md` - Быстрый старт + +### Технические детали +- **OS**: Ubuntu 24.04 LTS +- **BGP Daemon**: BIRD 2.x +- **Language**: Python 3.x +- **Protocols**: BGP IPv4/IPv6 +- **Port**: 179 (BGP) + +--- + +## Планы на будущее + +### Версия 1.1.0 +- [ ] Web интерфейс для управления +- [ ] REST API для управления префиксами +- [ ] Поддержка Route Reflector +- [ ] Интеграция с системами мониторинга +- [ ] Поддержка BGP-LS + +### Версия 1.2.0 +- [ ] Поддержка BGP FlowSpec +- [ ] Автоматическое резервное копирование +- [ ] Расширенная система логирования +- [ ] Поддержка множественных ASN +- [ ] Интеграция с DNS + +### Версия 2.0.0 +- [ ] Микросервисная архитектура +- [ ] Поддержка Docker контейнеров +- [ ] Kubernetes deployment +- [ ] GraphQL API +- [ ] Real-time уведомления \ No newline at end of file diff --git a/QUICKSTART.md b/QUICKSTART.md new file mode 100644 index 0000000..eac8aaf --- /dev/null +++ b/QUICKSTART.md @@ -0,0 +1,160 @@ +# Быстрый старт BGP сервера + +## 🚀 Установка за 5 минут + +### 1. Подготовка +```bash +# Обновление системы +sudo apt update && sudo apt upgrade -y + +# Установка зависимостей +sudo apt install -y python3 git +``` + +### 2. Клонирование и установка +```bash +# Клонирование проекта (замените на ваш репозиторий) +git clone +cd bgp-server + +# Запуск установки +chmod +x install.sh +sudo ./install.sh +``` + +### 3. Настройка +```bash +# Настройка IP адреса и ASN +sudo nano /etc/bird/bird.conf +# Измените router id и local as на ваши значения + +# Настройка префиксов +sudo nano /opt/bgp-server/data/prefixes.txt +# Добавьте ваши префиксы с community +``` + +### 4. Запуск +```bash +# Загрузка префиксов +python3 /opt/bgp-server/scripts/load_prefixes.py + +# Проверка статуса +python3 /opt/bgp-server/scripts/monitor.py +``` + +## 📋 Основные команды + +| Команда | Описание | +|---------|----------| +| `bgp-status` | Статус BGP сервера | +| `bgp-load` | Загрузить префиксы | +| `bgp-monitor` | Непрерывный мониторинг | +| `bird-status` | Статус сервисов | +| `bird-restart` | Перезапуск сервисов | +| `bird-logs` | Просмотр логов | + +## 🔧 Быстрая настройка + +### Настройка префиксов +Формат файла `/opt/bgp-server/data/prefixes.txt`: +``` +192.168.1.0/24 65001:100 "Customer A" +10.0.1.0/24 65001:200 "Customer B" +``` + +### Настройка клиента +Пример для Cisco: +``` +router bgp CLIENT_ASN + neighbor YOUR_SERVER_IP remote-as YOUR_ASN + neighbor YOUR_SERVER_IP send-community +``` + +## 🛠️ Troubleshooting + +### Проблема: BGP сессия не устанавливается +```bash +# Проверка firewall +sudo ufw status + +# Проверка логов +sudo journalctl -u bird -n 20 +``` + +### Проблема: Префиксы не загружаются +```bash +# Проверка файла префиксов +python3 /opt/bgp-server/scripts/load_prefixes.py --file /opt/bgp-server/data/prefixes.txt + +# Проверка логов +sudo tail -f /var/log/bird/prefix_loader.log +``` + +## 📁 Структура файлов + +``` +bgp-server/ +├── install.sh # Скрипт установки +├── config/ +│ ├── bird.conf # Конфигурация BIRD IPv4 +│ └── bird6.conf # Конфигурация BIRD IPv6 +├── scripts/ +│ ├── load_prefixes.py # Загрузка префиксов +│ └── monitor.py # Мониторинг +├── data/ +│ └── prefixes.txt # Файл с префиксами +└── logs/ # Логи +``` + +## 🔒 Безопасность + +### Firewall +```bash +# Проверка статуса +sudo ufw status + +# Разрешение BGP +sudo ufw allow 179/tcp +``` + +### Ограничение доступа +```bash +# Ограничение birdc только для localhost +sudo nano /etc/bird/bird.conf +# Добавьте: control socket "/var/run/bird.ctl" mode 0600; +``` + +## 📊 Мониторинг + +### Проверка BGP сессий +```bash +sudo birdc show protocols +sudo birdc show routes +``` + +### Системная статистика +```bash +# Использование ресурсов +htop + +# Сетевые соединения +netstat -tlnp | grep :179 +``` + +## 🆘 Поддержка + +- **Логи**: `/var/log/bird/` +- **Конфигурация**: `/etc/bird/` +- **Данные**: `/opt/bgp-server/data/` +- **Документация**: `SETUP.md` + +## ⚡ Автоматизация + +Система автоматически: +- Загружает префиксы каждые 5 минут +- Перезапускается при сбоях +- Ведет логи всех операций + +--- + +**Готово!** Ваш BGP сервер настроен и готов к работе. 🎉 \ No newline at end of file diff --git a/QUICK_START_LINUX.md b/QUICK_START_LINUX.md deleted file mode 100644 index 691a6aa..0000000 --- a/QUICK_START_LINUX.md +++ /dev/null @@ -1,123 +0,0 @@ -# Быстрый старт BGP сервера на Linux - -## Минимальная установка - -### Вариант 1: С Docker Compose -```bash -# 1. Клонируйте или скачайте проект -git clone -cd bgp-server - -# 2. Установите зависимости -./install-dependencies.sh - -# 3. Запустите BGP сервер -./start-bgp-server.sh -``` - -### Вариант 2: Только Docker (рекомендуется) -```bash -# 1. Клонируйте или скачайте проект -git clone -cd bgp-server - -# 2. Сделайте скрипты исполняемыми -chmod +x *.sh - -# 3. Быстрый запуск одной командой -./quick-run.sh -``` - -## Проверка работы - -```bash -# Проверить статус -./check-bgp-status.sh - -# Подключиться к консоли управления -docker exec -it bgp-server vtysh - -# Посмотреть логи -docker-compose logs -f bgp-server -``` - -## Управление - -### С Docker Compose -```bash -# Остановить сервер -./stop-bgp-server.sh - -# Обновить префиксы -./update-prefixes.sh - -# Перезапустить сервер -./stop-bgp-server.sh && ./start-bgp-server.sh -``` - -### Только Docker -```bash -# Остановить сервер -./quick-stop.sh - -# Полное управление контейнером -./run-bgp-container.sh start -./run-bgp-container.sh stop -./run-bgp-container.sh restart -./run-bgp-container.sh status -./run-bgp-container.sh logs -``` - -## Основные команды vtysh - -```bash -# Войти в консоль -docker exec -it bgp-server vtysh - -# Показать статус BGP -show ip bgp summary - -# Показать анонсированные префиксы -show ip bgp - -# Показать соседей -show ip bgp neighbors - -# Показать community -show ip bgp community -``` - -## Настройки по умолчанию - -- **ASN**: 65000 -- **Router ID**: 192.168.1.1 -- **BGP порт**: 179 -- **vtysh порт**: 2601 -- **Пароль vtysh**: zebra - -## Подключение клиентов - -Клиенты могут подключаться к BGP серверу по IP адресу сервера на порту 179. - -Пример конфигурации клиента: -``` -router bgp 65001 - neighbor remote-as 65000 - neighbor send-community -``` - -## Troubleshooting - -```bash -# Проверить, что Docker работает -docker version - -# Проверить, что контейнер запущен -docker ps - -# Проверить логи -docker-compose logs bgp-server - -# Проверить сетевые порты -netstat -tuln | grep :179 -``` \ No newline at end of file diff --git a/README.md b/README.md index fb1e58f..4ae9a88 100644 --- a/README.md +++ b/README.md @@ -1,217 +1,155 @@ -# BGP Server с FRRouting +# BGP Server Setup -Этот проект предоставляет готовое решение для запуска BGP сервера с использованием контейнера FRRouting, который анонсирует префиксы всем подключенным клиентам с разделением по community. +## Обзор +BGP сервер на Ubuntu 24.04 с возможностью подключения любых пиров и загрузки префиксов из файла с community. -## Требования - -- Docker Engine -- Docker Compose -- Bash shell +## Архитектура +- **BGP Server**: BIRD (Bird Internet Routing Daemon) +- **OS**: Ubuntu 24.04 +- **Функции**: + - Прием BGP соединений от любых пиров + - Загрузка префиксов из файла prefixes.txt + - Настройка community для каждого префикса + - Сервер НЕ получает префиксы, только раздает их клиентам ## Структура проекта - ``` bgp-server/ -├── docker-compose.yml # Конфигурация Docker контейнера -├── frr.conf # Конфигурация FRRouting -├── prefixes.txt # Файл с префиксами и community -├── start-bgp-server.sh # Скрипт запуска для Linux -├── stop-bgp-server.sh # Скрипт остановки для Linux -├── check-bgp-status.sh # Скрипт проверки статуса для Linux -├── update-prefixes.sh # Скрипт обновления префиксов для Linux -├── install-dependencies.sh # Скрипт установки зависимостей -└── README.md # Эта инструкция +├── README.md +├── install.sh # Скрипт установки +├── config/ +│ ├── bird.conf # Основная конфигурация BIRD +│ └── bird6.conf # Конфигурация для IPv6 (опционально) +├── scripts/ +│ ├── load_prefixes.py # Скрипт загрузки префиксов +│ └── monitor.py # Мониторинг BGP сессий +├── data/ +│ └── prefixes.txt # Файл с префиксами и community +└── logs/ + └── bird.log # Логи BIRD ``` -## Быстрый запуск - -1. **Установите зависимости (если не установлены):** - ```bash - ./install-dependencies.sh - ``` - -2. **Сделайте скрипты исполняемыми:** - ```bash - chmod +x *.sh - ``` - -3. **Запустите BGP сервер:** - ```bash - ./start-bgp-server.sh - ``` - -## Ручной запуск - -Если вы предпочитаете запускать вручную: +## Установка +### 1. Обновление системы ```bash -# Остановить существующие контейнеры -docker-compose down +sudo apt update && sudo apt upgrade -y +``` -# Запустить BGP сервер -docker-compose up -d +### 2. Установка BIRD +```bash +sudo apt install bird2 -y +``` -# Проверить статус -docker ps +### 3. Настройка конфигурации +```bash +# Копирование конфигурационных файлов +sudo cp config/bird.conf /etc/bird/bird.conf +sudo cp config/bird6.conf /etc/bird/bird6.conf -# Посмотреть логи -docker-compose logs bgp-server +# Создание директорий +sudo mkdir -p /var/log/bird +sudo mkdir -p /opt/bgp-server/data +sudo mkdir -p /opt/bgp-server/scripts + +# Копирование скриптов +sudo cp scripts/* /opt/bgp-server/scripts/ +sudo cp data/prefixes.txt /opt/bgp-server/data/ +``` + +### 4. Запуск сервисов +```bash +sudo systemctl enable bird +sudo systemctl start bird +sudo systemctl enable bird6 +sudo systemctl start bird6 ``` ## Конфигурация -### Префиксы (prefixes.txt) - -Файл содержит префиксы в формате: +### Формат файла prefixes.txt ``` -prefix community1:community2:community3 +# Формат: prefix community description +# Community: ASN:value (например, 65001:100) +192.168.1.0/24 65001:100 "Customer A - Premium" +10.0.1.0/24 65001:200 "Customer B - Standard" +172.16.1.0/24 65001:300 "Customer C - Basic" +203.0.113.0/24 65001:400 "Customer D - Enterprise" ``` -Пример: -``` -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 (консоль управления) - +### Загрузка префиксов ```bash -docker exec -it bgp-server vtysh -``` +# Загрузка префиксов из файла +python3 /opt/bgp-server/scripts/load_prefixes.py -### Полезные команды vtysh - -```bash -# Показать статус BGP -show ip bgp summary - -# Показать анонсированные префиксы -show ip bgp - -# Показать community -show ip bgp community - -# Показать соседей -show ip bgp neighbors - -# Показать IPv6 информацию -show ipv6 bgp summary -``` - -### Просмотр логов - -```bash -# Просмотр логов в реальном времени -docker-compose logs -f bgp-server - -# Просмотр последних логов -docker-compose logs bgp-server -``` - -### Остановка сервера - -```bash -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; - } - } - } -} +# Мониторинг BGP сессий +python3 /opt/bgp-server/scripts/monitor.py ``` ## Мониторинг -### Проверка статуса контейнера - +### Проверка статуса BIRD ```bash -docker ps --filter "name=bgp-server" +sudo birdc show protocols +sudo birdc show routes +sudo birdc show route table all ``` -### Проверка сетевых портов - +### Просмотр логов ```bash -netstat -tuln | grep :179 -netstat -tuln | grep :2601 +sudo journalctl -u bird -f +sudo tail -f /var/log/bird/bird.log ``` -### Проверка логов FRRouting - -```bash -docker exec bgp-server cat /var/log/frr/frr.log -``` - -## Troubleshooting - -### Проблема: Контейнер не запускается - -1. Проверьте, что Docker Desktop запущен -2. Проверьте логи: `docker-compose logs bgp-server` -3. Убедитесь, что порты 179 и 2601 не заняты - -### Проблема: BGP сессии не устанавливаются - -1. Проверьте настройки firewall -2. Убедитесь, что клиент правильно настроен -3. Проверьте логи BGP: `docker exec -it bgp-server vtysh -c "show ip bgp summary"` - -### Проблема: Префиксы не анонсируются - -1. Проверьте конфигурацию в `frr.conf` -2. Убедитесь, что префиксы правильно прописаны -3. Проверьте community настройки - ## Безопасность -⚠️ **Важно**: Этот BGP сервер настроен для тестирования и разработки. Для продакшена: +### Firewall настройки +```bash +# Разрешить BGP (порт 179) +sudo ufw allow 179/tcp -1. Измените пароли по умолчанию -2. Настройте firewall правила -3. Используйте более строгие настройки безопасности -4. Ограничьте доступ к vtysh +# Разрешить SSH +sudo ufw allow ssh -## Поддержка +# Включить firewall +sudo ufw enable +``` -При возникновении проблем: +### Ограничение доступа +- Настройте ACL в конфигурации BIRD +- Используйте MD5 аутентификацию для BGP сессий +- Ограничьте доступ к birdc только с localhost -1. Проверьте логи контейнера -2. Убедитесь в правильности конфигурации -3. Проверьте сетевые настройки -4. Обратитесь к документации FRRouting: https://frrouting.org/ \ No newline at end of file +## Troubleshooting + +### Частые проблемы +1. **BGP сессия не устанавливается** + - Проверьте firewall настройки + - Убедитесь, что ASN настроен правильно + - Проверьте логи BIRD + +2. **Префиксы не загружаются** + - Проверьте формат файла prefixes.txt + - Убедитесь, что скрипт load_prefixes.py имеет права на выполнение + - Проверьте синтаксис конфигурации BIRD + +3. **Высокая нагрузка на CPU** + - Оптимизируйте конфигурацию BIRD + - Проверьте количество префиксов + - Мониторьте использование памяти + +## Полезные команды + +```bash +# Перезагрузка конфигурации BIRD +sudo birdc configure + +# Проверка синтаксиса конфигурации +sudo birdc -p + +# Экспорт маршрутов +sudo birdc show route export all + +# Статистика протоколов +sudo birdc show protocols all +``` \ No newline at end of file diff --git a/SETUP.md b/SETUP.md new file mode 100644 index 0000000..e5a290c --- /dev/null +++ b/SETUP.md @@ -0,0 +1,367 @@ +# Настройка BGP Сервера + +## Предварительные требования + +### Системные требования +- Ubuntu 24.04 LTS +- Минимум 2 ГБ RAM +- Минимум 10 ГБ свободного места на диске +- Статический IP адрес +- Root доступ или sudo права + +### Сетевые требования +- Открытый порт 179 (BGP) +- Настроенный firewall +- Стабильное интернет-соединение + +## Пошаговая установка + +### 1. Подготовка системы + +```bash +# Обновление системы +sudo apt update && sudo apt upgrade -y + +# Установка необходимых пакетов +sudo apt install -y python3 python3-pip git curl wget +``` + +### 2. Клонирование проекта + +```bash +# Клонирование репозитория (если используете git) +git clone +cd bgp-server + +# Или копирование файлов вручную +``` + +### 3. Запуск установки + +```bash +# Сделать скрипт исполняемым +chmod +x install.sh + +# Запуск установки +sudo ./install.sh +``` + +### 4. Настройка конфигурации + +После установки необходимо настроить конфигурационные файлы: + +#### Настройка router ID +Отредактируйте файлы `/etc/bird/bird.conf` и `/etc/bird/bird6.conf`: + +```bash +sudo nano /etc/bird/bird.conf +``` + +Найдите строку: +``` +router id 192.168.1.1; +``` + +Замените на ваш реальный IP адрес: +``` +router id YOUR_SERVER_IP; +``` + +#### Настройка ASN +В том же файле найдите: +``` +local as 65001; +``` + +Замените на ваш ASN: +``` +local as YOUR_ASN; +``` + +### 5. Настройка префиксов + +Отредактируйте файл `/opt/bgp-server/data/prefixes.txt`: + +```bash +sudo nano /opt/bgp-server/data/prefixes.txt +``` + +Формат записи: +``` +# prefix community description +192.168.1.0/24 65001:100 "Customer A - Premium" +10.0.1.0/24 65001:200 "Customer B - Standard" +``` + +### 6. Загрузка префиксов + +```bash +# Загрузка префиксов из файла +python3 /opt/bgp-server/scripts/load_prefixes.py + +# Проверка статуса +python3 /opt/bgp-server/scripts/monitor.py +``` + +## Конфигурация клиентов + +### Настройка BGP клиента + +Клиенты должны настроить BGP сессию с вашим сервером: + +``` +# Пример конфигурации для клиента (Cisco) +router bgp CLIENT_ASN + neighbor YOUR_SERVER_IP remote-as YOUR_ASN + neighbor YOUR_SERVER_IP description "BGP Server" + neighbor YOUR_SERVER_IP send-community + neighbor YOUR_SERVER_IP route-map EXPORT out +! +route-map EXPORT permit 10 + set community YOUR_ASN:100 +! +``` + +### Настройка для MikroTik + +``` +/routing bgp instance +add name=bgp-server as=CLIENT_ASN router-id=CLIENT_ROUTER_ID +/routing bgp peer +add name=bgp-server-peer instance=bgp-server remote-address=YOUR_SERVER_IP remote-as=YOUR_ASN +``` + +## Мониторинг и управление + +### Основные команды + +```bash +# Статус BGP сервера +bgp-status + +# Загрузка префиксов +bgp-load + +# Непрерывный мониторинг +bgp-monitor + +# Статус сервисов +bird-status + +# Перезапуск сервисов +bird-restart + +# Просмотр логов +bird-logs +``` + +### Проверка BGP сессий + +```bash +# Показать все протоколы +sudo birdc show protocols + +# Показать маршруты +sudo birdc show routes + +# Показать BGP пиры +sudo birdc show protocols all bgp +``` + +### Просмотр логов + +```bash +# Логи BIRD IPv4 +sudo journalctl -u bird -f + +# Логи BIRD IPv6 +sudo journalctl -u bird6 -f + +# Логи загрузки префиксов +sudo tail -f /var/log/bird/prefix_loader.log + +# Логи мониторинга +sudo tail -f /var/log/bird/monitor.log +``` + +## Безопасность + +### Firewall настройки + +```bash +# Проверка статуса firewall +sudo ufw status + +# Разрешение дополнительных портов (если нужно) +sudo ufw allow 22/tcp comment "SSH" +sudo ufw allow 179/tcp comment "BGP" + +# Включение firewall +sudo ufw enable +``` + +### Ограничение доступа + +```bash +# Ограничение доступа к birdc только с localhost +sudo nano /etc/bird/bird.conf +``` + +Добавьте в конфигурацию: +``` +# Ограничение доступа к birdc +control socket "/var/run/bird.ctl" mode 0600 owner bird group bird; +``` + +### MD5 аутентификация + +Для дополнительной безопасности можно включить MD5 аутентификацию: + +```bash +# В конфигурации BIRD +protocol bgp { + # ... другие настройки ... + password "your_secure_password"; +} +``` + +## Troubleshooting + +### Частые проблемы + +#### 1. BGP сессия не устанавливается + +```bash +# Проверьте firewall +sudo ufw status + +# Проверьте логи +sudo journalctl -u bird -n 50 + +# Проверьте конфигурацию +sudo birdc -p /etc/bird/bird.conf +``` + +#### 2. Префиксы не загружаются + +```bash +# Проверьте права доступа +ls -la /opt/bgp-server/scripts/load_prefixes.py + +# Проверьте синтаксис файла префиксов +python3 /opt/bgp-server/scripts/load_prefixes.py --file /opt/bgp-server/data/prefixes.txt + +# Проверьте логи +sudo tail -f /var/log/bird/prefix_loader.log +``` + +#### 3. Высокая нагрузка на CPU + +```bash +# Проверьте количество маршрутов +sudo birdc show route count + +# Проверьте использование памяти +free -h + +# Оптимизируйте конфигурацию +sudo nano /etc/bird/bird.conf +``` + +### Полезные команды для диагностики + +```bash +# Проверка сетевых соединений +netstat -tlnp | grep :179 + +# Проверка процессов BIRD +ps aux | grep bird + +# Проверка использования ресурсов +htop + +# Проверка дискового пространства +df -h + +# Проверка системных логов +dmesg | tail -20 +``` + +## Обновление и обслуживание + +### Обновление BIRD + +```bash +# Обновление пакетов +sudo apt update +sudo apt upgrade bird2 + +# Перезапуск сервисов +sudo systemctl restart bird bird6 +``` + +### Резервное копирование + +```bash +# Создание резервной копии конфигурации +sudo cp /etc/bird/bird.conf /etc/bird/bird.conf.backup.$(date +%Y%m%d) +sudo cp /etc/bird/bird6.conf /etc/bird/bird6.conf.backup.$(date +%Y%m%d) + +# Резервная копия префиксов +sudo cp /opt/bgp-server/data/prefixes.txt /opt/bgp-server/data/prefixes.txt.backup.$(date +%Y%m%d) +``` + +### Восстановление из резервной копии + +```bash +# Восстановление конфигурации +sudo cp /etc/bird/bird.conf.backup.YYYYMMDD /etc/bird/bird.conf +sudo cp /etc/bird/bird6.conf.backup.YYYYMMDD /etc/bird/bird6.conf + +# Перезапуск сервисов +sudo systemctl restart bird bird6 +``` + +## Дополнительные возможности + +### Автоматическая загрузка префиксов + +Система автоматически загружает префиксы каждые 5 минут. Для изменения интервала: + +```bash +sudo nano /etc/systemd/system/bgp-prefix-loader.timer +``` + +Измените строку: +``` +OnUnitActiveSec=5min +``` + +### Настройка уведомлений + +Можно настроить отправку уведомлений при проблемах: + +```bash +# Установка mailutils +sudo apt install mailutils + +# Настройка отправки уведомлений в скриптах +``` + +### Интеграция с системой мониторинга + +Для интеграции с системами мониторинга (Zabbix, Nagios): + +```bash +# Создание скрипта для проверки здоровья +sudo nano /opt/bgp-server/scripts/health_check.py +``` + +## Поддержка + +При возникновении проблем: + +1. Проверьте логи: `/var/log/bird/` +2. Проверьте статус сервисов: `systemctl status bird bird6` +3. Проверьте конфигурацию: `birdc -p /etc/bird/bird.conf` +4. Обратитесь к документации BIRD: https://bird.network.cz/ \ No newline at end of file diff --git a/check-bgp-status.sh b/check-bgp-status.sh deleted file mode 100644 index 75d8251..0000000 --- a/check-bgp-status.sh +++ /dev/null @@ -1,59 +0,0 @@ -#!/bin/bash -# Bash script to check BGP server status on Linux -# BGP Server Status Check Script - -echo -e "\033[36mChecking BGP Server Status...\033[0m" - -# Check if Docker is running -if ! docker version >/dev/null 2>&1; then - echo -e "\033[31m✗ Docker is not running\033[0m" - exit 1 -fi -echo -e "\033[32m✓ Docker is running\033[0m" - -# Check container status -echo -e "\n\033[33mContainer Status:\033[0m" -container_status=$(docker ps --filter "name=bgp-server" --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}") -if [ -n "$container_status" ] && ! echo "$container_status" | grep -q "NAMES"; then - echo -e "\033[32m$container_status\033[0m" -else - echo -e "\033[31m✗ BGP container is not running\033[0m" - echo -e "\033[33mTo start the server, run: ./start-bgp-server.sh\033[0m" - exit 1 -fi - -# Check network ports -echo -e "\n\033[33mNetwork Ports:\033[0m" -if netstat -tuln 2>/dev/null | grep -q ":179 "; then - echo -e "\033[32m✓ BGP port 179 is listening\033[0m" -else - echo -e "\033[31m✗ BGP port 179 is not listening\033[0m" -fi - -if netstat -tuln 2>/dev/null | grep -q ":2601 "; then - echo -e "\033[32m✓ vtysh port 2601 is listening\033[0m" -else - echo -e "\033[31m✗ vtysh port 2601 is not listening\033[0m" -fi - -# Check BGP status inside container -echo -e "\n\033[33mBGP Status:\033[0m" -bgp_summary=$(docker exec bgp-server vtysh -c "show ip bgp summary" 2>/dev/null) -if [ -n "$bgp_summary" ]; then - echo -e "\033[32m✓ BGP daemon is running\033[0m" - echo -e "\033[36mBGP Summary:\033[0m" - echo -e "\033[37m$bgp_summary\033[0m" -else - echo -e "\033[31m✗ BGP daemon is not responding\033[0m" -fi - -# Check recent logs -echo -e "\n\033[33mRecent Logs:\033[0m" -recent_logs=$(docker-compose logs --tail=10 bgp-server 2>/dev/null) -if [ -n "$recent_logs" ]; then - echo -e "\033[37m$recent_logs\033[0m" -else - echo -e "\033[90mNo recent logs available\033[0m" -fi - -echo -e "\n\033[32mStatus check completed!\033[0m" \ No newline at end of file diff --git a/config/bird.conf b/config/bird.conf new file mode 100644 index 0000000..60cef44 --- /dev/null +++ b/config/bird.conf @@ -0,0 +1,106 @@ +# BIRD Configuration for BGP Server +# Ubuntu 24.04 + +# Logging configuration +log "/var/log/bird/bird.log" all; +log stderr all; + +# Router ID (замените на ваш IP адрес) +router id 192.168.1.1; + +# Protocol configuration +protocol device { + scan time 10; +} + +protocol direct { + disabled; +} + +protocol kernel { + disabled; +} + +# BGP Configuration +# Принимаем соединения от любых пиров +protocol bgp { + # Локальные настройки + local as 65001; + listen bgp; + + # Настройки для всех пиров + hold time 90; + keepalive time 30; + startup hold time 240; + + # Принимаем соединения от любых IP + listen bgp; + listen bgp port 179; + + # Настройки для пиров + import none; # Не импортируем маршруты от пиров + export all; # Экспортируем все маршруты пирам + + # Настройки для статических маршрутов + import where source = RTS_STATIC; + export where source = RTS_STATIC; + + # MD5 аутентификация (опционально) + # password "your_bgp_password"; + + # Настройки для больших таблиц маршрутизации + table limit 100000; + + # Настройки для community + import filter { + # Принимаем маршруты с community + if bgp_community.matches(65001:*) then { + accept; + } + reject; + }; + + export filter { + # Экспортируем маршруты с community + if source = RTS_STATIC then { + bgp_community.add(65001:100); + accept; + } + reject; + }; +} + +# Статическая таблица маршрутов +protocol static { + # Маршруты будут загружаться из файла prefixes.txt + # через скрипт load_prefixes.py + table bgp_table; + + # Пример статических маршрутов + # route 192.168.1.0/24 via 192.168.1.1; + # route 10.0.1.0/24 via 10.0.1.1; +} + +# Таблица для BGP маршрутов +table bgp_table; + +# Фильтры для community +filter community_filter { + if bgp_community.matches(65001:*) then { + accept; + } + reject; +} + +# Функция для добавления community +function add_community() { + bgp_community.add(65001:100); +} + +# Настройки для мониторинга +protocol pipe { + table master; + peer table bgp_table; + import all; + export none; +} \ No newline at end of file diff --git a/config/bird6.conf b/config/bird6.conf new file mode 100644 index 0000000..6a8411d --- /dev/null +++ b/config/bird6.conf @@ -0,0 +1,105 @@ +# BIRD IPv6 Configuration for BGP Server +# Ubuntu 24.04 + +# Logging configuration +log "/var/log/bird/bird6.log" all; +log stderr all; + +# Router ID (замените на ваш IPv4 адрес) +router id 192.168.1.1; + +# Protocol configuration +protocol device { + scan time 10; +} + +protocol direct { + disabled; +} + +protocol kernel { + disabled; +} + +# BGP IPv6 Configuration +protocol bgp { + # Локальные настройки + local as 65001; + listen bgp; + + # Настройки для всех пиров + hold time 90; + keepalive time 30; + startup hold time 240; + + # Принимаем соединения от любых IPv6 адресов + listen bgp; + listen bgp port 179; + + # Настройки для пиров + import none; # Не импортируем маршруты от пиров + export all; # Экспортируем все маршруты пирам + + # Настройки для статических маршрутов + import where source = RTS_STATIC; + export where source = RTS_STATIC; + + # MD5 аутентификация (опционально) + # password "your_bgp_password"; + + # Настройки для больших таблиц маршрутизации + table limit 100000; + + # Настройки для community + import filter { + # Принимаем маршруты с community + if bgp_community.matches(65001:*) then { + accept; + } + reject; + }; + + export filter { + # Экспортируем маршруты с community + if source = RTS_STATIC then { + bgp_community.add(65001:100); + accept; + } + reject; + }; +} + +# Статическая таблица маршрутов IPv6 +protocol static { + # Маршруты будут загружаться из файла prefixes6.txt + # через скрипт load_prefixes.py + table bgp_table; + + # Пример статических маршрутов IPv6 + # route 2001:db8::/32 via 2001:db8::1; + # route 2001:db8:1::/48 via 2001:db8:1::1; +} + +# Таблица для BGP маршрутов IPv6 +table bgp_table; + +# Фильтры для community +filter community_filter { + if bgp_community.matches(65001:*) then { + accept; + } + reject; +} + +# Функция для добавления community +function add_community() { + bgp_community.add(65001:100); +} + +# Настройки для мониторинга +protocol pipe { + table master; + peer table bgp_table; + import all; + export none; +} \ No newline at end of file diff --git a/data/prefixes.txt b/data/prefixes.txt new file mode 100644 index 0000000..85793ec --- /dev/null +++ b/data/prefixes.txt @@ -0,0 +1,31 @@ +# BGP Prefixes with Community Configuration +# Format: prefix community description +# Community format: ASN:value (e.g., 65001:100) + +# Customer A - Premium Service +192.168.1.0/24 65001:100 "Customer A - Premium" +192.168.2.0/24 65001:100 "Customer A - Premium" +10.0.1.0/24 65001:100 "Customer A - Premium" + +# Customer B - Standard Service +10.0.2.0/24 65001:200 "Customer B - Standard" +172.16.1.0/24 65001:200 "Customer B - Standard" +172.16.2.0/24 65001:200 "Customer B - Standard" + +# Customer C - Basic Service +203.0.113.0/24 65001:300 "Customer C - Basic" +203.0.113.16/28 65001:300 "Customer C - Basic" +198.51.100.0/24 65001:300 "Customer C - Basic" + +# Customer D - Enterprise Service +192.0.2.0/24 65001:400 "Customer D - Enterprise" +192.0.3.0/24 65001:400 "Customer D - Enterprise" +10.1.0.0/16 65001:400 "Customer D - Enterprise" + +# Customer E - High Priority +172.20.0.0/16 65001:500 "Customer E - High Priority" +10.10.0.0/16 65001:500 "Customer E - High Priority" + +# Customer F - Low Priority +192.168.100.0/24 65001:600 "Customer F - Low Priority" +10.100.0.0/16 65001:600 "Customer F - Low Priority" \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml deleted file mode 100644 index 211f77f..0000000 --- a/docker-compose.yml +++ /dev/null @@ -1,31 +0,0 @@ -version: '3.8' - -services: - bgp-server: - image: quay.io/frrouting/frr:latest - container_name: bgp-server - hostname: bgp-server - privileged: true - network_mode: host - volumes: - - ./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: - - 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 - - SYS_ADMIN - security_opt: - - seccomp:unconfined - -volumes: - frr-logs: - frr-run: \ No newline at end of file diff --git a/frr.conf b/frr.conf deleted file mode 100644 index 281f003..0000000 --- a/frr.conf +++ /dev/null @@ -1,69 +0,0 @@ -# FRRouting configuration file -# BGP Server Configuration - -# Enable password for vtysh -password zebra -enable password zebra - -# Router ID -router-id 192.168.1.1 - -# BGP configuration -router bgp 65000 - 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 - -# 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.1.1/24 - ipv6 address 2001:db8::1/64 - no shutdown - -# Logging -log file /var/log/frr/frr.log -log timestamp precision 6 \ No newline at end of file diff --git a/install-dependencies.sh b/install-dependencies.sh deleted file mode 100644 index e2ad195..0000000 --- a/install-dependencies.sh +++ /dev/null @@ -1,106 +0,0 @@ -#!/bin/bash -# Bash script to install dependencies on Linux -# Dependencies Installation Script - -echo -e "\033[36mInstalling BGP Server Dependencies...\033[0m" - -# Detect OS -if [ -f /etc/os-release ]; then - . /etc/os-release - OS=$NAME - VER=$VERSION_ID -else - echo -e "\033[31mCannot detect OS version\033[0m" - exit 1 -fi - -echo -e "\033[33mDetected OS: $OS $VER\033[0m" - -# Function to install Docker -install_docker() { - echo -e "\033[33mInstalling Docker...\033[0m" - - # Remove old versions - sudo apt-get remove docker docker-engine docker.io containerd runc 2>/dev/null || true - - # Update package index - sudo apt-get update - - # Install prerequisites - sudo apt-get install -y \ - apt-transport-https \ - ca-certificates \ - curl \ - gnupg \ - lsb-release - - # Add Docker's official GPG key - curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg - - # Set up stable repository - echo \ - "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \ - $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null - - # Install Docker Engine - sudo apt-get update - sudo apt-get install -y docker-ce docker-ce-cli containerd.io - - # Add user to docker group - sudo usermod -aG docker $USER - - # Start and enable Docker - sudo systemctl start docker - sudo systemctl enable docker - - echo -e "\033[32m✓ Docker installed successfully\033[0m" - echo -e "\033[33mNote: You may need to log out and back in for group changes to take effect\033[0m" -} - -# Function to install Docker Compose -install_docker_compose() { - echo -e "\033[33mInstalling Docker Compose...\033[0m" - - # Download Docker Compose - sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose - - # Make it executable - sudo chmod +x /usr/local/bin/docker-compose - - # Create symbolic link - sudo ln -sf /usr/local/bin/docker-compose /usr/bin/docker-compose - - echo -e "\033[32m✓ Docker Compose installed successfully\033[0m" -} - -# Check if Docker is installed -if ! command -v docker &> /dev/null; then - echo -e "\033[31mDocker is not installed\033[0m" - install_docker -else - echo -e "\033[32m✓ Docker is already installed\033[0m" -fi - -# Check if Docker Compose is installed -if ! command -v docker-compose &> /dev/null; then - echo -e "\033[31mDocker Compose is not installed\033[0m" - install_docker_compose -else - echo -e "\033[32m✓ Docker Compose is already installed\033[0m" -fi - -# Make scripts executable -echo -e "\033[33mMaking scripts executable...\033[0m" -chmod +x *.sh - -# Test Docker installation -echo -e "\033[33mTesting Docker installation...\033[0m" -if sudo docker run hello-world >/dev/null 2>&1; then - echo -e "\033[32m✓ Docker is working correctly\033[0m" -else - echo -e "\033[31m✗ Docker test failed\033[0m" - echo -e "\033[33mYou may need to log out and back in, or restart the system\033[0m" -fi - -echo -e "\n\033[32mDependencies installation completed!\033[0m" -echo -e "\033[33mTo start the BGP server, run: ./start-bgp-server.sh\033[0m" \ No newline at end of file diff --git a/install.sh b/install.sh new file mode 100644 index 0000000..ce26378 --- /dev/null +++ b/install.sh @@ -0,0 +1,338 @@ +#!/bin/bash + +# BGP Server Installation Script for Ubuntu 24.04 +# Устанавливает BIRD и настраивает BGP сервер + +set -e + +# Цвета для вывода +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +NC='\033[0m' # No Color + +# Функции для вывода +print_info() { + echo -e "${BLUE}[INFO]${NC} $1" +} + +print_success() { + echo -e "${GREEN}[SUCCESS]${NC} $1" +} + +print_warning() { + echo -e "${YELLOW}[WARNING]${NC} $1" +} + +print_error() { + echo -e "${RED}[ERROR]${NC} $1" +} + +# Проверка на root права +check_root() { + if [[ $EUID -ne 0 ]]; then + print_error "Этот скрипт должен быть запущен с правами root" + exit 1 + fi +} + +# Проверка версии Ubuntu +check_ubuntu_version() { + if [[ ! -f /etc/os-release ]]; then + print_error "Не удалось определить версию ОС" + exit 1 + fi + + source /etc/os-release + if [[ "$ID" != "ubuntu" ]]; then + print_error "Этот скрипт предназначен только для Ubuntu" + exit 1 + fi + + if [[ "$VERSION_ID" != "24.04" ]]; then + print_warning "Скрипт тестировался на Ubuntu 24.04. Текущая версия: $VERSION_ID" + fi + + print_success "Обнаружена Ubuntu $VERSION_ID" +} + +# Обновление системы +update_system() { + print_info "Обновление системы..." + apt update + apt upgrade -y + print_success "Система обновлена" +} + +# Установка BIRD +install_bird() { + print_info "Установка BIRD..." + + # Установка BIRD2 + apt install -y bird2 + + # Проверка установки + if command -v bird &> /dev/null; then + print_success "BIRD установлен успешно" + else + print_error "Ошибка установки BIRD" + exit 1 + fi +} + +# Создание директорий +create_directories() { + print_info "Создание директорий..." + + mkdir -p /var/log/bird + mkdir -p /opt/bgp-server/data + mkdir -p /opt/bgp-server/scripts + mkdir -p /opt/bgp-server/logs + + # Установка прав доступа + chown -R bird:bird /var/log/bird + chmod 755 /opt/bgp-server/scripts + + print_success "Директории созданы" +} + +# Копирование файлов конфигурации +copy_config_files() { + print_info "Копирование файлов конфигурации..." + + # Резервная копия оригинальных конфигураций + if [[ -f /etc/bird/bird.conf ]]; then + cp /etc/bird/bird.conf /etc/bird/bird.conf.backup.$(date +%Y%m%d_%H%M%S) + fi + + if [[ -f /etc/bird/bird6.conf ]]; then + cp /etc/bird/bird6.conf /etc/bird/bird6.conf.backup.$(date +%Y%m%d_%H%M%S) + fi + + # Копирование новых конфигураций + cp config/bird.conf /etc/bird/bird.conf + cp config/bird6.conf /etc/bird/bird6.conf + + # Копирование скриптов + cp scripts/load_prefixes.py /opt/bgp-server/scripts/ + cp scripts/monitor.py /opt/bgp-server/scripts/ + + # Копирование файла с префиксами + cp data/prefixes.txt /opt/bgp-server/data/ + + # Установка прав на выполнение для скриптов + chmod +x /opt/bgp-server/scripts/*.py + + print_success "Файлы конфигурации скопированы" +} + +# Настройка firewall +configure_firewall() { + print_info "Настройка firewall..." + + # Установка ufw если не установлен + if ! command -v ufw &> /dev/null; then + apt install -y ufw + fi + + # Разрешение BGP порта + ufw allow 179/tcp comment "BGP" + + # Разрешение SSH + ufw allow ssh comment "SSH" + + # Включение firewall + ufw --force enable + + print_success "Firewall настроен" +} + +# Настройка systemd сервисов +configure_services() { + print_info "Настройка systemd сервисов..." + + # Включение автозапуска + systemctl enable bird + systemctl enable bird6 + + # Запуск сервисов + systemctl start bird + systemctl start bird6 + + # Проверка статуса + if systemctl is-active --quiet bird; then + print_success "BIRD (IPv4) запущен" + else + print_error "Ошибка запуска BIRD (IPv4)" + systemctl status bird + fi + + if systemctl is-active --quiet bird6; then + print_success "BIRD (IPv6) запущен" + else + print_error "Ошибка запуска BIRD (IPv6)" + systemctl status bird6 + fi +} + +# Проверка конфигурации +check_configuration() { + print_info "Проверка конфигурации BIRD..." + + # Проверка синтаксиса IPv4 конфигурации + if bird -p /etc/bird/bird.conf; then + print_success "Конфигурация BIRD (IPv4) корректна" + else + print_error "Ошибка в конфигурации BIRD (IPv4)" + exit 1 + fi + + # Проверка синтаксиса IPv6 конфигурации + if bird6 -p /etc/bird/bird6.conf; then + print_success "Конфигурация BIRD (IPv6) корректна" + else + print_error "Ошибка в конфигурации BIRD (IPv6)" + exit 1 + fi +} + +# Создание systemd таймера для автоматической загрузки префиксов +create_systemd_timer() { + print_info "Создание systemd таймера для загрузки префиксов..." + + # Создание сервиса + cat > /etc/systemd/system/bgp-prefix-loader.service << EOF +[Unit] +Description=BGP Prefix Loader +After=bird.service bird6.service + +[Service] +Type=oneshot +ExecStart=/usr/bin/python3 /opt/bgp-server/scripts/load_prefixes.py +User=root +StandardOutput=journal +StandardError=journal + +[Install] +WantedBy=multi-user.target +EOF + + # Создание таймера + cat > /etc/systemd/system/bgp-prefix-loader.timer << EOF +[Unit] +Description=Run BGP Prefix Loader every 5 minutes +Requires=bgp-prefix-loader.service + +[Timer] +OnBootSec=1min +OnUnitActiveSec=5min +Unit=bgp-prefix-loader.service + +[Install] +WantedBy=timers.target +EOF + + # Перезагрузка systemd и включение таймера + systemctl daemon-reload + systemctl enable bgp-prefix-loader.timer + systemctl start bgp-prefix-loader.timer + + print_success "Systemd таймер создан" +} + +# Создание alias для удобства +create_aliases() { + print_info "Создание alias команд..." + + # Добавление в .bashrc root пользователя + cat >> /root/.bashrc << EOF + +# BGP Server Aliases +alias bgp-status='python3 /opt/bgp-server/scripts/monitor.py' +alias bgp-load='python3 /opt/bgp-server/scripts/load_prefixes.py' +alias bgp-monitor='python3 /opt/bgp-server/scripts/monitor.py -c' +alias bird-status='systemctl status bird bird6' +alias bird-restart='systemctl restart bird bird6' +alias bird-logs='journalctl -u bird -f' +alias bird6-logs='journalctl -u bird6 -f' +EOF + + print_success "Alias команды добавлены" +} + +# Финальная проверка +final_check() { + print_info "Выполнение финальной проверки..." + + # Проверка статуса сервисов + echo "" + print_info "Статус сервисов:" + systemctl status bird --no-pager -l + echo "" + systemctl status bird6 --no-pager -l + + # Проверка прослушивания порта + if netstat -tlnp | grep :179; then + print_success "BGP порт 179 прослушивается" + else + print_warning "BGP порт 179 не прослушивается" + fi + + # Проверка firewall + echo "" + print_info "Статус firewall:" + ufw status + + print_success "Установка завершена успешно!" +} + +# Основная функция +main() { + echo "==========================================" + echo "BGP Server Installation Script" + echo "Ubuntu 24.04" + echo "==========================================" + + check_root + check_ubuntu_version + update_system + install_bird + create_directories + copy_config_files + configure_firewall + configure_services + check_configuration + create_systemd_timer + create_aliases + final_check + + echo "" + echo "==========================================" + echo "УСТАНОВКА ЗАВЕРШЕНА" + echo "==========================================" + echo "" + echo "Полезные команды:" + echo " bgp-status - Показать статус BGP сервера" + echo " bgp-load - Загрузить префиксы из файла" + echo " bgp-monitor - Непрерывный мониторинг" + echo " bird-status - Статус сервисов BIRD" + echo " bird-restart - Перезапуск сервисов BIRD" + echo " bird-logs - Просмотр логов BIRD" + echo "" + echo "Файлы конфигурации:" + echo " /etc/bird/bird.conf - Конфигурация BIRD IPv4" + echo " /etc/bird/bird6.conf - Конфигурация BIRD IPv6" + echo " /opt/bgp-server/data/prefixes.txt - Файл с префиксами" + echo "" + echo "Логи:" + echo " /var/log/bird/bird.log - Логи BIRD IPv4" + echo " /var/log/bird/bird6.log - Логи BIRD IPv6" + echo "" + echo "Для применения изменений выполните:" + echo " source /root/.bashrc" + echo "" +} + +# Запуск основной функции +main "$@" \ No newline at end of file diff --git a/prefixes.txt b/prefixes.txt deleted file mode 100644 index b5d60c5..0000000 --- a/prefixes.txt +++ /dev/null @@ -1,23 +0,0 @@ -# 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/quick-run.sh b/quick-run.sh deleted file mode 100644 index 94c57f7..0000000 --- a/quick-run.sh +++ /dev/null @@ -1,63 +0,0 @@ -#!/bin/bash -# Quick run script for BGP container -# Simple one-command BGP server launcher - -echo -e "\033[32m🚀 Quick BGP Server Launcher\033[0m" - -# Check if required files exist -if [ ! -f "frr.conf" ]; then - echo -e "\033[31mError: frr.conf not found in current directory\033[0m" - exit 1 -fi - -if [ ! -f "prefixes.txt" ]; then - echo -e "\033[31mError: prefixes.txt not found in current directory\033[0m" - exit 1 -fi - -# Stop existing container if running -docker stop bgp-server 2>/dev/null || true -docker rm bgp-server 2>/dev/null || true - -# Pull latest image -echo -e "\033[33m📥 Pulling FRRouting image...\033[0m" -docker pull quay.io/frrouting/frr:latest - -# Run container -echo -e "\033[33m🚀 Starting BGP server...\033[0m" -docker run -d \ - --name bgp-server \ - --hostname bgp-server \ - --privileged \ - --network host \ - -v "$(pwd)/frr.conf:/etc/frr/frr.conf:ro" \ - -v "$(pwd)/prefixes.txt:/etc/frr/prefixes.txt:ro" \ - -e FRR_USER=frr \ - -e FRR_VTYSH_PASSWORD=zebra \ - --cap-add=NET_ADMIN \ - --cap-add=SYS_ADMIN \ - --security-opt seccomp=unconfined \ - --restart unless-stopped \ - quay.io/frrouting/frr:latest \ - /usr/lib/frr/frrinit.sh start - -# Wait for startup -sleep 5 - -# Show status -echo -e "\033[36m📊 Container Status:\033[0m" -docker ps --filter "name=bgp-server" --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}" - -# Show BGP status -echo -e "\n\033[36m🌐 BGP Status:\033[0m" -if docker exec bgp-server vtysh -c "show ip bgp summary" 2>/dev/null; then - echo -e "\n\033[32m✅ BGP Server is running successfully!\033[0m" -else - echo -e "\n\033[33m⚠️ BGP daemon is starting up...\033[0m" -fi - -echo -e "\n\033[33m🔧 Useful commands:\033[0m" -echo -e " Connect to vtysh: docker exec -it bgp-server vtysh" -echo -e " View logs: docker logs bgp-server" -echo -e " Stop server: docker stop bgp-server" -echo -e " Check status: docker ps | grep bgp-server" \ No newline at end of file diff --git a/quick-stop.sh b/quick-stop.sh deleted file mode 100644 index 0a18e02..0000000 --- a/quick-stop.sh +++ /dev/null @@ -1,21 +0,0 @@ -#!/bin/bash -# Quick stop script for BGP container -# Simple one-command BGP server stopper - -echo -e "\033[33m🛑 Quick BGP Server Stopper\033[0m" - -# Check if container is running -if docker ps -q -f name=bgp-server | grep -q .; then - echo -e "\033[33m⏹️ Stopping BGP server...\033[0m" - docker stop bgp-server - docker rm bgp-server - echo -e "\033[32m✅ BGP Server stopped successfully!\033[0m" -else - echo -e "\033[31m❌ BGP Server is not running\033[0m" -fi - -# Show remaining containers -echo -e "\n\033[36m📊 Remaining containers:\033[0m" -docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}" - -echo -e "\n\033[33m🚀 To start again: ./quick-run.sh\033[0m" \ No newline at end of file diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..ac69fcf --- /dev/null +++ b/requirements.txt @@ -0,0 +1,16 @@ +# Python dependencies for BGP Server +# These are mostly built-in modules, but listed for completeness + +# Core modules (built-in) +# ipaddress - for IP address validation +# subprocess - for executing system commands +# logging - for logging functionality +# json - for JSON output +# time - for timing functions +# datetime - for date/time operations +# os - for operating system interface +# sys - for system-specific parameters + +# Optional: for enhanced functionality +# psutil>=5.8.0 - for better system monitoring (optional) +# requests>=2.25.0 - for HTTP API calls (optional) \ No newline at end of file diff --git a/run-bgp-container.sh b/run-bgp-container.sh deleted file mode 100644 index 9752867..0000000 --- a/run-bgp-container.sh +++ /dev/null @@ -1,148 +0,0 @@ -#!/bin/bash -# Ready-to-use Docker container script for BGP server -# BGP Container Runner Script - -CONTAINER_NAME="bgp-server" -IMAGE_NAME="quay.io/frrouting/frr:latest" -BGP_PORT="179" -VTYSH_PORT="2601" -CONFIG_DIR="$(pwd)" - -echo -e "\033[36m=== BGP Server Container Runner ===\033[0m" - -# Function to check if Docker is running -check_docker() { - if ! docker version >/dev/null 2>&1; then - echo -e "\033[31mError: Docker is not running. Please start Docker first.\033[0m" - exit 1 - fi - echo -e "\033[32m✓ Docker is running\033[0m" -} - -# Function to stop existing container -stop_container() { - if docker ps -q -f name=$CONTAINER_NAME | grep -q .; then - echo -e "\033[33mStopping existing container...\033[0m" - docker stop $CONTAINER_NAME - docker rm $CONTAINER_NAME - fi -} - -# Function to pull image -pull_image() { - echo -e "\033[33mPulling FRRouting image...\033[0m" - docker pull $IMAGE_NAME -} - -# Function to create and run container -run_container() { - echo -e "\033[33mStarting BGP container...\033[0m" - - docker run -d \ - --name $CONTAINER_NAME \ - --hostname $CONTAINER_NAME \ - --privileged \ - --network host \ - -v "$CONFIG_DIR/frr.conf:/etc/frr/frr.conf:ro" \ - -v "$CONFIG_DIR/prefixes.txt:/etc/frr/prefixes.txt:ro" \ - -e FRR_USER=frr \ - -e FRR_VTYSH_PASSWORD=zebra \ - --cap-add=NET_ADMIN \ - --cap-add=SYS_ADMIN \ - --security-opt seccomp=unconfined \ - --restart unless-stopped \ - $IMAGE_NAME \ - /usr/lib/frr/frrinit.sh start -} - -# Function to check container status -check_status() { - echo -e "\033[36mContainer Status:\033[0m" - docker ps --filter "name=$CONTAINER_NAME" --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}" - - echo -e "\n\033[36mNetwork Ports:\033[0m" - if netstat -tuln 2>/dev/null | grep -q ":179 "; then - echo -e "\033[32m✓ BGP port 179 is listening\033[0m" - else - echo -e "\033[31m✗ BGP port 179 is not listening\033[0m" - fi - - if netstat -tuln 2>/dev/null | grep -q ":2601 "; then - echo -e "\033[32m✓ vtysh port 2601 is listening\033[0m" - else - echo -e "\033[31m✗ vtysh port 2601 is not listening\033[0m" - fi -} - -# Function to show logs -show_logs() { - echo -e "\n\033[36mContainer Logs:\033[0m" - docker logs $CONTAINER_NAME -} - -# Function to show usage -show_usage() { - echo -e "\033[33mUsage:\033[0m" - echo -e " $0 [start|stop|restart|status|logs|help]" - echo -e "" - echo -e "\033[33mCommands:\033[0m" - echo -e " start - Start BGP container" - echo -e " stop - Stop BGP container" - echo -e " restart - Restart BGP container" - echo -e " status - Show container status" - echo -e " logs - Show container logs" - echo -e " help - Show this help" - echo -e "" - echo -e "\033[33mExamples:\033[0m" - echo -e " $0 start" - echo -e " $0 status" - echo -e " $0 logs" -} - -# Main script logic -case "${1:-start}" in - start) - check_docker - stop_container - pull_image - run_container - sleep 3 - check_status - show_logs - echo -e "\n\033[32mBGP Server is running!\033[0m" - echo -e "\033[33mTo connect to vtysh: docker exec -it $CONTAINER_NAME vtysh\033[0m" - echo -e "\033[33mTo view logs: $0 logs\033[0m" - echo -e "\033[33mTo stop: $0 stop\033[0m" - ;; - stop) - echo -e "\033[33mStopping BGP container...\033[0m" - docker stop $CONTAINER_NAME 2>/dev/null || true - docker rm $CONTAINER_NAME 2>/dev/null || true - echo -e "\033[32mBGP container stopped\033[0m" - ;; - restart) - echo -e "\033[33mRestarting BGP container...\033[0m" - $0 stop - sleep 2 - $0 start - ;; - status) - check_docker - check_status - ;; - logs) - if docker ps -q -f name=$CONTAINER_NAME | grep -q .; then - show_logs - else - echo -e "\033[31mContainer is not running\033[0m" - fi - ;; - help|--help|-h) - show_usage - ;; - *) - echo -e "\033[31mUnknown command: $1\033[0m" - show_usage - exit 1 - ;; -esac \ No newline at end of file diff --git a/scripts/load_prefixes.py b/scripts/load_prefixes.py new file mode 100644 index 0000000..054369b --- /dev/null +++ b/scripts/load_prefixes.py @@ -0,0 +1,264 @@ +#!/usr/bin/env python3 +""" +BGP Prefix Loader Script +Загружает префиксы из файла prefixes.txt в BIRD с настройкой community +""" + +import os +import sys +import subprocess +import ipaddress +import logging +from datetime import datetime +from typing import List, Tuple, Optional + +# Настройка логирования +logging.basicConfig( + level=logging.INFO, + format='%(asctime)s - %(levelname)s - %(message)s', + handlers=[ + logging.FileHandler('/var/log/bird/prefix_loader.log'), + logging.StreamHandler() + ] +) +logger = logging.getLogger(__name__) + +class BGPPrefixLoader: + def __init__(self, prefixes_file: str = '/opt/bgp-server/data/prefixes.txt'): + self.prefixes_file = prefixes_file + self.birdc_path = '/usr/bin/birdc' + self.loaded_prefixes = set() + + def validate_ip_prefix(self, prefix: str) -> bool: + """Проверяет корректность IP префикса""" + try: + ipaddress.ip_network(prefix, strict=False) + return True + except ValueError: + return False + + def validate_community(self, community: str) -> bool: + """Проверяет корректность community (формат ASN:value)""" + try: + if ':' not in community: + return False + asn, value = community.split(':', 1) + int(asn) + int(value) + return True + except (ValueError, AttributeError): + return False + + def parse_prefixes_file(self) -> List[Tuple[str, str, str]]: + """Парсит файл prefixes.txt и возвращает список префиксов с community""" + prefixes = [] + + if not os.path.exists(self.prefixes_file): + logger.error(f"Файл {self.prefixes_file} не найден") + return prefixes + + try: + with open(self.prefixes_file, 'r', encoding='utf-8') as f: + for line_num, line in enumerate(f, 1): + line = line.strip() + + # Пропускаем пустые строки и комментарии + if not line or line.startswith('#'): + continue + + # Парсим строку: prefix community description + parts = line.split(None, 2) + if len(parts) < 2: + logger.warning(f"Строка {line_num}: неверный формат - {line}") + continue + + prefix, community = parts[0], parts[1] + description = parts[2] if len(parts) > 2 else "" + + # Валидация + if not self.validate_ip_prefix(prefix): + logger.warning(f"Строка {line_num}: неверный префикс - {prefix}") + continue + + if not self.validate_community(community): + logger.warning(f"Строка {line_num}: неверный community - {community}") + continue + + prefixes.append((prefix, community, description)) + logger.info(f"Добавлен префикс: {prefix} с community {community} - {description}") + + except Exception as e: + logger.error(f"Ошибка при чтении файла: {e}") + + return prefixes + + def execute_birdc_command(self, command: str) -> Tuple[bool, str]: + """Выполняет команду через birdc""" + try: + result = subprocess.run( + [self.birdc_path] + command.split(), + capture_output=True, + text=True, + timeout=30 + ) + + if result.returncode == 0: + return True, result.stdout + else: + return False, result.stderr + + except subprocess.TimeoutExpired: + return False, "Timeout при выполнении команды" + except Exception as e: + return False, str(e) + + def add_static_route(self, prefix: str, community: str) -> bool: + """Добавляет статический маршрут в BIRD""" + # Команда для добавления статического маршрута + command = f"configure 'route {prefix} via 127.0.0.1;'" + + success, output = self.execute_birdc_command(command) + + if success: + logger.info(f"Добавлен маршрут: {prefix}") + self.loaded_prefixes.add(prefix) + else: + logger.error(f"Ошибка добавления маршрута {prefix}: {output}") + + return success + + def remove_static_route(self, prefix: str) -> bool: + """Удаляет статический маршрут из BIRD""" + command = f"configure 'route {prefix} via 127.0.0.1;'" + + success, output = self.execute_birdc_command(command) + + if success: + logger.info(f"Удален маршрут: {prefix}") + self.loaded_prefixes.discard(prefix) + else: + logger.error(f"Ошибка удаления маршрута {prefix}: {output}") + + return success + + def get_current_routes(self) -> set: + """Получает текущие статические маршруты из BIRD""" + success, output = self.execute_birdc_command("show route table bgp_table") + + if not success: + logger.error(f"Ошибка получения маршрутов: {output}") + return set() + + routes = set() + for line in output.split('\n'): + if 'via' in line and 'static' in line: + # Парсим префикс из строки + parts = line.split() + if len(parts) > 0: + prefix = parts[0] + routes.add(prefix) + + return routes + + def reload_configuration(self) -> bool: + """Перезагружает конфигурацию BIRD""" + success, output = self.execute_birdc_command("configure") + + if success: + logger.info("Конфигурация BIRD перезагружена") + else: + logger.error(f"Ошибка перезагрузки конфигурации: {output}") + + return success + + def load_prefixes(self, force_reload: bool = False) -> bool: + """Основная функция загрузки префиксов""" + logger.info("Начинаем загрузку префиксов...") + + # Получаем текущие маршруты + current_routes = self.get_current_routes() + logger.info(f"Текущих маршрутов: {len(current_routes)}") + + # Парсим файл с префиксами + prefixes = self.parse_prefixes_file() + logger.info(f"Найдено префиксов в файле: {len(prefixes)}") + + if not prefixes: + logger.warning("Нет префиксов для загрузки") + return False + + # Создаем временный конфигурационный файл + temp_config = "/tmp/bird_static_routes.conf" + + try: + with open(temp_config, 'w') as f: + f.write("# Автоматически сгенерированные статические маршруты\n") + f.write("# Время создания: {}\n\n".format(datetime.now())) + + for prefix, community, description in prefixes: + f.write(f"route {prefix} via 127.0.0.1; # {community} - {description}\n") + + # Применяем конфигурацию + if force_reload: + success = self.reload_configuration() + else: + success = True + + if success: + logger.info(f"Успешно загружено {len(prefixes)} префиксов") + return True + else: + logger.error("Ошибка при применении конфигурации") + return False + + except Exception as e: + logger.error(f"Ошибка при создании конфигурации: {e}") + return False + + finally: + # Удаляем временный файл + if os.path.exists(temp_config): + os.remove(temp_config) + + def show_statistics(self): + """Показывает статистику загруженных префиксов""" + current_routes = self.get_current_routes() + + print(f"\n=== Статистика BGP сервера ===") + print(f"Всего загружено префиксов: {len(current_routes)}") + print(f"Время: {datetime.now()}") + + if current_routes: + print("\nЗагруженные префиксы:") + for prefix in sorted(current_routes): + print(f" - {prefix}") + +def main(): + """Основная функция""" + import argparse + + parser = argparse.ArgumentParser(description='BGP Prefix Loader') + parser.add_argument('--file', '-f', + default='/opt/bgp-server/data/prefixes.txt', + help='Путь к файлу с префиксами') + parser.add_argument('--force', action='store_true', + help='Принудительная перезагрузка конфигурации') + parser.add_argument('--stats', action='store_true', + help='Показать статистику') + + args = parser.parse_args() + + loader = BGPPrefixLoader(args.file) + + if args.stats: + loader.show_statistics() + else: + success = loader.load_prefixes(args.force) + if success: + loader.show_statistics() + sys.exit(0) + else: + sys.exit(1) + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/scripts/monitor.py b/scripts/monitor.py new file mode 100644 index 0000000..b30f60f --- /dev/null +++ b/scripts/monitor.py @@ -0,0 +1,378 @@ +#!/usr/bin/env python3 +""" +BGP Monitor Script +Мониторинг BGP сессий, статистики и состояния сервера +""" + +import os +import sys +import subprocess +import json +import time +import logging +from datetime import datetime +from typing import Dict, List, Optional + +# Настройка логирования +logging.basicConfig( + level=logging.INFO, + format='%(asctime)s - %(levelname)s - %(message)s', + handlers=[ + logging.FileHandler('/var/log/bird/monitor.log'), + logging.StreamHandler() + ] +) +logger = logging.getLogger(__name__) + +class BGPMonitor: + def __init__(self): + self.birdc_path = '/usr/bin/birdc' + self.bird6c_path = '/usr/bin/bird6c' + + def execute_birdc_command(self, command: str, ipv6: bool = False) -> tuple: + """Выполняет команду через birdc""" + try: + birdc = self.bird6c_path if ipv6 else self.birdc_path + result = subprocess.run( + [birdc] + command.split(), + capture_output=True, + text=True, + timeout=30 + ) + + if result.returncode == 0: + return True, result.stdout + else: + return False, result.stderr + + except subprocess.TimeoutExpired: + return False, "Timeout при выполнении команды" + except Exception as e: + return False, str(e) + + def get_protocols_status(self, ipv6: bool = False) -> Dict: + """Получает статус всех протоколов""" + success, output = self.execute_birdc_command("show protocols", ipv6) + + if not success: + return {} + + protocols = {} + current_protocol = None + + for line in output.split('\n'): + line = line.strip() + if not line: + continue + + # Находим имя протокола + if line.startswith('name') and 'state' in line: + parts = line.split() + if len(parts) >= 3: + protocol_name = parts[1] + state = parts[2] + protocols[protocol_name] = { + 'state': state, + 'info': {} + } + current_protocol = protocol_name + + # Парсим дополнительную информацию + elif current_protocol and ':' in line: + key, value = line.split(':', 1) + key = key.strip() + value = value.strip() + protocols[current_protocol]['info'][key] = value + + return protocols + + def get_routes_count(self, ipv6: bool = False) -> Dict: + """Получает количество маршрутов""" + success, output = self.execute_birdc_command("show route count", ipv6) + + if not success: + return {} + + routes_info = {} + for line in output.split('\n'): + line = line.strip() + if ':' in line: + key, value = line.split(':', 1) + key = key.strip() + value = value.strip() + routes_info[key] = value + + return routes_info + + def get_bgp_peers(self, ipv6: bool = False) -> List[Dict]: + """Получает информацию о BGP пирах""" + protocols = self.get_protocols_status(ipv6) + bgp_peers = [] + + for name, info in protocols.items(): + if name.startswith('bgp') and info['state'] == 'up': + peer_info = { + 'name': name, + 'state': info['state'], + 'remote_ip': info['info'].get('Neighbor address', 'Unknown'), + 'remote_as': info['info'].get('Neighbor AS', 'Unknown'), + 'uptime': info['info'].get('Uptime', 'Unknown'), + 'routes_received': info['info'].get('Routes received', '0'), + 'routes_exported': info['info'].get('Routes exported', '0') + } + bgp_peers.append(peer_info) + + return bgp_peers + + def get_system_stats(self) -> Dict: + """Получает системную статистику""" + stats = { + 'timestamp': datetime.now().isoformat(), + 'uptime': self.get_uptime(), + 'memory_usage': self.get_memory_usage(), + 'cpu_usage': self.get_cpu_usage(), + 'disk_usage': self.get_disk_usage() + } + return stats + + def get_uptime(self) -> str: + """Получает время работы системы""" + try: + with open('/proc/uptime', 'r') as f: + uptime_seconds = float(f.read().split()[0]) + days = int(uptime_seconds // 86400) + hours = int((uptime_seconds % 86400) // 3600) + minutes = int((uptime_seconds % 3600) // 60) + return f"{days}d {hours}h {minutes}m" + except: + return "Unknown" + + def get_memory_usage(self) -> Dict: + """Получает использование памяти""" + try: + with open('/proc/meminfo', 'r') as f: + lines = f.readlines() + mem_info = {} + for line in lines: + if ':' in line: + key, value = line.split(':', 1) + key = key.strip() + value = int(value.split()[0]) + mem_info[key] = value + + total = mem_info.get('MemTotal', 0) + available = mem_info.get('MemAvailable', 0) + used = total - available + usage_percent = (used / total * 100) if total > 0 else 0 + + return { + 'total_mb': total // 1024, + 'used_mb': used // 1024, + 'available_mb': available // 1024, + 'usage_percent': round(usage_percent, 1) + } + except: + return {'error': 'Unable to read memory info'} + + def get_cpu_usage(self) -> Dict: + """Получает использование CPU""" + try: + with open('/proc/loadavg', 'r') as f: + load_avg = f.read().split() + return { + 'load_1min': float(load_avg[0]), + 'load_5min': float(load_avg[1]), + 'load_15min': float(load_avg[2]) + } + except: + return {'error': 'Unable to read CPU info'} + + def get_disk_usage(self) -> Dict: + """Получает использование диска""" + try: + result = subprocess.run( + ['df', '-h', '/'], + capture_output=True, + text=True + ) + + if result.returncode == 0: + lines = result.stdout.split('\n') + if len(lines) >= 2: + parts = lines[1].split() + if len(parts) >= 5: + return { + 'total': parts[1], + 'used': parts[2], + 'available': parts[3], + 'usage_percent': parts[4] + } + except: + pass + + return {'error': 'Unable to read disk info'} + + def check_bird_service_status(self) -> Dict: + """Проверяет статус сервиса BIRD""" + try: + result = subprocess.run( + ['systemctl', 'is-active', 'bird'], + capture_output=True, + text=True + ) + + bird_status = result.stdout.strip() + + result = subprocess.run( + ['systemctl', 'is-active', 'bird6'], + capture_output=True, + text=True + ) + + bird6_status = result.stdout.strip() + + return { + 'bird': bird_status, + 'bird6': bird6_status, + 'timestamp': datetime.now().isoformat() + } + except: + return {'error': 'Unable to check service status'} + + def generate_report(self, output_format: str = 'text') -> str: + """Генерирует отчет о состоянии BGP сервера""" + report = { + 'timestamp': datetime.now().isoformat(), + 'system': self.get_system_stats(), + 'services': self.check_bird_service_status(), + 'ipv4': { + 'protocols': self.get_protocols_status(False), + 'routes': self.get_routes_count(False), + 'bgp_peers': self.get_bgp_peers(False) + }, + 'ipv6': { + 'protocols': self.get_protocols_status(True), + 'routes': self.get_routes_count(True), + 'bgp_peers': self.get_bgp_peers(True) + } + } + + if output_format == 'json': + return json.dumps(report, indent=2) + else: + return self.format_text_report(report) + + def format_text_report(self, report: Dict) -> str: + """Форматирует отчет в текстовом виде""" + output = [] + output.append("=" * 60) + output.append("BGP SERVER STATUS REPORT") + output.append("=" * 60) + output.append(f"Time: {report['timestamp']}") + output.append("") + + # Системная информация + output.append("SYSTEM INFORMATION:") + output.append("-" * 20) + sys_info = report['system'] + output.append(f"Uptime: {sys_info['uptime']}") + + if 'memory_usage' in sys_info and 'usage_percent' in sys_info['memory_usage']: + mem = sys_info['memory_usage'] + output.append(f"Memory: {mem['used_mb']}MB / {mem['total_mb']}MB ({mem['usage_percent']}%)") + + if 'cpu_usage' in sys_info and 'load_1min' in sys_info['cpu_usage']: + cpu = sys_info['cpu_usage'] + output.append(f"Load Average: {cpu['load_1min']:.2f} (1min), {cpu['load_5min']:.2f} (5min), {cpu['load_15min']:.2f} (15min)") + + output.append("") + + # Статус сервисов + output.append("SERVICE STATUS:") + output.append("-" * 15) + services = report['services'] + output.append(f"BIRD (IPv4): {services.get('bird', 'Unknown')}") + output.append(f"BIRD (IPv6): {services.get('bird6', 'Unknown')}") + output.append("") + + # BGP пиры IPv4 + output.append("BGP PEERS (IPv4):") + output.append("-" * 18) + ipv4_peers = report['ipv4']['bgp_peers'] + if ipv4_peers: + for peer in ipv4_peers: + output.append(f" {peer['name']}: {peer['remote_ip']} (AS{peer['remote_as']}) - {peer['state']}") + output.append(f" Uptime: {peer['uptime']}, Routes: {peer['routes_exported']} exported") + else: + output.append(" No active BGP peers") + output.append("") + + # BGP пиры IPv6 + output.append("BGP PEERS (IPv6):") + output.append("-" * 18) + ipv6_peers = report['ipv6']['bgp_peers'] + if ipv6_peers: + for peer in ipv6_peers: + output.append(f" {peer['name']}: {peer['remote_ip']} (AS{peer['remote_as']}) - {peer['state']}") + output.append(f" Uptime: {peer['uptime']}, Routes: {peer['routes_exported']} exported") + else: + output.append(" No active BGP peers") + output.append("") + + # Статистика маршрутов + output.append("ROUTE STATISTICS:") + output.append("-" * 18) + ipv4_routes = report['ipv4']['routes'] + ipv6_routes = report['ipv6']['routes'] + + if ipv4_routes: + output.append("IPv4 Routes:") + for key, value in ipv4_routes.items(): + output.append(f" {key}: {value}") + + if ipv6_routes: + output.append("IPv6 Routes:") + for key, value in ipv6_routes.items(): + output.append(f" {key}: {value}") + + output.append("=" * 60) + + return "\n".join(output) + + def monitor_continuously(self, interval: int = 60): + """Непрерывный мониторинг с заданным интервалом""" + print(f"Starting continuous monitoring (interval: {interval}s)") + print("Press Ctrl+C to stop") + + try: + while True: + report = self.generate_report('text') + print(report) + time.sleep(interval) + except KeyboardInterrupt: + print("\nMonitoring stopped") + +def main(): + """Основная функция""" + import argparse + + parser = argparse.ArgumentParser(description='BGP Monitor') + parser.add_argument('--format', '-f', choices=['text', 'json'], default='text', + help='Output format (text or json)') + parser.add_argument('--continuous', '-c', action='store_true', + help='Continuous monitoring') + parser.add_argument('--interval', '-i', type=int, default=60, + help='Monitoring interval in seconds (default: 60)') + + args = parser.parse_args() + + monitor = BGPMonitor() + + if args.continuous: + monitor.monitor_continuously(args.interval) + else: + report = monitor.generate_report(args.format) + print(report) + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/start-bgp-server.sh b/start-bgp-server.sh deleted file mode 100644 index 54f519f..0000000 --- a/start-bgp-server.sh +++ /dev/null @@ -1,45 +0,0 @@ -#!/bin/bash -# Bash script to start BGP server on Linux -# BGP Server Startup Script - -echo -e "\033[32mStarting BGP Server with FRRouting...\033[0m" - -# Check if Docker is running -if ! docker version >/dev/null 2>&1; then - echo -e "\033[31mError: Docker is not running. Please start Docker first.\033[0m" - exit 1 -fi -echo -e "\033[32m✓ Docker is running\033[0m" - -# Check if docker-compose is available -if ! docker-compose --version >/dev/null 2>&1; then - echo -e "\033[31mError: Docker Compose is not available. Please install Docker Compose.\033[0m" - exit 1 -fi -echo -e "\033[32m✓ Docker Compose is available\033[0m" - -# Stop any existing containers -echo -e "\033[33mStopping any existing BGP containers...\033[0m" -docker-compose down - -# Start the BGP server -echo -e "\033[33mStarting BGP server...\033[0m" -docker-compose up -d - -# Wait for container to start -sleep 5 - -# Check container status -echo -e "\033[36mContainer status:\033[0m" -docker ps --filter "name=bgp-server" --format "table {{.Names}}\t{{.Status}}" - -# Show logs -echo -e "\n\033[36mBGP Server logs:\033[0m" -docker-compose logs bgp-server - -echo -e "\n\033[32mBGP Server is running!\033[0m" -echo -e "\033[37mBGP port: 179\033[0m" -echo -e "\033[37mvtysh port: 2601\033[0m" -echo -e "\n\033[33mTo connect to vtysh: docker exec -it bgp-server vtysh\033[0m" -echo -e "\033[33mTo view logs: docker-compose logs -f bgp-server\033[0m" -echo -e "\033[33mTo stop server: docker-compose down\033[0m" \ No newline at end of file diff --git a/stop-bgp-server.sh b/stop-bgp-server.sh deleted file mode 100644 index 3e9c842..0000000 --- a/stop-bgp-server.sh +++ /dev/null @@ -1,28 +0,0 @@ -#!/bin/bash -# Bash script to stop BGP server on Linux -# BGP Server Stop Script - -echo -e "\033[33mStopping BGP Server...\033[0m" - -# Stop the BGP server -echo -e "\033[33mStopping BGP containers...\033[0m" -docker-compose down - -# Remove volumes (optional - uncomment if you want to clean up completely) -# echo -e "\033[33mRemoving volumes...\033[0m" -# docker-compose down -v - -# Check if containers are stopped -running_containers=$(docker ps --filter "name=bgp-server" --format "{{.Names}}") -if [ -n "$running_containers" ]; then - echo -e "\033[31mWarning: Some BGP containers are still running:\033[0m" - echo -e "\033[31m$running_containers\033[0m" -else - echo -e "\033[32mBGP Server stopped successfully!\033[0m" -fi - -# Show stopped containers -echo -e "\n\033[36mContainer status:\033[0m" -docker ps -a --filter "name=bgp-server" --format "table {{.Names}}\t{{.Status}}" - -echo -e "\n\033[33mTo start the server again, run: ./start-bgp-server.sh\033[0m" \ No newline at end of file diff --git a/update-prefixes.sh b/update-prefixes.sh deleted file mode 100644 index 71dfb66..0000000 --- a/update-prefixes.sh +++ /dev/null @@ -1,39 +0,0 @@ -#!/bin/bash -# Bash script to update BGP prefixes on Linux -# BGP Prefixes Update Script - -PREFIXES_FILE=${1:-"prefixes.txt"} - -echo -e "\033[36mUpdating BGP Prefixes...\033[0m" - -# Check if container is running -container_status=$(docker ps --filter "name=bgp-server" --format "{{.Names}}") -if [ -z "$container_status" ]; then - echo -e "\033[31mError: BGP container is not running. Please start it first.\033[0m" - echo -e "\033[33mRun: ./start-bgp-server.sh\033[0m" - exit 1 -fi - -# Check if prefixes file exists -if [ ! -f "$PREFIXES_FILE" ]; then - echo -e "\033[31mError: Prefixes file '$PREFIXES_FILE' not found.\033[0m" - exit 1 -fi - -# Copy new prefixes file to container -echo -e "\033[33mCopying new prefixes file to container...\033[0m" -docker cp "$PREFIXES_FILE" bgp-server:/etc/frr/prefixes.txt - -# Reload BGP configuration -echo -e "\033[33mReloading BGP configuration...\033[0m" -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 -sleep 3 - -# Show updated BGP table -echo -e "\n\033[32mUpdated BGP table:\033[0m" -docker exec bgp-server vtysh -c "show ip bgp" - -echo -e "\n\033[32mPrefixes updated successfully!\033[0m" -echo -e "\033[33mTo view current prefixes: docker exec -it bgp-server vtysh -c 'show ip bgp'\033[0m" \ No newline at end of file