Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c85bb1bd8b | ||
|
|
935c1ffec3 | ||
|
|
825255c64a | ||
|
|
9d07df53d0 |
@@ -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 уведомления
|
||||||
@@ -0,0 +1,293 @@
|
|||||||
|
# Развертывание BGP сервера на Ubuntu 24.04
|
||||||
|
|
||||||
|
## Клонирование репозитория
|
||||||
|
|
||||||
|
### 1. Клонирование с веткой bird
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Клонирование репозитория с веткой bird
|
||||||
|
git clone -b bird <repository-url> bgp-server
|
||||||
|
|
||||||
|
# Переход в директорию проекта
|
||||||
|
cd bgp-server
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Альтернативные способы клонирования
|
||||||
|
|
||||||
|
#### Если ветка bird существует:
|
||||||
|
```bash
|
||||||
|
# Клонирование с указанием ветки
|
||||||
|
git clone -b bird https://github.com/username/bgp-server.git
|
||||||
|
|
||||||
|
# Или клонирование и переключение на ветку
|
||||||
|
git clone https://github.com/username/bgp-server.git
|
||||||
|
cd bgp-server
|
||||||
|
git checkout bird
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Если нужно создать ветку bird:
|
||||||
|
```bash
|
||||||
|
# Клонирование основного репозитория
|
||||||
|
git clone https://github.com/username/bgp-server.git
|
||||||
|
cd bgp-server
|
||||||
|
|
||||||
|
# Создание и переключение на ветку bird
|
||||||
|
git checkout -b bird
|
||||||
|
|
||||||
|
# Добавление всех файлов
|
||||||
|
git add .
|
||||||
|
|
||||||
|
# Коммит изменений
|
||||||
|
git commit -m "Initial BGP server implementation"
|
||||||
|
|
||||||
|
# Отправка ветки на сервер
|
||||||
|
git push origin bird
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. Проверка клонирования
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Проверка текущей ветки
|
||||||
|
git branch
|
||||||
|
|
||||||
|
# Проверка содержимого
|
||||||
|
ls -la
|
||||||
|
|
||||||
|
# Проверка статуса git
|
||||||
|
git status
|
||||||
|
```
|
||||||
|
|
||||||
|
## Установка на сервере
|
||||||
|
|
||||||
|
### 1. Подготовка системы
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Обновление системы
|
||||||
|
sudo apt update && sudo apt upgrade -y
|
||||||
|
|
||||||
|
# Установка необходимых пакетов
|
||||||
|
sudo apt install -y python3 python3-pip git curl wget
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Клонирование и установка
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Клонирование репозитория (замените на ваш URL)
|
||||||
|
git clone -b bird https://github.com/username/bgp-server.git
|
||||||
|
cd bgp-server
|
||||||
|
|
||||||
|
# Проверка файлов
|
||||||
|
ls -la
|
||||||
|
|
||||||
|
# Сделать скрипт установки исполняемым
|
||||||
|
chmod +x install.sh
|
||||||
|
|
||||||
|
# Запуск установки
|
||||||
|
sudo ./install.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. Настройка после установки
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Настройка IP адреса и ASN
|
||||||
|
sudo nano /etc/bird/bird.conf
|
||||||
|
# Измените:
|
||||||
|
# router id YOUR_SERVER_IP;
|
||||||
|
# local as YOUR_ASN;
|
||||||
|
|
||||||
|
# Настройка префиксов
|
||||||
|
sudo nano /opt/bgp-server/data/prefixes.txt
|
||||||
|
# Добавьте ваши префиксы
|
||||||
|
|
||||||
|
# Загрузка префиксов
|
||||||
|
python3 /opt/bgp-server/scripts/load_prefixes.py
|
||||||
|
|
||||||
|
# Проверка статуса
|
||||||
|
python3 /opt/bgp-server/scripts/monitor.py
|
||||||
|
```
|
||||||
|
|
||||||
|
## Примеры команд для разных репозиториев
|
||||||
|
|
||||||
|
### GitHub
|
||||||
|
```bash
|
||||||
|
git clone -b bird https://github.com/username/bgp-server.git
|
||||||
|
```
|
||||||
|
|
||||||
|
### GitLab
|
||||||
|
```bash
|
||||||
|
git clone -b bird https://gitlab.com/username/bgp-server.git
|
||||||
|
```
|
||||||
|
|
||||||
|
### Bitbucket
|
||||||
|
```bash
|
||||||
|
git clone -b bird https://bitbucket.org/username/bgp-server.git
|
||||||
|
```
|
||||||
|
|
||||||
|
### SSH (если настроен ключ)
|
||||||
|
```bash
|
||||||
|
git clone -b bird git@github.com:username/bgp-server.git
|
||||||
|
```
|
||||||
|
|
||||||
|
## Автоматическое развертывание
|
||||||
|
|
||||||
|
### Скрипт автоматического развертывания
|
||||||
|
|
||||||
|
Создайте файл `deploy.sh`:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Автоматическое развертывание BGP сервера
|
||||||
|
REPO_URL="https://github.com/username/bgp-server.git"
|
||||||
|
BRANCH="bird"
|
||||||
|
INSTALL_DIR="/opt/bgp-server-deploy"
|
||||||
|
|
||||||
|
echo "Начинаем развертывание BGP сервера..."
|
||||||
|
|
||||||
|
# Создание директории
|
||||||
|
sudo mkdir -p $INSTALL_DIR
|
||||||
|
cd $INSTALL_DIR
|
||||||
|
|
||||||
|
# Клонирование репозитория
|
||||||
|
echo "Клонирование репозитория..."
|
||||||
|
git clone -b $BRANCH $REPO_URL .
|
||||||
|
|
||||||
|
# Проверка успешности клонирования
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
echo "Репозиторий успешно клонирован"
|
||||||
|
|
||||||
|
# Запуск установки
|
||||||
|
chmod +x install.sh
|
||||||
|
sudo ./install.sh
|
||||||
|
else
|
||||||
|
echo "Ошибка при клонировании репозитория"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
```
|
||||||
|
|
||||||
|
### Использование скрипта развертывания
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Создание скрипта
|
||||||
|
nano deploy.sh
|
||||||
|
|
||||||
|
# Сделать исполняемым
|
||||||
|
chmod +x deploy.sh
|
||||||
|
|
||||||
|
# Запуск
|
||||||
|
./deploy.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
## Проверка установки
|
||||||
|
|
||||||
|
### 1. Проверка сервисов
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Статус BIRD сервисов
|
||||||
|
sudo systemctl status bird bird6
|
||||||
|
|
||||||
|
# Проверка портов
|
||||||
|
sudo netstat -tlnp | grep :179
|
||||||
|
|
||||||
|
# Проверка процессов
|
||||||
|
ps aux | grep bird
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Проверка конфигурации
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Проверка синтаксиса конфигурации
|
||||||
|
sudo birdc -p /etc/bird/bird.conf
|
||||||
|
sudo bird6c -p /etc/bird/bird6.conf
|
||||||
|
|
||||||
|
# Проверка протоколов
|
||||||
|
sudo birdc show protocols
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. Проверка префиксов
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Загрузка префиксов
|
||||||
|
python3 /opt/bgp-server/scripts/load_prefixes.py
|
||||||
|
|
||||||
|
# Проверка маршрутов
|
||||||
|
sudo birdc show routes
|
||||||
|
```
|
||||||
|
|
||||||
|
## Troubleshooting
|
||||||
|
|
||||||
|
### Проблема: Не удается клонировать репозиторий
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Проверка подключения к интернету
|
||||||
|
ping -c 3 github.com
|
||||||
|
|
||||||
|
# Проверка git
|
||||||
|
git --version
|
||||||
|
|
||||||
|
# Очистка кэша git
|
||||||
|
git config --global credential.helper cache
|
||||||
|
```
|
||||||
|
|
||||||
|
### Проблема: Ветка bird не найдена
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Просмотр доступных веток
|
||||||
|
git branch -r
|
||||||
|
|
||||||
|
# Клонирование без указания ветки
|
||||||
|
git clone https://github.com/username/bgp-server.git
|
||||||
|
cd bgp-server
|
||||||
|
|
||||||
|
# Создание локальной ветки
|
||||||
|
git checkout -b bird origin/main
|
||||||
|
```
|
||||||
|
|
||||||
|
### Проблема: Нет прав доступа
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Настройка SSH ключей (если используете SSH)
|
||||||
|
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
|
||||||
|
cat ~/.ssh/id_rsa.pub
|
||||||
|
# Добавьте ключ в настройки GitHub/GitLab
|
||||||
|
|
||||||
|
# Или используйте HTTPS с токеном
|
||||||
|
git clone https://username:token@github.com/username/bgp-server.git
|
||||||
|
```
|
||||||
|
|
||||||
|
## Обновление репозитория
|
||||||
|
|
||||||
|
### Обновление кода
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Переход в директорию проекта
|
||||||
|
cd /path/to/bgp-server
|
||||||
|
|
||||||
|
# Получение обновлений
|
||||||
|
git fetch origin
|
||||||
|
|
||||||
|
# Переключение на ветку bird
|
||||||
|
git checkout bird
|
||||||
|
|
||||||
|
# Обновление кода
|
||||||
|
git pull origin bird
|
||||||
|
|
||||||
|
# Перезапуск сервисов (если нужно)
|
||||||
|
sudo systemctl restart bird bird6
|
||||||
|
```
|
||||||
|
|
||||||
|
### Автоматическое обновление
|
||||||
|
|
||||||
|
Создайте cron задачу для автоматического обновления:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Редактирование crontab
|
||||||
|
crontab -e
|
||||||
|
|
||||||
|
# Добавление задачи (обновление каждый день в 2:00)
|
||||||
|
0 2 * * * cd /opt/bgp-server && git pull origin bird && sudo systemctl restart bird bird6
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Готово!** Теперь у вас есть полные инструкции по клонированию и развертыванию BGP сервера. 🚀
|
||||||
+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.
|
||||||
|
|
||||||
## Требования
|
## Архитектура
|
||||||
|
- **BGP Server**: BIRD (Bird Internet Routing Daemon)
|
||||||
- Docker Engine
|
- **OS**: Ubuntu 24.04
|
||||||
- Docker Compose
|
- **Функции**:
|
||||||
- Bash shell
|
- Прием BGP соединений от любых пиров
|
||||||
|
- Загрузка префиксов из файла prefixes.txt
|
||||||
|
- Настройка community для каждого префикса
|
||||||
|
- Сервер НЕ получает префиксы, только раздает их клиентам
|
||||||
|
|
||||||
## Структура проекта
|
## Структура проекта
|
||||||
|
|
||||||
```
|
```
|
||||||
bgp-server/
|
bgp-server/
|
||||||
├── docker-compose.yml # Конфигурация Docker контейнера
|
├── README.md
|
||||||
├── frr.conf # Конфигурация FRRouting
|
├── install.sh # Скрипт установки
|
||||||
├── prefixes.txt # Файл с префиксами и community
|
├── config/
|
||||||
├── start-bgp-server.sh # Скрипт запуска для Linux
|
│ ├── bird.conf # Основная конфигурация BIRD
|
||||||
├── stop-bgp-server.sh # Скрипт остановки для Linux
|
│ └── bird6.conf # Конфигурация для IPv6 (опционально)
|
||||||
├── check-bgp-status.sh # Скрипт проверки статуса для Linux
|
├── scripts/
|
||||||
├── update-prefixes.sh # Скрипт обновления префиксов для Linux
|
│ ├── load_prefixes.py # Скрипт загрузки префиксов
|
||||||
├── install-dependencies.sh # Скрипт установки зависимостей
|
│ └── monitor.py # Мониторинг BGP сессий
|
||||||
└── README.md # Эта инструкция
|
├── 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
|
```bash
|
||||||
# Остановить существующие контейнеры
|
sudo apt update && sudo apt upgrade -y
|
||||||
docker-compose down
|
```
|
||||||
|
|
||||||
# Запустить BGP сервер
|
### 2. Установка BIRD
|
||||||
docker-compose up -d
|
```bash
|
||||||
|
sudo apt install bird2 -y
|
||||||
|
```
|
||||||
|
|
||||||
# Проверить статус
|
### 3. Настройка конфигурации
|
||||||
docker ps
|
```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
|
```bash
|
||||||
docker exec -it bgp-server vtysh
|
# Загрузка префиксов из файла
|
||||||
```
|
python3 /opt/bgp-server/scripts/load_prefixes.py
|
||||||
|
|
||||||
### Полезные команды vtysh
|
# Мониторинг BGP сессий
|
||||||
|
python3 /opt/bgp-server/scripts/monitor.py
|
||||||
```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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
```
|
||||||
|
|
||||||
## Мониторинг
|
## Мониторинг
|
||||||
|
|
||||||
### Проверка статуса контейнера
|
### Проверка статуса BIRD
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
docker ps --filter "name=bgp-server"
|
sudo birdc show protocols
|
||||||
|
sudo birdc show routes
|
||||||
|
sudo birdc show route table all
|
||||||
```
|
```
|
||||||
|
|
||||||
### Проверка сетевых портов
|
### Просмотр логов
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
netstat -tuln | grep :179
|
sudo journalctl -u bird -f
|
||||||
netstat -tuln | grep :2601
|
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. Измените пароли по умолчанию
|
# Разрешить SSH
|
||||||
2. Настройте firewall правила
|
sudo ufw allow ssh
|
||||||
3. Используйте более строгие настройки безопасности
|
|
||||||
4. Ограничьте доступ к vtysh
|
|
||||||
|
|
||||||
## Поддержка
|
# Включить firewall
|
||||||
|
sudo ufw enable
|
||||||
|
```
|
||||||
|
|
||||||
При возникновении проблем:
|
### Ограничение доступа
|
||||||
|
- Настройте ACL в конфигурации BIRD
|
||||||
|
- Используйте MD5 аутентификацию для BGP сессий
|
||||||
|
- Ограничьте доступ к birdc только с localhost
|
||||||
|
|
||||||
1. Проверьте логи контейнера
|
## Troubleshooting
|
||||||
2. Убедитесь в правильности конфигурации
|
|
||||||
3. Проверьте сетевые настройки
|
### Частые проблемы
|
||||||
4. Обратитесь к документации FRRouting: https://frrouting.org/
|
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/
|
||||||
@@ -0,0 +1,279 @@
|
|||||||
|
# Troubleshooting - Решение проблем
|
||||||
|
|
||||||
|
## Проблема: "Unit file bird6.service does not exist"
|
||||||
|
|
||||||
|
### Описание проблемы
|
||||||
|
В Ubuntu 24.04 сервис `bird6` не всегда устанавливается по умолчанию вместе с пакетом `bird2`.
|
||||||
|
|
||||||
|
### Решение 1: Установка BIRD6 отдельно
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Установка BIRD6
|
||||||
|
sudo apt install -y bird6
|
||||||
|
|
||||||
|
# Проверка установки
|
||||||
|
which bird6
|
||||||
|
systemctl list-unit-files | grep bird6
|
||||||
|
```
|
||||||
|
|
||||||
|
### Решение 2: Использование скрипта установки BIRD6
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Сделать скрипт исполняемым
|
||||||
|
chmod +x install_bird6.sh
|
||||||
|
|
||||||
|
# Запуск установки BIRD6
|
||||||
|
sudo ./install_bird6.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
### Решение 3: Ручное создание сервиса BIRD6
|
||||||
|
|
||||||
|
Если BIRD6 не устанавливается, создайте сервис вручную:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Создание systemd сервиса для BIRD6
|
||||||
|
sudo tee /etc/systemd/system/bird6.service > /dev/null << EOF
|
||||||
|
[Unit]
|
||||||
|
Description=BIRD Internet Routing Daemon (IPv6)
|
||||||
|
Documentation=man:bird(8)
|
||||||
|
After=network.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=notify
|
||||||
|
ExecStart=/usr/sbin/bird6 -c /etc/bird/bird6.conf -s /var/run/bird6.ctl
|
||||||
|
ExecReload=/bin/kill -HUP \$MAINPID
|
||||||
|
Restart=on-failure
|
||||||
|
RestartSec=5
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# Перезагрузка systemd
|
||||||
|
sudo systemctl daemon-reload
|
||||||
|
|
||||||
|
# Включение и запуск сервиса
|
||||||
|
sudo systemctl enable bird6
|
||||||
|
sudo systemctl start bird6
|
||||||
|
|
||||||
|
# Проверка статуса
|
||||||
|
sudo systemctl status bird6
|
||||||
|
```
|
||||||
|
|
||||||
|
### Решение 4: Использование только IPv4
|
||||||
|
|
||||||
|
Если BIRD6 не нужен, можно использовать только IPv4:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Проверка статуса BIRD IPv4
|
||||||
|
sudo systemctl status bird
|
||||||
|
|
||||||
|
# Проверка конфигурации
|
||||||
|
sudo birdc -p /etc/bird/bird.conf
|
||||||
|
|
||||||
|
# Запуск BIRD IPv4
|
||||||
|
sudo systemctl start bird
|
||||||
|
```
|
||||||
|
|
||||||
|
## Другие частые проблемы
|
||||||
|
|
||||||
|
### Проблема: "Permission denied" при запуске скриптов
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Установка прав на выполнение
|
||||||
|
chmod +x install.sh
|
||||||
|
chmod +x install_bird6.sh
|
||||||
|
chmod +x scripts/*.py
|
||||||
|
|
||||||
|
# Проверка прав
|
||||||
|
ls -la install.sh
|
||||||
|
ls -la scripts/
|
||||||
|
```
|
||||||
|
|
||||||
|
### Проблема: "Command not found: birdc"
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Проверка установки BIRD
|
||||||
|
which bird
|
||||||
|
which birdc
|
||||||
|
|
||||||
|
# Переустановка BIRD
|
||||||
|
sudo apt remove --purge bird2
|
||||||
|
sudo apt install -y bird2
|
||||||
|
|
||||||
|
# Проверка символических ссылок
|
||||||
|
ls -la /usr/sbin/bird*
|
||||||
|
```
|
||||||
|
|
||||||
|
### Проблема: "Configuration file not found"
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Проверка существования файлов конфигурации
|
||||||
|
ls -la /etc/bird/
|
||||||
|
|
||||||
|
# Копирование файлов конфигурации
|
||||||
|
sudo cp config/bird.conf /etc/bird/
|
||||||
|
sudo cp config/bird6.conf /etc/bird/
|
||||||
|
|
||||||
|
# Проверка прав доступа
|
||||||
|
sudo chown bird:bird /etc/bird/bird*.conf
|
||||||
|
sudo chmod 644 /etc/bird/bird*.conf
|
||||||
|
```
|
||||||
|
|
||||||
|
### Проблема: "Port 179 already in use"
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Проверка процессов на порту 179
|
||||||
|
sudo netstat -tlnp | grep :179
|
||||||
|
sudo lsof -i :179
|
||||||
|
|
||||||
|
# Остановка конфликтующих сервисов
|
||||||
|
sudo systemctl stop bird bird6
|
||||||
|
sudo pkill bird
|
||||||
|
|
||||||
|
# Перезапуск сервисов
|
||||||
|
sudo systemctl start bird
|
||||||
|
sudo systemctl start bird6
|
||||||
|
```
|
||||||
|
|
||||||
|
### Проблема: "Firewall blocking BGP"
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Проверка статуса firewall
|
||||||
|
sudo ufw status
|
||||||
|
|
||||||
|
# Разрешение BGP порта
|
||||||
|
sudo ufw allow 179/tcp
|
||||||
|
|
||||||
|
# Проверка правил iptables
|
||||||
|
sudo iptables -L | grep 179
|
||||||
|
```
|
||||||
|
|
||||||
|
### Проблема: "Python script errors"
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Проверка версии Python
|
||||||
|
python3 --version
|
||||||
|
|
||||||
|
# Установка зависимостей
|
||||||
|
sudo apt install -y python3-pip
|
||||||
|
|
||||||
|
# Проверка скриптов
|
||||||
|
python3 -m py_compile scripts/load_prefixes.py
|
||||||
|
python3 -m py_compile scripts/monitor.py
|
||||||
|
```
|
||||||
|
|
||||||
|
## Проверка работоспособности
|
||||||
|
|
||||||
|
### Полная диагностика
|
||||||
|
|
||||||
|
```bash
|
||||||
|
#!/bin/bash
|
||||||
|
# Скрипт диагностики BGP сервера
|
||||||
|
|
||||||
|
echo "=== Диагностика BGP сервера ==="
|
||||||
|
|
||||||
|
echo "1. Проверка установки BIRD:"
|
||||||
|
which bird && echo "✓ BIRD найден" || echo "✗ BIRD не найден"
|
||||||
|
which birdc && echo "✓ BIRDc найден" || echo "✗ BIRDc не найден"
|
||||||
|
|
||||||
|
echo "2. Проверка сервисов:"
|
||||||
|
systemctl is-active bird && echo "✓ BIRD IPv4 активен" || echo "✗ BIRD IPv4 неактивен"
|
||||||
|
systemctl is-active bird6 2>/dev/null && echo "✓ BIRD IPv6 активен" || echo "✗ BIRD IPv6 неактивен"
|
||||||
|
|
||||||
|
echo "3. Проверка портов:"
|
||||||
|
netstat -tlnp | grep :179 && echo "✓ Порт 179 прослушивается" || echo "✗ Порт 179 не прослушивается"
|
||||||
|
|
||||||
|
echo "4. Проверка конфигурации:"
|
||||||
|
birdc -p /etc/bird/bird.conf 2>/dev/null && echo "✓ Конфигурация IPv4 корректна" || echo "✗ Ошибка в конфигурации IPv4"
|
||||||
|
bird6c -p /etc/bird/bird6.conf 2>/dev/null && echo "✓ Конфигурация IPv6 корректна" || echo "✗ Ошибка в конфигурации IPv6"
|
||||||
|
|
||||||
|
echo "5. Проверка файлов:"
|
||||||
|
ls -la /etc/bird/ && echo "✓ Файлы конфигурации найдены" || echo "✗ Файлы конфигурации не найдены"
|
||||||
|
|
||||||
|
echo "6. Проверка логов:"
|
||||||
|
tail -5 /var/log/bird/bird.log 2>/dev/null || echo "Логи BIRD не найдены"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Сохранение скрипта диагностики
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Создание скрипта диагностики
|
||||||
|
nano diagnose_bgp.sh
|
||||||
|
# Вставьте код выше
|
||||||
|
|
||||||
|
# Сделать исполняемым
|
||||||
|
chmod +x diagnose_bgp.sh
|
||||||
|
|
||||||
|
# Запуск диагностики
|
||||||
|
./diagnose_bgp.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
## Восстановление после сбоя
|
||||||
|
|
||||||
|
### Полное переустановка
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Остановка сервисов
|
||||||
|
sudo systemctl stop bird bird6
|
||||||
|
|
||||||
|
# Удаление конфигурации
|
||||||
|
sudo rm -rf /etc/bird/bird*.conf
|
||||||
|
sudo rm -rf /opt/bgp-server
|
||||||
|
|
||||||
|
# Переустановка BIRD
|
||||||
|
sudo apt remove --purge bird2 bird6
|
||||||
|
sudo apt install -y bird2
|
||||||
|
|
||||||
|
# Повторная установка
|
||||||
|
sudo ./install.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
### Восстановление из резервной копии
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Восстановление конфигурации
|
||||||
|
sudo cp /etc/bird/bird.conf.backup.* /etc/bird/bird.conf
|
||||||
|
sudo cp /etc/bird/bird6.conf.backup.* /etc/bird/bird6.conf
|
||||||
|
|
||||||
|
# Перезапуск сервисов
|
||||||
|
sudo systemctl restart bird bird6
|
||||||
|
```
|
||||||
|
|
||||||
|
## Получение помощи
|
||||||
|
|
||||||
|
### Логи для диагностики
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Сбор логов для анализа
|
||||||
|
sudo journalctl -u bird --no-pager > bird_logs.txt
|
||||||
|
sudo journalctl -u bird6 --no-pager > bird6_logs.txt
|
||||||
|
sudo systemctl status bird bird6 > service_status.txt
|
||||||
|
sudo netstat -tlnp > network_status.txt
|
||||||
|
|
||||||
|
# Создание архива с логами
|
||||||
|
tar -czf bgp_diagnostics_$(date +%Y%m%d_%H%M%S).tar.gz *.txt
|
||||||
|
```
|
||||||
|
|
||||||
|
### Полезные команды
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Проверка версии BIRD
|
||||||
|
bird --version
|
||||||
|
|
||||||
|
# Проверка синтаксиса конфигурации
|
||||||
|
birdc -p /etc/bird/bird.conf
|
||||||
|
|
||||||
|
# Просмотр протоколов
|
||||||
|
birdc show protocols
|
||||||
|
|
||||||
|
# Просмотр маршрутов
|
||||||
|
birdc show routes
|
||||||
|
|
||||||
|
# Просмотр логов в реальном времени
|
||||||
|
journalctl -u bird -f
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Примечание**: Если проблема не решается, соберите логи и обратитесь к документации 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,104 @@
|
|||||||
|
# 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 маршрутов
|
||||||
|
table bgp_table;
|
||||||
|
|
||||||
|
# Статическая таблица маршрутов
|
||||||
|
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 Configuration
|
||||||
|
# Принимаем соединения от любых пиров
|
||||||
|
protocol bgp {
|
||||||
|
# Локальные настройки
|
||||||
|
local as 65001;
|
||||||
|
|
||||||
|
# Настройки для всех пиров
|
||||||
|
hold time 90;
|
||||||
|
keepalive time 30;
|
||||||
|
startup hold time 240;
|
||||||
|
|
||||||
|
# Принимаем соединения от любых IP
|
||||||
|
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;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
# Фильтры для 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,103 @@
|
|||||||
|
# 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
|
||||||
|
table bgp_table;
|
||||||
|
|
||||||
|
# Статическая таблица маршрутов 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 Configuration
|
||||||
|
protocol bgp {
|
||||||
|
# Локальные настройки
|
||||||
|
local as 65001;
|
||||||
|
|
||||||
|
# Настройки для всех пиров
|
||||||
|
hold time 90;
|
||||||
|
keepalive time 30;
|
||||||
|
startup hold time 240;
|
||||||
|
|
||||||
|
# Принимаем соединения от любых IPv6 адресов
|
||||||
|
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;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
# Фильтры для 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,97 @@
|
|||||||
|
# BIRD Configuration for BGP Server - Accept ANY Peer
|
||||||
|
# Ubuntu 24.04
|
||||||
|
# Эта конфигурация принимает ЛЮБЫХ пиров с ЛЮБЫМИ ASN
|
||||||
|
|
||||||
|
# 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 маршрутов
|
||||||
|
table bgp_table;
|
||||||
|
|
||||||
|
# Статическая таблица маршрутов
|
||||||
|
protocol static {
|
||||||
|
# Маршруты будут загружаться из файла prefixes.txt
|
||||||
|
# через скрипт load_prefixes.py
|
||||||
|
table bgp_table;
|
||||||
|
}
|
||||||
|
|
||||||
|
# BGP Configuration - принимаем ЛЮБЫХ пиров
|
||||||
|
protocol bgp {
|
||||||
|
# Локальные настройки
|
||||||
|
local as 65001;
|
||||||
|
|
||||||
|
# Настройки для всех пиров
|
||||||
|
hold time 90;
|
||||||
|
keepalive time 30;
|
||||||
|
startup hold time 240;
|
||||||
|
|
||||||
|
# Принимаем соединения от ЛЮБЫХ IP и ЛЮБЫХ ASN
|
||||||
|
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 - принимаем любые community
|
||||||
|
import filter {
|
||||||
|
# Принимаем ВСЕ маршруты от любых пиров
|
||||||
|
accept;
|
||||||
|
};
|
||||||
|
|
||||||
|
export filter {
|
||||||
|
# Экспортируем маршруты с community
|
||||||
|
if source = RTS_STATIC then {
|
||||||
|
bgp_community.add(65001:100);
|
||||||
|
accept;
|
||||||
|
}
|
||||||
|
reject;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
# Фильтры для 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,66 @@
|
|||||||
|
# BIRD Configuration for BGP Server
|
||||||
|
# Ubuntu 24.04 - Fixed Version
|
||||||
|
|
||||||
|
# Logging configuration
|
||||||
|
log "/var/log/bird/bird.log" all;
|
||||||
|
log stderr all;
|
||||||
|
|
||||||
|
# Router ID (замените на ваш IP адрес)
|
||||||
|
router id 77.232.38.173;
|
||||||
|
|
||||||
|
# Protocol configuration
|
||||||
|
protocol device {
|
||||||
|
scan time 10;
|
||||||
|
}
|
||||||
|
|
||||||
|
protocol direct {
|
||||||
|
disabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
protocol kernel {
|
||||||
|
disabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Статическая таблица маршрутов
|
||||||
|
protocol static {
|
||||||
|
# Маршруты будут загружаться из файла prefixes.txt
|
||||||
|
# через скрипт load_prefixes.py
|
||||||
|
|
||||||
|
# Пример статических маршрутов
|
||||||
|
# route 192.168.1.0/24 via 192.168.1.1;
|
||||||
|
# route 10.0.1.0/24 via 10.0.1.1;
|
||||||
|
}
|
||||||
|
|
||||||
|
# BGP Configuration - принимаем любых пиров, но не получаем префиксы
|
||||||
|
protocol bgp any_peer {
|
||||||
|
# Локальные настройки
|
||||||
|
local as 65001;
|
||||||
|
|
||||||
|
# Настройки для всех пиров
|
||||||
|
hold time 90;
|
||||||
|
keepalive time 30;
|
||||||
|
startup hold time 240;
|
||||||
|
|
||||||
|
# Принимаем соединения от любых IP
|
||||||
|
listen bgp port 179;
|
||||||
|
|
||||||
|
# НЕ импортируем маршруты от пиров
|
||||||
|
import none;
|
||||||
|
|
||||||
|
# Экспортируем только статические маршруты
|
||||||
|
export where source = RTS_STATIC;
|
||||||
|
|
||||||
|
# MD5 аутентификация (опционально)
|
||||||
|
# password "your_bgp_password";
|
||||||
|
|
||||||
|
# Настройки для больших таблиц маршрутизации
|
||||||
|
table limit 100000;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Настройки для мониторинга
|
||||||
|
protocol pipe {
|
||||||
|
table master;
|
||||||
|
peer table bgp_table;
|
||||||
|
import all;
|
||||||
|
export none;
|
||||||
|
}
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
# Простая конфигурация BIRD для тестирования
|
||||||
|
# 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Статическая таблица маршрутов
|
||||||
|
protocol static {
|
||||||
|
# Пример статических маршрутов
|
||||||
|
route 192.168.1.0/24 via 192.168.1.1;
|
||||||
|
route 10.0.1.0/24 via 10.0.1.1;
|
||||||
|
}
|
||||||
|
|
||||||
|
# BGP Configuration
|
||||||
|
protocol bgp {
|
||||||
|
# Локальные настройки
|
||||||
|
local as 65001;
|
||||||
|
|
||||||
|
# Принимаем соединения от любых IP
|
||||||
|
listen bgp port 179;
|
||||||
|
|
||||||
|
# Настройки для пиров
|
||||||
|
import none; # Не импортируем маршруты от пиров
|
||||||
|
export all; # Экспортируем все маршруты пирам
|
||||||
|
}
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
# Минимальная тестовая конфигурация BIRD
|
||||||
|
# Ubuntu 24.04
|
||||||
|
|
||||||
|
# Logging
|
||||||
|
log stderr all;
|
||||||
|
|
||||||
|
# Router ID
|
||||||
|
router id 77.232.38.173;
|
||||||
|
|
||||||
|
# Device protocol
|
||||||
|
protocol device {
|
||||||
|
scan time 10;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Direct protocol (disabled)
|
||||||
|
protocol direct {
|
||||||
|
disabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Kernel protocol (disabled)
|
||||||
|
protocol kernel {
|
||||||
|
disabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Static routes
|
||||||
|
protocol static {
|
||||||
|
# Пустая таблица статических маршрутов
|
||||||
|
}
|
||||||
|
|
||||||
|
# BGP protocol
|
||||||
|
protocol bgp any_peer {
|
||||||
|
local as 65001;
|
||||||
|
listen bgp port 179;
|
||||||
|
import none;
|
||||||
|
export where source = RTS_STATIC;
|
||||||
|
}
|
||||||
@@ -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:
|
|
||||||
@@ -0,0 +1,401 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Скрипт для включения режима приема ЛЮБЫХ пиров
|
||||||
|
# Ubuntu 24.04
|
||||||
|
|
||||||
|
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
|
||||||
|
}
|
||||||
|
|
||||||
|
# Получение IP адреса сервера
|
||||||
|
get_server_ip() {
|
||||||
|
# Попытка получить основной IP адрес
|
||||||
|
local ip=$(ip route get 8.8.8.8 | awk '{print $7; exit}' 2>/dev/null)
|
||||||
|
|
||||||
|
if [[ -z "$ip" ]]; then
|
||||||
|
# Альтернативный способ
|
||||||
|
ip=$(hostname -I | awk '{print $1}' 2>/dev/null)
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ -z "$ip" ]]; then
|
||||||
|
print_warning "Не удалось определить IP адрес, используем 192.168.1.1"
|
||||||
|
ip="192.168.1.1"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "$ip"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Создание конфигурации для любых пиров
|
||||||
|
create_any_peer_config() {
|
||||||
|
local server_ip=$(get_server_ip)
|
||||||
|
|
||||||
|
print_info "Создание конфигурации для приема ЛЮБЫХ пиров с IP: $server_ip"
|
||||||
|
|
||||||
|
# Создание конфигурации IPv4
|
||||||
|
cat > /etc/bird/bird.conf << EOF
|
||||||
|
# BIRD Configuration for BGP Server - Accept ANY Peer
|
||||||
|
# Ubuntu 24.04
|
||||||
|
# Эта конфигурация принимает ЛЮБЫХ пиров с ЛЮБЫМИ ASN
|
||||||
|
|
||||||
|
# Logging configuration
|
||||||
|
log "/var/log/bird/bird.log" all;
|
||||||
|
log stderr all;
|
||||||
|
|
||||||
|
# Router ID
|
||||||
|
router id $server_ip;
|
||||||
|
|
||||||
|
# Protocol configuration
|
||||||
|
protocol device {
|
||||||
|
scan time 10;
|
||||||
|
}
|
||||||
|
|
||||||
|
protocol direct {
|
||||||
|
disabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
protocol kernel {
|
||||||
|
disabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Таблица для BGP маршрутов
|
||||||
|
table bgp_table;
|
||||||
|
|
||||||
|
# Статическая таблица маршрутов
|
||||||
|
protocol static {
|
||||||
|
# Маршруты будут загружаться из файла prefixes.txt
|
||||||
|
# через скрипт load_prefixes.py
|
||||||
|
table bgp_table;
|
||||||
|
}
|
||||||
|
|
||||||
|
# BGP Configuration - принимаем ЛЮБЫХ пиров
|
||||||
|
protocol bgp {
|
||||||
|
# Локальные настройки
|
||||||
|
local as 65001;
|
||||||
|
|
||||||
|
# Настройки для всех пиров
|
||||||
|
hold time 90;
|
||||||
|
keepalive time 30;
|
||||||
|
startup hold time 240;
|
||||||
|
|
||||||
|
# Принимаем соединения от ЛЮБЫХ IP и ЛЮБЫХ ASN
|
||||||
|
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 - принимаем любые community
|
||||||
|
import filter {
|
||||||
|
# Принимаем ВСЕ маршруты от любых пиров
|
||||||
|
accept;
|
||||||
|
};
|
||||||
|
|
||||||
|
export filter {
|
||||||
|
# Экспортируем маршруты с community
|
||||||
|
if source = RTS_STATIC then {
|
||||||
|
bgp_community.add(65001:100);
|
||||||
|
accept;
|
||||||
|
}
|
||||||
|
reject;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
# Фильтры для 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;
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# Создание конфигурации IPv6
|
||||||
|
cat > /etc/bird/bird6.conf << EOF
|
||||||
|
# BIRD IPv6 Configuration for BGP Server - Accept ANY Peer
|
||||||
|
# Ubuntu 24.04
|
||||||
|
# Эта конфигурация принимает ЛЮБЫХ пиров с ЛЮБЫМИ ASN
|
||||||
|
|
||||||
|
# Logging configuration
|
||||||
|
log "/var/log/bird/bird6.log" all;
|
||||||
|
log stderr all;
|
||||||
|
|
||||||
|
# Router ID
|
||||||
|
router id $server_ip;
|
||||||
|
|
||||||
|
# Protocol configuration
|
||||||
|
protocol device {
|
||||||
|
scan time 10;
|
||||||
|
}
|
||||||
|
|
||||||
|
protocol direct {
|
||||||
|
disabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
protocol kernel {
|
||||||
|
disabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Таблица для BGP маршрутов IPv6
|
||||||
|
table bgp_table;
|
||||||
|
|
||||||
|
# Статическая таблица маршрутов IPv6
|
||||||
|
protocol static {
|
||||||
|
# Маршруты будут загружаться из файла prefixes6.txt
|
||||||
|
# через скрипт load_prefixes.py
|
||||||
|
table bgp_table;
|
||||||
|
}
|
||||||
|
|
||||||
|
# BGP IPv6 Configuration - принимаем ЛЮБЫХ пиров
|
||||||
|
protocol bgp {
|
||||||
|
# Локальные настройки
|
||||||
|
local as 65001;
|
||||||
|
|
||||||
|
# Настройки для всех пиров
|
||||||
|
hold time 90;
|
||||||
|
keepalive time 30;
|
||||||
|
startup hold time 240;
|
||||||
|
|
||||||
|
# Принимаем соединения от ЛЮБЫХ IPv6 адресов и ЛЮБЫХ ASN
|
||||||
|
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 - принимаем любые community
|
||||||
|
import filter {
|
||||||
|
# Принимаем ВСЕ маршруты от любых пиров
|
||||||
|
accept;
|
||||||
|
};
|
||||||
|
|
||||||
|
export filter {
|
||||||
|
# Экспортируем маршруты с community
|
||||||
|
if source = RTS_STATIC then {
|
||||||
|
bgp_community.add(65001:100);
|
||||||
|
accept;
|
||||||
|
}
|
||||||
|
reject;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
# Фильтры для 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;
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# Установка правильных прав доступа
|
||||||
|
chown bird:bird /etc/bird/bird*.conf
|
||||||
|
chmod 644 /etc/bird/bird*.conf
|
||||||
|
|
||||||
|
print_success "Конфигурация для любых пиров создана"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Проверка конфигурации
|
||||||
|
check_config() {
|
||||||
|
print_info "Проверка конфигурации..."
|
||||||
|
|
||||||
|
if bird -p /etc/bird/bird.conf; then
|
||||||
|
print_success "Конфигурация BIRD (IPv4) корректна"
|
||||||
|
else
|
||||||
|
print_error "Ошибка в конфигурации BIRD (IPv4)"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if command -v bird6 &> /dev/null; then
|
||||||
|
if bird6 -p /etc/bird/bird6.conf; then
|
||||||
|
print_success "Конфигурация BIRD (IPv6) корректна"
|
||||||
|
else
|
||||||
|
print_warning "Ошибка в конфигурации BIRD (IPv6)"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
# Перезапуск сервисов
|
||||||
|
restart_services() {
|
||||||
|
print_info "Перезапуск сервисов BIRD..."
|
||||||
|
|
||||||
|
# Остановка сервисов
|
||||||
|
systemctl stop bird 2>/dev/null || true
|
||||||
|
systemctl stop bird6 2>/dev/null || true
|
||||||
|
|
||||||
|
# Запуск BIRD IPv4
|
||||||
|
systemctl start bird
|
||||||
|
|
||||||
|
if systemctl is-active --quiet bird; then
|
||||||
|
print_success "BIRD (IPv4) запущен"
|
||||||
|
else
|
||||||
|
print_error "Ошибка запуска BIRD (IPv4)"
|
||||||
|
systemctl status bird
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Попытка запуска BIRD6 если существует
|
||||||
|
if systemctl list-unit-files | grep -q bird6; then
|
||||||
|
systemctl start bird6
|
||||||
|
|
||||||
|
if systemctl is-active --quiet bird6; then
|
||||||
|
print_success "BIRD (IPv6) запущен"
|
||||||
|
else
|
||||||
|
print_warning "BIRD (IPv6) не запущен"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
# Проверка работоспособности
|
||||||
|
test_functionality() {
|
||||||
|
print_info "Проверка работоспособности..."
|
||||||
|
|
||||||
|
# Проверка статуса сервисов
|
||||||
|
echo ""
|
||||||
|
print_info "Статус сервисов:"
|
||||||
|
systemctl status bird --no-pager -l
|
||||||
|
|
||||||
|
# Проверка портов
|
||||||
|
echo ""
|
||||||
|
print_info "Проверка портов:"
|
||||||
|
if netstat -tlnp | grep :179; then
|
||||||
|
print_success "Порт 179 прослушивается"
|
||||||
|
else
|
||||||
|
print_warning "Порт 179 не прослушивается"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Проверка протоколов
|
||||||
|
echo ""
|
||||||
|
print_info "Проверка протоколов:"
|
||||||
|
if birdc show protocols 2>/dev/null; then
|
||||||
|
print_success "BIRD отвечает на команды"
|
||||||
|
else
|
||||||
|
print_warning "BIRD не отвечает на команды"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Основная функция
|
||||||
|
main() {
|
||||||
|
echo "=========================================="
|
||||||
|
echo "Enable ANY Peer Mode for BGP Server"
|
||||||
|
echo "Ubuntu 24.04"
|
||||||
|
echo "=========================================="
|
||||||
|
|
||||||
|
check_root
|
||||||
|
|
||||||
|
# Создание конфигурации для любых пиров
|
||||||
|
create_any_peer_config
|
||||||
|
|
||||||
|
# Проверка конфигурации
|
||||||
|
if check_config; then
|
||||||
|
# Перезапуск сервисов
|
||||||
|
if restart_services; then
|
||||||
|
# Проверка работоспособности
|
||||||
|
test_functionality
|
||||||
|
|
||||||
|
print_success "Режим приема любых пиров включен!"
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "Теперь сервер принимает ЛЮБЫХ пиров с ЛЮБЫМИ ASN"
|
||||||
|
echo ""
|
||||||
|
echo "Полезные команды:"
|
||||||
|
echo " sudo birdc show protocols"
|
||||||
|
echo " sudo birdc show routes"
|
||||||
|
echo " sudo systemctl status bird"
|
||||||
|
echo " sudo journalctl -u bird -f"
|
||||||
|
echo ""
|
||||||
|
echo "Для подключения клиентов используйте:"
|
||||||
|
echo " Remote AS: 65001"
|
||||||
|
echo " Remote IP: $(get_server_ip)"
|
||||||
|
echo " Port: 179"
|
||||||
|
else
|
||||||
|
print_error "Ошибка перезапуска сервисов"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
print_error "Ошибка в конфигурации"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Запуск основной функции
|
||||||
|
main "$@"
|
||||||
@@ -0,0 +1,137 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Скрипт для исправления конфигурации BIRD
|
||||||
|
# Ubuntu 24.04
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
echo "=========================================="
|
||||||
|
echo "Исправление конфигурации BIRD"
|
||||||
|
echo "Ubuntu 24.04"
|
||||||
|
echo "=========================================="
|
||||||
|
|
||||||
|
# Получаем IP адрес сервера
|
||||||
|
SERVER_IP=$(curl -s ifconfig.me 2>/dev/null || echo "192.168.1.1")
|
||||||
|
echo "[INFO] Используется IP адрес: $SERVER_IP"
|
||||||
|
|
||||||
|
# Останавливаем BIRD если запущен
|
||||||
|
echo "[INFO] Остановка BIRD..."
|
||||||
|
systemctl stop bird 2>/dev/null || true
|
||||||
|
|
||||||
|
# Создаем резервную копию текущей конфигурации
|
||||||
|
if [ -f /etc/bird/bird.conf ]; then
|
||||||
|
cp /etc/bird/bird.conf /etc/bird/bird.conf.backup.$(date +%Y%m%d_%H%M%S)
|
||||||
|
echo "[INFO] Создана резервная копия: /etc/bird/bird.conf.backup"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Создаем простую рабочую конфигурацию
|
||||||
|
echo "[INFO] Создание простой конфигурации BIRD..."
|
||||||
|
cat > /etc/bird/bird.conf << EOF
|
||||||
|
# Простая конфигурация BIRD для BGP сервера
|
||||||
|
# Ubuntu 24.04
|
||||||
|
|
||||||
|
# Logging
|
||||||
|
log stderr all;
|
||||||
|
log "/var/log/bird/bird.log" all;
|
||||||
|
|
||||||
|
# Router ID
|
||||||
|
router id $SERVER_IP;
|
||||||
|
|
||||||
|
# Device protocol
|
||||||
|
protocol device {
|
||||||
|
scan time 10;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Direct protocol (disabled)
|
||||||
|
protocol direct {
|
||||||
|
disabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Kernel protocol (disabled)
|
||||||
|
protocol kernel {
|
||||||
|
disabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Static routes
|
||||||
|
protocol static {
|
||||||
|
# Статические маршруты будут загружаться через скрипт
|
||||||
|
}
|
||||||
|
|
||||||
|
# BGP protocol - принимаем любых пиров
|
||||||
|
protocol bgp any_peer {
|
||||||
|
local as 65001;
|
||||||
|
listen bgp port 179;
|
||||||
|
import none; # Не принимаем маршруты от пиров
|
||||||
|
export where source = RTS_STATIC; # Экспортируем только статические маршруты
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# Проверяем синтаксис конфигурации (пробуем запустить в тестовом режиме)
|
||||||
|
echo "[INFO] Проверка синтаксиса конфигурации..."
|
||||||
|
if timeout 5s bird -c /etc/bird/bird.conf -f 2>/dev/null; then
|
||||||
|
echo "[SUCCESS] Конфигурация синтаксически корректна"
|
||||||
|
else
|
||||||
|
echo "[INFO] Попытка создания минимальной конфигурации..."
|
||||||
|
|
||||||
|
# Создаем еще более простую конфигурацию
|
||||||
|
cat > /etc/bird/bird.conf << EOF
|
||||||
|
# Минимальная конфигурация BIRD
|
||||||
|
log stderr all;
|
||||||
|
router id $SERVER_IP;
|
||||||
|
|
||||||
|
protocol device {
|
||||||
|
scan time 10;
|
||||||
|
}
|
||||||
|
|
||||||
|
protocol direct {
|
||||||
|
disabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
protocol kernel {
|
||||||
|
disabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
protocol static {
|
||||||
|
}
|
||||||
|
|
||||||
|
protocol bgp any_peer {
|
||||||
|
local as 65001;
|
||||||
|
listen bgp port 179;
|
||||||
|
import none;
|
||||||
|
export where source = RTS_STATIC;
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
|
||||||
|
echo "[INFO] Минимальная конфигурация создана"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Создаем директорию для логов если не существует
|
||||||
|
mkdir -p /var/log/bird
|
||||||
|
chown bird:bird /var/log/bird 2>/dev/null || true
|
||||||
|
|
||||||
|
# Запускаем BIRD
|
||||||
|
echo "[INFO] Запуск BIRD..."
|
||||||
|
systemctl start bird
|
||||||
|
|
||||||
|
# Проверяем статус
|
||||||
|
if systemctl is-active --quiet bird; then
|
||||||
|
echo "[SUCCESS] BIRD успешно запущен"
|
||||||
|
|
||||||
|
# Показываем статус
|
||||||
|
echo "[INFO] Статус BIRD:"
|
||||||
|
systemctl status bird --no-pager -l
|
||||||
|
|
||||||
|
# Показываем информацию о протоколах
|
||||||
|
echo "[INFO] Информация о протоколах:"
|
||||||
|
birdc show protocols 2>/dev/null || echo "birdc недоступен"
|
||||||
|
|
||||||
|
else
|
||||||
|
echo "[ERROR] Не удалось запустить BIRD"
|
||||||
|
echo "[INFO] Логи BIRD:"
|
||||||
|
journalctl -u bird --no-pager -l -n 20
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "[SUCCESS] Конфигурация BIRD исправлена и сервис запущен"
|
||||||
|
echo "[INFO] BIRD слушает на порту 179 и принимает соединения от любых пиров"
|
||||||
|
echo "[INFO] Сервер НЕ будет принимать префиксы от пиров, только экспортировать свои"
|
||||||
+224
@@ -0,0 +1,224 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Скрипт для исправления конфигурации BIRD
|
||||||
|
# Ubuntu 24.04
|
||||||
|
|
||||||
|
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
|
||||||
|
}
|
||||||
|
|
||||||
|
# Получение IP адреса сервера
|
||||||
|
get_server_ip() {
|
||||||
|
# Попытка получить основной IP адрес
|
||||||
|
local ip=$(ip route get 8.8.8.8 | awk '{print $7; exit}' 2>/dev/null)
|
||||||
|
|
||||||
|
if [[ -z "$ip" ]]; then
|
||||||
|
# Альтернативный способ
|
||||||
|
ip=$(hostname -I | awk '{print $1}' 2>/dev/null)
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ -z "$ip" ]]; then
|
||||||
|
print_warning "Не удалось определить IP адрес, используем 192.168.1.1"
|
||||||
|
ip="192.168.1.1"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "$ip"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Создание простой конфигурации BIRD
|
||||||
|
create_simple_config() {
|
||||||
|
local server_ip=$(get_server_ip)
|
||||||
|
|
||||||
|
print_info "Создание простой конфигурации BIRD с IP: $server_ip"
|
||||||
|
|
||||||
|
# Создание простой конфигурации
|
||||||
|
cat > /etc/bird/bird.conf << EOF
|
||||||
|
# Простая конфигурация BIRD для BGP сервера
|
||||||
|
# Ubuntu 24.04
|
||||||
|
|
||||||
|
# Logging configuration
|
||||||
|
log "/var/log/bird/bird.log" all;
|
||||||
|
log stderr all;
|
||||||
|
|
||||||
|
# Router ID
|
||||||
|
router id $server_ip;
|
||||||
|
|
||||||
|
# Protocol configuration
|
||||||
|
protocol device {
|
||||||
|
scan time 10;
|
||||||
|
}
|
||||||
|
|
||||||
|
protocol direct {
|
||||||
|
disabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
protocol kernel {
|
||||||
|
disabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Статическая таблица маршрутов
|
||||||
|
protocol static {
|
||||||
|
# Маршруты будут загружаться из файла prefixes.txt
|
||||||
|
# через скрипт load_prefixes.py
|
||||||
|
}
|
||||||
|
|
||||||
|
# BGP Configuration
|
||||||
|
protocol bgp {
|
||||||
|
# Локальные настройки
|
||||||
|
local as 65001;
|
||||||
|
|
||||||
|
# Принимаем соединения от любых IP
|
||||||
|
listen bgp port 179;
|
||||||
|
|
||||||
|
# Настройки для пиров
|
||||||
|
import none; # Не импортируем маршруты от пиров
|
||||||
|
export all; # Экспортируем все маршруты пирам
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
|
||||||
|
print_success "Простая конфигурация создана"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Проверка конфигурации
|
||||||
|
check_config() {
|
||||||
|
print_info "Проверка конфигурации BIRD..."
|
||||||
|
|
||||||
|
if bird -p /etc/bird/bird.conf; then
|
||||||
|
print_success "Конфигурация BIRD корректна"
|
||||||
|
return 0
|
||||||
|
else
|
||||||
|
print_error "Ошибка в конфигурации BIRD"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Перезапуск сервисов
|
||||||
|
restart_services() {
|
||||||
|
print_info "Перезапуск сервисов BIRD..."
|
||||||
|
|
||||||
|
# Остановка сервисов
|
||||||
|
systemctl stop bird 2>/dev/null || true
|
||||||
|
systemctl stop bird6 2>/dev/null || true
|
||||||
|
|
||||||
|
# Запуск BIRD IPv4
|
||||||
|
systemctl start bird
|
||||||
|
|
||||||
|
if systemctl is-active --quiet bird; then
|
||||||
|
print_success "BIRD (IPv4) запущен"
|
||||||
|
else
|
||||||
|
print_error "Ошибка запуска BIRD (IPv4)"
|
||||||
|
systemctl status bird
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Попытка запуска BIRD6 если существует
|
||||||
|
if systemctl list-unit-files | grep -q bird6; then
|
||||||
|
systemctl start bird6
|
||||||
|
|
||||||
|
if systemctl is-active --quiet bird6; then
|
||||||
|
print_success "BIRD (IPv6) запущен"
|
||||||
|
else
|
||||||
|
print_warning "BIRD (IPv6) не запущен"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
# Проверка работоспособности
|
||||||
|
test_functionality() {
|
||||||
|
print_info "Проверка работоспособности..."
|
||||||
|
|
||||||
|
# Проверка статуса сервисов
|
||||||
|
echo ""
|
||||||
|
print_info "Статус сервисов:"
|
||||||
|
systemctl status bird --no-pager -l
|
||||||
|
|
||||||
|
# Проверка портов
|
||||||
|
echo ""
|
||||||
|
print_info "Проверка портов:"
|
||||||
|
if netstat -tlnp | grep :179; then
|
||||||
|
print_success "Порт 179 прослушивается"
|
||||||
|
else
|
||||||
|
print_warning "Порт 179 не прослушивается"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Проверка протоколов
|
||||||
|
echo ""
|
||||||
|
print_info "Проверка протоколов:"
|
||||||
|
if birdc show protocols 2>/dev/null; then
|
||||||
|
print_success "BIRD отвечает на команды"
|
||||||
|
else
|
||||||
|
print_warning "BIRD не отвечает на команды"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Основная функция
|
||||||
|
main() {
|
||||||
|
echo "=========================================="
|
||||||
|
echo "BIRD Configuration Fix Script"
|
||||||
|
echo "Ubuntu 24.04"
|
||||||
|
echo "=========================================="
|
||||||
|
|
||||||
|
check_root
|
||||||
|
|
||||||
|
# Создание простой конфигурации
|
||||||
|
create_simple_config
|
||||||
|
|
||||||
|
# Проверка конфигурации
|
||||||
|
if check_config; then
|
||||||
|
# Перезапуск сервисов
|
||||||
|
if restart_services; then
|
||||||
|
# Проверка работоспособности
|
||||||
|
test_functionality
|
||||||
|
|
||||||
|
print_success "Конфигурация исправлена успешно!"
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "Полезные команды:"
|
||||||
|
echo " sudo birdc show protocols"
|
||||||
|
echo " sudo birdc show routes"
|
||||||
|
echo " sudo systemctl status bird"
|
||||||
|
echo " sudo journalctl -u bird -f"
|
||||||
|
else
|
||||||
|
print_error "Ошибка перезапуска сервисов"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
print_error "Ошибка в конфигурации"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Запуск основной функции
|
||||||
|
main "$@"
|
||||||
@@ -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"
|
|
||||||
+571
@@ -0,0 +1,571 @@
|
|||||||
|
#!/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
|
||||||
|
}
|
||||||
|
|
||||||
|
# Получение IP адреса сервера
|
||||||
|
get_server_ip() {
|
||||||
|
# Попытка получить основной IP адрес
|
||||||
|
local ip=$(ip route get 8.8.8.8 | awk '{print $7; exit}' 2>/dev/null)
|
||||||
|
|
||||||
|
if [[ -z "$ip" ]]; then
|
||||||
|
# Альтернативный способ
|
||||||
|
ip=$(hostname -I | awk '{print $1}' 2>/dev/null)
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ -z "$ip" ]]; then
|
||||||
|
print_warning "Не удалось определить IP адрес, используем 192.168.1.1"
|
||||||
|
ip="192.168.1.1"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "$ip"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Проверка версии 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
|
||||||
|
|
||||||
|
# Получение IP адреса сервера
|
||||||
|
local server_ip=$(get_server_ip)
|
||||||
|
print_info "Используется IP адрес: $server_ip"
|
||||||
|
|
||||||
|
# Создание правильной конфигурации BIRD IPv4
|
||||||
|
cat > /etc/bird/bird.conf << EOF
|
||||||
|
# BIRD Configuration for BGP Server
|
||||||
|
# Ubuntu 24.04
|
||||||
|
|
||||||
|
# Logging configuration
|
||||||
|
log "/var/log/bird/bird.log" all;
|
||||||
|
log stderr all;
|
||||||
|
|
||||||
|
# Router ID
|
||||||
|
router id $server_ip;
|
||||||
|
|
||||||
|
# Protocol configuration
|
||||||
|
protocol device {
|
||||||
|
scan time 10;
|
||||||
|
}
|
||||||
|
|
||||||
|
protocol direct {
|
||||||
|
disabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
protocol kernel {
|
||||||
|
disabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
table bgp_table;
|
||||||
|
|
||||||
|
protocol static {
|
||||||
|
table bgp_table;
|
||||||
|
}
|
||||||
|
|
||||||
|
protocol bgp {
|
||||||
|
local as 65001;
|
||||||
|
listen bgp port 179;
|
||||||
|
hold time 90;
|
||||||
|
keepalive time 30;
|
||||||
|
startup hold time 240;
|
||||||
|
|
||||||
|
# Сервер НЕ принимает маршруты от клиентов
|
||||||
|
import none;
|
||||||
|
# Сервер раздает ТОЛЬКО свои статические маршруты
|
||||||
|
export where source = RTS_STATIC;
|
||||||
|
|
||||||
|
# MD5 аутентификация (опционально)
|
||||||
|
# password "your_bgp_password";
|
||||||
|
table limit 100000;
|
||||||
|
|
||||||
|
# Фильтры: не принимаем ничего, раздаем всё
|
||||||
|
import filter {
|
||||||
|
reject;
|
||||||
|
};
|
||||||
|
export filter {
|
||||||
|
accept;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
filter community_filter {
|
||||||
|
reject;
|
||||||
|
}
|
||||||
|
|
||||||
|
function add_community() {
|
||||||
|
# пусто
|
||||||
|
}
|
||||||
|
|
||||||
|
protocol pipe {
|
||||||
|
table master;
|
||||||
|
peer table bgp_table;
|
||||||
|
import all;
|
||||||
|
export none;
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# Создание правильной конфигурации BIRD IPv6
|
||||||
|
cat > /etc/bird/bird6.conf << EOF
|
||||||
|
# BIRD IPv6 Configuration for BGP Server
|
||||||
|
# Ubuntu 24.04
|
||||||
|
|
||||||
|
# Logging configuration
|
||||||
|
log "/var/log/bird/bird6.log" all;
|
||||||
|
log stderr all;
|
||||||
|
|
||||||
|
# Router ID
|
||||||
|
router id $server_ip;
|
||||||
|
|
||||||
|
# Protocol configuration
|
||||||
|
protocol device {
|
||||||
|
scan time 10;
|
||||||
|
}
|
||||||
|
|
||||||
|
protocol direct {
|
||||||
|
disabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
protocol kernel {
|
||||||
|
disabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
table bgp_table;
|
||||||
|
|
||||||
|
protocol static {
|
||||||
|
table bgp_table;
|
||||||
|
}
|
||||||
|
|
||||||
|
protocol bgp {
|
||||||
|
local as 65001;
|
||||||
|
listen bgp port 179;
|
||||||
|
hold time 90;
|
||||||
|
keepalive time 30;
|
||||||
|
startup hold time 240;
|
||||||
|
|
||||||
|
# Сервер НЕ принимает маршруты от клиентов
|
||||||
|
import none;
|
||||||
|
# Сервер раздает ТОЛЬКО свои статические маршруты
|
||||||
|
export where source = RTS_STATIC;
|
||||||
|
|
||||||
|
# MD5 аутентификация (опционально)
|
||||||
|
# password "your_bgp_password";
|
||||||
|
table limit 100000;
|
||||||
|
|
||||||
|
# Фильтры: не принимаем ничего, раздаем всё
|
||||||
|
import filter {
|
||||||
|
reject;
|
||||||
|
};
|
||||||
|
export filter {
|
||||||
|
accept;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
filter community_filter {
|
||||||
|
reject;
|
||||||
|
}
|
||||||
|
|
||||||
|
function add_community() {
|
||||||
|
# пусто
|
||||||
|
}
|
||||||
|
|
||||||
|
protocol pipe {
|
||||||
|
table master;
|
||||||
|
peer table bgp_table;
|
||||||
|
import all;
|
||||||
|
export none;
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# Копирование скриптов
|
||||||
|
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
|
||||||
|
|
||||||
|
# Установка правильных прав доступа к конфигурации
|
||||||
|
chown bird:bird /etc/bird/bird*.conf
|
||||||
|
chmod 644 /etc/bird/bird*.conf
|
||||||
|
|
||||||
|
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 сервисов..."
|
||||||
|
|
||||||
|
# Включение автозапуска для bird (IPv4)
|
||||||
|
systemctl enable bird
|
||||||
|
|
||||||
|
# Проверка существования bird6 сервиса
|
||||||
|
if systemctl list-unit-files | grep -q bird6; then
|
||||||
|
systemctl enable bird6
|
||||||
|
print_info "BIRD6 сервис найден и включен"
|
||||||
|
else
|
||||||
|
print_warning "BIRD6 сервис не найден, будет использоваться только IPv4"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Запуск сервисов
|
||||||
|
systemctl start bird
|
||||||
|
|
||||||
|
# Проверка статуса bird
|
||||||
|
if systemctl is-active --quiet bird; then
|
||||||
|
print_success "BIRD (IPv4) запущен"
|
||||||
|
else
|
||||||
|
print_error "Ошибка запуска BIRD (IPv4)"
|
||||||
|
systemctl status bird
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Запуск bird6 если существует
|
||||||
|
if systemctl list-unit-files | grep -q bird6; then
|
||||||
|
systemctl start bird6
|
||||||
|
|
||||||
|
if systemctl is-active --quiet bird6; then
|
||||||
|
print_success "BIRD (IPv6) запущен"
|
||||||
|
else
|
||||||
|
print_error "Ошибка запуска BIRD (IPv6)"
|
||||||
|
systemctl status bird6
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
print_warning "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)"
|
||||||
|
print_info "Попытка создания простой конфигурации..."
|
||||||
|
create_simple_config
|
||||||
|
if bird -p /etc/bird/bird.conf; then
|
||||||
|
print_success "Простая конфигурация BIRD (IPv4) создана"
|
||||||
|
else
|
||||||
|
print_error "Не удалось создать рабочую конфигурацию BIRD (IPv4)"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Проверка синтаксиса IPv6 конфигурации
|
||||||
|
if command -v bird6 &> /dev/null; then
|
||||||
|
if bird6 -p /etc/bird/bird6.conf; then
|
||||||
|
print_success "Конфигурация BIRD (IPv6) корректна"
|
||||||
|
else
|
||||||
|
print_warning "Ошибка в конфигурации BIRD (IPv6), будет использоваться только IPv4"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
print_warning "BIRD6 не установлен, пропускаем проверку IPv6"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Создание простой конфигурации
|
||||||
|
create_simple_config() {
|
||||||
|
local server_ip=$(get_server_ip)
|
||||||
|
print_info "Создание простой конфигурации BIRD с IP: $server_ip"
|
||||||
|
cat > /etc/bird/bird.conf << EOF
|
||||||
|
# Простая конфигурация BIRD для BGP сервера
|
||||||
|
# Ubuntu 24.04
|
||||||
|
|
||||||
|
log "/var/log/bird/bird.log" all;
|
||||||
|
log stderr all;
|
||||||
|
router id $server_ip;
|
||||||
|
protocol device { scan time 10; }
|
||||||
|
protocol direct { disabled; }
|
||||||
|
protocol kernel { disabled; }
|
||||||
|
protocol static {}
|
||||||
|
protocol bgp {
|
||||||
|
local as 65001;
|
||||||
|
listen bgp port 179;
|
||||||
|
import none;
|
||||||
|
export where source = RTS_STATIC;
|
||||||
|
import filter { reject; };
|
||||||
|
export filter { accept; };
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
chown bird:bird /etc/bird/bird.conf
|
||||||
|
chmod 644 /etc/bird/bird.conf
|
||||||
|
print_success "Простая конфигурация создана"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Создание 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 ""
|
||||||
|
|
||||||
|
# Проверка bird6 если существует
|
||||||
|
if systemctl list-unit-files | grep -q bird6; then
|
||||||
|
systemctl status bird6 --no-pager -l
|
||||||
|
else
|
||||||
|
print_warning "BIRD6 сервис не установлен"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Проверка прослушивания порта
|
||||||
|
if netstat -tlnp | grep :179; then
|
||||||
|
print_success "BGP порт 179 прослушивается"
|
||||||
|
else
|
||||||
|
print_warning "BGP порт 179 не прослушивается"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Проверка конфигурации
|
||||||
|
echo ""
|
||||||
|
print_info "Проверка конфигурации:"
|
||||||
|
if birdc show protocols 2>/dev/null; then
|
||||||
|
print_success "BIRD отвечает на команды"
|
||||||
|
else
|
||||||
|
print_warning "BIRD не отвечает на команды (возможно, нужно время для запуска)"
|
||||||
|
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 "$@"
|
||||||
@@ -0,0 +1,198 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Скрипт для установки BIRD6 на Ubuntu 24.04
|
||||||
|
# BIRD6 не всегда устанавливается по умолчанию
|
||||||
|
|
||||||
|
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
|
||||||
|
}
|
||||||
|
|
||||||
|
# Установка BIRD6
|
||||||
|
install_bird6() {
|
||||||
|
print_info "Проверка установки BIRD6..."
|
||||||
|
|
||||||
|
# Проверка существования bird6
|
||||||
|
if command -v bird6 &> /dev/null; then
|
||||||
|
print_success "BIRD6 уже установлен"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
print_info "Установка BIRD6..."
|
||||||
|
|
||||||
|
# Попытка установки bird6
|
||||||
|
if apt install -y bird6; then
|
||||||
|
print_success "BIRD6 установлен успешно"
|
||||||
|
else
|
||||||
|
print_warning "BIRD6 не найден в репозиториях, попробуем альтернативные способы"
|
||||||
|
|
||||||
|
# Попытка установки из пакета bird2
|
||||||
|
if apt install -y bird2; then
|
||||||
|
print_info "BIRD2 установлен, проверяем наличие bird6"
|
||||||
|
|
||||||
|
# Проверка символических ссылок
|
||||||
|
if [[ -f /usr/sbin/bird6 ]]; then
|
||||||
|
print_success "BIRD6 найден в BIRD2 пакете"
|
||||||
|
else
|
||||||
|
print_warning "BIRD6 не найден в BIRD2 пакете"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
print_error "Не удалось установить BIRD6"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
# Настройка BIRD6 сервиса
|
||||||
|
configure_bird6_service() {
|
||||||
|
print_info "Настройка BIRD6 сервиса..."
|
||||||
|
|
||||||
|
# Проверка существования сервиса
|
||||||
|
if systemctl list-unit-files | grep -q bird6; then
|
||||||
|
print_success "BIRD6 сервис найден"
|
||||||
|
|
||||||
|
# Включение автозапуска
|
||||||
|
systemctl enable bird6
|
||||||
|
|
||||||
|
# Запуск сервиса
|
||||||
|
systemctl start bird6
|
||||||
|
|
||||||
|
# Проверка статуса
|
||||||
|
if systemctl is-active --quiet bird6; then
|
||||||
|
print_success "BIRD6 сервис запущен"
|
||||||
|
else
|
||||||
|
print_error "Ошибка запуска BIRD6 сервиса"
|
||||||
|
systemctl status bird6
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
print_warning "BIRD6 сервис не найден, создаем вручную"
|
||||||
|
|
||||||
|
# Создание systemd сервиса для BIRD6
|
||||||
|
cat > /etc/systemd/system/bird6.service << EOF
|
||||||
|
[Unit]
|
||||||
|
Description=BIRD Internet Routing Daemon (IPv6)
|
||||||
|
Documentation=man:bird(8)
|
||||||
|
After=network.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=notify
|
||||||
|
ExecStart=/usr/sbin/bird6 -c /etc/bird/bird6.conf -s /var/run/bird6.ctl
|
||||||
|
ExecReload=/bin/kill -HUP \$MAINPID
|
||||||
|
Restart=on-failure
|
||||||
|
RestartSec=5
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# Перезагрузка systemd
|
||||||
|
systemctl daemon-reload
|
||||||
|
|
||||||
|
# Включение и запуск сервиса
|
||||||
|
systemctl enable bird6
|
||||||
|
systemctl start bird6
|
||||||
|
|
||||||
|
# Проверка статуса
|
||||||
|
if systemctl is-active --quiet bird6; then
|
||||||
|
print_success "BIRD6 сервис создан и запущен"
|
||||||
|
else
|
||||||
|
print_error "Ошибка запуска созданного BIRD6 сервиса"
|
||||||
|
systemctl status bird6
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
# Проверка конфигурации BIRD6
|
||||||
|
check_bird6_config() {
|
||||||
|
print_info "Проверка конфигурации BIRD6..."
|
||||||
|
|
||||||
|
if [[ -f /etc/bird/bird6.conf ]]; then
|
||||||
|
# Проверка синтаксиса
|
||||||
|
if bird6 -p /etc/bird/bird6.conf; then
|
||||||
|
print_success "Конфигурация BIRD6 корректна"
|
||||||
|
else
|
||||||
|
print_error "Ошибка в конфигурации BIRD6"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
print_warning "Файл конфигурации BIRD6 не найден"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
# Основная функция
|
||||||
|
main() {
|
||||||
|
echo "=========================================="
|
||||||
|
echo "BIRD6 Installation Script"
|
||||||
|
echo "Ubuntu 24.04"
|
||||||
|
echo "=========================================="
|
||||||
|
|
||||||
|
check_root
|
||||||
|
|
||||||
|
# Установка BIRD6
|
||||||
|
if install_bird6; then
|
||||||
|
# Настройка сервиса
|
||||||
|
if configure_bird6_service; then
|
||||||
|
# Проверка конфигурации
|
||||||
|
if check_bird6_config; then
|
||||||
|
print_success "BIRD6 успешно установлен и настроен"
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "Полезные команды:"
|
||||||
|
echo " sudo systemctl status bird6"
|
||||||
|
echo " sudo bird6c show protocols"
|
||||||
|
echo " sudo bird6c show routes"
|
||||||
|
echo " sudo journalctl -u bird6 -f"
|
||||||
|
else
|
||||||
|
print_warning "BIRD6 установлен, но есть проблемы с конфигурацией"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
print_error "Ошибка настройки BIRD6 сервиса"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
print_error "Ошибка установки BIRD6"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Запуск основной функции
|
||||||
|
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()
|
||||||
+100
@@ -0,0 +1,100 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Простой скрипт для исправления конфигурации BIRD
|
||||||
|
# Ubuntu 24.04
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
echo "=========================================="
|
||||||
|
echo "Простое исправление конфигурации BIRD"
|
||||||
|
echo "Ubuntu 24.04"
|
||||||
|
echo "=========================================="
|
||||||
|
|
||||||
|
# Получаем IP адрес сервера
|
||||||
|
SERVER_IP=$(curl -s ifconfig.me 2>/dev/null || echo "192.168.1.1")
|
||||||
|
echo "[INFO] Используется IP адрес: $SERVER_IP"
|
||||||
|
|
||||||
|
# Останавливаем BIRD если запущен
|
||||||
|
echo "[INFO] Остановка BIRD..."
|
||||||
|
systemctl stop bird 2>/dev/null || true
|
||||||
|
|
||||||
|
# Создаем резервную копию текущей конфигурации
|
||||||
|
if [ -f /etc/bird/bird.conf ]; then
|
||||||
|
cp /etc/bird/bird.conf /etc/bird/bird.conf.backup.$(date +%Y%m%d_%H%M%S)
|
||||||
|
echo "[INFO] Создана резервная копия: /etc/bird/bird.conf.backup"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Создаем простую рабочую конфигурацию
|
||||||
|
echo "[INFO] Создание простой конфигурации BIRD..."
|
||||||
|
cat > /etc/bird/bird.conf << EOF
|
||||||
|
# Простая конфигурация BIRD для BGP сервера
|
||||||
|
# Ubuntu 24.04
|
||||||
|
|
||||||
|
# Logging
|
||||||
|
log stderr all;
|
||||||
|
log "/var/log/bird/bird.log" all;
|
||||||
|
|
||||||
|
# Router ID
|
||||||
|
router id $SERVER_IP;
|
||||||
|
|
||||||
|
# Device protocol
|
||||||
|
protocol device {
|
||||||
|
scan time 10;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Direct protocol (disabled)
|
||||||
|
protocol direct {
|
||||||
|
disabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Kernel protocol (disabled)
|
||||||
|
protocol kernel {
|
||||||
|
disabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Static routes
|
||||||
|
protocol static {
|
||||||
|
# Статические маршруты будут загружаться через скрипт
|
||||||
|
}
|
||||||
|
|
||||||
|
# BGP protocol - принимаем любых пиров
|
||||||
|
protocol bgp any_peer {
|
||||||
|
local as 65001;
|
||||||
|
listen bgp port 179;
|
||||||
|
import none; # Не принимаем маршруты от пиров
|
||||||
|
export where source = RTS_STATIC; # Экспортируем только статические маршруты
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
|
||||||
|
echo "[SUCCESS] Конфигурация создана"
|
||||||
|
|
||||||
|
# Создаем директорию для логов если не существует
|
||||||
|
mkdir -p /var/log/bird
|
||||||
|
chown bird:bird /var/log/bird 2>/dev/null || true
|
||||||
|
|
||||||
|
# Запускаем BIRD
|
||||||
|
echo "[INFO] Запуск BIRD..."
|
||||||
|
systemctl start bird
|
||||||
|
|
||||||
|
# Проверяем статус
|
||||||
|
if systemctl is-active --quiet bird; then
|
||||||
|
echo "[SUCCESS] BIRD успешно запущен"
|
||||||
|
|
||||||
|
# Показываем статус
|
||||||
|
echo "[INFO] Статус BIRD:"
|
||||||
|
systemctl status bird --no-pager -l
|
||||||
|
|
||||||
|
# Показываем информацию о протоколах
|
||||||
|
echo "[INFO] Информация о протоколах:"
|
||||||
|
birdc show protocols 2>/dev/null || echo "birdc недоступен"
|
||||||
|
|
||||||
|
else
|
||||||
|
echo "[ERROR] Не удалось запустить BIRD"
|
||||||
|
echo "[INFO] Логи BIRD:"
|
||||||
|
journalctl -u bird --no-pager -l -n 20
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "[SUCCESS] Конфигурация BIRD исправлена и сервис запущен"
|
||||||
|
echo "[INFO] BIRD слушает на порту 179 и принимает соединения от любых пиров"
|
||||||
|
echo "[INFO] Сервер НЕ будет принимать префиксы от пиров, только экспортировать свои"
|
||||||
@@ -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