Проект ЦИТадель
Предыдущие статьи раздела разбирали отдельное соединение: TLS защищает его, а HTTP/2 и HTTP/3 организуют прикладной обмен. Теперь поднимемся на уровень выше: как пакет находит путь через независимые сети разных операторов? Между ними нет единого администратора, а кратчайший физический путь не всегда соответствует коммерческим отношениям. BGP (Border Gateway Protocol) распространяет сведения о достижимости и позволяет каждой сети применять собственную политику. Эта автономность обеспечивает рост интернета и одновременно объясняет перехваты и утечки маршрутов.
Автономная система (AS) — сеть или группа сетей под общей технической администрацией, которая показывает внешним соседям согласованную политику маршрутизации. Провайдер, оператор дата-центров, университет или крупная организация могут получить номер автономной системы (ASN). IP-префиксы распределяются отдельно: AS может объявлять собственные ресурсы, ресурсы клиента или вообще не объявлять адресов, если использует только чужой транзит.
Внутри AS маршруты распространяют, например, OSPF или IS-IS, а внутренний BGP разносит внешние маршруты между пограничными узлами. Между автономными системами работает внешний BGP. Глобального узла, который вычисляет путь за всех, нет: каждая AS выбирает и экспортирует маршруты согласно своим договорам и фильтрам. Поэтому интернет представляет собой сеть автономных систем, связанных не только кабелями, но и правилами обмена маршрутами.
Два BGP-узла устанавливают сеанс поверх TCP, обычно с портом 179, и передают сообщения UPDATE. Маршрут сочетает префикс назначения с атрибутами пути. Например, AS 65010 может получить анонс: «192.0.2.0/24 доступен через AS_PATH 65020 65030». Экспортируя маршрут внешнему соседу, AS обычно добавляет собственный номер слева. Изменения передаются при появлении или исчезновении маршрута, а не полной таблицей через равные интервалы.
AS_PATH выполняет две основные функции. Он описывает последовательность AS, через которые прошёл анонс, и предотвращает петли: узел отвергает маршрут, если видит в пути номер своей AS. Длина пути может участвовать в выборе, но BGP сам не измеряет задержку, пропускную способность, загрузку или потери.
Нужно различать два решения маршрутизатора:
Это различие объясняет многие перехваты: более специфичный анонс может победить на этапе пересылки, даже если для менее специфичного префикса BGP выбрал хороший путь.
Политику BGP нельзя отделить от отношений между сетями:
Распространённая модель предпочитает маршрут от клиента маршруту от пира, а маршрут от пира — маршруту от провайдера: получение клиентского трафика приносит доход, пиринг избегает расходов, транзит провайдеру оплачивается. Это не закон протокола и не универсальное правило, а политика, которую оператор кодирует, например, через Local Preference. Экспорт обычно дополняет выбор: клиентские маршруты сообщают всем соседям, а маршруты от провайдера или пира — своим клиентам, но не другим провайдерам и пирам. Нарушение именно этого ограничения часто создаёт утечку.
В результате маршрут может быть не кратчайшим географически и не самым быстрым. Искусственное удлинение AS_PATH (prepending) иногда отводит входящий трафик, но действует только там, где удалённые сети не предпочли иной путь по более важной политике.
Точный алгоритм зависит от реализации и конфигурации. Для нескольких допустимых маршрутов к одному префиксу типичная последовательность выглядит так:
Этот список объясняет порядок, но не заменяет документацию конкретного маршрутизатора. Результатом обычно становится один лучший BGP-путь к префиксу; многопутевая пересылка требует, чтобы реализация признала пути равноценными и была соответствующим образом настроена. После установки маршрутов применяется правило наиболее длинного префикса из раздела 2 — оно не является ещё одним шагом алгоритма BGP.
Глобальная таблица IPv4 к середине 2020-х имеет порядок миллиона маршрутов, поэтому память и время сходимости остаются эксплуатационными ограничениями. Многие операторы фильтруют в глобальном обмене IPv4-префиксы длиннее /24 и IPv6-префиксы длиннее /48, но это распространённая практика, а не универсальная гарантия протокола.
Базовый BGP сообщает, откуда получен маршрут, но не доказывает право исходной AS объявлять префикс и не подтверждает весь AS_PATH. Защита самого сеанса между соседями не решает эту задачу. Ошибка фильтра или намеренный ложный анонс поэтому может распространиться дальше.
Защиту добавляют по частям, сохраняя совместимость с уже работающей маршрутизацией:
Задание 1. Путь пакета. Выполните traceroute или mtr до нескольких узлов и сопоставьте отвечающие IP-адреса с ASN через whois или сервис IP → ASN. Отметьте границы сетей, но не называйте полученный список AS_PATH: часть маршрутизаторов не отвечает, адрес интерфейса может принадлежать другой стороне связи, а прямой и обратный пути могут различаться.
Задание 2. Анонсы из нескольких точек. В RIPEstat, RIPE RIS или RouteViews найдите префикс своей сети либо известного сервиса. Запишите исходную AS, несколько наблюдаемых AS_PATH и статус RPKI. Сравните точки наблюдения: разные лучшие пути являются нормальным следствием локальной политики.
Задание 3. Инцидент YouTube 2008 года. В разборе RIPE NCC найдите законный 208.65.152.0/22, ложный 208.65.153.0/24, AS 17557 и провайдера AS 3491. Объясните отдельно, почему анонс распространился и почему трафик выбрал /24. Затем проверьте контрмеры: ROA для /22 с maxLength=22 сделал бы /24 Invalid при ROV, а входной фильтр провайдера не позволил бы клиенту объявить чужой префикс. Это два независимых рубежа.
Задание 4. Границы RPKI. Найдите примеры Valid, Invalid и NotFound и объясните каждый результат через ASN, длину префикса и maxLength. Затем рассмотрите маршрут с законным origin, но неожиданным промежуточным провайдером: почему ROV не способен признать его утечкой? Сопоставьте ответ с назначением ASPA.
Задание 5* (лабораторное). Перехват и фильтр. В контейнерах с FRRouting или BIRD соберите четыре AS на отдельных соединениях: транзит T (65000), законный источник L (65010), нарушитель A (65020) и наблюдатель O (65030). L объявляет 10.10.0.0/16, A — свой 10.20.0.0/16, T передаёт клиентские маршруты O. Для команды network добавьте на источниках соответствующие статические маршруты в Null0, иначе реализация может не анонсировать префикс, отсутствующий в локальной таблице.
show bgp ipv4 unicast и маршрут к 10.10.1.1.Лаборатория разделяет два механизма, которые легко смешать: фильтрацию и выбор BGP-пути для одинакового префикса, а затем наиболее длинное совпадение при пересылке пакета.