Files
poc-frr-anycast/hld.md
T
ayurishchevandClaude Sonnet 5 eaa577e6b7 Add FRR anycast lab: HLD, containerized topology, docs
Реализует HLD-дизайн (hld.md) в виде развёртываемого Docker Compose
окружения: 5 FRR-роутеров (A1-A3 anycast 10.200.200.1/32 на AS 65001,
B1/B2 на AS 65002/65003) + 6 клиентских контейнеров, ECMP-балансировка
трафика клиентов площадки B к anycast-адресу площадки A.

- docker-compose.yml, frr/*, entrypoints/* — топология и конфиги FRR
- scripts/verify.sh, scripts/traffic-test.sh — проверка BGP/ECMP и трафика
- hld.md — HLD-дизайн + Mermaid-диаграмма топологии
- README.md — запуск, структура, команды проверки на роутерах и клиентах
- docs/ — планы внедрения и summary по каждому изменению

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Bc3HkMiDwooSyLBLoMKNyF
2026-09-03 12:52:44 +03:00

7.2 KiB

Anycast FRR Configuration

Топология

Full Mesh между площадками

Site A (AS 65001)                          Site B
  A1 ───────── 10.0.1.0/30 ───────── B1 (AS 65002)
  A1 ───────── 10.0.2.0/30 ───────── B2 (AS 65003)

  A2 ───────── 10.0.3.0/30 ───────── B1 (AS 65002)
  A2 ───────── 10.0.4.0/30 ───────── B2 (AS 65003)

  A3 ───────── 10.0.5.0/30 ───────── B1 (AS 65002)
  A3 ───────── 10.0.6.0/30 ───────── B2 (AS 65003)
  • Anycast-адрес на всех A: 10.200.200.1/32 (dummy0)

  • Клиентские сети площадки Б:

    • B1: 10.100.1.0/24
    • B2: 10.100.2.0/24

Диаграмма (Mermaid)

flowchart LR
    subgraph SiteA["Площадка A — AS 65001 · anycast 10.200.200.1/32"]
        A1["A1<br/>dummy0: 10.200.200.1/32"]
        A2["A2<br/>dummy0: 10.200.200.1/32"]
        A3["A3<br/>dummy0: 10.200.200.1/32"]
    end

    subgraph SiteB1["Площадка B — B1 · AS 65002 · 10.100.1.0/24"]
        B1["B1"]
        C1["C1<br/>10.100.1.11"]
        C2["C2<br/>10.100.1.12"]
        C3["C3<br/>10.100.1.13"]
        C1 --> B1
        C2 --> B1
        C3 --> B1
    end

    subgraph SiteB2["Площадка B — B2 · AS 65003 · 10.100.2.0/24"]
        B2["B2"]
        C4["C4<br/>10.100.2.14"]
        C5["C5<br/>10.100.2.15"]
        C6["C6<br/>10.100.2.16"]
        C4 --> B2
        C5 --> B2
        C6 --> B2
    end

    A1 ---|"10.0.1.0/30"| B1
    A2 ---|"10.0.3.0/30"| B1
    A3 ---|"10.0.5.0/30"| B1
    A1 ---|"10.0.2.0/30"| B2
    A2 ---|"10.0.4.0/30"| B2
    A3 ---|"10.0.6.0/30"| B2

Каждый B-роутер держит 3 eBGP-сессии в сторону площадки A (ECMP, maximum-paths 3) — трафик клиентов к anycast-адресу распределяется по A1/A2/A3.


Конфигурация FRR — площадка A

A1 (AS 65001)

interface dummy0
 ip address 10.200.200.1/32
!
interface eth0
 ip address 10.0.1.1/30
!
interface eth1
 ip address 10.0.2.1/30
!
router bgp 65001
 bgp router-id 10.0.0.1
 no bgp ebgp-requires-policy
 neighbor 10.0.1.2 remote-as 65002
 neighbor 10.0.2.2 remote-as 65003
 !
 address-family ipv4 unicast
  network 10.200.200.1/32
  neighbor 10.0.1.2 activate
  neighbor 10.0.2.2 activate
 exit-address-family

A2 (AS 65001)

interface dummy0
 ip address 10.200.200.1/32
!
interface eth0
 ip address 10.0.3.1/30
!
interface eth1
 ip address 10.0.4.1/30
!
router bgp 65001
 bgp router-id 10.0.0.2
 no bgp ebgp-requires-policy
 neighbor 10.0.3.2 remote-as 65002
 neighbor 10.0.4.2 remote-as 65003
 !
 address-family ipv4 unicast
  network 10.200.200.1/32
  neighbor 10.0.3.2 activate
  neighbor 10.0.4.2 activate
 exit-address-family

A3 (AS 65001)

interface dummy0
 ip address 10.200.200.1/32
!
interface eth0
 ip address 10.0.5.1/30
!
interface eth1
 ip address 10.0.6.1/30
!
router bgp 65001
 bgp router-id 10.0.0.3
 no bgp ebgp-requires-policy
 neighbor 10.0.5.2 remote-as 65002
 neighbor 10.0.6.2 remote-as 65003
 !
 address-family ipv4 unicast
  network 10.200.200.1/32
  neighbor 10.0.5.2 activate
  neighbor 10.0.6.2 activate
 exit-address-family

Конфигурация FRR — площадка B

B1 (AS 65002)

interface eth0
 ip address 10.0.1.2/30
!
interface eth1
 ip address 10.0.3.2/30
!
interface eth2
 ip address 10.0.5.2/30
!
interface eth3
 ip address 10.100.1.1/24
!
router bgp 65002
 bgp router-id 10.0.0.4
 no bgp ebgp-requires-policy
 bgp bestpath as-path multipath-relax
 neighbor 10.0.1.1 remote-as 65001
 neighbor 10.0.3.1 remote-as 65001
 neighbor 10.0.5.1 remote-as 65001
 !
 address-family ipv4 unicast
  network 10.100.1.0/24
  maximum-paths 3
  neighbor 10.0.1.1 activate
  neighbor 10.0.3.1 activate
  neighbor 10.0.5.1 activate
 exit-address-family

B2 (AS 65003)

interface eth0
 ip address 10.0.2.2/30
!
interface eth1
 ip address 10.0.4.2/30
!
interface eth2
 ip address 10.0.6.2/30
!
interface eth3
 ip address 10.100.2.1/24
!
router bgp 65003
 bgp router-id 10.0.0.5
 no bgp ebgp-requires-policy
 bgp bestpath as-path multipath-relax
 neighbor 10.0.2.1 remote-as 65001
 neighbor 10.0.4.1 remote-as 65001
 neighbor 10.0.6.1 remote-as 65001
 !
 address-family ipv4 unicast
  network 10.100.2.0/24
  maximum-paths 3
  neighbor 10.0.2.1 activate
  neighbor 10.0.4.1 activate
  neighbor 10.0.6.1 activate
 exit-address-family

Traffic Flow

От клиента к anycast-адресу

Клиенты (Site B)           B-маршрутизаторы            A-маршрутизаторы (Site A)
                                                                       [Anycast IP 10.200.200.1/32]
 C1 (10.100.1.11) ──► B1 ───────────────────► A1 ──► dummy0
 C2 (10.100.1.12) ──► B1 ───────────────────► A2 ──► dummy0
 C3 (10.100.1.13) ──► B1 ───────────────────► A3 ──► dummy0
 C4 (10.100.2.14) ──► B2 ───────────────────► A1 ──► dummy0
 C5 (10.100.2.15) ──► B2 ───────────────────► A2 ──► dummy0
 C6 (10.100.2.16) ──► B2 ───────────────────► A3 ──► dummy0

Каждый B использует ECMP (3 равноправных eBGP-пути) и распределяет клиентские потоки по A1/A2/A3.


ECMP и распределение трафика

Логика распределения нагрузки на примере 6 клиентов к anycast адресу на площадке B.

При 6 клиентах каждый маршрутизатор площадки B (B1 или B2) имеет три равноправных eBGP-маршрута к anycast-префиксу 10.200.200.1/32 (через A1, A2, A3) и использует ECMP.

Распределение трафика по путям выполняется на основе хэша 5-tuple (src IP, dst IP, src port, dst port, protocol) каждого клиентского потока:

  • если все 6 клиентов подключены к B1 → каждый поток попадает в один из трёх путей (A1/A2/A3), в среднем по 2 клиента на путь, но возможны отклонения из-за конкретных значений хэша;
  • если клиенты распределены между B1 и B2 → каждый маршрутизатор B независимо распределяет свои клиентские потоки по своим трём линкам (всего 6 линков в сторону A).

Итог: трафик от 6 клиентов разделяется на 3 (или 6) параллельных потоков, каждый клиент закрепляется за одним anycast-узлом (A1/A2/A3) на время сессии.