imageСлева вы наблюдаете аватар savannah.gnu.org, где лежит репозиторий Quagga. Нам показалось, что он подходит к событию.

Примерно две недели назад команда Qrator Radar столкнулась с интересным сетевым инцидентом, выяснение обстоятельств которого вылилось во внутреннее расследование-исследование, с поиском пострадавших и виновных, а также попытками исправить ситуацию. 30.09.2017 наша команда обратила внимание на необычно большое количество «мигающих» BGP-сессий.

Быстро проведенный анализ показал, что все проблемные сессии обладали рядом одинаковых симптомов: они обрывались из-за каких-то однотипных «битых» анонсов, также создавалось впечатление, что сессии рвутся не только у нас — в результате значительные перестроения маршрутизации происходят по всему миру.

Потратив некоторое время на выяснение причин данной проблемы, мы обнаружили, что битый анонс приходит для префикса 186.177.184.0/23 от AS262197 из Коста-Рики, причем по другим направлениям этот анонс приходит без каких-либо ошибок, но с препендом… 563. С одной стороны, данная политика бесполезна, так как эффект от политики препенда сходит на нет уже при значениях в районе 5, с другой стороны, такой анонс остается легитимным.

Мы задали вопросы пользователям, с которыми у нас «мигали» сессии, и в большинстве случаев BGP-сессия на стороне пользователя оказалась настроена с использованием Quagga или маршрутизаторов Brocade (который тоже основан на Quagga). Cобрав стенд, мы убедились в том, что проблема и вправду локализована в реализации Quagga — после обработки данного маршрута Quagga создавала анонс сразу с несколькими аномалиями: в маршруте оказывалась как неправильная длина атрибута AS_PATH, равно как и само значение атрибута AS_PATH оказывалось некорректным.

В результате, в соответствии с RFC4271, подобный анонс приводил к разрыву BGP-сессии, что начало приводить к разрыву BGP-сессий по всему миру. Для операторов, вышестоящие поставщики которых используют Quagga, данная аномалия за счет постоянных разрывов BGP-сессии была в состоянии приводить к частичной или полной недоступности сети. Мы обнаружили несколько сотен сетей, пострадавших в результате этого инцидента.

Данная аномалия повторилась на прошедших выходных, но уже для другого префикса — 186.176.186.0/23. Она завершилась только вчера, 16 октября 2017 года, таким образом общая длительность инцидента составила более двух суток.

На момент конца прошлой недели реализации Quagga в рамках релиза 1.2.2 была исправлена ошибка с длиной атрибута AS_PATH. Наша команда также прислала дополнительный патч, исправляющий и вторую проблему с самим содержимым этого атрибута. По состоянию на прошлую неделю ошибка в коде была частично исправлена в рамках релиза 1.2.2. Команда Qrator Radar предоставила дополнительный патч для Quagga, исправляющий формирование некорректного значения атрибута AS_PATH, и вчера он был принят, но пока еще не относится к текущему релизу.

Мы настоятельно рекомендуем всем пользователям Quagga обновить свой софт до версии 1.2.2 и следить за последующими апдейтами. Также, в приложение к данной публикации, мы прикладываем патч, исправляющий обе вышеописанные проблемы с анонсами в Quagga.

Команде Quagga спасибо за скорую реакцию.

Ссылка на патч.
Проверить, задета ли ваша AS.

Комментарии (12)


  1. Demon_i
    17.10.2017 23:46

    Мало того, что пост специфичный сугубо для провайдеров и прочих, подключённых к инету напрямую, так вы хоть объясните почему так случилось. Краткий пересказ: у нас все сломалось. Виноваты вот эти. Сломалось у всех, мы тут не причём. Они чёт пофиксили. Мы тоже чёт пофиксили. Всем бобра.


    1. elve
      18.10.2017 08:18
      +5

      Так автор объяснил почему. Вот поэтому — «Quagga создавала анонс сразу с несколькими аномалиями: в маршруте оказывалась как неправильная длина атрибута AS_PATH, равно как и само значение атрибута AS_PATH оказывалось некорректным.» Суховато, конечно. Без экспрессии и буйства эмоций. Это ж не роман, а техническая статья.


  1. younghacker
    18.10.2017 08:48
    +1

    А нам вешали лапшу про ураган в Костарике и по этой причине датацентр плохо доступен. :)


  1. Gansterito
    18.10.2017 10:02

    Примерно две недели назад команда Qrator Radar столкнулась с интересным сетевым инцидентом

    В действительности, с инцидентом столкнулось большинство инженеров, использующих Quagga на бордерах. Какая заслуга именно Qrator в обнаружении и устранении проблемы — не понятно. «Наша команда...», «мы обнаружили...», «мы задали...», «мы убедились..», «мы рекомендуем...».


    1. Phoen
      18.10.2017 10:36
      +1

      > Какая заслуга именно Qrator в обнаружении и устранении проблемы

      > Команда Qrator Radar предоставила дополнительный патч для Quagga, исправляющий формирование некорректного значения атрибута AS_PATH, и вчера он был принят, но пока еще не относится к текущему релизу.


      1. Gansterito
        18.10.2017 11:02
        +2

        Наверное, предложенный патч более правильный, чем тот, что спас нас (и не только) — lists.quagga.net/pipermail/quagga-dev/2017-September/033284.html
        Спасибо!


    1. mickvav
      18.10.2017 11:10
      +1

      Судя по git-у quagga, патч таки прислал таки Eugene Bogomazov из qrator.


  1. Loiqig
    18.10.2017 15:01

    И всё же. Каков механизм распространения? От Коста-Рики достаточно далеко, если я правильно понимаю то в AS_PATH для AS_SEQ не может быть больше 255 ASn. Даже если Quagga и сформировала неверный UPDDATE, то первый же сосед должен был положить сессию в направлении источника, то что это долетело до России как-то странно. Тоже пострадали, но на Ericsson. Или на всём пути у всех Quagga и её клоны?


    P.S. Проблеме сверх длинных AS_PATH ой как много лет уже. Вот навскидку ссылка.


    1. mitradir
      18.10.2017 15:51
      +1

      Проблема сверх длинных AS_PATH — ей и вправду много лет, и это именно проблема реализаций, а него самого протокола. Да, в одном сегменте не может быть больше 255 номеров, однако никто не запрещает иметь несколько сегментов (тоже обычное появление {}, т.е. одновременно AS_SEQ и AS_SET приводит к разбиению пути на два сегмента).
      Проблема в Quagga была в том, что при наличие несклольких сегментов AS_SEQ, неправильно считалась сумма длины всего атрибута — результат NOTIFICATION, а по факту постоянные флапы. Так же Quagga дописывала номера АС не в последний сегмент, а во все сегменты сразу, в итоге получался веселый путь: AS3 AS2 AS3 AS2 253xAS1 AS3 AS2 253xAS1.


      1. mitradir
        18.10.2017 16:21

        Так, чуть-чуть неточно написал, там еще инвертированный порядок сегментов, и «последний» неафектится:
        первый сегмент — AS3 AS2 253xAS1
        второй сегмент — AS3 AS2 253xAS1
        третий сегмент — 53xAS1

        В итоге вместо AS3 AS2 AS1x563 получился AS3 AS2 AS1x253 AS3 AS2 AS1x306


    1. firk
      18.10.2017 17:05

      Я может чего-то не понимаю, но разве 256 AS не сделают как минимум столько же узлов в tcp/ip трассировке, на которую всё не хватит никакого TTL?


      1. mitradir
        18.10.2017 17:42
        +1

        Нет, длина AS_PATH не имеет привязки к числу хопов. Более того, стандартный способ деприоритизации направления между операторами связи — это как раз добавление несколько раз номера своей АС в AS_PATH (prepend policy), кол-во хопов внутри сети, очевидно, при этом не меняется.
        Как написано в статье, обычно делать препенд больше 5 не имеет смысла, но при этом делать его больше никто не запрещает.