Защита CPU Extreme Summit X670.

Автор: | 03.04.2020

Сегодня поговорим про защиту CPU от broadcast/multicast трафика на платформе Extreme X670. Данные рассуждения так же верны для X670V.

Коммутаторы построены на довольно старом Trident+ и в сравнении с одноклассниками – Huawei  (S6700-48-EI) или Cisco (N3K-3064) практически не имеют защиты control plane.
Extreme предлагает воспользоваться встроенным в XOS механизмом – dos-protect. Однако, этот механизм не спасет в случае broadcast/multicast шторма.
Для защиты от BUM трафика принято пользоваться опцией storm-control или rate-limit flood в XOS. Тут нас тоже ждет неприятный сюрприз. На X670 G1 платформе используется XOS 16.x, в котором функционал rate-limit flood реализован с использованием токенов с инетервалом обновления 15.625 микросекунд. Не углубляясь в подробности, скажу сразу – опция rate-limit flood будет дропать легитимный трафик из за несовершенства механизма.
Более подробно можно прочитать на форуме extremenetworks.com

Описываемые методы были успешно применены в качестве последнего рубежа защиты на магистральных L2 коммутаторах. Однако, не стоит ограничиваться только этими методами, best practice – защита на доступе.

Теория:

Итак, пора разобраться, какой трафик попадает на CPU:

Queue 0 : Broadcast and IPv6 packets
Queue 1 : sFlow packets
Queue 2 : vMAC destined packets (VRRP MAC and ESRP MAC)
Queue 3 : L3 Miss packets (ARP request not resolved) or L2 Miss packets (Software MAC learning)
Queue 4 : Multicast traffic not hitting hardware ipmc table (224.0.0.0/4 normal IP multicast packets neither IGMP nor PIM)
Queue 5 : ARP reply packets or packets destined for switch itself
Queue 6 : IGMP or PIM packets
Queue 7 : Packets whose TOS field is "0xc0" and Ethertype is "0x0800", or STP, EAPS, EDP, OSPF packets 

При возникновении L2 петель, основной трафик который полетит в CPU – это Broadcast, IPV6 и Multicast.
Для снятия дампа с CPU и анализа текущей ситуации, можно воспользоваться командой :

debug packet capture on interface Broadcom count 1000

Дамп сохранится в /usr/local/tmp.
Можно воспользоваться tftp или scp для того, что бы скопировать дамп на рабочую машину.

tftp put 11.1.1.1 vr "VR-Default"  /usr/local/tmp/2020-02-10_16-54-22_rx_tx.pcap  2020-02-10_16-54-22_rx_tx.pcap

После того, как мы проанализировали трафик на CPU, приступим к построению защиты.

Практика:

Для начала посмотрим, что будет с CPU при генерации broadcast и multicast трафика без какой либо защиты.
Схема лабы:

Для генерации трафика BcMc используется пакет pktgetn и скрипт nmap для флуда RA.
На сервере gen1 генерируется multicast трафик и IPV6 RA, сервер gen2 генерит broadcast.
Средний рейт генерации — 3Mpps.

Утилизация CPU:
sw2# sh cpu-monitoring | exclude 0.0

      CPU Utilization Statistics - Monitored every 5 seconds
-----------------------------------------------------------------------

Process      5   10   30   1    5    30   1    Max           Total
            secs secs secs min  mins mins hour            User/System
            util util util util util util util util       CPU Usage
            (%)  (%)  (%)  (%)   (%)  (%)  (%)  (%)         (secs)
-----------------------------------------------------------------------

System       52.2 50.3 50.4 47.3 48.9 26.0 13.0 69.7     0.32     964.28 
mcmgr        39.9 40.4 41.6 43.0 38.6 10.5  5.2 47.1    46.47     356.98 

sw2#top
Load average: 6.57 5.38 4.74 4/208 2905
  PID  PPID USER     STAT   RSS %MEM CPU %CPU COMMAND
  1327     2 root     RW       0  0.0   1 41.2 [bcmRX]
 1543     1 root     R     3852  0.3   0 40.4 ./mcmgr 

sw2# debug hal show device port-info system unit 0 | include cpu
MC_PERQ_PKT(0).cpu0     :      1,131,571      +62,271           5,776/s
MC_PERQ_PKT(4).cpu0     :      187,781        +42,768           5,353/s
MC_PERQ_PKT(7).cpu0     :      503            +17
MCQ_DROP_PKT(0).cpu0    :      174,095,428    +29,103,098       3,298,296/s
MCQ_DROP_PKT(4).cpu0    :      78,082,718     +17,834,191       1,021,107/s

sw2# debug hal show congestion 
Congestion information for Summit type X670-48x since last query
  CPU congestion present: 12414120

Итого, при транзитном трафике broadcast/multicast с рейтом около 6Mpps мы имеем загрузку CPU 100% и 10Kpps в очередях на процессоре, все остальное дропается. Реальный трафик на процессор многократно выше.

Теперь перейдем к фильтрам и посмотрим, что у получится.

Для защиты Queue 0 : Broadcast and IPv6 packets, создадим policy limit-bc-ipv6.

Данный конфиг можно использовать, если на коммутаторе НЕ используется L3 IPv6 функционал.

configure meter limit-broadcast committed-rate 1000 Pps out-actions drop 

sw#show policy limit-bc-ipv6

entry match-v6 { 
if match all { 
    ethernet-type 0x86DD ;
}
then {
    deny-cpu  ;
}
}
entry match-bc { 
if match all { 
    ethernet-destination-address ff:ff:ff:ff:ff:ff ;
}
then {
    meter limit-broadcast ;
}
}

Данную политику можно применить на все порты, либо только на те, где возомжно возникновение шторма.

configure access-list limit-bc-ipv6 ports 1-48 ingress

Для полной симуляции, создадим петлю в портах 11 и 12.

sw2# sh ports 11-12,46-47 utilization 
Link Utilization Averages                            Fri Apr  3 14:55:26 2020
Port    Link     Rx            Peak Rx        Tx             Peak Tx
        State    pkts/sec      pkts/sec       pkts/sec       pkts/sec
===========================================================================
11        A       7484877        8725834          7483368         8724075
12        A       7471259        8710066          7472785         8711816
46        A       2962834        3716425          7435635         8690736
47        A       2807846        3931673          7304028         8541282


В CPU попадает 3000 Broadcast пакетов, проходящих через петлю, все остальное — мультикаст.

sw2# debug hal show device port-info system unit 0 | include cpu
MC_PERQ_PKT(0).cpu0     :      2,456,584        +290,921           3,043/s
MC_PERQ_PKT(3).cpu0     :      3,104,008        +1,498,923         4,102/s
MC_PERQ_PKT(4).cpu0     :      3,125,047        +394,781           4,102/s
MC_PERQ_PKT(6).cpu0     :      1,222,571        +135,286           4,090/s

Утилизация CPU все еще 100%:

sw2# sh cpu-monitoring 

      CPU Utilization Statistics - Monitored every 5 seconds
-----------------------------------------------------------------------

Process      5   10   30   1    5    30   1    Max           Total
            secs secs secs min  mins mins hour            User/System
            util util util util util util util util       CPU Usage
            (%)  (%)  (%)  (%)   (%)  (%)  (%)  (%)         (secs)
-----------------------------------------------------------------------

System       50.3 48.9 46.9 51.4 58.1 31.7 15.8 68.8     0.32    1180.54 
mcmgr        43.9 43.1 44.8 31.0  6.3  6.3  3.1 48.5    33.33     198.40 

Попробуем защитить CPU от мультикаста.
Для этого понадобится выключить igmp snooping на всех вланах, которые смотрят в порт, с которого приходит шторм.
Если на влане включен igmp snooping, трафик будет попадать в CPU.

sw2# configure igmp snooping filters per-vlan
sw2#disable igmp snooping vlan test
sw2#disable igmp snooping vlan test2

После наложения данных фильтров на CPU попадает 3000pps броадкаста:

sw2# debug hal show device port-info system unit 0 | include cpu
MC_PERQ_PKT(0).cpu0     :     4,908,231       +6,352           2,994/s
MC_PERQ_PKT(7).cpu0     :     11,214            +3               1/s

Утилизация CPU ~ 15%.

sw2# sh cpu-monitoring | exclude 0.0

      CPU Utilization Statistics - Monitored every 5 seconds
-----------------------------------------------------------------------

Process      5   10   30   1    5    30   1    Max           Total
            secs secs secs min  mins mins hour            User/System
            util util util util util util util util       CPU Usage
            (%)  (%)  (%)  (%)   (%)  (%)  (%)  (%)         (secs)
-----------------------------------------------------------------------

System        9.3 10.5 16.5 13.7  2.7  0.4  0.2 34.1     0.14      18.96 
hal           3.5  3.7  3.2 10.2  2.0  0.3  0.1 51.5     1.42      10.67 
sw2#top
Mem: 577816K used, 443708K free, 0K shrd, 127032K buff, 157064K cached
CPU:  0.8% usr 16.5% sys  0.0% nic 69.9% idle  0.0% io  2.6% irq  9.9% sirq
Load average: 5.12 2.77 1.10 3/208 2015
  PID  PPID USER     STAT   RSS %MEM CPU %CPU COMMAND
 1329     2 root     SW       0  0.0   1 17.7 [bcmRX]

Подводя итог, можно сказать, что данные коммутаторы будут хороши как L2 агрегаторы или P роутеры в MPLS сетях. Если использовать X670 как L3/L2 коммутатор, полноценной защиты CPU сделать не получится.

UPD(02/2021):

В ExtremeXOS 16.2.5-Patch1-22 (Apr 2020) заявлен фикс проблемы с storm-control:
xos0063205 Even though the traffic rate is below the configured flood rate limit, traffic is dropped.

Но, как обычно, пофиксили не до конца.
Настраиваем action = disable-port log для broadcast и multicast при прeвышении порога в 500pps и только log для unknown-destmac.

configure port 1 rate-limit flood broadcast 500 out-actions log disable-port
configure port 1 rate-limit flood multicast 500 out-actions log disable-port
configure port 1 rate-limit flood unknown-destmac 500 out-actions log

Запускаем генератор трафика с рандомными DST MAC и рейтом 1000pps.
Проблема в том, что action=disable-port срабатывает при достижении порога любым типом трафика. В нашем случае, при достижении unknown-destmac порога в 500pps порт выключаться не должен. Однако, порт выключается:

sw2#sh ports 1 rate-limit flood out-of-profile refresh 
                                  Port Monitor         Fri Feb 12 11:48:33 2021
Port      Flood Type        Status             Counter
#--------  ----------------  --------------  ----------
1         Unknown Dest MAC  Out of profile      109336
1         Multicast         Out of profile      109336
1         Broadcast         Out of profile      109336

sw2# sh log
02/12/2021 11:52:14.71 Info:vlan.msgs.portLinkStateDown Port 1 link down
02/12/2021 11:52:14.70 Info:vlan.msgs.FldRateOutActDsblPort Port 1 disabled by Flood Control Rate Limit because the traffic exceeded the configured rate.

Протестировано на 16.2.5.4 16.2.5.4-patch1-29.
Надеюсь, это исправят в следующих релизах.

Подписаться
Уведомить о

0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии