Files
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

246 lines
7.2 KiB
Markdown

# Anycast FRR Configuration
## Топология
### Full Mesh между площадками
```cfg
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)
```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)
```cfg
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)
```cfg
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)
```cfg
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)
```cfg
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-адресу
```cfg
Клиенты (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) на время сессии.