Files
bgp-server/alternative-solutions.md
T
denozord 5d4d24b49f
Build and Push Docker Image / build (push) Has been cancelled
Sure! Pl
2025-07-11 13:23:21 +07:00

8.2 KiB

Альтернативные решения для BGP сервера

Обзор решений

В данном документе представлены альтернативные решения для создания BGP сервера, который раздает префиксы из текстовых файлов.

1. Bird BGP Daemon

Преимущества

  • Высокая производительность
  • Поддержка IPv6
  • Гибкая конфигурация
  • Активная разработка

Недостатки

  • Сложная конфигурация
  • Меньше документации на русском языке

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

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

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)

[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

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

Преимущества

  • Полный контроль
  • Легкая кастомизация
  • Простота отладки

Недостатки

  • Требует разработки
  • Меньше производительность
  • Необходимость поддержки

Пример реализации

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 является оптимальным выбором благодаря простоте настройки и достаточной производительности.