Реализует 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
246 lines
7.2 KiB
Markdown
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) на время сессии.
|