# BGP - Border Gateway Protocol _Протоколы · LinuxLab Knowledge Base_ **TL;DR:** **BGP** - протокол маршрутизации между автономными системами (AS). Это «язык» которым общаются ISP и крупные сети интернета: какой AS владеет какими prefix'ами и через кого до них доходить. ## Зачем BGP Внутри одной организации работают **IGP** (interior gateway protocols) - [ospf](/kb/ospf.md), IS-IS, RIP. Они быстрые, делятся всей топологией, но не масштабируются на размер интернета. **BGP** - это **EGP** (exterior gateway protocol). Он: - Работает между **автономными системами** (AS) - независимыми сетями с собственным номером (ASN, например 65001 для приватных или 13335 для Cloudflare) - Не делится топологией - только **достижимостью**: «AS 65001 может достать prefix 10.0.0.0/24 через путь AS 65002 → AS 65003» - Решает не «кратчайший путь по метрике», а **политикой**: предпочесть транзит подешевле, не отдавать prefix конкурентам, и т.д. Интернет - это ~75000 AS которые между собой обмениваются BGP-апдейтами. Полная BGP-таблица интернета сейчас ~950000 IPv4 prefix'ов. ## eBGP vs iBGP | Тип | Между кем | Особенность | |-----|-----------|-------------| | **eBGP** | разные AS | TTL=1 (соседи на одном link'е), AS-path увеличивается | | **iBGP** | внутри одной AS | full-mesh обязателен, AS-path не меняется | iBGP нужен когда у вас несколько BGP-роутеров в одной AS - они должны все знать друг про друга чтобы консистентно forward'ить транзит. Вместо full-mesh используют **route reflector** (один говорит со всеми, переотправляет апдейты). ## Состояния сессии (FSM) BGP-сессия - это TCP/179. После установления TCP идёт BGP handshake: ``` Idle → Connect → Active → OpenSent → OpenConfirm → Established ``` - **Idle** - стартовое, ждём триггера - **Connect** - пытаемся открыть TCP - **Active** - TCP не открылся, retry - **OpenSent / OpenConfirm** - обменялись OPEN-сообщениями - **Established** - всё, можем обмениваться prefix'ами Если в `show ip bgp summary` сосед в `Active` - значит TCP не идёт (firewall, IP не тот, AS не тот). См. [cmd-vtysh](/kb/cmd-vtysh.md). ## BGP-атрибуты (как принимается решение) Когда роутер получает один и тот же prefix несколькими путями, он выбирает best-path по порядку: 1. **Local Preference** (выше = лучше) - внутри AS 2. **AS-path length** (короче = лучше) 3. **Origin** (IGP < EGP < incomplete) 4. **MED** (Multi-Exit Discriminator, ниже = лучше) 5. **eBGP > iBGP** 6. **IGP-метрика до next-hop** 7. **Router ID** (тie-breaker) В скобках упрощено - реально шагов 13. Главное: путь короче (по AS) и Local-Pref выше - значит этот путь побеждает. ## Минимальная конфигурация (FRR) Сосед на p2p-линке `10.0.0.0/30`, своя AS 65001, чужая 65002: ``` router bgp 65001 bgp router-id 1.1.1.1 no bgp default ipv4-unicast neighbor 10.0.0.2 remote-as 65002 address-family ipv4 unicast neighbor 10.0.0.2 activate network 192.168.10.0/24 exit-address-family ``` Что тут: - `network` - анонсируем свой prefix соседу (он должен быть в RIB) - `no bgp default ipv4-unicast` - современная best-practice: явно активировать address-family для каждого соседа - `bgp router-id` - стабильный 32-битный ID (часто loopback IP) Проверка: `show ip bgp summary` → должен быть `Established` и число принятых prefix'ов. ## Префикс-фильтры Без фильтров iBGP/eBGP может сделать вас транзитом для половины интернета. Минимум: ``` ip prefix-list MY-PREFIXES seq 10 permit 192.168.10.0/24 router bgp 65001 neighbor 10.0.0.2 prefix-list MY-PREFIXES out ``` → соседу 10.0.0.2 отправляем только наш prefix, ничего больше. ## BGP в датацентре В современных DC (Clos / spine-leaf) BGP вытеснил OSPF даже как IGP - это **BGP-as-IGP** или **EVPN BGP**. Причины: - Простой policy control (route-map, prefix-list) - Multipath с unequal AS-path - Не нужно area-design как в [ospf](/kb/ospf.md) - Легко отделить underlay от overlay (VXLAN/EVPN) Кому интересно: [Cumulus / NVIDIA "BGP in the Data Center"](https://www.nvidia.com/en-us/networking/ethernet-switching/cumulus-linux/) - фактический стандарт de-facto. ## Команды ```bash vtysh -c 'show ip bgp summary' ``` Состояние всех BGP-соседей: AS, sessions, число prefix'ов ```bash vtysh -c 'show ip bgp' ``` Полная BGP-таблица: prefix → next-hop → AS-path ```bash vtysh -c 'show ip bgp neighbors 10.0.0.2 advertised-routes' ``` Что мы анонсируем конкретному соседу ```bash vtysh -c 'show ip bgp neighbors 10.0.0.2 received-routes' ``` Что приняли от соседа (нужно soft-reconfiguration inbound) ```bash ss -tnp '( sport = :179 or dport = :179 )' ``` Активные BGP TCP-сессии - быстрая проверка без vtysh ## См. также - [OSPF - Open Shortest Path First](/kb/ospf.md) - [Routing table](/kb/routing-table.md) - [IPv4-адресация и CIDR](/kb/ipv4-addressing.md) - [vtysh - CLI к FRR (BGP/OSPF)](/kb/cmd-vtysh.md) - [CNI plugins - сеть Kubernetes (calico, cilium, flannel)](/kb/cni-plugins.md)