This commit is contained in:
2025-07-11 19:06:56 +07:00
parent 8f53e99188
commit 9d07df53d0
23 changed files with 1947 additions and 934 deletions
+65
View File
@@ -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
View File
@@ -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 сервер настроен и готов к работе. 🎉
-123
View File
@@ -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
```
+117 -179
View File
@@ -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
```
+367
View File
@@ -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/
-59
View File
@@ -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"
+106
View File
@@ -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;
}
+105
View File
@@ -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;
}
+31
View File
@@ -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"
-31
View File
@@ -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:
-69
View File
@@ -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
-106
View File
@@ -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
View File
@@ -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 "$@"
-23
View File
@@ -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
-63
View File
@@ -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"
-21
View File
@@ -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"
+16
View File
@@ -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)
-148
View File
@@ -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
+264
View File
@@ -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()
+378
View File
@@ -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()
-45
View File
@@ -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"
-28
View File
@@ -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"
-39
View File
@@ -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"