update
This commit is contained in:
@@ -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 уведомления
|
||||
+160
@@ -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 <your-repo-url>
|
||||
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 сервер настроен и готов к работе. 🎉
|
||||
@@ -1,123 +0,0 @@
|
||||
# Быстрый старт BGP сервера на Linux
|
||||
|
||||
## Минимальная установка
|
||||
|
||||
### Вариант 1: С Docker Compose
|
||||
```bash
|
||||
# 1. Клонируйте или скачайте проект
|
||||
git clone <repository-url>
|
||||
cd bgp-server
|
||||
|
||||
# 2. Установите зависимости
|
||||
./install-dependencies.sh
|
||||
|
||||
# 3. Запустите BGP сервер
|
||||
./start-bgp-server.sh
|
||||
```
|
||||
|
||||
### Вариант 2: Только Docker (рекомендуется)
|
||||
```bash
|
||||
# 1. Клонируйте или скачайте проект
|
||||
git clone <repository-url>
|
||||
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 <SERVER_IP> remote-as 65000
|
||||
neighbor <SERVER_IP> send-community
|
||||
```
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
```bash
|
||||
# Проверить, что Docker работает
|
||||
docker version
|
||||
|
||||
# Проверить, что контейнер запущен
|
||||
docker ps
|
||||
|
||||
# Проверить логи
|
||||
docker-compose logs bgp-server
|
||||
|
||||
# Проверить сетевые порты
|
||||
netstat -tuln | grep :179
|
||||
```
|
||||
@@ -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/
|
||||
## 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
|
||||
```
|
||||
@@ -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 <repository-url>
|
||||
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/
|
||||
@@ -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"
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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"
|
||||
@@ -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:
|
||||
@@ -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
|
||||
@@ -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"
|
||||
+338
@@ -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 "$@"
|
||||
@@ -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
|
||||
@@ -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"
|
||||
@@ -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"
|
||||
@@ -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)
|
||||
@@ -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
|
||||
@@ -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()
|
||||
@@ -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()
|
||||
@@ -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"
|
||||
@@ -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"
|
||||
@@ -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"
|
||||
Reference in New Issue
Block a user