# BGP на пальцах: как читать карту связности

> AS, префиксы, AS-path, транзит и пиринг, Tier 1, RPKI и препенды. Ровно столько BGP, сколько нужно, чтобы понять, что нарисовано в досье хостера и чем грозит один апстрим.

Хостер пишет в рекламе «10 Гбит/с, магистральные каналы», а BGP знает, как всё обстоит на самом деле. Читать его не сложнее, чем `traceroute`, если знать пять слов.

## Пять слов

| Термин | Что это |
|---|---|
| **AS** (автономная система) | Группа префиксов под управлением одного или нескольких операторов с единой, чётко заданной политикой маршрутизации (так её определяет RFC 1930). У каждой есть номер: AS9123, AS13335. |
| **Префикс** | Блок адресов вида `91.135.156.0/24`, который анонсируется в BGP одной записью. |
| **Анонс** | Сообщение BGP «до этого префикса можно дойти через меня». Сеть, которая анонсирует свой префикс первой, называется **origin**. |
| **AS-path** | Список AS, через которые прошёл анонс. По нему видно, кто кому передаёт маршрут. |
| **Апстрим** | Сеть, у которой твоя AS покупает транзит, то есть доступ ко всему остальному интернету. |

## Как читать AS-path

Каждый маршрутизатор, передавая анонс в соседнюю AS, дописывает свой номер **в самую левую позицию** пути (RFC 4271, раздел 5.1.2). Отсюда правило: **справа origin, слева тот, кто показал тебе маршрут**. Читать от origin нужно справа налево.

Реальный путь до префикса Timeweb, который видел один из пиров RIPE RIS 2026-09-23:

```
286 3257 12389 9123
```

**Схема:** AS9123 Timeweb → (транзит) AS12389 Ростелеком → (Tier 1) AS3257 GTT → (пир RIS) AS286

*Путь `286 3257 12389 9123` из RIPE RIS looking glass для 91.135.156.0/24, 2026-09-23. Анонс идёт слева направо по схеме, в AS-path записан в обратном порядке.*


Что ещё следует из устройства AS-path:

- **Защита от петель.** Маршрут с петлёй в AS-path (свой номер уже в пути) исключается из выбора (RFC 4271, 9.1.2).
- **Короче значит лучше, но не в первую очередь.** Сначала работает локальная степень предпочтения (LOCAL_PREF, её каждая сеть выставляет сама, RFC 4271, 9.1.1), и только среди равных по ней сравнивается длина AS-path (9.1.2.2). Поэтому трафик не обязан идти по самому короткому пути.

## Транзит, пиринг и кто кому платит

- **Транзит.** Клиент платит провайдеру за две вещи сразу: провайдер анонсирует маршруты клиента остальным сетям и отдаёт клиенту маршруты до всего остального интернета.
- **Пиринг.** Две сети обмениваются трафиком только между собой (и своими клиентами), чужой транзит через пиринг не гоняют. Часто без взаимных расчётов (settlement-free), напрямую или через точку обмена трафиком (IX).

**Tier 1** это общепринятое, но неформальное понятие: сеть, которая достаёт до всего интернета только через бесплатный пиринг и сама транзит не покупает. Официального списка нет, никакая организация тиры не присваивает, договоры о пиринге обычно закрыты (см. статью Tier 1 network в Википедии и её источники). Там же отмечено, что примерно с 2010 года крупные контент-провайдеры и CDN подключаются к провайдерам напрямую, и иерархия стала заметно площе.

> [!NOTE]
> Список Tier 1 в нашей карте связности зашит в код: 15 номеров (174, 701, 1299, 2914, 3257, 3320, 3356, 3491, 5511, 6453, 6461, 6762, 6830, 7018, 12956). Это рабочее соглашение для рисования графа, а не чей-то официальный реестр.

## Как строится карта связности в досье

Карта есть в [досье ASN](https://host.pink/AS9123), [досье префикса](https://host.pink/1.1.1.0/24) и досье IP. Что делает код (`worker/src/asgraph.ts`):

1. **Берёт префиксы.** Для AS это самый крупный анонсируемый IPv4-префикс и самый крупный IPv6. Для IP и префикса это сам префикс.
2. **Спрашивает RIPE RIS.** RIS это платформа RIPE NCC, которая собирает BGP-таблицы через коллекторы (RRC), с которыми пирятся сети по всему миру. Эндпоинт looking-glass в RIPEstat отдаёт AS-path от каждого пира каждого коллектора, данные близки к реальному времени.
3. **Чистит пути.** Схлопывает повторы (препенды), разворачивает путь так, чтобы он шёл от origin.
4. **Оставляет только дороги до Tier 1.** Путь обрезается на первой Tier 1. Пути, где Tier 1 нет вовсе, отбрасываются: это пиринг. Если у сети вообще нет путей через Tier 1, рисуются первые четыре хопа.
5. **Рисует.** Толщина линии пропорциональна числу путей через это ребро, в подсказке видна доля в процентах. Связи Tier 1 между собой не рисуются. На графе не больше 30 узлов: origin, все встреченные Tier 1 и самые нагруженные транзиты.

Поле **«прямые апстримы»** показывает AS, которая стоит сразу за origin, с долей путей, где она встретилась. Вот что получилось для Timeweb:

| | % |
|---|---:|
| AS9002 RETN | 49 |
| AS1299 Arelion | 23 |
| AS12389 Ростелеком | 14 |
| AS174 Cogent | 5 |
| AS50509 Transroute | 5 |
| AS20764 RASCOM | 4 |

*Прямые апстримы AS9123 (Timeweb): доля от 114 путей RIS до Tier 1 по префиксам 91.135.156.0/24 и 2a03:6f00::/29. Данные host.pink/AS9123?json, 2026-09-23 22:21 UTC*


> [!IMPORTANT]
> Проценты означают долю маршрутов, которые видят пиры RIS, а не долю трафика и не условия договора. По AS-path не определить, транзит это или пиринг: карта показывает, через кого сеть видна миру, а не сколько она кому платит. Пути без Tier 1 (например, через прямой пиринг на IX) на карту не попадают вовсе. В прямом запросе к looking glass по 91.135.156.0/24 (2026-09-23) пиры RIS показали 364 пути, и 301 из них обходился без Tier 1 из нашего списка.

## Досье префикса: видимость и RPKI

В разделе «Маршрутизация и RPKI» на [host.pink/1.1.1.0/24](https://host.pink/1.1.1.0/24) (2026-09-23): origin AS13335 Cloudflare, RPKI `valid`, видимость **110 из 111 пиров RIS**.

- **Видимость N из M** берётся из RIPEstat routing-status. M означает число пиров RIS с полной таблицей для этого семейства адресов (IPv4 или IPv6), N показывает, сколько из них сейчас видят префикс. Если N заметно меньше M, часть интернета до тебя не доходит: фильтры, отзыв анонса, проблемы у апстрима.
- **Впервые замечен**, **покрывающие** и **более узкие** префиксы тоже из routing-status.

### RPKI и ROA

**ROA** (Route Origin Authorization) это подписанный объект, в котором владелец адресов указывает, какой AS разрешено анонсировать его префиксы и до какой длины маски (`maxLength`), см. RFC 9582. Маршрутизатор сверяет анонс со списком проверенных ROA и присваивает ему одно из трёх состояний (RFC 6811):

| Состояние | Когда |
|---|---|
| **Valid** | Есть ROA, который покрывает префикс, совпадает по AS и допускает такую длину маски |
| **Invalid** | ROA на этот адресный блок есть, но ни один не совпадает: чужой AS или слишком длинная маска |
| **NotFound** | Ни один ROA этот префикс не покрывает |

RIPEstat, откуда досье берёт статус (валидатор Routinator), называет их `valid`, `invalid_asn`, `invalid_length` и `unknown` (это и есть NotFound). Если в досье не `valid`, открой RIPEstat по ссылке из досье и посмотри точный статус.

Зачем это нужно: сети, которые отбрасывают invalid-маршруты, не примут чужой анонс твоего префикса от другого AS. Чего RPKI не делает: он проверяет только origin, а не путь. RFC 6811 прямо пишет, что атакующему достаточно дописать в конец пути легитимный origin. RFC 9319 советует «минимальные» ROA: только те префиксы, которые реально анонсируются, и `maxLength` без необходимости не ставить, иначе остаётся место для угона более узкого префикса.

## Отказ апстрима и почему нужно два

**Один апстрим:**

```
твоя AS → A → Tier 1 → мир
```
Сессия с A упала: анонс отзывается везде. Видимость в досье падает к 0 из M, пока A не поднимется.

**Два и больше:**

```
твоя AS → A → Tier 1
твоя AS → B → Tier 1
```
Упал A: маршруты через B остаются в таблицах. После пересчёта BGP трафик идёт через B, префикс виден.



На карте одиночный апстрим выглядит как одна линия от origin, а если он к тому же не Tier 1, досье пишет: «Один апстрим. Упадёт он — упадёт всё». Для ноды, на которой висят платные клиенты, стоит выбирать хостера хотя бы с двумя независимыми апстримами. Опыт сообщества: хостеры меняют апстримов и ловят проблемы у них ([хроника за июнь 2026](/baza/hronologiya/2026-06/)), а связность префикса проверяют через bgp.tools ([сервисы](/baza/hosting/boty-servisy/), [мосты](/baza/tspu/mosty/)).

## Prepend

**Препенд** означает повтор своего номера в AS-path, чтобы путь через этот стык выглядел длиннее и соседи выбирали его реже. В данных RIS для Timeweb он виден прямо: `1299 9123 9123`, то есть в сторону Arelion номер Timeweb стоит дважды. Наша карта такие повторы схлопывает.

Рекомендации из черновика IETF GROW `draft-ietf-grow-as-path-prepending` (это ещё не RFC):

- больше пяти повторов почти никогда ничего не даёт;
- не препендить чужие номера AS;
- при одном апстриме препенд бессмыслен;
- сосед может безусловно предпочитать маршруты от клиентов (через LOCAL_PREF), и тогда препенд не работает вовсе. Проще спросить у него заранее.

> [!TIP]
> Быстрый чек-лист перед покупкой: открой `host.pink/AS<номер хостера>`. Хорошо, когда прямых апстримов несколько и ни у одного нет почти 100% путей. Плохо, когда RPKI не `valid` или видимость префикса заметно ниже числа пиров. Собственная ASN и подсеть стоят отдельных денег (цифры из сообщества в разделе [DNS](/baza/set/dns/) и в [рынке подсетей](/baza/hosting/rynok-podsetey/)).

## Источники

- RFC 4271, [A Border Gateway Protocol 4 (BGP-4)](https://www.rfc-editor.org/rfc/rfc4271): разделы 5.1.2 (AS_PATH), 9.1.2 (выбор маршрута)
- RFC 1930, [Guidelines for creation, selection, and registration of an Autonomous System](https://www.rfc-editor.org/rfc/rfc1930)
- RFC 6811, [BGP Prefix Origin Validation](https://www.rfc-editor.org/rfc/rfc6811)
- RFC 9582, [A Profile for Route Origin Authorizations (ROAs)](https://www.rfc-editor.org/rfc/rfc9582)
- RFC 9319, [The Use of maxLength in the RPKI](https://www.rfc-editor.org/rfc/rfc9319)
- IETF GROW: [draft-ietf-grow-as-path-prepending](https://datatracker.ietf.org/doc/draft-ietf-grow-as-path-prepending/) (версия 19)
- RIPE NCC: [RIS](https://ris.ripe.net/docs/), [Route Collectors](https://ris.ripe.net/docs/route-collectors/)
- RIPEstat Data API: [Looking Glass](https://stat.ripe.net/docs/data-api/api-endpoints/looking-glass), [Routing Status](https://stat.ripe.net/docs/data-api/api-endpoints/routing-status), [RPKI Validation](https://stat.ripe.net/docs/data-api/api-endpoints/rpki-validation)
- Википедия: [Tier 1 network](https://en.wikipedia.org/wiki/Tier_1_network), [Internet transit](https://en.wikipedia.org/wiki/Internet_transit), [Peering](https://en.wikipedia.org/wiki/Peering)
- Код карты связности host.pink: `worker/src/asgraph.ts`; данные [host.pink/AS9123](https://host.pink/AS9123) и [host.pink/1.1.1.0/24](https://host.pink/1.1.1.0/24), сняты 2026-09-23

---
Источник: https://host.pink/gaidy/bgp-na-paltsah/
Лицензия: CC BY-SA 4.0
