Сегодня я увидел кое-что Прекрасное.

Я, когда устаю работать и хочу побездельничать, обычно хожу в гуглоридер почитать всякие новости-сплетни, башорг и прочую расслабляющую дребедень. Вот и сегодня... Но до башорга не дошел. Смотрю, сверху в списке драфтик с интригующим названием. Дай, думаю, гляну. Глянул.

Встречайте, E6 Addressing Scheme and Network Architecture.

Аплодирую автору стоя.

Только настоящему таланту дано написать документ настолько беспощадный в своей бессмысленности и бессмысленный в своей беспощадности. Это даже не летающие свиньи из RFC1925 - там все-таки свиней заставляли летать с какой-то подразумеваемой целью. Здесь - нет! Здесь они полетят только потому, что это отвечает эстетическим запросам автора, который не связан не только мелкими и пошлыми соображениями целесообразности, но и целеполагания как такового. Я считаю, что это архиверный подход, - ибо только так можно сделать что-то действительно возвышенное.

Нужна кристальная ясность мысли, чтобы так полно и точно придерживаться в своей работе принципа "много нового и много правильного". Не беда, что то новое не правильно, а правильное не ново. Пускай. Нет никакой необходимости пачкать одно другим. Пусть они просто будут рядом, не касаясь друг друга.

Заслуживает отдельной похвалы выбранная автором стратегия архитектурного проектирования. Если нечто нельзя за пол-лекции объяснить похмельному студенту, то этому совершенно не место в архитектуре Сетей Будущего. Действительно, ну кому нужен этот дурацкий TCP'шный и не-TCP'шный congestion control вместе со всем TCP? LLC2 прекрасно со всем справится, ведь у него даже предусмотрено скользящее окно! Я, кстати, думаю, что здесь недоработка. Скользящие окна стоило бы тоже запретить - от них оверхед и сплошное расстройство чувств.
 
Я уверен, что такое замечательное начинание, как E6 Network Architecture, найдет своих горячих поклонников. Я уже в их числе.
Уважаемые, я должен вам признаться, что я лох. Тупой лох.

В прошлом посте я предложил критерий выбора одного из решений системы логических уравнений, возникающей при обнаружении ASN32-capable роутеров по сочетаниями BGP атрибутов.

Мало того, что этот критерий довольно произвольный, так он еще и не приводит к единственному решению. Таких решений на том dataset'е, который у меня есть, - 1728 штук. В общем, файлик с решениями, удовлетворяющими выдвинутому критерию, здесь: allminsol.txt.

В принципе, эти решения имеют много общего, так что "какую-то" картинку на их основе можно сложить.

Где была моя голова, о чем я думал? Почему мне показалось, что такое решение одно? Не понятно.

Мне очень стыдно за свою тупость, простите меня. Пойду заливать стыд пивом в ближайшую пивную.

Надо что-то придумывать. Во-первых, побольше данных. Больше данных - больше ограничений в системе - меньше решений. Во-вторых, мой критерий явно дурацкий, нужен другой.

Detecting ASN32-capable routers in the Internet

| Comments ()   | No TrackBacks
Уже некоторое время RIR'ы выдают 32-битные номера автономных систем. В Интернете появились префиксы, анонсируемые 32-битными AS. Очевидно, для того, чтобы такие префиксы появились, нужна поддержка в софте роутеров. Основные вендоры, конечно же, уже выпустили софт с такой поддержкой. Однако, одно дело - выпущенный софт, другое - софт, задеплоенный в работающих сетях.

RFC4893 (BGP Support for Four-octet AS Number Space) позволяет переходить к повсеместной поддержке ASN32 постепенно и не требует, чтобы весь Интернет взял и одномоментно проапгрейдил софт на всех роутерах. Для того, чтобы сохранить совместимость новых номеров автономных систем со старым софтом, RFC4893 предусматривает довольно интересный механизм совместимости.

Вкратце, RFC определяет optional transitive атрибут AS4_PATH. Роутеры, которые поддерживают ASN32, при передаче апдейта роутеру без такой поддержки, сохраняют AS_PATH с 32-битными ASN в этом атрибуте, а в AS_PATH 32-битные номера заменяет на специальное значение 23456. Роутеры без поддержки ASN32 прозрачно передают этот атрибут дальше, а когда роутер с поддержкой ASN32 видит в апдейте атрибут AS4_PATH, он восстанавливает AS_PATH, основываясь на текущем значении AS_PATH и AS4_PATH.

Там немножко больше процедур, чем я описал одним абзацем, но пересказывать весь RFC я здесь не буду. Поэтому, интересующихся отошлю к тексту документа. Разобраться довольно не сложно.

Задача

Новый софт необходим только для тех автономных систем, которым присвоен 32-битный номер. Для 16-битных AS апгрейд, в принципе, необязателен - почти все будет работать как надо. С другой стороны, апгрейд имеет некоторые бенефиты: можно использовать в as-path regexp настоящие номера AS, а не 23456, MED будет работать правильно и т.п. Кому-то мелочи, кому-то нет.

Вопрос: а насколько распространен софт с поддержкой ASN32 в настоящий момент?

Метод

Можно попытаться ответить на этот вопрос, наблюдая за BGP-апдейтами, в которых есть атрибут AS4_PATH.

Рассмотрим апдейт вот с такими атрибутами (пример 1):
AS_PATH: 10 20 30 40 23456 50
AS4_PATH: 30 40 65537 50

Что можно сказать, глядя на такой апдейт?

  1. В AS65537 определенно есть новый софт (спасибо, Капитан Очевидность)
  2. В AS10 нового софта не замечено. Если б он там был, то AS4_PATH был бы длиннее.
  3. Про AS40 и AS50 неизвестно ничего. Даже если в них и есть новый софт, то он был "скрыт" новыми роутерами, через которые апдейт прошел потом.
  4. А вот с AS20 и AS30 все несколько интересней. AS_PATH со значением 30 40 65537 50 был сохранен в AS4_PATH в одной из этих двух автономных систем.
    • Если в AS20 новый софт стоит вперемешку со старым, то могло получиться так, что сначала апдейт попал на роутер с новым софтом, а потом по iBGP ушел на старый - в этом случае получится именно такой AS4_PATH.
      При этом в AS20 обязательно должны быть и роутеры со старым софтом. Например, роутер на стыке с AS10. Если б этот роутер имел новый софт, то AS4_PATH выглядел бы как 20 30 40 65537 50.
    • Если в AS20 нового софта нет, то такой AS4_PATH мог получиться только, если в AS30 роутер на стыке с AS20 - новый.

Видно, что рассматривая апдейты по одиночке, сказать что-то определенное о поддержке ASN32 в каждой из замеченных AS сложно. Кое-что можно, а кое-что нет. Но можно рассмотреть апдейты в совокупности.

Пусть в дополнению к предыдущему апдейту мы увидели еще и такой апдейт (пример 2):
AS_PATH: 30 80 65538
AS4_PATH: 65538

Становится понятно, что апдейт прошел через AS30 только по роутерам без поддержки ASN32. В принципе, могло получиться и так, что в AS30 есть новый софт, но апдейт прошел через другие роутеры. Т.е. либо AS30 не поддерживает ASN32 полностью, либо поддерживает частично. Если AS30 не поддерживает ASN32, то получается, что AS4_PATH в примере 1 был сформирован в AS20, и тогда в AS20 есть частичная поддержка ASN32.

Если мы посмотрим на апдейты за какой-то промежуток времени, то получится система логических ограничений, которая решается классическими методами для таких систем. Такая система имеет решение - в конце концов мы наблюдаем реальный интернет, который существует объективно (предполагаем, что сеть функционирует так, как описано в RFC4893 без ошибок). Такая система имеет много решений - например, есть тривиальное и неинтересное: говорим, что все наблюдаемые AS имеют частичную поддержку ASN32 и тогда все сойдется.

Поскольку решений может быть много, нам надо как-то выбрать одно. В связи с этим, я выдвину предложение: наиболее близким к реальности будем считать то решение, которое содержит наименьшее число утверждений "в автономной системе X мешанина из старого и нового софта", ибо это разврат, а разврата не может быть много. Называйте это presumption of sane operational practices :)

Эксперимент

Я собрал апдейты, содержащие атрибут AS4_PATH за трое суток c 7 мая 17:00 по 10 мая 17:00 (время московское) с http://bgpmon.netsec.colostate.edu/. Этот сервис отдает BGP-апдейты в реальном времени, которые получает от нескольких автономных систем. Файл с данными: as4upd.log. Формат, я думаю, очевиден.

За это время было зарегистрировано 869 апдейтов, несущих AS4_PATH, из них 294 с уникальными AS_PATH и AS4_PATH. 33 различных префикса. 30 автономных систем с номером более 65556. 119 автономных систем (считая 32-битные), про которые зарегистрированные апдейты дают какую-то информацию.

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

Update: Это не просто не "установленный факт". Эти результаты - говно чуть менее, чем полностью. См. следующий пост.

Результаты

Результаты приводятся только ASN16, ибо для ASN32 все очевидно.

Обнаружен новый софт, старого не обнаружено:
  • AS702
  • AS1103
  • AS1213
  • AS2828
  • AS3255
  • AS8758
  • AS8928
  • AS9035
  • AS9070
  • AS13249
  • AS20960
  • AS20965
  • AS22773
  • AS23352
  • AS24863
  • AS35320
  • AS42184
  • AS43561
  • AS48100
  • AS48850

Обнаружен старый софт, нового не обнаружено:
  • AS701
  • AS715
  • AS1267
  • AS1273
  • AS2516
  • AS2907
  • AS2914
  • AS3043
  • AS3216
  • AS3327
  • AS3491
  • AS3701
  • AS3741
  • AS4436
  • AS4600
  • AS4648
  • AS4697
  • AS5539
  • AS5784
  • AS6298
  • AS6453
  • AS6461
  • AS6762
  • AS6789
  • AS6854
  • AS7018
  • AS7091
  • AS7660
  • AS7911
  • AS8207
  • AS8400
  • AS8452
  • AS8495
  • AS8601
  • AS8866
  • AS9050
  • AS10764
  • AS10876
  • AS11537
  • AS12389
  • AS12552
  • AS12956
  • AS12989
  • AS13030
  • AS15412
  • AS15589
  • AS15703
  • AS15742
  • AS15772
  • AS20485
  • AS21011
  • AS21219
  • AS26769
  • AS34224
  • AS42396

Обнаружена мешанина из старого и нового софта:
  • AS174
  • AS286
  • AS812
  • AS1239
  • AS1299
  • AS3257
  • AS3303
  • AS3356
  • AS3549
  • AS6939
  • AS8342
  • AS9002
  • AS16150
  • AS22388

Обсуждение

Из 89 16-битных автономных систем (119 всего минус 30 32-битных)
  • в 55 обнаружен только старый софт (а нового не найдено)
  • в 20 обнаружен только новый софт (а старого не найдено)
  • в 14 обнаружено и то, и другое.

В принципе, результаты совпадают с моим представлением о положении дел. Большинство (62%) - разумные консерваторы, которые не стремятся к апгрейду на новый софт, пока их не вынуждают обстоятельства. Некоторые (22%) апгрейдятся, либо из-за относительно небольших преимуществ, которые дает поддержка ASN32, либо из-за каких-то других фич и фиксов.

Интересно довольно большое количество сетей, в которых есть и старый, и новый софт. Моя гипотеза состоит в том, что это сети с консервативной политикой по отношению к апгрейдам, но которые недавно ставили на сеть новое железо, поддерживаемое только новым софтом, а поддержку ASN32 на этих роутерах получили в довесок и специально выключать ее не стали.

Дальше

Я собираюсь повторить эксперимент через несколько месяцев, чтобы посмотреть что изменится за это время. Очень хотелось бы расширить источники данных, чтобы увидеть больше разных путей. Советы, где бы взять побольше пригодных данных, и помощь в этом приветствуются.

Blog upgrade

| Comments ()   | No TrackBacks
Проапгрейдил MT на 4.25. Новая версия не захотела принимать бэкап старого блога, и пришлось пойти путем экспорта/импорта. Все засосалось, но поменялись идентификаторы постов в фиде, так что ридеры покажут некоторое количество старых записей, как новые. Я дико извиняюсь за это неудобство.

Ежели еще чего поломано, прошу жаловаться. Буду по возможности чинить.

Райффайзен, продолжение

| Comments ()   | No TrackBacks
В продолжение к предыдущему.

Райффайзен заявление рассмотрел, расследовал, от претензий отказался, бабло вернул. Причем вернул правильно - по тому курсу, который был на момент возникновения "задолженности".

Ну что ж, молодцы. Уважаю за умение признавать ошибки. Это в наше время среди банков редкость.

Лох - это судьба

| Comments ()   | No TrackBacks
Некоторое время назад я матерился в адрес альфабанка (пользуясь случаем в очередной раз желаю им сдохнуть в корчах).

Так вот, видимо, жизнь меня ничему не учит. Нынче на практически такую же фигню я налетел в Райффайзене.

Они умудрились год назад перевыпустить одну из моих карточек, но ничего мне про это не сказать. Взяли комиссию, которая задвинула карточный счет в минус на какую-то незначительную сумму. В connect.raiffeisen.ru об этом, естественно, ни слова - там просто нарисован 0. Потом в июле, когда они от меня приняли завление на закрытие карточки, они опять же не сказали о минусе ни слова и заявление не исполнили, при этом само заявление осталось лежать у них в архиве и они мне его сегодня вытащили. А на минус погнались овердрафтовские проценты.

В общем, пару дней назад они таки проснулись и прислали СМСку. Минус за это время вырос в несколько раз и превратился баксов в пятьдесят. В connect.raiffeisen.ru опять же нарисован нолик.

Сегодня ездил писать заявление, краткое содержание которого сводится к "а вы, часом, не охуели?". Рядом стояла парочка, у которой аналогичный минус вырос за несколько лет до 20000 руб.

Я понимаю, кризис-хуизис, долги взыскивать. Но сначала: починить интернет-банк и научить своих клерков не проебывать заявления.

Тем временем, подыскиваю альтернативный банчок, чтобы послать Райффайзен в жопу. Советы принимаются.

Сам себя не похвалишь ...

| Comments ()   | No TrackBacks
Смотрю презентации с MWC2009. Bruce Davie и Yakov Rekhter хором рассказывают про использование BGP+labed unicast для масштабирования MPLS в нескольких IGP area. Я такую конструкцию описывал полтора года назад - http://net-geek.org/dbg/2007/08/interarea-ldp.html. Там конфиги и описание, как это работает.

Сижу и горжусь собой.

Там есть еще много интересного. Как появятся презентации в открытом доступе, обсудим. Stay tuned.

Достижение

| Comments ()   | No TrackBacks
Вышел вечером на часик пересечься с коллегой в ближайшем кабаке.

Возвращаюсь домой, жена обнюхивает.

- Дорогая, чего принюхиваешься? Да, выпил.
- Да я пытаюсь определить, чего пил.
- Пиво пил.
- Да нет. Это я понимаю. Какое ...
- Ну, давай, определяй.

Принюхивается внимательно.

- Стаут!
- !!!!

Всегда хотел научить жену разбираться в пивах. Теперь горжусь - воспитал.

Long prepends

| Comments ()   | No TrackBacks
Вот оно, оказывается, как: http://www.merit.edu/mail.archives/nanog/msg15730.html
Аплодирую наблюдательности.

Оказывается, так ведет себя Mikrotik в некоторых версиях. Если попытаться задать препенд номером AS, как мы все привыкли, то он интерпретирует это не как ASN, а как число ASN, которыми надо запрепендить AS_PATH, возьмет остаток от деления на 256, и собственно, запрепендит - мало не покажется никому.

Мораль? Молчаливые "нормализации" параметров - зло злодейское. Ну и с интерфейсом выделываться не надо - делай семантику как у всех, а то потом люди будут удивляться.

Bennett backs off (Torrent FUD III)

| Comments ()   | No TrackBacks
Тов. Беннетт занял более вменяемую (BitTorrent net meltdown delayed) позицию по отношению uTP в новом релизе uTorrent'а. Видимо, общественность вложила ему немного понимания. Что не может не радовать.

Однако, и в новой его статье не со всем можно согласиться.

The overall picture suggests that uTP has a serious flaw. If it simply relies on latency measurements to find preferred paths, it’s likely to favor paths where it’s successfully circumventing management.

Это не недостаток, это достоинство. Под traffic management тут понимаются нелепые попытки придавить одни приложения в пользу других чаще всего при помощи DPI. Так вот, the Net interprets non-neutrality as damage and routes around it.

Я уже говорил и еще раз повторю: доллар вложенный в расширение емкости сети делает сеть лучше, доллар вложенный в DPI - ничего нового не создает, а только [тщетно] пытается перераспределить имеющееся.

When a path is managed to give UDP priority over TCP (as is apparently the case in the Bell Canada network,) uTP will see that path as uncongested even as it's struggling to deliver TCP. In this case, uTP will in fact impair other applications, as we suggested in our previous piece.

Ежели кто-то от большого ума дает UDP приоритет просто по факту того, что это UDP, то это просто неправильно построенная сеть.

This may not be a widespread scenario, but that’s uncertain. Several management tweaks can prevent perverse side-effects like this from happening, such as reconfiguring traffic shapers to key on stream volume rather than protocol type. This approach to traffic shaping is slower to respond than protocol-based systems, however, so uTP just trades responsiveness at the application for responsiveness at the traffic shaper. Another solution would be for traffic shapers to look inside the UDP payload in order to differentiate VoIP from uTP, but this approach is frustrated by the protocol obfuscation option that remains a live feature in BitTorrent over uTP. uTP will cause traffic shaping to become more expensive.

Угу. Есть еще третье решение. Отказаться от идеи per application shaping, но Беннетт "почему-то" ее не высказывает.

Вообще, уважаемый автор, кажется, так и не понял, зачем все это затеяно. А именно, это попытка реализовать less-than-BE без интеллекта внутри сети и добиться того, чтобы bulk data transfers не мешали остальным приложениям. Если эта попытка окажется удачной, то вся затея с засовыванием per application traffic management'а внутрь сети окажется еще более бесполезной, чем она есть сейчас.

Torrent FUD II

| Comments ()   | No TrackBacks
Все как обычно. Slashdot'овские pathetic wannabe losers пляшут в комментах - из 600+ коментов только два не мимо тазика.

Тов. Беннетт бесстыдно несет ахинею в уютном бложике и глупо отмазывается в ledbat@ietf.org. Удивительно, все-таки. Раз он подписан на рассылку, значит знает о workgroup'е, наверняка читал charter и материалы с BoF, соответственно знает, кем workgroup была инициирована и зачем. Но это не мешает ему FUD'ить в полный рост.

Torrent FUD

| Comments ()   | No TrackBacks
Товарищ Беннетт, кажется, окончательно спятил: "Bittorrent declares war on VoIP, gamers (The next internet meltdown)". Кто бы ему объяснил, что использование UDP не обязательно означает отсутствие congestion control?

В данном случае, uTorrent стал использовать UDP не потому что хочет забрать больше полосы, а наоборот, потому что обычный TCP congestion control излишне агрессивен и хочется уступать больше ресурсов интерактивным приложениям, т.е. это end-to-end реализация less-than-best-effort. Я сугубо это приветствую.

Спецификацию своего протокола они обещают отдать на стандартизацию в IETF. Я предполагаю, что это будет workgroup item в LEDBAT WG.

Впрочем, ничего объяснить ему не получится, ибо он пропагандон с ясной политической целью:
The best way to ensure that uTP doesn’t kill the internet is to throttle it at the source, and any law that stands in the way of ISPs exercising that level of management is deadly to the internet.

Патентик

| Comments ()   | No TrackBacks
Случайно напоролся и офигел:
"US Patent 7230913 - MPLS fast reroute without full mesh traffic engineering":
Fast Reroute capability is added to an IP network to guarantee fast recovery to IP traffic in case of link or node failure without the need to deploy a full mesh of MPLS Traffic Engineering Label Switched Paths (LSPs). In one implementation, to protect a link, a 1-hop primary LSP is configured for the protected link and in addition a backup tunnel is configured to protect the 1-hop primary LSP. To protect a node, 2-hop primary LSPs are established for the link pairs traversing the node and backup tunnel(s) are configured to protect these 2-hop primary LSPs.
Assignee: Cisco Technology, Inc.

Абамлеть. Циска запатентовала one-hop'ы. Ну ладно, запатентовала, так запатентовала.

Мне вот что интересно: нафига? Кого они могут прищучить этим патентом?

Вендора-конкурента? Вряд ли. Такая конструкция вполне естественно получается при обычной имплементации LDP, RSPV-TE и туннелирования первого во второе. Патент этого не покрывает. Он покрывает конкретную конструцию, сделанную на этих механизмах. Пожалуй, единственный, кто может этот патент "нарушить" - это конечный пользователь, который такое задеплоил. Но зачем уважаемой компании Циско Системз щемить пользователей? Не могу себе представить такого стечения обстоятельств, когда бы такое произошло.

TWIMC

| Comments ()   | No TrackBacks
С сегодняшнего дня мой почтовый адрес в домене amt.ru действовать перестает.

Было клево. So long, and thanks for all the fish. :)

Изя всё

| Comments ()   | No TrackBacks
В начале прошлого года я написал несколько постов про PBT, выразив сомнения, что эта конструкция будет жить. В принципе, судьба этого чуда враждебной техники была понятна еще в апреле этого года, когда BT - главный потребитель этого несчастья - передумал. Поэтому, сегодняшняя новость о том, что Nortel - главный производитель этого несчастья - спешит избавиться от соответствующего подразделения, не была шоком.

Думаю, что на этом можно ставить точку. Конечно, стандартизаторы таки достандартизируют свой, как они его называют, PBB-TE - стандартизационные комитеты вообще не очень обращают внимание на реальность. Но, думаю, что никто в здравом уме не станет это деплоить. Мои соболезнования тем, кто повелся на нортелевскую пропаганду и успел на этом построиться.

Disqus

| No TrackBacks
По наводке уважаемого maxss проинтегрировал в блог Disqus для комментов. maxss же написал замечательную инструкцию по регистрации в Disqus. Я надеюсь, что комментировать станет удобней. Прошу тестировать.

Напоминаю, что в соотвествии с Планом, я через некоторое время перестану кросспостить в ЖЖ вообще. Так что призываю всех своих читателей подписываться на фид, либо, если хочется читать в ЖЖ-шной ленте, подписываться на ЖЖ-шную синдикацию.

Overcoming peer fraud

| Comments (6)   | No TrackBacks
Just for a change I'm going to try to blog in [admittedly broken] English. Hey, Petr, I'm jealous about your postings in internetworkexpert.com blog and the feedback you're getting, and I'm going to catch up. Just kidding. ;)

Next, I'm going to use Junos examples to illustrate this posting instead of IOS. I've finally got my olives in qemu working nicely on my home PC, and I'm anxious to put it to use.

The problem

A couple of weeks ago my LJ-friend visir has asked an interesting question: "Assume we have a client, which also peers at the same IX as we do. Then the client can defraud us. They can announce /22 on their direct link to us and one or two /23 through the IX route server. Now traffic from the Internet to that prefix flows to us, and takes exit at the IX to the client. Our client enjoys a free ride stealing bandwidth from us. How do you deal with this problem?"

If you think about it, it may sound somewhat weird. We're basically peering with our own customer. Well, that can and does happen in the real world. So we have to come up with a solution.

In fact, this problem with peering isn't new. It was mentioned a few times on various mailing lists and there was a presentation at NANOG 38 in 2006, describing a whole set of possible tricks a peer can play on you. I suggest reading the presentation before continuing with this posting. Please note, that it is not limited to peering; even your upstream can do nasty things to you.

Speaking of possible solutions, I'd like to point out that having a written and signed agreement is an absolute must when dealing with service stealing issues. Yes, it applies to peering as well, not only to Internet transit. Do have a peering agreement, which clearly states what a peer can do. No agreement - no ground for complaints. It leads us to observation 0: being promiscuous in your relationships is asking for trouble (you probably knew that before). The observation basically rules out peering with route server on IXs in favor of direct peering. Sure, direct peering is not always possible, so weigh your risks carefully when engaging in an IX peering.

That was a short comment on administrative side of the issue. Now to the technical one.

Luckily, there're technical ways to mitigate the threat, so you don't have to rely on administrative measures only.

Technical solution boils down to enforcing certain routing policies. The rules are:
1. Traffic ingressing from an upstream must flow only to a customer.
2. Traffic ingressing from a peer must flow only to a customer.
3. Traffic ingressing from a customer must flow to a customer if a customer route exists, otherwise it can flow to upstream or peer.

How can we enforce the policy? Clearly, control-plane-only solution is not sufficient (you've read NANOG presentation above, haven't you?). We have to somehow couple forwarding plane operations to control plane policy.

Other solutions

There're quite a few known solutions to this issue.

One from Juniper-land: DSU/SCU and their usage in firewall policies. Basically DSU/SCU is a method of grouping traffic on destination or source address. We could group all traffic in three classes: customer, upstream and peer, and then employ class-based filtering to enforce our rules.

Another one is from Cisco-land: QPPB. There's a quite cool method described in details in another NANOG presentation: http://www.nanog.org/meetings/nanog42/presentations/DavidSmith-PeeringPolicyEnforcement.pdf.

These solutions can deal with the problem, but there's a catch. They are designed to drop traffic when a peer tries to defraud us. This is a problem, because even unintentional misconfiguration (say, a sloppy attempt at traffic engineering) will result in service disruption. It would be nice, if we could handle it better and somehow ignore fraudulent/erroneous routes.

You've probably noticed in abovementioned presentations references to separate routers carrying partial routes. Yes, it can solve the problem, but it is uneconomical.

One can employ virtualization, i.e. logical routers, VRFs etc. But it is still uneconomical. You need a separate VRF per peer, if you don't want your peers to talk to each other through you. And a separate VRF per upstream, if you want enforce routing policy on traffic, coming from upstream providers too (remember, upstreams can also play games on you). Just imagine the amount of route replication between VRFs. It not only taxes on router memory and CPU resources, it also wastes precious FIB space - keeping several BGP full views each in separate VRF is very, very expensive.

Still, virtualization (or compartmentalization, if you will) is a very powerful method to deal with our problem. Let's try to design a practical method to use it.

The problem demonstrated

This is our playgroud where we're going to test our findings.

peer-fraud.png

Nothing fancy in the setup. IS-IS, LDP, iBGP full mesh between border routers, and eBGP to external autonomous systems. eBGP export policies are configured as usual: customer prefixes are announced to upstream ISP, local prefixes are announced everywhere, upstream and peer prefixes are announced only to customers.

AS 4 is a customer, AS 3 is a peer (a well behaved one), AS 100 is an upstream ISP. AS 2 is a customer, which is trying to defraud us. AS 2 has customer link to router BORDER-3 and a peering link to BORDER-2. AS 2 announces 2.0.0.0/8 route over the customer link and 2.0.0.0/9 over the peering link.

Let's see the issue in action.

dg@UPSTREAM> show route 2.0.0.1 terse

inet.0: 10 destinations, 10 routes (10 active, 0 holddown, 0 hidden)
+ = Active Route, - = Last Active, * = Both

A Destination        P Prf   Metric 1   Metric 2  Next hop        AS path
* 2.0.0.0/8          B 170        100            >100.0.1.1       1 2 I

dg@UPSTREAM> traceroute 2.0.0.1    
traceroute to 2.0.0.1 (2.0.0.1), 30 hops max, 40 byte packets
 1  100.0.1.1 (100.0.1.1)  0.761 ms  96.959 ms  100.964 ms
 2  1.0.255.0 (1.0.255.0)  158.851 ms  104.946 ms  106.054 ms
     MPLS Label=100016 CoS=0 TTL=1 S=1
 3  1.0.255.3 (1.0.255.3)  201.972 ms  104.960 ms  105.964 ms
 4  2.0.1.0 (2.0.1.0)  105.393 ms  52.344 ms  154.138 ms
 5  2.0.1.0 (2.0.1.0)  149.144 ms !H  105.044 ms !H  106.142 ms !H

You can see that traffic exits on the peering link to AS 2. Bad, bad, bad. Same with traffic from customer (AS 4), and even from a peer (AS 3).

Design and implementation

If you look at our rules again, you can see that a packet must be treated differently, depending on where it is coming from. That's observation 1.

We must make routing decisions (i.e. select egress point) right on ingress point, and once we've selected the egress point, we must not change it while the packet travels through our network. That's observation 2.

How do we implement this?

We want to make different routing decisions based on what the ingress link is: a customer, an upstream, or a peer. This implies multiple routing tables, right? But haven't we concluded that keeping separate routing tables for each upstream or peer is out of the question? Not exactly so. Keeping lots of copies of lots of routes is wrong; having multiple routing tables is ok, if we can populate them in an efficient way.

Let's see what additional routing/forwarding tables do we need and what routes they need to carry. Let's take a routing table to forward traffic coming from an upstream ISP. It needs to carry only customers' routes, locally originated routes, but not peer or upstream routes. Same with routing table for a peer. Do we need separate routing tables for each upstream or peer? No. If a routing table has only customer and local routes, then it is ok to use only one instance to forward traffic from all upstreams and peers connected to a router.

How can this be achieved? The idea is to have an external entity to run BGP signaling to our master routing instance (global routing table in Cisco speak), populate a restricted routing instance with needed routes from master routing instance, and then forward traffic from that entity within that restricted routing instance. We can do that with so called FBF (Filter Based Forwarding).

interfaces {
    fxp2 {          
        unit 0 {    
            family inet {
                filter {
                    input restricted;
                }   
            }       
        }
    }
}

routing-options {
    auto-export;
}

policy-options {
    policy-statement client-and-local-only {
        term local {
            from community local;
            then accept;
        }
        term client {
            from community client;
            then accept;
        }
        then reject;
    }
    policy-statement restricted-import {
        term needed-routes {
            from {  
                instance master;
                policy client-and-local-only;
            }       
            then accept;
        }           
        then reject;
    }               
}

firewall {
    filter restricted {
        term bgp-passive {
            from {
                destination-port bgp;
            }
            then accept;
        }
        term bgp-active {
            from {
                source-port bgp;
            }       
            then accept;
        }           
        term other {
            then routing-instance restricted;
        }           
    }               
}

routing-instances {
    restricted {    
        instance-type forwarding;
        routing-options {
            static {
                route 0.0.0.0/0 discard;
            }       
            instance-import restricted-import;
        }           
    }            
}

Traffic coming from a customer is slightly different. Remember rule 3: ... must flow to a customer if a customer route exists, otherwise it can flow to upstream or peer.

What we need to do in this case is to look up a customer route first, and if there's no such route, then we fallback to looking up a peer or an upstream route. So we make another routing instance, which again carries customer and local prefixes, and also add a fallback route to it. Again, a single such routing instance is sufficient to forward traffic from all customers.

Configuration is very similar to previuosly shown, but instead of default discard route we configure lookup in master routing table.

routing-instances {
    restricted-fallback {
        instance-type forwarding;
        routing-options {
            static {
                route 0.0.0.0/0 next-table inet.0;
            }       
            instance-import restricted-import;
        }           
    }               
}

It is pretty economical way to use multiple routing tables. We only have to replicate customer and local routes and we have to do that only to two extra tables, regardless of number of external commections on the router.

Let's now tackle with observation 2. Let me show why it is important. This is traceroute after we implemented restricted routing tables.

dg@UPSTREAM> traceroute 2.0.0.1 source 100.0.0.0    
traceroute to 2.0.0.1 (2.0.0.1) from 100.0.0.0, 30 hops max, 40 byte packets
 1  100.0.1.1 (100.0.1.1)  0.893 ms  99.335 ms  96.004 ms
 2  1.0.255.0 (1.0.255.0)  96.225 ms  240.356 ms  95.819 ms
     MPLS Label=100000 CoS=0 TTL=1 S=1
 3  1.0.255.5 (1.0.255.5)  95.861 ms  95.646 ms  96.030 ms
 4  1.0.255.4 (1.0.255.4)  192.635 ms  95.277 ms  144.631 ms
     MPLS Label=100016 CoS=0 TTL=1 S=1
 5  1.0.255.3 (1.0.255.3)  144.381 ms  148.101 ms  144.356 ms
 6  2.0.1.0 (2.0.1.0)  144.571 ms  100.139 ms  96.159 ms
 7  2.0.1.0 (2.0.1.0)  139.571 ms !H  196.818 ms !H  95.966 ms !H

See, a packet from upstream comes in to BORDER-1, BORDER-1 forwards it to BORDER-3 over LDP-signaled LSP, then BORDER-3 makes it's own routing decision and reroutes the packet to BORDER-2, and the packet exits to the peering link to AS2. We haven't achieved anything!

The problem is with penultimate hop popping. With PHP, a packet arrives at the egress router striped of MPLS headers, and the egress router makes routing decision based on destination IP address. This is not what we want. There're chances that the egress router will make a different routing decision and forward the packet to a different exit point. How can this be avoided? The answer is simple: use one more label. PHP will pop the top label, and the egress router will forward the packet based on the remaining label without looking at IP header. This can be easily achieved with labeled IPv4 unicast address family on our iBGP sessions.

protocols {
    bgp {               
        group ibgp {
            type internal;
            local-address 1.0.0.1;
            family inet {
                labeled-unicast;
            }
            neighbor 1.0.0.2;
            neighbor 1.0.0.3;
        }
    }
}

There's small catch though. We must enable family mpls on our external interfaces, otherwise this setup doesn't work (Is this olive's artifact? I don't have enough real equipment to verify it). This opens our network for label spoofing attack. Thus we must attach a filtering policy to family mpls on our external interfaces.

interfaces {
    fxp1 {          
        unit 0 {
            family mpls {
                filter {
                    input-list drop-mpls;
                }
            }
        }
    }
}

firewall {
    family mpls {
        filter drop-mpls {
            term all {
                then discard;
            }
        }
    }
}

Let's see how is all works together.

dg@UPSTREAM> traceroute 2.0.0.1
traceroute to 2.0.0.1 (2.0.0.1) from 100.0.0.0, 30 hops max, 40 byte packets
 1  100.0.1.1 (100.0.1.1)  1.103 ms  98.689 ms  100.819 ms
 2  1.0.255.0 (1.0.255.0)  100.305 ms  240.509 ms  100.759 ms
     MPLS Label=100000 CoS=0 TTL=1 S=0
     MPLS Label=100064 CoS=0 TTL=1 S=1
 3  1.0.255.5 (1.0.255.5)  51.932 ms  192.196 ms  105.548 ms
     MPLS Label=100064 CoS=0 TTL=1 S=1
 4  1.0.2.1 (1.0.2.1)  148.946 ms  100.330 ms  100.693 ms
 5  1.0.2.1 (1.0.2.1)  96.588 ms !H  153.207 ms !H  101.018 ms !H

dg@CUSTOMER> traceroute 2.0.0.1    
traceroute to 2.0.0.1 (2.0.0.1) from 4.0.0.0, 30 hops max, 40 byte packets
 1  1.0.4.0 (1.0.4.0)  0.744 ms  100.479 ms  102.213 ms
 2  1.0.255.0 (1.0.255.0)  102.067 ms  152.851 ms  101.834 ms
     MPLS Label=100000 CoS=0 TTL=1 S=0
     MPLS Label=100064 CoS=0 TTL=1 S=1
 3  1.0.255.5 (1.0.255.5)  101.457 ms  152.631 ms  153.512 ms
     MPLS Label=100064 CoS=0 TTL=1 S=1
 4  1.0.2.1 (1.0.2.1)  101.715 ms  50.052 ms  153.585 ms
 5  1.0.2.1 (1.0.2.1)  102.267 ms !H  100.998 ms !H  153.793 ms !H

dg@PEER> traceroute 2.0.0.1
traceroute to 2.0.0.1 (2.0.0.1) from 3.0.0.0, 30 hops max, 40 byte packets
 1  1.0.3.0 (1.0.3.0)  0.662 ms  90.742 ms  87.542 ms
 2  1.0.255.2 (1.0.255.2)  91.884 ms  215.552 ms  91.635 ms
     MPLS Label=100000 CoS=0 TTL=1 S=0
     MPLS Label=100064 CoS=0 TTL=1 S=1
 3  1.0.255.5 (1.0.255.5)  45.099 ms  157.433 ms  125.233 ms
     MPLS Label=100064 CoS=0 TTL=1 S=1
 4  1.0.2.1 (1.0.2.1)  132.577 ms  132.641 ms  91.394 ms
 5  1.0.2.1 (1.0.2.1)  103.895 ms !H  145.040 ms !H  133.256 ms !H

Now traffic coming in from customers, upstreams or peers takes the correct route. The fraudulent routes from AS2 are simply ignored.

Acknowledgements

Many thanks to Andrew Lomaka, who has pointed out this problem to me few years ago, shared lots of operational wisdom pertaining to the issue, answered many of my silly questions, and also helped to debug the configuration I described above.


Infowar

| Comments (8)   | No TrackBacks
На слешдоте обсуждали грузинскую цензуру по отношению к российским новостным сайтам. Утверждают, что блокировка - DNS-based. Похоже, что это и в самом деле так, но этим оно не ограничивается.

[13:42] dg@iddater:~$ dig @62.168.168.2 lenta.ru. any

; <<>> DiG 9.3.4 <<>> @62.168.168.2 lenta.ru. any
; (1 server found)
;; global options:  printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 49807
;; flags: qr aa rd; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 0

;; QUESTION SECTION:
;lenta.ru.                      IN      ANY

;; AUTHORITY SECTION:
ru.                     86400   IN      SOA     ns0.caucasus.net. root.caucasus.net. 2008102903 14400 3600 1209600 172800

;; Query time: 170 msec
;; SERVER: 62.168.168.2#53(62.168.168.2)
;; WHEN: Mon Aug 18 13:43:08 2008
;; MSG SIZE  rcvd: 83

Видно, что люди решили проблему радикально, и в соответствии с принципом “Разве может что-нибудь хорошее прийти из Назарета?”, накрыли медным тазом целый TLD.

Кстати, есть у кого-нибудь предположения, что может означать такой странный serial?

Для особо умных, которые умеют обращаться с собственным рекурсором и не пользуются провайдерским, есть второй слой блокировки - на уровне IP.

Вот пинги lenta.ru:

PING 81.19.69.232 (81.19.69.232) 56(84) bytes of data.
From 80.241.178.70 icmp_seq=3 Packet filtered

--- 81.19.69.232 ping statistics ---
3 packets transmitted, 0 received, +1 errors, 100% packet loss, time 2009ms

Как видно, приезжает ICMP 3/13 от 80.241.178.70.

И соседнего адреса:
PING 81.19.69.233 (81.19.69.233) 56(84) bytes of data.
64 bytes from 81.19.69.233: icmp_seq=1 ttl=42 time=132 ms
64 bytes from 81.19.69.233: icmp_seq=2 ttl=42 time=131 ms
64 bytes from 81.19.69.233: icmp_seq=3 ttl=42 time=132 ms

--- 81.19.69.233 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2037ms
rtt min/avg/max/mdev = 131.702/132.192/132.802/0.544 ms

Как видно, тут сделано несколько поизбирательней - блокируется только "вражеская пропаганда".

От оценок я воздержусь, пусть каждый делает выводы сам.

Don't fuck with TCP!

| Comments (17)   | No TrackBacks
Уважаемые, а давайте пофлеймим? Я кое-что скажу, а вы мне в ответ скажете, что я дурак и нихрена не понимаю.

А скажу я вот что: цископикс (ну и его производные) - говно.

Нет, я не буду говорить про управляемость, я не буду говорить про фичи, я не буду говорить про производительность, я даже не буду говорить про унылое множество атак, от которых может защитить пикс. Речь не о "недоделках".

Речь о том, что PIX - говно по построению. Сам принцип, по которому действует PIX, не позволяет построить что-либо, кроме говна.

А именно, попытка анализировать и модифицировать пакеты в некотором контексте, выведенном из пролетающего мимо трафика, - идея заведомо ущербная. Вот возьмем TCP, к примеру. TCP по своему дизайну - end-to-end протокол. Функции согласования параметров, сборки потока, ретрансмиссии, контроля скорости и все остальные выполняются на оконечном устройстве. Попытка вмешаться в пролетающие пакеты без взятия на себя всех функций неминуемо ведет к неисчислимым бедствиям.

Перейдем к примерам.

Я тут повспоминал, и понял, что PIX последовательно и неуклонно просрал все полимеры по очереди.

ECN просрал? Тупо и линейно. PIX присылал RST на SYN с установленными ECN-флагами (CSCds23698).

SACK просрал? Еще как! С фейрверком. PIX и ASA рандомизируют TCP sequence numbers, а тот sequence number, который внутри SACK option - забыли (CSCse14419). Oops.

Window scaling просрал? Просрал самым классическим образом. До некоторой версии window scaling не поддерживался. Попытка контролировать window overshooting в сочетании с непониманием window scaling приводил понятно к чему: пикс думал, что окошко маааленькое, и дропал совершенно нормальные пакеты. Починили это несчастье только в 2006 году, если мне не изменяет склероз. Т.е. через 14 (!) лет после выхода RFC 1323. Аплодисменты.

Не, конечно, всё это цискоиндусы поправили. Но поправили они это только после того как. А иначе быть и не могло. Появление всех расширений предвидеть невозможно, а принцип функционирования не позволяет обходиться с ними по-человечески без допиливания софта. Это не случайные баги, это системное.

И совершенно понятно, что это все повторится вновь. Следующее расширение опять будет сломано. Мы все опять будем пялиться красными от недосыпа глазами в wireshark и тихо материться.

Вы мне скажете: Даня, ты дурачок, это же security, security is supposed to break things.
Так я вам отвечу: Ежели так, то глобальная ядреная война - это the ultimate security solution. Вот взять, долбануть всех Бомбой и чтобы никто и никуда, и чтобы ша, и чтобы тихо и ничего не шевелилось.

/me облачился в asbestos suit. Расчехляйте flamethrower, коллеги.

IETF72

| Comments (2)   | No TrackBacks
На этой неделе в Дублине проходит очередная встреча IETF. Я сижу в Москве и наблюдаю издалека. На сегодня большая часть WG уже выложила свои материалы: https://datatracker.ietf.org/meeting/72/materials.html. Поэтому наблюдать интересно.

Несколько штучек, которые меня заинтересовали:

Virtual Aggregation

Некоторое время назад Paul Francis в grow@ietf рассказал про свою статью "Reducing FIB Size through Virtual Aggregation".

С тех пор он передумал и решил дополнить свой подход BGP-сигнализацией для некоторой автоматизации и, соотвественно, опубликовать свой драфт уже не в GROW, а в IDR. Что он и сделал в начале этого месяца, взяв в соавторы Xiaohu Xu из Huawei. В idr@ietf успели пообсуждать этот драфт немного, поэтому, скорее всего, надо ждать версии -01 в скором времени.

Суть предложенного подхода заключается в инжектировании довольно коротких префиксов (локальных для данной AS), и выкидывания из FIB (но не из RIB) префиксов более длинных. Если использовать правильную систему туннелей (например MPLS-туннелей), то это не приведет к циклам, но, естественно, может удлинить пути для трафика в данной AS. Статья показывает, что если выкидывать из FIB не все префиксы, а только "непопулярные", то можно достичь значительного сокращения объема FIB, не сильно ухудшив общую картину с оптимальностью путей трафика. Я в такой результат вполне верю: по словам коллеги из одного [довольно большого] оператора, на 120K префиксов уходит всего лишь около 1% трафика.

Кроме того, инжектирование покрывающих префиксов может помочь улучшить время сходимости. Здесь есть два фактора:
1) Покрывающий префикс распространяется независимо от специфичного и может служить своего рода fall back'ом для случая, когда next-hop специфичного префикса погиб. С несколькими одинаковыми префиксами обеспечить fallback труднее из-за того, что BGP-спикер анонсирует только лучший путь - это так называемая проблема path invisibility.
2) Маршрутизаторы, которые вбрасывают покрывающие префиксы, образуют уровень иерархии. Соответственно, как указал Robert Raszuk, само число роутеров, которые должны нести fallback пути, меньше. Плюс, если использовать BFD для быстрого обнаружения падения next-hop'ов, то BFD mesh серьезно уменьшается.

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

Я эту конструкцию на прошлых выходных собрал в лабе. Работает (с некоторыми недочетами). Но получилось слишком сложно, чтобы рекомендовать это для реального внедрения прямо сегодня.

Текущая версия драфта: http://tools.ietf.org/html/draft-francis-idr-intra-va-00
Презентация на IETF72, кратко описывающая суть предложенного: http://www.ietf.org/proceedings/08jul/slides/idr-3.pdf

TANA

На этой встрече IETF запланирована BoF сессия TANA (Techniques for Advanced Networking Applications)

О чем речь? В одной из своих заметок я упоминал, что для peer-to-peer приложений пригодился бы новый транспортный протокол со специальным congestion control. Вот TANA именно про это. Цель в разработке алгоритма congestion control, который позволял бы p2p не мешать интерактивным задачам, но тем не менее эффективно утилизировал бы полосу, когда она не затребована другими приложениями. Насколько я понял, технология уже есть и используется в Bittorrent DNA.

BoF session по TANA будет 31-го июля. С нетерпением жду minutes.

TANA BoF agenda: http://www.ietf.org/proceedings/08jul/agenda/tana.txt
TANA Problem Statement: http://www.ietf.org/internet-drafts/draft-shalunov-tana-problem-statement-01.txt
Материалы с IETF P2PI Workshop: http://www.funchords.com/p2pi/ (чисто для смеху, там есть  Position Paper of the RIAA - это очень смешно)

RRG on Loc/ID split

После прошлогоднего IAB Workshop on Routing and Addressing в списке рассылки RRG (Routing Research group) идет очень активная работа на предмет как нам реорганизовать Рабкрин переделать архитектуру маршрутизации в Internet. Подходов там целая куча: LISP, Six/One, Ivip, TRRP и еще несколько. Останавливаться на них я не буду, отсылаю заинтересованных читателей к архиву maillist'а и соотвествующим статьям и драфтам.

На сессии RRG было (или только будет?) выступление Joel Halpern с очень правильной мыслью. Можно устроить разделение функций locator/identifier не внутри сетевого уровня, а между сетевым и транспортным уровнем: на сетевом locator, а на транспортном identifier. В принципе, идея не новая, но очень, по-моему, правильная. Пойдя по этому пути, можно избежать довольно опасных вещей, которые предлагаются в рамках того же LISP, например.

Презентация Joel Halpern: http://www.ietf.org/proceedings/08jul/slides/RRG-0.pdf

Find recent content on the main index or look in the archives to find all content.

Archives