Как проверить маршруты BGP и валидность RPKI

Проверка маршрута BGP отвечает на вопрос, на который проверка сервера ответить не может: не «жива ли машина?», а «действительно ли интернет несёт трафик к этому префиксу — и от правильного ли источника?». Она читает анонсы, которые видят другие сети, — автономную систему источника, AS-пути, сколько коллекторов маршрутов вообще видят префикс, — и проверяет их по RPKI, подписанному реестру того, кому разрешено анонсировать что. В этом руководстве разбирается, что означает каждый сигнал, где он вводит в заблуждение, а также рутина из пяти шагов с использованием поиска BGP на этом сайте.

Когда маршруты идут не так

Сценарий знаком каждому, кто эксплуатировал публичный сервис: сайт открывается у вас, сервер исправен, сертификат действителен — а клиенты в другой стране не получают ничего. Мониторинг из вашего собственного офиса говорит, что всё в порядке. Их трафик никогда не приходит, потому что достижимость — это не свойство вашего сервера. Это свойство анонсов, которые несут ваш префикс через чужие сети, а эти анонсы могут меняться, фильтроваться или опровергаться, при том что на вашей машине не меняется вообще ничего. «Сайт лежит» иногда оказывается фактом маршрутизации в костюме сервера.

Сбои маршрутизации бывают трёх форм, которые стоит различать. Хайджек: другая автономная система анонсирует ваш префикс — или более специфичный его кусок — и притягивает трафик, который никогда не был её. Утечка маршрута: сеть распространяет полученные маршруты пирам или провайдерам, которым не должна была их посылать, так что трафик делает абсурдные объезды или падает в сеть, которая не может его доставить. И тихая форма: анонс отозван или отфильтрован изменением конфигурации, спором о пиринге или сбросом по RPKI, так что у части интернета просто не остаётся пути. Исправления для всех трёх полностью различны, поэтому первая задача — различить их, а начинается это с того, чтобы посмотреть, что анонсируется на самом деле.

Начните с анонса

Первый вопрос самый простой: анонсируется ли этот префикс в глобальную таблицу вообще, и если да, то кем? Последняя AS анонса — ASN источника — называет сеть, утверждающую, что владеет префиксом, а данные реестра за ней называют организацию, которой эта ASN принадлежит. Если источник — ваша собственная ASN или ASN вашего провайдера, анонс по меньшей мере заявляет правильный дом. Если это имя, которого вы никогда не видели, вы узнали нечто важное за первые десять секунд.

Информацию несут крайние случаи. Префикс совсем без источника нигде не анонсируется, где коллекторы могут видеть, — опечатка в префиксе, анонс, который никогда не делался, или отозванный повсюду; проверьте, есть ли покрывающий менее специфичный префикс, прежде чем делать выводы, потому что трафик ещё может течь под агрегатом. Несколько источников у одного префикса не являются автоматически подозрительными: сервисы anycast и крупные CDN по замыслу анонсируют один и тот же префикс из многих сетей, а префикс в середине передачи между провайдерами может какое-то время законно показывать два источника. Несколько источников плюс владелец, которого вы не знаете, начиная с момента, когда вы ничего не меняли, — вот комбинация, заслуживающая тревоги.

Видимость и AS-пути

Looking glass не спрашивает ваш маршрутизатор; он спрашивает коллекторы маршрутов — коллекторы RIPE RIS, стоящие за данными этого сайта, пирятся с сетями по всему миру и записывают, что эти пиры им анонсируют. Видимость — это число пиров коллекторов, которые вообще видят ваш префикс. Здоровый, давно существующий префикс обычно видят почти все. Число в свободном падении — или полное вчера и горстка сегодня — предполагает анонс, который отзывается, фильтруется или виден только через сужающийся набор путей.

AS-путь — это цепочка сетей, которую прошёл анонс: читайте её справа налево, от источника наружу через транзитных провайдеров к пиру коллектора. Она говорит вам, какие апстримы несут маршрут и где в цепочке сидит ваш собственный провайдер, — а когда случается утечка, путь показывает сеть, которой там быть не должно, в середине, перенаправляющую трафик вбок. Одна привычка чтения, которую стоит выработать: повторяющаяся ASN в пути — это обычно намеренный препендинг, сигнал инженерии трафика, а не петля; и кратчайший путь не всегда тот, которым идёт реальный трафик, потому что маршрутизация следует коммерческой политике, а не географии.

Откалибруйте прибор, прежде чем ему доверять. Коллекторы видят представления сетей, которые с ними пирятся, — большую, хорошо расположенную выборку, но не каждый маршрутизатор на планете. Префикс может быть невидим для коллекторов и при этом достижим внутри провайдера, который не пирится с RIS, и видим для коллекторов, пока конкретный транзит фильтрует его дальше вниз по потоку. Результат looking glass — это свидетельство о глобальной таблице, видимой с серьёзных точек наблюдения. Это не фотография каждого решения о пересылке, принимаемого сейчас в отношении вашего префикса.

RPKI простыми словами

RPKI — это попытка интернета сделать «мне разрешено это анонсировать» проверяемым утверждением, а не выкриком. Владелец префикса публикует ROA — Route Origin Authorisation, подписанный объект, заявляющий, что названная ASN может анонсировать этот префикс до указанной максимальной длины префикса. Валидаторы, такие как Routinator — тот, что стоит за проверкой на этом сайте, — забирают ROA из точек доверия пяти региональных реестров (APNIC, ARIN, LACNIC, RIPE NCC и AFRINIC) и проверяют каждый анонс по ним. Подписанное заявление либо покрывает ваш анонс, либо нет; в этом весь механизм.

Каждый анонс попадает в одно из трёх состояний. Действительный (valid): ROA покрывает этот префикс, эту ASN источника и эту длину. Недействительный (invalid): ROA покрывает префикс, но анонс нарушает его условия — и различие внутри invalid важно: invalid_asn означает, что его анонсирует не та сеть, а invalid_length означает, что правильная сеть анонсирует более специфичный префикс, чем разрешает ROA. Неизвестный (unknown, часто называемый not-found): ни один ROA вообще не покрывает префикс, так что проверять не по чему.

Теперь честность. Invalid — это свидетельство, а не доказательство хайджека. ROA выпускают ошибочно, они устаревают после передачи префикса или пишутся с максимальной длиной, которую операционная команда потом забывает при деагрегации, — случай с неверной ASN заслуживает быстрого звонка, но проверьте свои собственные документы, прежде чем кого-то обвинять. А unknown обычно означает просто, что никто не опубликовал ROA; у большой доли префиксов мира их до сих пор нет, так что unknown — это пробел в системе, а не отметка против префикса. У invalid, впрочем, есть настоящие зубы: многие крупные сети теперь просто сбрасывают недействительные анонсы, так что состояние invalid может быть прямой причиной той дыры достижимости, с которой вы начали.

Рутина проверки из пяти шагов

Сначала исключите более простые слои — новая запись DNS, ещё распространяющаяся (проверьте её проверкой распространения DNS), или порт сервиса, закрытый снаружи (проверьте его сканером портов), прекрасно имитируют сбои маршрутизации. Затем откройте поиск BGP и работайте по порядку. Шаг первый, префикс: введите IP или префикс и подтвердите покрывающий анонс, который действительно несёт ваш трафик. Шаг второй, источник: прочитайте ASN источника и владельца — ваш, вашего провайдера или чужой. Шаг третий, видимость: сколько пиров коллекторов его видят и выглядит ли это число нормальным для этого префикса?

Шаг четвёртый, RPKI: valid, invalid (какого вида?) или unknown — и если invalid_asn называет чужого, эскалируйте, прежде чем заканчивать список. Шаг пятый, AS-пути: какие апстримы несут анонс, и нет ли сети, сидящей в пути, где ей не место? Затем запишите это, пока оно перед вами: префикс, ASN источника и владельца, число видимости, состояние RPKI, пути, которые вы видели, — и время, в UTC. Данные инструмента берутся из RIPEstat и RIPE RIS и кэшируются примерно на час, так что скриншот без метки времени — это анекдот; заметка с ней — свидетельство, которое можно сравнить со следующей проверкой.

Ограничения, которые стоит проговорить

Три ограничения принадлежат любому отчёту, который питается этими данными. Покрытие коллекторов смещено: пиров у RIS много, но распределены они не равномерно — некоторые регионы и типы сетей представлены куда лучше других, так что число видимости — это выборка, а не перепись. Распространение занимает минуты, а не секунды: законное изменение, которое вы только что сделали, может законно ещё не быть видимым, а отозванный маршрут может задержаться в коллекторах после того, как реальный трафик уже ушёл дальше; подождите и проверьте снова, прежде чем объявлять исправление или катастрофу. Покрытие RPKI частично: поскольку у многих префиксов до сих пор нет ROA, слой валидации может судить только ту часть таблицы, которая в нём участвует.

И ограничение, которое важнее всего в споре: чистый результат здесь не доказывает, что содержится в таблице вашего собственного маршрутизатора. Ваши сессии, ваши фильтры, ваше локальное предпочтение — всё это может сделать ваш угол интернета законно отличным от того, что видят коллекторы. Используйте поиск BGP, чтобы установить, что мир анонсирует и видит; используйте BGP-таблицу вашего собственного маршрутизатора, чтобы установить, что вы с этим делаете. Отчёт об инциденте, который держит эти два утверждения раздельно, — это отчёт, который никому не придётся отзывать.

Часто задаваемые вопросы

Что на самом деле означает RPKI invalid?

Что ROA покрывает префикс, но этот анонс нарушает его условия: либо ASN источника не та, которую ROA разрешает (invalid_asn), либо анонсированный префикс более специфичен, чем позволяет максимальная длина ROA (invalid_length). Это свидетельство, а не доказательство хайджека — ошибочно выпущенные и устаревшие ROA, а также префиксы в середине передачи тоже дают недействительные анонсы. Всё равно относитесь к этому как к срочному: многие крупные сети сбрасывают недействительные маршруты, так что состояние invalid само по себе может быть причиной того, что часть интернета не может достичь префикса.

Может ли looking glass видеть таблицу маршрутов моего собственного маршрутизатора?

Нет. Looking glass показывает, что коллекторы маршрутов, такие как RIPE RIS, получили от сетей, которые с ними пирятся, — большую, полезную выборку глобальной таблицы, но не представление вашего собственного маршрутизатора. Ваш маршрутизатор применяет ваши сессии, фильтры и локальное предпочтение, так что его таблица может законно отличаться. Для собственного представления нет замены тому, чтобы спросить сам маршрутизатор (его сводку BGP и запросы маршрутов); используйте looking glass для того, что видит мир, а ваш маршрутизатор — для того, что делаете вы.

Почему два looking glass расходятся в отношении одного и того же префикса?

Потому что они смотрят с разных стульев. Каждый коллектор пирится с разным набором сетей, так что один может получить анонс, которого другой никогда не слышит; они также могут опрашивать с разницей в минуты, пока изменение ещё распространяется, а сети на пути применяют собственную фильтрацию — включая сброс маршрутов, недействительных по RPKI, — так что разные точки наблюдения честно держат разные таблицы. Расхождение — это информация: если коллекторы одного региона видят префикс, а другого — нет, форма расхождения часто и есть форма проблемы.