Author: Alan Tobagua

  • Как Google выявляет трафик ботов в сети

    Как Google выявляет трафик ботов в сети

    Меня всегда немного напрягает, как навязчиво Google AdSense подсовывает мне рекламу в зависимости от моих старых запросов в поисковике. Вроде бы и времени с момента поиска прошло достаточно много, да и куки и кеш браузера чистились не раз, а реклама оставалась. Как же они продолжали отслеживать меня? Оказывается, способов для этого предостаточно.

    Небольшое предисловие

    Идентификация, отслеживание пользователя или попросту веб-трекинг подразумевает под собой расчет и установку уникального идентификатора для каждого браузера, посещающего определенный сайт. Вообще, изначально это не задумывалось каким-то вселенским злом и, как и все, имеет обратную сторону, то есть призвано приносить пользу. Например, позволить владельцам сайта отличить обычных пользователей от ботов или же предоставить возможность хранить предпочтения пользователей и применять их при последующем визите. Но в то же самое время данная возможность очень пришлась по душе рекламной индустрии. Как ты прекрасно знаешь, куки (cookies) — один из самых популярных способов идентификации пользователей. И активно применяться в рекламной индустрии они начали аж с середины девяностых годов.

    С тех пор многое изменилось, технологии ушли далеко вперед, и в настоящее время отслеживание пользователей одними только печеньками не ограничивается. На самом деле идентифицировать ботов и пользователей можно разными способами. Самый очевидный вариант — установить какие-либо идентификаторы, наподобие куков. Следующий вариант — воспользоваться данными об используемым пользователем ПК, которые можно почерпнуть из HTTP-заголовков отправляемых запросов: адрес, тип используемой ОС, время и тому подобное. Ну и напоследок можно отличить пользователя по его поведению и привычкам (движения курсора, любимые разделы сайта и прочее).

    Явные идентификаторы

    Данный подход довольно очевиден, все, что требуется, — сохранить на стороне пользователя какой-то долгоживущий идентификатор, который можно запрашивать при последующем посещении ресурса. Современные браузеры предоставляют достаточно способов выполнить это прозрачно для пользователя. Прежде всего это старые добрые куки. Затем особенности некоторых плагинов, близкие по функционалу к кукам, например Local Shared Objects во флеше или Isolated Storage в силверлайте. HTML5 также включает в себя несколько механизмов хранения на стороне клиента, в том числе localStorage, File и IndexedDB API. Кроме этих мест, уникальные маркеры можно также хранить в кешированных ресурсах локальной машины или метаданных кеша (Last-Modified, ETag). Помимо этого, можно идентифицировать пользователя по отпечаткам, полученным из Origin Bound сертификатов, сгенерированных браузером для SSL-соединений, по данным, содержащимся в SDCH-словарях, и метаданным этих словарей. Одним словом — возможностей полно.

    Cookies

    Когда дело касается хранения какого-то небольшого объема данных на стороне клиента, куки — это первое, что обычно приходит на ум. Веб-сервер устанавливает уникальный идентификатор для нового пользователя, сохраняя его в куках, и при всех последующих запросах клиент будет отправлять его серверу. И хотя все популярные браузеры уже давно снабжены удобным интерфейсом по управлению куками, а в Сети полно сторонних утилит для управления ими и их блокировки, куки все равно продолжают активно использоваться для трекинга пользователей. Дело в том, что мало кто просматривает и чистит их (вспомни, когда ты занимался этим последний раз). Пожалуй, основная причина этого — все боятся случайно удалить нужную «печеньку», которая, например, может использоваться для авторизации. И хотя некоторые браузеры позволяют ограничивать установку сторонних куков, проблема не исчезает, так как очень часто браузеры считают «родными» куки, полученные через HTTP-редиректы или другие способы во время загрузки контента страницы. В отличие от большинства механизмов, о которых мы поговорим далее, использование куков прозрачно для конечного пользователя. Для того чтобы «пометить» юзера, необязательно даже хранить уникальный идентификатор в отдельной куке — он может собираться из значений нескольких куков или храниться в метаданных, таких как Expiration Time. Поэтому на данном этапе довольно непросто разобраться, используется ли конкретная кука для трекинга или нет.

    Local Shared Objects

    Для хранения данных на стороне клиента в Adobe Flash используется механизм LSO. Он является аналогом cookies в HTTP, но в отличие от последних может хранить не только короткие фрагменты текстовых данных, что, в свою очередь, усложняет анализ и проверку таких объектов. До версии 10.3 поведение флеш-куков настраивалось отдельно от настроек браузера: нужно было посетить менеджер настроек Flash, расположенный на сайте macromedia.com (кстати, он доступен и сейчас по следующей ссылке). Сегодня это можно выполнить непосредственно из контрольной панели. К тому же большинство современных браузеров обеспечивают достаточно плотную интеграцию с флеш-плеером: так, при удалении куков и других данных сайтов будут также удалены и LSO. С другой стороны, взаимодействие браузеров с плеером еще не настолько тесное, поэтому настройка в браузере политики для сторонних куков не всегда затронет флеш-куки (на сайте Adobe можно посмотреть, как вручную их отключить).

    Удаление данных из localStorage в Opera

    Изолированное хранилище Silverlight

    Программная платформа Silverlight имеет довольно много общего с Adobe Flash. Так, аналогом флешевого Local Shared Objects служит механизм под названием Isolated Storage. Правда, в отличие от флеша настройки приватности тут никак не завязаны с браузером, поэтому даже в случае полной очистки куков и кеша браузера данные, сохраненные в Isolated Storage, все равно останутся. Но еще интересней, что хранилище оказывается общим для всех окон браузера (кроме открытых в режиме «Инкогнито») и всех профилей, установленных на одной машине. Как и в LSO, с технической точки зрения здесь нет каких-либо препятствий для хранения идентификаторов сессии. Тем не менее, учитывая, что достучаться до этого механизма через настройки браузера пока нельзя, он не получил такого широкого распространения в качестве хранилища для уникальных идентификаторов.

    Вот так выглядит изолированное хранилище Silverlight

    HTML5 и хранение данных на клиенте

    HTML5 представляет набор механизмов для хранения структурированных данных на клиенте. К ним относятся localStorage, File API и IndexedDB. Несмотря на различия, все они предназначены для обеспечения постоянного хранения произвольных порций бинарных данных, привязанных к конкретному ресурсу. Плюс, в отличие от HTTP- и Flash-куков, здесь нет каких-либо значительных ограничений на размер хранимых данных. В современных браузерах HTML5-хранилище располагается наряду с другими данными сайта. Однако как управлять хранилищем через настройки браузера — догадаться очень трудно. К примеру, чтобы удалить данные из localStorage в Firefox, пользователю придется выбрать offline website data или site preferences и задать временной промежуток равным everything. Еще одна неординарная фишка, присущая только IE, — данные существуют только на время жизни табов, открытых в момент их сохранения. Плюс ко всему вышеперечисленные механизмы не особо-то стараются следовать ограничениям, применимым к HTTP-кукам. Например, можно писать в localStorage и читать из него через кросс-доменные фреймы даже при отключенных сторонних куках.
    Настройка локального хранилища Flash Player

    Кешированные объекты

    Все хотят, чтобы браузер работал шустро и без тормозов. Поэтому ему приходится складывать в локальный кеш ресурсы посещаемых сайтов (чтобы не запрашивать их при последующем визите). И хотя данный механизм явно не предназначался для использования в качестве хранилища с произвольным доступом, его можно в таковой превратить. Например, сервер может вернуть пользователю JavaScript-документ с уникальным идентификатором внутри его тела и установить в заголовках Expires / max-age= далекое будущее. Таким образом скрипт, а с ним и уникальный идентификатор пропишется в кеше браузера. После чего к нему можно будет обратиться с любой страницы в Сети, просто запросив загрузку скрипта с известного URL’а. Конечно, браузер будет периодически спрашивать с помощью заголовка If-Modified-Since, не появилась ли новая версия скрипта. Но если сервер будет возвращать код 304 (Not modified), то закешированная копия будет использоваться вечно. Чем еще интересен кеш? Здесь нет концепции «сторонних» объектов, как, например, в случае с HTTP-куками. В то же время отключение кеширования может серьезно отразиться на производительности. А автоматическое определение хитрых ресурсов, хранящих в себе какие-то идентификаторы/метки, затруднено в связи с большим объемом и сложностью JavaScript-документов, встречающихся в Сети. Конечно, все браузеры позволяют юзеру вручную чистить кеш. Но как показывает практика (даже собственный пример), производится это не так часто, если производится вообще.

    ETag и Last-Modified

    Для того чтобы кеширование работало правильно, серверу необходимо каким-то образом информировать браузер о том, что доступна более новая версия документа. Стандарт HTTP/1.1 предлагает два способа для решения этой задачи. Первый основан на дате последнего изменения документа, а второй — на абстрактном идентификаторе, известном как ETag. В случае с ETag сервер изначально возвращает так называемый version tag в заголовке ответа вместе с самим документом. При последующих запросах к заданному URL клиент сообщает серверу через заголовок If-None-Match это значение, ассоциированное с его локальной копией. Если версия, указанная в этом заголовке, актуальная, то сервер отвечает HTTP-кодом 304 (Not Modified), и клиент может спокойно использовать кешированную версию. В противном случае сервер присылает новую версию документа с новым ETag. Такой подход чем-то напоминает HTTP-куки — сервер сохраняет произвольное значение на клиенте только для того, чтобы потом его считать. Другой способ, связанный с использованием заголовка Last-Modified, позволяет хранить по крайней мере 32 бита данных в строке даты, которая затем отправляется клиентом серверу в заголовке If-Modified-Since. Что интересно, большинство браузеров даже не требуют, чтобы эта строка представляла собой дату в правильном формате. Как и в случае идентификации пользователя через кешированные объекты, на ETag и Last-Modified никак не влияет удаление куков и данных сайта, избавиться от них можно только очисткой кеша.
    Google возвращает клиенту ETag

    HTML5 AppCache

    Application Cache позволяет задавать, какая часть сайта должна быть сохранена на диске и быть доступна, даже если пользователь находится офлайн. Управляется все с помощью манифестов, которые задают правила для хранения и извлечения элементов кеша. Подобно традиционному механизму кеширования, AppCache тоже позволяет хранить уникальные, зависящие от пользователя данные — как внутри самого манифеста, так и внутри ресурсов, которые сохраняются на неопределенный срок (в отличие от обычного кеша, ресурсы из которого удаляются по истечении какого-то времени). AppCache занимает промежуточное значение между механизмами хранения данных в HTML5 и обычным кешем браузера. В некоторых браузерах он очищается при удалении куков и данных сайта, в других только при удалении истории просмотра и всех кешированных документов.

    SDCH-словари

    SDCH — это разработанный Google алгоритм компрессии, который основывается на использовании предоставляемых сервером словарей и позволяет достичь более высокого уровня сжатия, чем Gzip или deflate. Дело в том, что в обычной жизни веб-сервер отдает слишком много повторяющейся информации — хидеры/футеры страниц, встроенный JavaScript/CSS и так далее. В данном подходе клиент получает с сервера файл словаря, содержащий строки, которые могут появиться в последующих ответах (те же хидеры/футеры/JS/CSS). После чего сервер может просто ссылаться на эти элементы внутри словаря, а клиент будет самостоятельно на их основе собирать страницу. Как ты понимаешь, эти словари можно с легкостью использовать и для хранения уникальных идентификаторов, которые можно поместить как в ID словарей, возвращаемые клиентом серверу в заголовке Avail-Dictionary, так и непосредственно в сам контент. И потом использовать подобно как и в случае с обычным кешем браузера.

    Прочие механизмы хранения

    Но это еще не все варианты. При помощи JavaScript и его товарищей по цеху можно сохранять и запрашивать уникальный идентификатор таким образом, что он останется в живых даже после удаления всей истории просмотров и данных сайтов. Как один из вариантов, можно использовать для хранения window.name или sessionStorage. Даже если пользователь подчистит все куки и данные сайта, но не закроет вкладку, в которой был открыт отслеживающий сайт, то при последующем заходе идентифицирующий токен будет получен сервером и пользователь будет снова привязан к уже собранным о нем данным. Такое же поведение наблюдается и у JS, любой открытый JavaScript-контекст сохраняет состояние, даже если пользователь удалит данные сайта. При этом такой JavaScript может не только принадлежать отображаемому сайту, но и прятаться в iframe’ах, веб-воркерах и так далее. Например, загруженная в iframe реклама вовсе не обратит внимания на удаление истории просмотров и данных сайта и продолжит использовать идентификатор, сохраненный в локальной переменной в JS.

    Протоколы

    Помимо механизмов, связанных с кешированием, использованием JS и разных плагинов, в современных браузерах есть еще несколько сетевых фич, позволяющих хранить и извлекать уникальные идентификаторы.
    • Origin Bound Certificates (aka ChannelID) — персистентные самоподписанные сертификаты, идентифицирующие клиента HTTPS-серверу. Для каждого нового домена создается отдельный сертификат, который используется для соединений, инициируемых в дальнейшем. Сайты могут использовать OBC для трекинга пользователей, не предпринимая при этом каких-либо действий, которые будут заметны клиенту. В качестве уникального идентификатора можно взять криптографический хеш сертификата, предоставляемый клиентом как часть легитимного SSL-рукопожатия.
    • Подобным образом и в TLS тоже есть два механизма — session identifiers и session tickets, которые позволяют клиентам возобновлять прерванные HTTPS-соединения без выполнения полного рукопожатия. Достигается это за счет использования закешированных данных. Два этих механизма в течение небольшого промежутка времени позволяют серверам идентифицировать запросы, исходящие от одного клиента.
    • Практически все современные браузеры реализуют свой собственный внутренний DNS-кеш, чтобы ускорить процесс разрешения имен (и в некоторых случаях снизить риск DNS rebinding атак). Такой кеш запросто можно использовать для хранения небольших объемов информации. Например, если обладать 16 доступными IP-адресами, около 8–9 закешированных имен будет достаточно, чтобы идентифицировать каждый компьютер в Сети. Однако такой подход ограничен размером внутреннего DNS-кеша браузеров и может потенциально привести к конфликтам в разрешении имен с DNS провайдера.

    Характеристики машины

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

    «Отпечатки» браузера

    Наиболее простой подход к трекингу — это построение идентификаторов путем объединения набора параметров, доступных в среде браузера, каждый из которых по отдельности не представляет никакого интереса, но совместно они образуют уникальное для каждой машины значение:
    • User-Agent. Выдает версию браузера, версию ОС и некоторые из установленных аддонов. В случаях, когда User-Agent отсутствует или хочется проверить его «правдивость», можно определить версию браузера проверкой на наличие определенных фич, реализованных или измененных между релизами.
    • Ход часов. Если система не синхронизирует свои часы со сторонним сервером времени, то рано или поздно они начнут отставать или спешить, что породит уникальную разницу между реальным и системным временем, которую можно измерить с точностью до микросекунды с помощью JavaScript’а. На самом деле даже при синхронизации с NTP-сервером все равно будут небольшие отклонения, которые также можно будет измерить.
    • Информация о CPU и GPU. Можно получить как напрямую (через GL_RENDERER), так и через бенчмарки и тесты, реализованные с помощью JavaScript.
    • Разрешение монитора и размер окна браузера (включая параметры второго монитора в случае мультимониторной системы).
    • Список установленных в системе шрифтов, полученных, например, с помощью getComputedStyle API.
    • Список всех установленных плагинов, ActiveX-контролов, Browser Helper Object’ов, включая их версии. Можно получить перебором navigator.plugins[] (некоторые плагины выдают свое присутствие в HTTP-заголовках).
    • Информация об установленных расширениях и другом ПО. Такие расширения, как блокировщики рекламы, вносят определенные изменения в просматриваемые страницы, по которым можно определить, что это за расширение, и его настройки.

    Сетевые «отпечатки»

    Еще ряд признаков кроется в архитектуре локальной сети и настройке сетевых протоколов. Такие знаки будут характерны для всех браузеров, установленных на клиентской машине, и их нельзя просто скрыть с помощью настроек приватности или каких-то security-утилит. Они включают в себя:
    • Внешний IP-адрес. Для IPv6-адресов данный вектор особенно интересен, так как последние октеты в некоторых случаях могут получаться из MAC-адреса устройства и потому сохраняться даже при подключении к разным сетям.
    • Номера портов для исходящих TCP/IP-соединений (обычно выбираются последовательно для большинства ОС).
    • Локальный IP-адрес для пользователей, находящихся за NAT’ом или HTTP-прокси. Вкупе с внешним айпишником позволяет уникально идентифицировать большинство клиентов.
    • Информация об используемых клиентом прокси-серверах, полученная из HTTP-заголовка (X-Forwarded-For). В сочетании с реальным адресом клиента, полученным через несколько возможных способов обхода прокси, также позволяет идентифицировать пользователя.

    Поведенческий анализ и привычки

    Еще один вариант — взглянуть в сторону характеристик, которые привязаны не к ПК, а скорее к конечному пользователю, такие как региональные настройки и поведение. Такой способ опять же позволит идентифицировать клиентов между различными сессиями браузера, профилями и в случае приватного просмотра. Делать выводы можно на основании следующих данных, которые всегда доступны для изучения:
    • Предпочитаемый язык, дефолтная кодировка и часовой пояс (все это живет в HTTP-заголовках и доступно из JavaScript).
    • Данные в кеше клиента и его история просмотра. Элементы кеша можно обнаружить при помощи атак по времени — отслеживающий может обнаружить долгоживущие элементы кеша, относящиеся к популярным ресурсам, просто измерив время из загрузки (и отменив переход, если время превышает ожидаемое время загрузки из локального кеша). Также можно извлекать URL’ы, хранящиеся в истории просмотра браузера, хотя такая атака в современных браузерах потребует небольшого взаимодействия с пользователем.
    • Жесты мышью, частота и продолжительность нажатия клавиш, данные с акселерометра — все эти параметры уникальны для каждого пользователя.
    • Любые изменения стандартных шрифтов сайта и их размеров, уровень zoom’а, использование специальных возможностей, таких как цвет текста, размер.
    • Состояние определенных фич браузера, настраиваемых клиентом: блокировка сторонних куков, DNS prefetching, блокировка всплывающих окон, настройки безопасности Flash и так далее (по иронии, пользователи, меняющие дефолтные настройки, в действительности делают свой браузер значительно более легким для идентификации).
    И это лишь очевидные варианты, которые лежат на поверхности. Если копнуть глубже — можно придумать еще.

    Подытожим

    Как видишь, на практике существует большое число различных способов для трекинга пользователя. Какие-то из них являются плодом ошибок в реализации или упущений и теоретически могут быть исправлены. Другие практически невозможно искоренить без полного изменения принципов работы компьютерных сетей, веб-приложений, браузеров. Каким-то техникам можно противодействовать — чистить кеш, куки и прочие места, где могут храниться уникальные идентификаторы. Другие работают абсолютно незаметно для пользователя, и защититься от них вряд ли получится. Поэтому самое главное — путешествуя по Сети даже в приватном режиме просмотра, помнить, что твои перемещения все равно могут отследить.
  • Google AdSense запустил новую программу для издателей User First

    Google AdSense запустил новую программу для издателей User First

     Программа ориентирована на те сайты, которые обеспечивают хороший пользовательский опыт

    User First или как теперь Google AdSense принимает новые сайты

    На этой неделе отдельные издатели рекламных сетей AdSense и AdMob начали получать приглашения от Google AdSense принять участие в бета-программе User First.

    Цель проекта – протестировать новые способы, с помощью которых издатели смогут повысить свой доход, размещая меньшее количество рекламы, и поощрить тех владельцев сайтов, которые обеспечивают хороший пользовательский опыт. То есть, те ресурсы, которые быстро загружаются; содержат рекламные шаблоны, генерирующие высококачественные клики, и имеют низкий процент пользователей, отключающих рекламу на сайте.

    Текст приглашения гласит следующее:

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

    Google надеется найти оптимальную формулу для показа меньшего количества объявлений (но при этом более таргетированных), и увеличения дохода издателей. Для начала компания планирует оптимизировать время загрузки рекламы.

    Чтобы принять участие в эксперименте, издатели должны показывать на своих сайтах только рекламу AdSense. Это значит, что участвовать в другой рекламной сети в этот период будет нельзя.

    Участники программы как бета-тестеры будут получать ранний доступ к новым функциям и новым рекламным форматам AdSense.

    Выйти из программы можно будет в любой момент.

  • Apple меняет правила игры на рынке рекламы мобильных приложений

    Apple меняет правила игры на рынке рекламы мобильных приложений

     Платформы Facebook, Twitter и Google на следующей неделе должны представить финансовые результаты за третий квартал 2021 года, накануне их акции рухнули вслед за бумагами соцсети Snap, рекламный бизнес которой «просел» в июле — сентябре из-за новой политики конфиденциальности Apple

    доходы Google adSense значительно просели из-за действий конкурента

    В апреле 2021 года Apple изменила политику конфиденциальности для iOS-приложений: новшества коснулись и рекламы, которую партнеры Snap, Facebook, Google и Twitter показывали пользователям, основываясь на данных о них. Раньше пользователь, скачивая приложение, по умолчанию давал согласие на использование своих данных, а запрещать их сбор нужно было отдельным действием, однако теперь владелец приложения не может обрабатывать данные пользователя, пока тот специально не даст на это согласие.

    «Наш рекламный бизнес был подорван изменениями, которые Apple внесла в правила отслеживания в рекламных целях для пользователей iOS в июне и июле. Новое решение Apple не масштабировалось, как мы того ожидали, что затрудняло для наших рекламных партнеров управление и измерение их рекламных кампаний», — заявил во время конференц-колла сооснователь Snap Эван Шпигель.  

    Влияние изменений в работе iOS для Facebook будет наиболее заметным по итогам третьего квартала 2021 года, но должно ослабнуть в четвертом квартале, писали аналитики Goldman Sachs в записке для инвесторов от 7 октября.

    Нововведения от Apple могут полностью перестроить рынок онлайн-рекламы, говорит Шатов из Capital Lab: «Ситуация в моменте является критичной для компаний, где основная часть дохода формируется за счет продажи рекламы». Изменения коснулись не только технологических компаний, но и бизнеса, игроков на рынке e-commerce, указывает The Wall Street Journal.

    В новых условиях стоимость привлечения пользователя для рекламодателя может значительно вырасти, соответственно, спрос на такую рекламу со стороны заказчиков, вероятно, снизится, что непременно негативно отразится на доходах компаний, считает Шатов.

    Цены на рекламу в Facebook уже выросли для рекламодателей на 25%. При этом небольшие бизнесы, которые продвигают свои товары и услуги в основном через Facebook и Instagram, изменения в политике конфиденциальности Apple вынудили сократить расходы на рекламу, пишет The Wall Street Journal.

  • DDOS атаки на маршрутизатор и методы защиты Juniper routing engine

    По долгу службы мне часто приходится сталкиваться с DDOS на сервера, но некоторое время назад столкнулся с другой атакой, к которой был не готов. Атака производилась на маршрутизатор Juniper MX80 поддерживающий BGP сессии и выполняющий анонс сетей дата-центра. Целью атакующих был веб-ресурс расположенный на одном из наших серверов, но в результате атаки, без связи с внешним миром остался весь дата-центр. Подробности атаки, а также тесты и методы борьбы с такими атаками под катом. 

    История атаки


    Исторически сложилось, что на маршрутизаторе блокируется весь UDP трафик летящий в нашу сеть. Первая волна атаки (в 17:22) была как раз UDP трафиком, график unicast пакетов с аплинка маршрутизатора:

    график unicast пакетов с аплинка маршрутизатора
    и график unicast пакетов с порта свича подключенного к роутеру:
    график unicast пакетов с порта свича подключенного к роутеру

    демонстрируют, что весь трафик осел на фильтре маршрутизатора. Поток unicast пакетов на аплинке маршрутизатора увеличился на 400 тысяч и атака только UDP пакетами продолжалась до 17:33. Далее атакующие изменили стратегию и добавили к атаке UDP еще и атаку TCP SYN пакетами на атакуемый сервер, а также на сам маршрутизатор. Как видно по графику, маршрутизатору стало настолько плохо, что он перестал отдавать SNMP в zabbix. После волны SYN на порты маршрутизатора стали отваливаться BGP сессии с пирами (используется три аплинка с каждого получаем full view по ipv4 и по ipv6), в логах появились трагические записи:

    Jun 27 17:35:07 ROUTER rpd[1408]: bgp_hold_timeout:4035: NOTIFICATION sent to ip.ip.ip.ip (External AS 1111): code 4 (Hold Timer Expired Error), Reason: holdtime expired for ip.ip.ip.ip (External AS 1111), socket buffer sndcc: 19 rcvcc: 0 TCP state: 4, snd_una: 1200215741 snd_nxt: 1200215760 snd_wnd: 15358 rcv_nxt: 4074908977 rcv_adv: 4074925361, hold timer out 90s, hold timer remain 0s
    Jun 27 17:35:33 ROUTER rpd[1408]: bgp_hold_timeout:4035: NOTIFICATION sent to ip.ip.ip.ip (External AS 1111): code 4 (Hold Timer Expired Error), Reason: holdtime expired for ip.ip.ip.ip (External AS 1111), socket buffer sndcc: 38 rcvcc: 0 TCP state: 4, snd_una: 244521089 snd_nxt: 244521108 snd_wnd: 16251 rcv_nxt: 3829118827 rcv_adv: 3829135211, hold timer out 90s, hold timer remain 0s
    Jun 27 17:37:26 ROUTER rpd[1408]: bgp_hold_timeout:4035: NOTIFICATION sent to ip.ip.ip.ip (External AS 1111): code 4 (Hold Timer Expired Error), Reason: holdtime expired for ip.ip.ip.ip (External AS 1111), socket buffer sndcc: 19 rcvcc: 0 TCP state: 4, snd_una: 1840501056 snd_nxt: 1840501075 snd_wnd: 16384 rcv_nxt: 1457490093 rcv_adv: 1457506477, hold timer out 90s, hold timer remain 0s


    Как было выяснено позже, после атаки, волна TCP SYN увеличила нагрузку на routing engine маршрутизатора после чего упали все BGP сессии и маршрутизатор не смог самостоятельно восстановить работу. Атака на маршрутизатор длилась несколько минут, но из-за дополнительной нагрузки, маршрутизатор не мог обработать full view с трех аплинков и сессии снова рвались. Восстановить работу удалось только поочередным поднятием всех BGP сессий. Дальнейшая атака шла на сам сервер.

    Испытание в условиях стенда и воспроизведение атаки


    В качестве цели атаки использовался Juniper MX80 с той же версией прошивки, что и на боевом роутере. В качестве атакующего использовался сервер с 10Gb картой и установленной на нем ubuntu server + quagga. Генератором трафика выступал скрипт с вызовом утилиты hping3. Для проверки пагубного воздействия “всплесков” трафика, скрипт генерировал трафик с временными разрывами: 30 секунд атака — 2 секунды атаки нет. Также, для чистоты эксперимента, была поднята BGP сессия между маршрутизатором и сервером. В установленной на тот момент конфигурации боевого маршрутизатора, порты BGP и SSH были открыты на всех интерфейсах/адресах маршрутизатора и не фильтровались. Аналогичная конфигурация была перенесена на стендовый маршрутизатор.

    Первым этапом испытаний стала атака TCP SYN на BGP (179) порт маршрутизатора. IP адрес источника совпадал с адресом пира в конфигурации маршрутизатора. IP address spoofing не исключался, так как у наших аплинков не включен uPRF. Сессия была установлена. Со стороны quagga:

    BGP router identifier 9.4.8.2, local AS number 9123
    RIB entries 3, using 288 bytes of memory
    Peers 1, using 4560 bytes of memory

    Neighbor V AS MsgRcvd MsgSent TblVer InQ OutQ Up/Down State/PfxRcd
    9.4.8.1 4 1234 1633 2000 0 0 0 00:59:56 0

    Total number of neighbors 1


    Со стороны Juniper:

    user@MX80> show bgp summary 
    Groups: 1 Peers: 1 Down peers: 0
    Table Tot Paths Act Paths Suppressed History Damp State Pending
    inet.0
    2 1 0 0 0 0
    Peer AS InPkt OutPkt OutQ Flaps Last Up/Dwn State|#Active/Received/Accepted/Damped...
    9.4.8.2 4567 155 201 0 111 59:14 1/2/2/0 0/0/0/0


    После начала атаки (13:52) на маршрутизатор летит ~1.2 Mpps трафика:
    на маршрутизатор летит ~1.2 Mpps трафика

    или 380Mbps:
    на маршрутизатор летит 380 Mpps трафика
    Нагрузка на CPU RE и CPU FE маршрутизатора возрастает:
    Нагрузка на CPU RE и CPU FE маршрутизатора возрастает
    После задержки (90 сек) BGP сессия падает и больше не поднимается:

    Jul 4 13:54:01 MX80 rpd[1407]: bgp_hold_timeout:4035: NOTIFICATION sent to 9.4.8.2 (External AS 4567): code 4 (Hold Timer Expired Error), Reason: holdtime expired for 9.4.8.2 (External AS 4567), socket buffer sndcc: 38 rcvcc: 0 TCP state: 4, snd_una: 3523671294 snd_nxt: 3523671313 snd_wnd: 114 rcv_nxt: 1556791630 rcv_adv: 1556808014, hold timer out 90s, hold timer remain 0s


    Маршрутизатор занят обработкой прилетающего TCP SYN на порт BGP и не может установить сессию. На порту множество пакетов:

    user@MX80> monitor traffic interface ge-1/0/0 count 20 
    13:55:39.219155 In IP 9.4.8.2.2097 > 9.4.8.1.bgp: S 1443462200:1443462200(0) win 512
    13:55:39.219169 In IP 9.4.8.2.27095 > 9.4.8.1.bgp: S 295677290:295677290(0) win 512
    13:55:39.219177 In IP 9.4.8.2.30114 > 9.4.8.1.bgp: S 380995480:380995480(0) win 512
    13:55:39.219184 In IP 9.4.8.2.57280 > 9.4.8.1.bgp: S 814209218:814209218(0) win 512
    13:55:39.219192 In IP 9.4.8.2.2731 > 9.4.8.1.bgp: S 131350916:131350916(0) win 512
    13:55:39.219199 In IP 9.4.8.2.2261 > 9.4.8.1.bgp: S 2145330024:2145330024(0) win 512
    13:55:39.219206 In IP 9.4.8.2.z39.50 > 9.4.8.1.bgp: S 1238175350:1238175350(0) win 512
    13:55:39.219213 In IP 9.4.8.2.2098 > 9.4.8.1.bgp: S 1378645261:1378645261(0) win 512
    13:55:39.219220 In IP 9.4.8.2.30115 > 9.4.8.1.bgp: S 1925718835:1925718835(0) win 512
    13:55:39.219227 In IP 9.4.8.2.27096 > 9.4.8.1.bgp: S 286229321:286229321(0) win 512
    13:55:39.219235 In IP 9.4.8.2.2732 > 9.4.8.1.bgp: S 1469740166:1469740166(0) win 512
    13:55:39.219242 In IP 9.4.8.2.57281 > 9.4.8.1.bgp: S 1179645542:1179645542(0) win 512
    13:55:39.219254 In IP 9.4.8.2.2262 > 9.4.8.1.bgp: S 1507663512:1507663512(0) win 512
    13:55:39.219262 In IP 9.4.8.2.914c/g > 9.4.8.1.bgp: S 1219404184:1219404184(0) win 512
    13:55:39.219269 In IP 9.4.8.2.2099 > 9.4.8.1.bgp: S 577616492:577616492(0) win 512
    13:55:39.219276 In IP 9.4.8.2.267 > 9.4.8.1.bgp: S 1257310851:1257310851(0) win 512
    13:55:39.219283 In IP 9.4.8.2.27153 > 9.4.8.1.bgp: S 1965427542:1965427542(0) win 512
    13:55:39.219291 In IP 9.4.8.2.30172 > 9.4.8.1.bgp: S 1446880235:1446880235(0) win 512
    13:55:39.219297 In IP 9.4.8.2.57338 > 9.4.8.1.bgp: S 206377149:206377149(0) win 512
    13:55:39.219305 In IP 9.4.8.2.2789 > 9.4.8.1.bgp: S 838483872:838483872(0) win 512


    Вторым этапом испытаний стала атака TCP SYN на BGP (179) порт маршрутизатора. IP адрес источника выбирался случайно и не совпадал с адресом пира указанным в конфигурации маршрутизатора. Эта атака произвела на маршрутизатор такой же эффект. Дабы не растягивать статью однообразными выводами логов, приведу только график нагрузки:

    график нагрузки CPU

    По графику отчетливо видно момент начала атаки. BGP сессия также упала и не смогла восстановиться.

    Концепция построения защиты RE маршрутизатора


    Особенность работы оборудования Juniper заключается в разделении задач между routing engine (RE) и packet forwarding engine (PFE). PFE обрабатывает весь поток проходящего трафика осуществляя его фильтрацию и маршрутизацию по заранее сформированной схеме. RE занимается обработкой прямых обращений к маршрутизатору (traceroute, ping, ssh), обработкой пакетов для служб BGP, NTP, DNS, SNMP и формирует схемы фильтрации и маршрутизации трафика для PFE маршрутизатора. 

    Основная идея защиты маршрутизатора состоит в фильтрации всего трафика предназначенного для RE. Создание фильтра позволит перенести нагрузку, создаваемую DDOS атакой, с CPU RE на CPU PFE маршрутизатора, что даст возможность RE обрабатывать только реальные пакеты и не тратить процессорное время на другой трафик. Для построения защиты необходимо определить, что фильтруем. Схема написания фильтров для IPv4 была взята из книги Douglas Hanks Jr. — Day One Book: Securing the Routing Engine on M, MX and T series. В моем случае на маршрутизаторе схема была следующей:

    По протоколу IPv4

    • BGP — фильтруем пакеты по source и destination ip, source ip может быть любой из списка bgp neighbor. Разрешаем только подключения tcp established, то есть фльтр будет отбрасывать все SYN прилетающие на этот порт, а сессия BGP будет начинаться только от нас (BGP сосед аплинка работает в пассивном режиме).
    • TACACS+ — фильтруем пакеты по source и destination ip, source ip может быть только из внутренней сети. Ограничиваем полосу пропускания в 1Mb/s.
    • SNMP — фильтруем пакеты по source и destination ip, source ip может быть любой из списка snmp-clients в конфигурации.
    • SSH — фильтруем пакеты по destination ip, source ip может быть любой, так как есть необходимость экстренного доступа к устройству из любой сети. Ограничиваем полосу пропускания в 5Mb/s.
    • NTP — фильтруем пакеты по source и destination ip, source ip может быть любой из списка ntp servers конфигурации. Ограничиваем полосу пропускания в 1Mb/s (в дальнейшем порог был уменьшен до 512Kb/s).
    • DNS — фильтруем пакеты по source и destination ip, source ip может быть любой из списка dns servers конфигурации. Ограничиваем полосу пропускания в 1Mb/s.
    • ICMP — фильтруем пакеты, пропускаем только на адреса принадлежащие маршрутизатору. Ограничиваем полосу пропускания в 5Mb/s (в дальнейшем порог был уменьшен до 1Mb/s).
    • TRACEROUTE — фильтруем пакеты, пропускаем только пакеты с TTL равным 1 и только на адреса принадлежащие маршрутизатору. Ограничиваем полосу пропускания в 1Mb/s.


    По протоколу IPv6, в моем случае, фильтры накладывались только на BGP, NTP, ICMP, DNS и traceroute. Единственное отличие в фильтрации ICMP трафика, так как IPv6 использует ICMP в служебных целях. Остальные протоколы не использовали IPv6 адресацию. 

    Написание конфигурации


    Для написания фильтров в juniper существует удобный инструмент — prefix-list, который позволяет динамически составлять списки ip адресов/подсетей для подстановки в фильтры. Например, для создания списка адресов ipv4 BGP соседей указанных в конфигурации, используется следующая структура:

    prefix-list BGP-neighbors-v4 {
    apply-path "protocols bgp group <*> neighbor <*.*>";
    }


    результат составления списка:

    show configuration policy-options prefix-list BGP-neighbors-v4 | display inheritance 
    ##
    ## apply-path was expanded to:
    ## 1.1.1.1/32;
    ## 2.2.2.2/32;
    ## 3.3.3.3/32;
    ##
    apply-path «protocols bgp group <*> neighbor <*.*>»;


    Составляем динамические списки префиксов для всех фильтров:


    /* Список всех ipv4 адресов соседей BGP */
    prefix-list BGP-neighbors-v4 {
    apply-path "protocols bgp group <*> neighbor <*.*>";
    }
    /* Список всех ipv6 адресов соседей BGP */
    prefix-list BGP-neighbors-v6 {
    apply-path "protocols bgp group <*> neighbor <*:*>";
    }
    /* Список всех ipv4 серверов NTP */
    prefix-list NTP-servers-v4 {
    apply-path "system ntp server <*.*>";
    }
    /* Список всех ipv6 серверов NTP */
    prefix-list NTP-servers-v6 {
    apply-path "system ntp server <*:*>";
    }
    /* Список всех ipv4 адресов назначеных роутеру */
    prefix-list LOCALS-v4 {
    apply-path "interfaces <*> unit <*> family inet address <*>";
    }
    /* Список всех ipv6 адресов назначеных роутеру */
    prefix-list LOCALS-v6 {
    apply-path "interfaces <*> unit <*> family inet6 address <*>";
    }
    /* Список всех ipv4 адресов SNMP клиентов */
    prefix-list SNMP-clients {
    apply-path "snmp client-list <*> <*>";
    }
    prefix-list SNMP-community-clients {
    apply-path "snmp community <*> clients <*>";
    }
    /* Список всех серверов TACACS+ */
    prefix-list TACPLUS-servers {
    apply-path "system tacplus-server <*>";
    }
    /* Список адресов роутера которые принадлежат внутренней сети */
    prefix-list INTERNAL-locals {
    /* В моем случае лучший вариант - ручное указание адреса */
    192.168.0.1/32;
    }
    /* Список адресов роутера на интерфейсе управления, для доступа по SSH */
    prefix-list MGMT-locals {
    apply-path "interfaces fxp0 unit 0 family inet address <*>";
    }
    /* Приватные сети */
    prefix-list rfc1918 {
    10.0.0.0/8;
    172.16.0.0/12;
    192.168.0.0/16;
    }
    /* Loopback */
    prefix-list localhost-v6 {
    ::1/128;
    }
    prefix-list localhost-v4 {
    127.0.0.0/8;
    }
    /* Список всех ipv4 локальных адресов BGP */
    prefix-list BGP-locals-v4 {
    apply-path "protocols bgp group <*> neighbor <*.*> local-address <*.*>";
    }
    /* Список всех ipv6 локальных адресов BGP */
    prefix-list BGP-locals-v6 {
    apply-path "protocols bgp group <*> neighbor <*:*> local-address <*:*>";
    }
    /* Список всех ipv4 серверов DNS */
    prefix-list DNS-servers-v4 {
    apply-path "system name-server <*.*>";
    }
    /* Список всех ipv6 серверов DNS */
    prefix-list DNS-servers-v6 {
    apply-path "system name-server <*:*>";
    }


    Составляем политики для ограничения пропускной способности:

    /* Ограничение в 1Mb */
    policer management-1m {
    apply-flags omit;
    if-exceeding {
    bandwidth-limit 1m;
    burst-size-limit 625k;
    }
    /* Все что не помещается дропаем */
    then discard;
    }
    /* Ограничение в 5Mb */
    policer management-5m {
    apply-flags omit;
    if-exceeding {
    bandwidth-limit 5m;
    burst-size-limit 625k;
    }
    /* Все что не помещается дропаем */
    then discard;
    }
    /* Ограничение в 512Kb */
    policer management-512k {
    apply-flags omit;
    if-exceeding {
    bandwidth-limit 512k;
    burst-size-limit 25k;
    }
    /* Все что не помещается дропаем */
    then discard;
    }


    Ниже, под «копи-паст», конфигурация фильтров конечного варианта защиты (были уменьшены пороги пропускной способности трафика NTP и ICMP, причины снижения порогов подробно описаны в разделе тестирования). Настраиваем фильтры ipv4:

    IPv4 filter


    Аналогичный фильтр для ipv6:

    IPv6 filter


    Далее необходимо применить фильтры на служебный интерфейс lo0.0. В системе JunOS этот интерфейс используется для передачи данных между PFE и RE. Конфигурация примет следующий вид:

    lo0 {
    unit 0 {
    family inet {
    filter {
    input-list [ accept-bgp accept-common-services discard-all ];
    }
    }
    family inet6 {
    filter {
    input-list [ accept-v6-bgp accept-v6-common-services discard-v6-all ];
    }
    }
    }
    }


    Порядок указания фильтров в input-list интерфейса очень важен. Каждый пакет будет проверяться на валидность проходя по фильтрам указанным в input-list слева направо.

    Тестирование фильтров


    После применения фильтров, провел ряд тестов на том же стенде. После каждого теста выполнялась очистка счетчиков firewall. Нормальная (без атаки) нагрузка на роутере видна на графиках в 11:06 — 11:08. График pps за весь период тестов:
    pps за весь период тестов
    График CPU за весь период тестов:
    график CPU за весь период тестов

    Первым проводился тест флуда icmp c порогом трафика 5Мб/с (на графиках 10:21 — 10:24). По счетчикам фильтра и на графике видно ограничение по трафика по пропускной способности, но даже этого потока было достаточно для повышения нагрузки, поэтому порог был уменьшен до 1Мб/с. Счетчики:

    Filter: lo0.0-i                                                
    Counters:
    Name Bytes Packets
    accept-bgp-lo0.0-i 0 0
    accept-icmp-lo0.0-i 47225584 1686628
    accept-ntp-lo0.0-i 152 2
    accept-snmp-lo0.0-i 174681 2306
    accept-ssh-lo0.0-i 38952 702
    accept-traceroute-icmp-lo0.0-i 0 0
    accept-traceroute-tcp-lo0.0-i 841 13
    accept-traceroute-udp-lo0.0-i 0 0
    discard-TTL_1-unknown-lo0.0-i 0 0
    discard-icmp-lo0.0-i 0 0
    discard-icmp-fragments-lo0.0-i 0 0
    discard-ip-options-lo0.0-i 0 0
    discard-tcp-lo0.0-i 780 13
    discard-udp-lo0.0-i 18743 133
    discard-unknown-lo0.0-i 0 0
    Policers:
    Name Bytes Packets
    management-1m-accept-ntp-lo0.0-i 0 0
    management-1m-accept-traceroute-icmp-lo0.0-i 0 0
    management-1m-accept-traceroute-tcp-lo0.0-i 0 0
    management-1m-accept-traceroute-udp-lo0.0-i 0 0
    management-5m-accept-icmp-lo0.0-i 933705892 33346639
    management-5m-accept-ssh-lo0.0-i 0 0


    Повторный тест флуда icmp c порогом трафика 1Мб/с (на графиках 10:24 — 10:27). Нагрузка на RE роутера упала с 19% до 10%, нагрузка на PFE до 30%. Счетчики:

    Filter: lo0.0-i                                                
    Counters:
    Name Bytes Packets
    accept-bgp-lo0.0-i 0 0
    accept-icmp-lo0.0-i 6461448 230766
    accept-ntp-lo0.0-i 0 0
    accept-snmp-lo0.0-i 113433 1497
    accept-ssh-lo0.0-i 33780 609
    accept-traceroute-icmp-lo0.0-i 0 0
    accept-traceroute-tcp-lo0.0-i 0 0
    accept-traceroute-udp-lo0.0-i 0 0
    discard-TTL_1-unknown-lo0.0-i 0 0
    discard-icmp-lo0.0-i 0 0
    discard-icmp-fragments-lo0.0-i 0 0
    discard-ip-options-lo0.0-i 0 0
    discard-tcp-lo0.0-i 360 6
    discard-udp-lo0.0-i 12394 85
    discard-unknown-lo0.0-i 0 0
    Policers:
    Name Bytes Packets
    management-1m-accept-icmp-lo0.0-i 665335496 23761982
    management-1m-accept-ntp-lo0.0-i 0 0
    management-1m-accept-traceroute-icmp-lo0.0-i 0 0
    management-1m-accept-traceroute-tcp-lo0.0-i 0 0
    management-1m-accept-traceroute-udp-lo0.0-i 0 0
    management-5m-accept-ssh-lo0.0-i 0 0


    Следующим был проведен тест флуда на порт BGP роутера с постороннего (не включеного в конфиг) ip адреса (на графиках 10:29 — 10:36). Как видно из счетчиков, весь флуд осел на discard-tcp фильтре RE и лишь увеличил нагрузку на PFE. Нагрузка на RE не изменилась. Счетчики:

    Filter: lo0.0-i                                                
    Counters:
    Name Bytes Packets
    accept-bgp-lo0.0-i 824 26
    accept-icmp-lo0.0-i 0 0
    accept-ntp-lo0.0-i 0 0
    accept-snmp-lo0.0-i 560615 7401
    accept-ssh-lo0.0-i 33972 585
    accept-traceroute-icmp-lo0.0-i 0 0
    accept-traceroute-tcp-lo0.0-i 1088 18
    accept-traceroute-udp-lo0.0-i 0 0
    discard-TTL_1-unknown-lo0.0-i 0 0
    discard-icmp-lo0.0-i 0 0
    discard-icmp-fragments-lo0.0-i 0 0
    discard-ip-options-lo0.0-i 0 0
    discard-tcp-lo0.0-i 12250785600 306269640
    discard-udp-lo0.0-i 63533 441
    discard-unknown-lo0.0-i 0 0
    Policers:
    Name Bytes Packets
    management-1m-accept-icmp-lo0.0-i 0 0
    management-1m-accept-ntp-lo0.0-i 0 0
    management-1m-accept-traceroute-icmp-lo0.0-i 0 0
    management-1m-accept-traceroute-tcp-lo0.0-i 0 0
    management-1m-accept-traceroute-udp-lo0.0-i 0 0
    management-5m-accept-ssh-lo0.0-i 0 0


    сессия не падает:

    user@MX80# run show bgp summary                
    Groups: 1 Peers: 1 Down peers: 0
    Table Tot Paths Act Paths Suppressed History Damp State Pending
    inet.0
    2 1 0 0 0 0
    Peer AS InPkt OutPkt OutQ Flaps Last Up/Dwn State|#Active/Received/Accepted/Damped...
    9.4.8.2 4567 21 22 0 76 8:49 1/2/2/0 0/0/0/0


    Четвертым был проведен тест флуда (на графиках 10:41 — 10:46) UDP на порт NTP (в настройках фильтра взаимодействие по этому порту ограничивается серверами указанными в конфиге роутера). По графику, нагрузка поднимается только на PFE роутера до 28%. Счетчики:

    Filter: lo0.0-i                                                
    Counters:
    Name Bytes Packets
    accept-bgp-lo0.0-i 0 0
    accept-icmp-lo0.0-i 0 0
    accept-ntp-lo0.0-i 0 0
    accept-snmp-lo0.0-i 329059 4344
    accept-ssh-lo0.0-i 22000 388
    accept-traceroute-icmp-lo0.0-i 0 0
    accept-traceroute-tcp-lo0.0-i 615 10
    accept-traceroute-udp-lo0.0-i 0 0
    discard-TTL_1-unknown-lo0.0-i 0 0
    discard-icmp-lo0.0-i 0 0
    discard-icmp-fragments-lo0.0-i 0 0
    discard-ip-options-lo0.0-i 0 0
    discard-tcp-lo0.0-i 0 0
    discard-udp-lo0.0-i 1938171670 69219329
    discard-unknown-lo0.0-i 0 0
    Policers:
    Name Bytes Packets
    management-1m-accept-icmp-lo0.0-i 0 0
    management-1m-accept-ntp-lo0.0-i 0 0
    management-1m-accept-traceroute-icmp-lo0.0-i 0 0
    management-1m-accept-traceroute-tcp-lo0.0-i 0 0
    management-1m-accept-traceroute-udp-lo0.0-i 0 0
    management-5m-accept-ssh-lo0.0-i 0 0


    Пятым был проведен тест флуда (на графиках 10:41 — 11:04) UDP на порт NTP с IP spoofing. Нагрузка на RE увеличилась на 12%, нагрузка на PFE увеличилась до 22%. По счетчикам видно, что флуд упирается в порог 1Мб/с, но этого достаточно для повышения нагрузки на RE. Порог трафика в итоге был уменьшен до 512Кб/с. Счетчики:

    Filter: lo0.0-i                                                
    Counters:
    Name Bytes Packets
    accept-bgp-lo0.0-i 0 0
    accept-icmp-lo0.0-i 0 0
    accept-ntp-lo0.0-i 34796804 1242743
    accept-snmp-lo0.0-i 630617 8324
    accept-ssh-lo0.0-i 20568 366
    accept-traceroute-icmp-lo0.0-i 0 0
    accept-traceroute-tcp-lo0.0-i 1159 19
    accept-traceroute-udp-lo0.0-i 0 0
    discard-TTL_1-unknown-lo0.0-i 0 0
    discard-icmp-lo0.0-i 0 0
    discard-icmp-fragments-lo0.0-i 0 0
    discard-ip-options-lo0.0-i 0 0
    discard-tcp-lo0.0-i 0 0
    discard-udp-lo0.0-i 53365 409
    discard-unknown-lo0.0-i 0 0
    Policers:
    Name Bytes Packets
    management-1m-accept-icmp-lo0.0-i 0 0
    management-1m-accept-ntp-lo0.0-i 3717958468 132784231
    management-1m-accept-traceroute-icmp-lo0.0-i 0 0
    management-1m-accept-traceroute-tcp-lo0.0-i 0 0
    management-1m-accept-traceroute-udp-lo0.0-i 0 0
    management-5m-accept-ssh-lo0.0-i 0 0


    Повторный тест флуда (на графике ниже 11:29 — 11:34) UDP на порт NTP с IP spoofing, но с порогом трафика 512Кб/с. График нагрузки:
    график нагрузки CPU
    Счетчики:

    Filter: lo0.0-i                                                
    Counters:
    Name Bytes Packets
    accept-bgp-lo0.0-i 0 0
    accept-icmp-lo0.0-i 0 0
    accept-ntp-lo0.0-i 21066260 752363
    accept-snmp-lo0.0-i 744161 9823
    accept-ssh-lo0.0-i 19772 347
    accept-traceroute-icmp-lo0.0-i 0 0
    accept-traceroute-tcp-lo0.0-i 1353 22
    accept-traceroute-udp-lo0.0-i 0 0
    discard-TTL_1-unknown-lo0.0-i 0 0
    discard-icmp-lo0.0-i 0 0
    discard-icmp-fragments-lo0.0-i 0 0
    discard-ip-options-lo0.0-i 0 0
    discard-tcp-lo0.0-i 0 0
    discard-udp-lo0.0-i 82745 602
    discard-unknown-lo0.0-i 0 0
    Policers:
    Name Bytes Packets
    management-1m-accept-icmp-lo0.0-i 0 0
    management-1m-accept-traceroute-icmp-lo0.0-i 0 0
    management-1m-accept-traceroute-tcp-lo0.0-i 0 0
    management-1m-accept-traceroute-udp-lo0.0-i 0 0
    management-512k-accept-ntp-lo0.0-i 4197080384 149895728
    management-5m-accept-ssh-lo0.0-i 0 0


    Заключение


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

    Filter: lo0.0-i                                                
    Counters:
    Name Bytes Packets
    accept-v6-bgp-lo0.0-i 31091878 176809
    accept-v6-icmp-lo0.0-i 1831144 26705
    accept-v6-ntp-lo0.0-i 0 0
    accept-v6-traceroute-icmp-lo0.0-i 0 0
    accept-v6-traceroute-tcp-lo0.0-i 48488 684
    accept-v6-traceroute-udp-lo0.0-i 0 0
    discard-v6-icmp-lo0.0-i 0 0
    discard-v6-tcp-lo0.0-i 0 0
    discard-v6-udp-lo0.0-i 0 0
    discard-v6-unknown-lo0.0-i 0 0
    Policers:
    Name Bytes Packets
    management-1m-accept-v6-icmp-lo0.0-i 0 0
    management-1m-accept-v6-traceroute-icmp-lo0.0-i 0 0
    management-1m-accept-v6-traceroute-tcp-lo0.0-i 0 0
    management-1m-accept-v6-traceroute-udp-lo0.0-i 0 0
    management-512k-accept-v6-ntp-lo0.0-i 0 0

    Filter: lo0.0-i
    Counters:
    Name Bytes Packets
    accept-bgp-lo0.0-i 135948400 698272
    accept-dns-lo0.0-i 374 3
    accept-icmp-lo0.0-i 121304849 1437305
    accept-ntp-lo0.0-i 87780 1155
    accept-snmp-lo0.0-i 1265470648 12094967
    accept-ssh-lo0.0-i 2550011 30897
    accept-tacacs-lo0.0-i 702450 11657
    accept-traceroute-icmp-lo0.0-i 28824 636
    accept-traceroute-tcp-lo0.0-i 75378 1361
    accept-traceroute-udp-lo0.0-i 47328 1479
    discard-TTL_1-unknown-lo0.0-i 27790 798
    discard-icmp-lo0.0-i 26400 472
    discard-icmp-fragments-lo0.0-i 0 0
    discard-ip-options-lo0.0-i 35680 1115
    discard-tcp-lo0.0-i 73399674 1572144
    discard-udp-lo0.0-i 126386306 694603
    discard-unknown-lo0.0-i 0 0
    Policers:
    Name Bytes Packets
    management-1m-accept-dns-lo0.0-i 0 0
    management-1m-accept-icmp-lo0.0-i 38012 731
    management-1m-accept-tacacs-lo0.0-i 0 0
    management-1m-accept-traceroute-icmp-lo0.0-i 0 0
    management-1m-accept-traceroute-tcp-lo0.0-i 0 0
    management-1m-accept-traceroute-udp-lo0.0-i 0 0
    management-512k-accept-ntp-lo0.0-i 0 0
    management-5m-accept-ssh-lo0.0-i 0 0


    видно какое количество “левого” трафика оседает на фильтре discard.

    Буду рад ответить на все вопросы в комментариях.