293 lines
8.2 KiB
Markdown
293 lines
8.2 KiB
Markdown
# Альтернативные решения для BGP сервера
|
|
|
|
## Обзор решений
|
|
|
|
В данном документе представлены альтернативные решения для создания BGP сервера, который раздает префиксы из текстовых файлов.
|
|
|
|
## 1. Bird BGP Daemon
|
|
|
|
### Преимущества
|
|
- Высокая производительность
|
|
- Поддержка IPv6
|
|
- Гибкая конфигурация
|
|
- Активная разработка
|
|
|
|
### Недостатки
|
|
- Сложная конфигурация
|
|
- Меньше документации на русском языке
|
|
|
|
### Dockerfile
|
|
```dockerfile
|
|
FROM ubuntu:20.04
|
|
|
|
# Установка Bird
|
|
RUN apt-get update && apt-get install -y bird
|
|
|
|
# Создание директорий
|
|
RUN mkdir -p /etc/bird /var/log/bird
|
|
|
|
# Копирование конфигурации
|
|
COPY bird.conf /etc/bird/bird.conf
|
|
|
|
# Открытие BGP порта
|
|
EXPOSE 179
|
|
|
|
# Запуск Bird
|
|
CMD ["bird", "-f", "-d"]
|
|
```
|
|
|
|
### Конфигурация (bird.conf)
|
|
```
|
|
# Основная конфигурация Bird
|
|
log stderr all;
|
|
log "/var/log/bird.log" all;
|
|
|
|
# Настройки BGP
|
|
router id 192.168.1.100;
|
|
|
|
# Протокол для загрузки префиксов из файла
|
|
protocol static {
|
|
route 192.168.1.0/24 via 192.168.1.100;
|
|
route 10.0.0.0/8 via 192.168.1.100;
|
|
route 172.16.0.0/12 via 192.168.1.100;
|
|
}
|
|
|
|
# BGP протокол
|
|
protocol bgp bgp_peer {
|
|
local as 65000;
|
|
neighbor 192.168.1.1 as 65001;
|
|
export where proto = "static";
|
|
import none;
|
|
}
|
|
```
|
|
|
|
## 2. FRRouting (FRR)
|
|
|
|
### Преимущества
|
|
- Полная совместимость с Cisco IOS
|
|
- Поддержка множества протоколов
|
|
- Хорошая документация
|
|
- Активное сообщество
|
|
|
|
### Недостатки
|
|
- Больший размер образа
|
|
- Более сложная настройка
|
|
|
|
### Dockerfile
|
|
```dockerfile
|
|
FROM ubuntu:20.04
|
|
|
|
# Установка FRR
|
|
RUN apt-get update && apt-get install -y frr
|
|
|
|
# Создание директорий
|
|
RUN mkdir -p /etc/frr /var/log/frr
|
|
|
|
# Копирование конфигурации
|
|
COPY frr.conf /etc/frr/frr.conf
|
|
|
|
# Открытие BGP порта
|
|
EXPOSE 179
|
|
|
|
# Запуск FRR
|
|
CMD ["/usr/lib/frr/frrinit", "start"]
|
|
```
|
|
|
|
### Конфигурация (frr.conf)
|
|
```
|
|
! FRR configuration
|
|
hostname bgp-server
|
|
password zebra
|
|
enable password zebra
|
|
|
|
! BGP configuration
|
|
router bgp 65000
|
|
bgp router-id 192.168.1.100
|
|
neighbor 192.168.1.1 remote-as 65001
|
|
neighbor 192.168.1.1 description RouterOS
|
|
!
|
|
address-family ipv4 unicast
|
|
network 192.168.1.0/24
|
|
network 10.0.0.0/8
|
|
network 172.16.0.0/12
|
|
neighbor 192.168.1.1 activate
|
|
exit-address-family
|
|
```
|
|
|
|
## 3. GoBGP
|
|
|
|
### Преимущества
|
|
- Современный подход
|
|
- Высокая производительность
|
|
- Поддержка gRPC API
|
|
- Легкая интеграция с Go приложениями
|
|
|
|
### Недостатки
|
|
- Меньше готовых примеров
|
|
- Требует знания Go для расширения
|
|
|
|
### Dockerfile
|
|
```dockerfile
|
|
FROM golang:1.19-alpine
|
|
|
|
# Установка GoBGP
|
|
RUN go install github.com/osrg/gobgp/cmd/gobgpd@latest
|
|
|
|
# Создание директорий
|
|
RUN mkdir -p /etc/gobgp
|
|
|
|
# Копирование конфигурации
|
|
COPY gobgpd.conf /etc/gobgpd.conf
|
|
|
|
# Открытие BGP порта
|
|
EXPOSE 179
|
|
|
|
# Запуск GoBGP
|
|
CMD ["gobgpd", "-f", "/etc/gobgpd.conf"]
|
|
```
|
|
|
|
### Конфигурация (gobgpd.conf)
|
|
```toml
|
|
[global.config]
|
|
as = 65000
|
|
router-id = "192.168.1.100"
|
|
|
|
[[neighbors]]
|
|
[neighbors.config]
|
|
neighbor-address = "192.168.1.1"
|
|
peer-as = 65001
|
|
|
|
[[neighbors.afi-safis]]
|
|
[neighbors.afi-safis.config]
|
|
afi-safi-name = "ipv4-unicast"
|
|
|
|
[[defined-sets.prefix-sets]]
|
|
prefix-set-name = "prefixes"
|
|
[[defined-sets.prefix-sets.prefix-list]]
|
|
ip-prefix = "192.168.1.0/24"
|
|
[[defined-sets.prefix-sets.prefix-list]]
|
|
ip-prefix = "10.0.0.0/8"
|
|
[[defined-sets.prefix-sets.prefix-list]]
|
|
ip-prefix = "172.16.0.0/12"
|
|
```
|
|
|
|
## 4. Quagga (устаревший)
|
|
|
|
### Преимущества
|
|
- Простая конфигурация
|
|
- Много документации
|
|
- Стабильность
|
|
|
|
### Недостатки
|
|
- Устаревший проект
|
|
- Отсутствие обновлений
|
|
- Проблемы с безопасностью
|
|
|
|
### Dockerfile
|
|
```dockerfile
|
|
FROM ubuntu:18.04
|
|
|
|
# Установка Quagga
|
|
RUN apt-get update && apt-get install -y quagga
|
|
|
|
# Создание директорий
|
|
RUN mkdir -p /etc/quagga /var/log/quagga
|
|
|
|
# Копирование конфигурации
|
|
COPY zebra.conf /etc/quagga/zebra.conf
|
|
COPY bgpd.conf /etc/quagga/bgpd.conf
|
|
|
|
# Открытие BGP порта
|
|
EXPOSE 179
|
|
|
|
# Запуск Quagga
|
|
CMD ["/usr/lib/quagga/zebra", "-f", "/etc/quagga/zebra.conf"]
|
|
```
|
|
|
|
## 5. Собственное решение на Python
|
|
|
|
### Преимущества
|
|
- Полный контроль
|
|
- Легкая кастомизация
|
|
- Простота отладки
|
|
|
|
### Недостатки
|
|
- Требует разработки
|
|
- Меньше производительность
|
|
- Необходимость поддержки
|
|
|
|
### Пример реализации
|
|
```python
|
|
import asyncio
|
|
import ipaddress
|
|
from pybgp import BGP
|
|
|
|
class BGPServer:
|
|
def __init__(self, local_as, router_id, neighbor_ip, neighbor_as):
|
|
self.local_as = local_as
|
|
self.router_id = router_id
|
|
self.neighbor_ip = neighbor_ip
|
|
self.neighbor_as = neighbor_as
|
|
self.prefixes = set()
|
|
|
|
async def load_prefixes(self, filename):
|
|
"""Загрузка префиксов из файла"""
|
|
with open(filename, 'r') as f:
|
|
for line in f:
|
|
line = line.strip()
|
|
if line and not line.startswith('#'):
|
|
try:
|
|
ipaddress.ip_network(line)
|
|
self.prefixes.add(line)
|
|
except ValueError:
|
|
print(f"Invalid prefix: {line}")
|
|
|
|
async def announce_prefixes(self):
|
|
"""Анонсирование префиксов"""
|
|
for prefix in self.prefixes:
|
|
# Логика анонсирования
|
|
pass
|
|
|
|
async def main():
|
|
server = BGPServer(65000, "192.168.1.100", "192.168.1.1", 65001)
|
|
await server.load_prefixes("prefixes.txt")
|
|
await server.announce_prefixes()
|
|
|
|
if __name__ == "__main__":
|
|
asyncio.run(main())
|
|
```
|
|
|
|
## Сравнение решений
|
|
|
|
| Решение | Простота | Производительность | Документация | Поддержка |
|
|
|---------|----------|-------------------|--------------|-----------|
|
|
| ExaBGP | ⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐ |
|
|
| Bird | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
|
|
| FRR | ⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
|
|
| GoBGP | ⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐⭐ |
|
|
| Quagga | ⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐ |
|
|
| Python | ⭐⭐⭐⭐⭐ | ⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
|
|
|
|
## Рекомендации
|
|
|
|
### Для простых задач
|
|
- **ExaBGP** - лучший выбор для быстрого прототипирования
|
|
- **Python решение** - для полного контроля
|
|
|
|
### Для продакшн использования
|
|
- **Bird** - для высокой производительности
|
|
- **FRR** - для совместимости с Cisco
|
|
|
|
### Для современных проектов
|
|
- **GoBGP** - для интеграции с микросервисами
|
|
- **ExaBGP** - для простых сценариев
|
|
|
|
## Заключение
|
|
|
|
Выбор решения зависит от конкретных требований:
|
|
- Простота настройки → ExaBGP
|
|
- Производительность → Bird/FRR
|
|
- Современность → GoBGP
|
|
- Контроль → Python решение
|
|
|
|
Для большинства случаев ExaBGP является оптимальным выбором благодаря простоте настройки и достаточной производительности. |