- PVSM.RU - https://www.pvsm.ru -
По долгу службы мне часто приходится сталкиваться с DDOS на сервера, но некоторое время назад столкнулся с другой атакой, к которой был не готов. Атака производилась на роутер Juniper MX80 поддерживающий BGP сессии и выполняющий анонс подсетей дата-центра. Целью атакующих был веб-ресурс расположенный на одном из наших серверов, но в результате атаки, без связи с внешним миром остался весь дата-центр. Подробности атаки, а также тесты и методы борьбы с такими атаками под катом.
Исторически сложилось, что на роутере блокируется весь UDP трафик летящий в нашу сеть. Первая волна атаки (в 17:22) была как раз UDP трафиком, график 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 трафика:

или 380Mbps:

Нагрузка на 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 адрес источника выбирался рандомно и не совпадал с адресом пира указанным в конфиге роутера. Эта атака произвела на роутер такой же эффект. Дабы не растягивать статью однообразными выводами логов, приведу только график нагрузки:

По графику отчетливо видно момент начала атаки. BGP сессия также упала и не смогла восстановиться.
Особенность работы оборудования 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 [1]. В моем случае на роутере схема была следующей:
По протоколу IPv4
По протоколу 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:
/* Фильтр BGP трафика */
filter accept-bgp {
interface-specific;
term accept-bgp {
from {
source-prefix-list {
BGP-neighbors-v4;
}
destination-prefix-list {
BGP-locals-v4;
}
/* пассивный режим работы соседа. Сессия начинается с нашей стороны. */
tcp-established;
protocol tcp;
port bgp;
}
then {
count accept-bgp;
accept;
}
}
}
/* Фильтр SSH трафика */
filter accept-ssh {
apply-flags omit;
term accept-ssh {
from {
destination-prefix-list {
MGMT-locals;
}
protocol tcp;
destination-port ssh;
}
then {
/* ограничение пропускной способности */
policer management-5m;
count accept-ssh;
accept;
}
}
}
/* Фильтр SNMP трафика */
filter accept-snmp {
apply-flags omit;
term accept-snmp {
from {
source-prefix-list {
SNMP-clients;
SNMP-community-clients;
}
destination-prefix-list {
/* Подключение только на адрес внутренней сети */
INTERNAL-locals;
}
protocol udp;
destination-port [ snmp snmptrap ];
}
then {
count accept-snmp;
accept;
}
}
}
/* Фильтр ICMP трафика */
filter accept-icmp {
apply-flags omit;
/* Отбрасываем фрагментированные пакеты ICMP */
term discard-icmp-fragments {
from {
is-fragment;
protocol icmp;
}
then {
count discard-icmp-fragments;
discard;
}
}
term accept-icmp {
from {
protocol icmp;
icmp-type [ echo-reply echo-request time-exceeded unreachable source-quench router-advertisement parameter-problem ];
}
then {
/* ограничение пропускной способности */
policer management-1m;
count accept-icmp;
accept;
}
}
}
/* фильтр traceroute трафика */
filter accept-traceroute {
apply-flags omit;
term accept-traceroute-udp {
from {
destination-prefix-list {
LOCALS-v4;
}
protocol udp;
/* ограничение в TTL = 1 */
ttl 1;
destination-port 33434-33450;
}
then {
/* ограничение пропускной способности */
policer management-1m;
count accept-traceroute-udp;
accept;
}
}
term accept-traceroute-icmp {
from {
destination-prefix-list {
LOCALS-v4;
}
protocol icmp;
/* ограничение в TTL = 1 */
ttl 1;
icmp-type [ echo-request timestamp time-exceeded ];
}
then {
/* ограничение пропускной способности */
policer management-1m;
count accept-traceroute-icmp;
accept;
}
}
term accept-traceroute-tcp {
from {
destination-prefix-list {
LOCALS-v4;
}
protocol tcp;
/* ограничение в TTL = 1 */
ttl 1;
}
then {
/* ограничение пропускной способности */
policer management-1m;
count accept-traceroute-tcp;
accept;
}
}
}
/* фильтр DNS трафика */
filter accept-dns {
apply-flags omit;
term accept-dns {
from {
source-prefix-list {
DNS-servers-v4;
}
destination-prefix-list {
LOCALS-v4;
}
protocol udp;
source-port 53;
}
then {
/* ограничение пропускной способности */
policer management-1m;
count accept-dns;
accept;
}
}
}
/* фильтр для отбрасывания не прошедших все проверки пакетов */
filter discard-all {
apply-flags omit;
term discard-ip-options {
from {
ip-options any;
}
then {
/* счетчик пакетов для сбора статистики */
count discard-ip-options;
log;
discard;
}
}
term discard-TTL_1-unknown {
from {
ttl 1;
}
then {
/* счетчик пакетов для сбора статистики */
count discard-TTL_1-unknown;
log;
discard;
}
}
term discard-tcp {
from {
protocol tcp;
}
then {
/* счетчик пакетов для сбора статистики */
count discard-tcp;
log;
discard;
}
}
term discard-udp {
from {
protocol udp;
}
then {
/* счетчик пакетов для сбора статистики */
count discard-udp;
log;
discard;
}
}
term discard-icmp {
from {
destination-prefix-list {
LOCALS-v4;
}
protocol icmp;
}
then {
/* счетчик пакетов для сбора статистики */
count discard-icmp;
log;
discard;
}
}
term discard-unknown {
then {
/* счетчик пакетов для сбора статистики */
count discard-unknown;
log;
discard;
}
}
}
/* фильтр TACACS+ трафика */
filter accept-tacacs {
apply-flags omit;
term accept-tacacs {
from {
source-prefix-list {
TACPLUS-servers;
}
destination-prefix-list {
INTERNAL-locals;
}
protocol [ tcp udp ];
source-port [ tacacs tacacs-ds ];
tcp-established;
}
then {
/* ограничение пропускной способности */
policer management-1m;
count accept-tacacs;
accept;
}
}
}
/* фильтр NTP трафика */
filter accept-ntp {
apply-flags omit;
term accept-ntp {
from {
source-prefix-list {
NTP-servers-v4;
localhost-v4;
}
destination-prefix-list {
localhost-v4;
LOCALS-v4;
}
protocol udp;
destination-port ntp;
}
then {
/* ограничение пропускной способности */
policer management-512k;
count accept-ntp;
accept;
}
}
}
/* родительский фильтр для ветвления фильтрации и упрощения применения фильтра на интерфейс */
filter accept-common-services {
term protect-TRACEROUTE {
filter accept-traceroute;
}
term protect-ICMP {
filter accept-icmp;
}
term protect-SSH {
filter accept-ssh;
}
term protect-SNMP {
filter accept-snmp;
}
term protect-NTP {
filter accept-ntp;
}
term protect-DNS {
filter accept-dns;
}
term protect-TACACS {
filter accept-tacacs;
}
}
Аналогичный фильтр для ipv6:
/* фильтр BGP трафика */
filter accept-v6-bgp {
interface-specific;
term accept-v6-bgp {
from {
source-prefix-list {
BGP-neighbors-v6;
}
destination-prefix-list {
BGP-locals-v6;
}
tcp-established;
next-header tcp;
port bgp;
}
then {
count accept-v6-bgp;
accept;
}
}
}
/* фильтр ICMP трафика */
filter accept-v6-icmp {
apply-flags omit;
term accept-v6-icmp {
from {
next-header icmp6;
/* фильтр по типу более лояльный, так как ipv6 требуется icmp */
icmp-type [ echo-reply echo-request time-exceeded router-advertisement parameter-problem destination-unreachable packet-too-big router-solicit neighbor-solicit neighbor-advertisement redirect ];
}
then {
policer management-1m;
count accept-v6-icmp;
accept;
}
}
}
/* фильтр traceroute трафика */
filter accept-v6-traceroute {
apply-flags omit;
term accept-v6-traceroute-udp {
from {
destination-prefix-list {
LOCALS-v6;
}
next-header udp;
destination-port 33434-33450;
hop-limit 1;
}
then {
policer management-1m;
count accept-v6-traceroute-udp;
accept;
}
}
term accept-v6-traceroute-tcp {
from {
destination-prefix-list {
LOCALS-v6;
}
next-header tcp;
hop-limit 1;
}
then {
policer management-1m;
count accept-v6-traceroute-tcp;
accept;
}
}
term accept-v6-traceroute-icmp {
from {
destination-prefix-list {
LOCALS-v6;
}
next-header icmp6;
icmp-type [ echo-reply echo-request router-advertisement parameter-problem destination-unreachable packet-too-big router-solicit neighbor-solicit neighbor-advertisement redirect ];
hop-limit 1;
}
then {
policer management-1m;
count accept-v6-traceroute-icmp;
accept;
}
}
}
/* фильтр DNS трафика */
filter accept-v6-dns {
apply-flags omit;
term accept-v6-dns {
from {
source-prefix-list {
DNS-servers-v6;
}
destination-prefix-list {
LOCALS-v6;
}
next-header udp;
source-port 53;
}
then {
policer management-1m;
count accept-v6-dns;
accept;
}
}
}
/* фильтр NTP трафика */
filter accept-v6-ntp {
apply-flags omit;
term accept-v6-ntp {
from {
source-prefix-list {
NTP-servers-v6;
localhost-v6;
}
destination-prefix-list {
localhost-v6;
LOCALS-v6;
}
next-header udp;
destination-port ntp;
}
then {
policer management-512k;
count accept-v6-ntp;
accept;
}
}
}
/* фильтр отбрасывающий остальные пакеты */
filter discard-v6-all {
apply-flags omit;
term discard-v6-tcp {
from {
next-header tcp;
}
then {
count discard-v6-tcp;
log;
discard;
}
}
term discard-v6-udp {
from {
next-header udp;
}
then {
count discard-v6-udp;
log;
discard;
}
}
term discard-v6-icmp {
from {
destination-prefix-list {
LOCALS-v6;
}
next-header icmp6;
}
then {
count discard-v6-icmp;
log;
discard;
}
}
term discard-v6-unknown {
then {
count discard-v6-unknown;
log;
discard;
}
}
}
/* родительский фильтр для ветвления фильтрации и упрощения применения фильтра на интерфейс */
filter accept-v6-common-services {
term protect-TRACEROUTE {
filter accept-v6-traceroute;
}
term protect-ICMP {
filter accept-v6-icmp;
}
term protect-NTP {
filter accept-v6-ntp;
}
term protect-DNS {
filter accept-v6-dns;
}
}
Далее необходимо применить фильтры на служебный интерфейс 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 за весь период тестов:

График 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Кб/с. График нагрузки:

Счетчики:
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.
Буду рад ответить на все вопросы в комментариях.
Автор: velizarx
Источник [2]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/ddos/38818
Ссылки в тексте:
[1] Douglas Hanks Jr. — Day One Book: Securing the Routing Engine on M, MX and T series: http://www.juniper.net/us/en/community/junos/training-certification/day-one/fundamentals-series/securing-routing-engine/
[2] Источник: http://habrahabr.ru/post/186566/
Нажмите здесь для печати.