Расширенная безопасность CISCO

Расширенная безопасность CISCO — в этой части рассмотрим защиту Control Plane устройства CISCO с помощью CoPP.

Мы уже защитили Management Plane в записи Базовая безопасность CISCO от нежелательного доступа. Лучше прочитать там про концепцию NFP, иначе может быть непонятно. А теперь нужно двигаться дальше.

Что же входит в расширенную безопасность устройства CISCO? Да дофига всего. И это ещё одна концепция от CISCO с названием SAFE, куда относится NFP.

Значит, у меня по плану:

  • Защита Control Plane с помощью CoPP;
  • Защита Data Plane с помощью 802.1X/MAB;
  • И Zone-Based Firewall (ZBF).

Сегодня Control Plane (CP). Защищаемся от атак DoS и перегрузки CPU устройства. Тема очень тесно переплетена с QoS.


Что будем ограничивать

Защита CP (Control Plane Protection, CPPr) рассказана тут. Там подробно объясняется как соотносятся CPPr и CoPP. А на самом устройстве будем применять CoPP.

В двух словах суть CoPP (Control Plane Policing): мы задаём политику предельного рейта для потоков трафика, которые обрабатываются с помощью CP. То есть со значительной утилизацией CPU устройства. Или же вообще по умолчанию отбрасываем некоторые виды трафика чтобы снизить нагрузку:

Control Plane Policing (CoPP) is a protection feature for the router’s control plane CPU. 
CoPP can granularly permit, drop, or rate-limit traffic to or from the CPU using a Modular QoS 
CLI (MQC) policy.

Обратите внимание "to or from", то есть можно применять в обе стороны. Ипользуется обычно конечно же для ограничения входящего трафика, предназначенного для обработки с помощью CPU устройства.

А какой трафик предназначен CP? Другими словами какой трафик обрабатывается со значительной утилизацией CPU?

Вернёмся к CPPr, здесь определяется три логических интерефейса для CP:

  • Host subinterface, это трафик предназначеный самому устройству: протоколы маршрутизации, службы и сервисы на устройстве; 
  • Transit subinterface, транзитный трафик обрабатываемый программно (как пример пакеты с IP Options);
  • CEF-exception subinterface, трафик который нельзя обработать с помощью CEF (ARP, L2 Keepalives, non-IP).

Что из этого мы будем резать с помощью CoPP?

CoPP handles all process-switched traffic, such as packets logged by an ACL or IP packets with header
(TTL) options. Other types of traffic directed to the control plane include routing updates, (OSPF,
EIGRP and BGP) as well as management traffic, including Telnet, SNMP, SSH, NTP, and HTTP etc.

Классификация трафика

Сначала нужно разбить входящий трафик на классы на основе типа трафика (менеджмент трафик, протоколы маршрутизации или известный трафик с известных IP адресов). Затем политика CoPP устанавливает максимальный рейт для каждого типа трафика.

Делается это с помощью разделения трафика для каждого класса на уровни: Conform, Exceed, Violate. Это всё понятия QoS.

Что это за уровни? Наглядно показано на картинке:

Расширенная безопасность CISC

Для этих понятий изначально подразумевалось, что есть контракт с ISP, где заложено:

  • Conforming — пакеты соответвуют пропускной способности контракта. Максимальный уровень CIR;
Committed Information Rate (CIR): The policed traffic rate, in bits per second (bps), defined 
in the traffic contract.
  • Exceeding — разрешённый скачок, "всплеск" трафика, указанный в контракте. Максимальный уровень PIR;
Peak Information Rate (PIR): The maximum rate of traffic allowed. PIR should be equal to or 
greater than the CIR.
  • Violating — пакеты абсолютно за рамками контракта.

Каждому уровню нужно назначить действие:

  • Пропускаем трафик (Transmit);
  • Отбрасываем трафик (Drop);
  • Перемаркировываем с меньшим приоритетом (Mark Down).

Как видно из картинки возможны различные варианты. Хорошо, необходимые термины разобраны, возвращаемся к CoPP.


Настройка CoPP

Сказанное выше про классификацию трафика не совсем соответствует в случае СoPP. Здесь нет контракта, нет ISP, но понятия те же самые. И надо знать "откуда ноги растут".

Далее, чтобы было ясно, идём от простого к сложному. Сначала пример настройки, где будут только уровни Conform, Exceed. Разберём пример и затем уже поговорим про Violate.

Итак, нужно понять: а что конкретно ограничивать в нашем случае? Как это выяснить?

  • Во-первых, роутер не в воздухе висит. Хорошо известно какие у него роутеры-соседи и какой примерно трафик с этих роутеров ходит. Но этого недостаточно;
  • Поэтому второй вариант: предварительно позахватывать трафик на интерфейсах устройства c помощью CISCO Embedded Packet Capture (EPC);

О EPC обязательно напишу в будущих материалах. Это необходимый элемент траблшутинга.

  • Третий вариант пособирать трафик с помощью NetFlow и поглядеть что же там собирается.

Допустим, всё это уже предварительно сделано и типы трафика для введения ограничений определены. Переходим непосредствено к настройке.

ACLs

Как отобрать трафик? Проще всего с помощью списков доступа (ACLs).

Конечно же здесь ACLs не предоставляют какой-либо доступ, а используются именно для отбора трафика, согласно условиям permit. Важный момент в настройке CoPP, чем точнее будут ACLs, тем лучше и полнее защита CP. Возьму для рассмотрения готовый пример из литературы:

ip access-list extended ACL_ICMP_CoPP
 permit icmp any any echo-reply
 permit icmp any any ttl-exceeded
 permit icmp any any unreachable
 permit icmp any any echo
 permit udp any any range 33434 33463 ttl eq 1
!
ip access-list extended ACL_IPsec_CoPP
 permit esp any any
 permit gre any any
 permit udp any eq isakmp any eq isakmp
 permit udp any any eq non500-isakmp
 permit udp any eq non500-isakmp any
!
ip access-list extended ACL_Bootpc_CoPP
 permit udp any eq bootps any eq bootpc
!
ip access-list extended ACL_Management_CoPP
 permit udp any eq ntp any
 permit udp any any eq snmp
 permit tcp any any eq 22
 permit tcp any eq 22 any established
!
ip access-list extended ACL_Routing_CoPP
 permit tcp any eq bgp any established
 permit eigrp any host 224.0.0.10
 permit ospf any host 224.0.0.5
 permit ospf any host 224.0.0.6
 permit pim any host 224.0.0.13
 permit igmp any any 

Вот такая "рыба" и тут много чего отбирается. Как видно, здесь список доступа ACL_Routing_CoPP не содержит правил для обмена unicast маршрутной информацией, это уже надо добавлять отдельно с учётом конкретных IP роутеров.

Значит посмотрел эту рыбу и теперь делаю что-нибудь попроще:

R1(config)# ip access-list extended TELNET
R1(config-ext-nacl)# permit tcp any any eq 23
R1(config-ext-nacl)# exit
R1(config)# ip access-list extended EIGRP
R1(config-ext-nacl)# permit eigrp any any
R1(config-ext-nacl)# exit
R1(config)# ip access-list extended SSH
R1(config-ext-nacl)# permit tcp any any eq 22
R1(config-ext-nacl)# exit
R1(config)# ip access-list extended ICMP
R1(config-ext-nacl)# permit icmp any any
R1(config-ext-nacl)# exit
Class Maps

Подвязываю списки доступа к картам классов, на этом процесс классификации трафика завершается:

R1(config)# class-map match-all COPP_TELNET
R1(config-cmap)# match access-group name TELNET
R1(config-cmap)# exit
R1(config)# class-map match-all COPP_EIGRP
R1(config-cmap)# match access-group name EIGRP
R1(config-cmap)# exit
R1(config)# class-map match-all COPP_SSH
R1(config-cmap)# match access-group name SSH
R1(config-cmap)# exit
R1(config)# class-map match-all COPP_ICMP
R1(config-cmap)# match access-group name ICMP
R1(config-cmap)# exit
Policy Map

Наконец составляю политику:

R1(config)# policy-map PM_COPP
R1(config-pmap)# class COPP_TELNET
R1(config-pmap-c)# police 8000 conform-action drop exceed-action drop - 8 килобит
R1(config-pmap-c-police)# class COPP_EIGRP
R1(config-pmap-c)# police rate 20 pps conform-action transmit exceed-action transmit - 20 пакетов в секунду
R1(config-pmap-c-police)# class COPP_SSH
R1(config-pmap-c)# police 50000 conform-action transmit exceed-action transmit - 50 килобит
R1(config-pmap-c-police)# class COPP_ICMP
R1(config-pmap-c)# police rate 10 pps conform-action transmit exceed-action drop - 10 пакетов в секунду      
R1(config-pmap-c-police)#end

Тут conform-action это когда трафик попадает в указанный рейт. А exceed-action когда превосходит. Мы задаём что делать в каком случае.

Во-первых, не хочу никакого телнета, поэтому там везде drop. И понятно что здесь 8 килобит цифра условная, она ни на что не влияет.

Во-вторых, для "важных" в этом примере типов трафика (EIGRP, SSH), чтобы не нарушить их работу изначально exceed-action transmit. Выбрано 20 пакетов в секунду для EIGRP и 50 килобит для SSH.

Это "пальцем в небо", примерные значения, поскольку неизвестно какой у них реальный рейт. Потом надо обязательно мониторить, подобрать нужный рейт, выставить его. И затем exceed-action переводится в drop.

В-третьих, ICMP не так важен для работоспособности, поэтому там сразу exceed-action drop. Посмотрим к чему это приведёт.

Class-Default

Теперь определяем class-default, неучтённый нами трафик:

R1(config)# policy-map PM_COPP
R1(config-pmap)# class class-default
R1(config-pmap-c)# police 8000 conform-action transmit exceed-action drop - 8 килобит

И если этот класс не определить, а автоматически он не добавляется, то неклассифицированный нашими ACLs трафик будет идти напрямую к CPU без всяких ограничений. Значит потуги по ограничению имеют гораздо меньше смысла. Тут задан рейт 8 килобит и действие drop при превышении. Класс class-default автоматически помещается в конец карты классов.

Соответсвенно желательно мониторить этот класс тоже, смотреть сколько туда попадает трафика и если этого трафика много, то разобрать что за трафик, доопределить недостающие ACLs.

Однако из-за механизма CoPP трафик, относящийся к данному классу, всё равно окажется непустой. По крайней мере туда будет попадать L2 keepalive и non-IP трафик.

Казалось бы: неизвестный трафик, а давайте его откинем? Нет. Чтобы не нарушить работу для class-default всегда подразумевается conform-action transmit при каком-то небольшом, подобранном рейте.

Всё сделали. Теперь политика применяется во входящем направлении:

R1(config)# control-plane
R1(config-cp)# service-policy input PM_COPP

Обращаю внимание что тут не интерфейс, а control-plane, вроде логического интерфейса.


Просмотр CoPP

Сначала поглядим что мы там понастраивали. Позапускаем SSH, телнет и пинг к R1, EIGRP уже настроен. R2 это роутер-сосед:

R2# ssh -l admin 10.10.1.1 
Password: 
 R1, Control Plane Policing 
R1# exit

R2# telnet 10.10.1.1         
Trying 10.10.1.1 ... 
% Connection timed out; remote host not responding

R2# ping            
Protocol [ip]: 
Target IP address: 10.10.1.1       
Repeat count [5]: 20
...
Type escape sequence to abort.
Sending 20, 100-byte ICMP Echos to 10.10.1.1, timeout is 2 seconds:
!!.!!.!!.!!.!!.!!.!!
Success rate is 70 percent (14/20), round-trip min/avg/max = 1/1/1 ms

Обращаю внимание, как интересно ведёт себя пинг. И смотрим ACLs:

R1# show access-lists
Extended IP access list EIGRP
    10 permit eigrp any any (272 matches)
Extended IP access list ICMP
    10 permit icmp any any (30 matches)
Extended IP access list SSH
    10 permit tcp any any eq 22 (50 matches)
Extended IP access list TELNET
    10 permit tcp any any eq telnet (4 matches)

Смотрим карту классов:

R1# show class-map
 Class Map match-all COPP_EIGRP (id 2)
   Match access-group name EIGRP

 Class Map match-all COPP_SSH (id 3)
   Match access-group name SSH

 Class Map match-any class-default (id 0)
   Match any 

 Class Map match-all COPP_ICMP (id 4)
   Match access-group name ICMP

 Class Map match-all COPP_TELNET (id 1)
   Match access-group name TELNET

Смотрим политику:

R1# show policy-map
  Policy Map PM_COPP
    Class COPP_TELNET
     police cir 8000 bc 1500
       conform-action drop 
       exceed-action drop 
    Class COPP_EIGRP
     police rate 20 pps
       conform-action transmit 
       exceed-action transmit 
    Class COPP_SSH
     police cir 50000 bc 1562
       conform-action transmit 
       exceed-action transmit 
    Class COPP_ICMP
     police rate 10 pps
       conform-action transmit 
       exceed-action drop 
    Class class-default
     police cir 8000 bc 1500
       conform-action transmit 
       exceed-action drop 

С CIR понятно, а что там за BC и откуда значение для него? Будет кратко в конце статьи.

Проверка CoPP

Теперь можно проверить статистику по настроенному рейту.

R1# show policy-map control-plane
 Control Plane 

  Service-policy input: PM_COPP

    Class-map: COPP_TELNET (match-all)  
      4 packets, 240 bytes
      5 minute offered rate 0000 bps, drop rate 0000 bps
      Match: access-group name TELNET
      police:
          cir 8000 bps, bc 1500 bytes
        conformed 4 packets, 240 bytes; actions:
          drop 
        exceeded 0 packets, 0 bytes; actions:
          drop 
        conformed 0000 bps, exceeded 0000 bps

    Class-map: COPP_EIGRP (match-all)  
      349 packets, 25826 bytes
      5 minute offered rate 0000 bps, drop rate 0000 bps
      Match: access-group name EIGRP
      police:
          rate 20 pps, burst 4 packets
        conformed 349 packets, 349 bytes; actions:
          transmit 
        exceeded 0 packets, 0 bytes; actions:
          transmit 
        conformed 0 pps, exceeded 0 pps

    Class-map: COPP_SSH (match-all)  
      50 packets, 4388 bytes
      5 minute offered rate 0000 bps, drop rate 0000 bps
      Match: access-group name SSH
      police:
          cir 50000 bps, bc 1562 bytes
        conformed 49 packets, 4298 bytes; actions:
          transmit 
        exceeded 1 packets, 90 bytes; actions:
          transmit 
        conformed 0000 bps, exceeded 0000 bps

    Class-map: COPP_ICMP (match-all)  
      30 packets, 3420 bytes
      5 minute offered rate 0000 bps, drop rate 0000 bps
      Match: access-group name ICMP
      police:
          rate 10 pps, burst 2 packets
        conformed 22 packets, 22 bytes; actions:
          transmit 
        exceeded 8 packets, 8 bytes; actions:
          drop 
        conformed 0 pps, exceeded 0 pps

    Class-map: class-default (match-any)  
      866 packets, 68206 bytes
      5 minute offered rate 0000 bps, drop rate 0000 bps
      Match: any 
      police:
          cir 8000 bps, bc 1500 bytes
        conformed 866 packets, 68206 bytes; actions:
          transmit 
        exceeded 0 packets, 0 bytes; actions:
          drop 
        conformed 0000 bps, exceeded 0000 bps

Длинная портянка, но её надо разобрать. Трафик:

  • TELNET ожидаемо дропнут;
  • EIGRP вписался в 20 пакетов в секунду;
  • SSH вылез за пределы, значит 50 килобит мало и надо подкрутить в сторону увеличения (это ещё не настраивали и не просматривали ничего);
  • ICMP тоже вылез, именно поэтому такой странный вывод был, каждый третий пакет дропнут;
  • На дефолтный класс пришлось 66 килобайт, но поскольку этот трафик был разнесён во времени, превышения не было и ничего не дропнулось.

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


MQC

Как уже выяснили выше политика CoPP является политикой QoS. Для CISCO IOS называется Modular QoS CLI (MQC).

Что за MQC? Вкратце, CISCO в какой-то момент упорядочила/упростила настройку QoS в IOS и назвала эту концепцию MQC. В современных релизах IOS всё что мы используем для настройки QoS это MQC.

Используются "Class-Based" (CB) средства: CB Marking, CB Policing, CB Shaping, CBWFQ. Поэтому большинство средств MQC требуют предварительной классификации трафика. Общая схема настройки приведена на картинке:

Расширенная безопасность CISC

Как можно было увидеть, именно это и настраивали.

Команда policy

Остался хороший вопрос: а для чего нужен Violate? Ведь такой параметр есть, а использован он не был. Придётся ещё чуть в QoS. Параметр Violate служит для более тонкой настройки, чем просто пара Conform-Exceed.

В QoS команда policy предполагает некоторую вариативность и различные схемы обработки трафика. Возьмём роутер непривязанный к примеру выше и посмотрим структуру команды:

Router(config-pmap-c)# police ?
  <8000-2000000000>  Target Bit Rate (bIts per second)
  cir                Committed information rate
...
Router(config-pmap-c)# police 8000 ?
  <1000-512000000>  Burst bytes
  bc                Conform burst
...
Router(config-pmap-c)# police 8000 1000 ?
  <1000-512000000>  Burst bytes 
  be                Excess burst
...

Что такое BC и BE? Как видно, ВСconform burst, соотвествующий уровню PIR. BEexcess burst, такой уровень мы не определяли. При этом BE всегда больше или равен BC. Всего получается три уровня. Возвращаемся к R1 и будем мучать class COPP_ICMP. В итоге команда может выглядеть, например, вот так:

R1(config-pmap-c)# police 8000 1000 2000 conform-action transmit exceed-action transmit violate-action drop

Ну и ожидаемо в выводе show CIR, BC, BE:

Router#   show policy-map
  Policy Map PM_COPP
...  
   Class COPP_ICMP
     police cir 8000 bc 1000 be 2000
       conform-action transmit 
       exceed-action transmit 
       violate-action drop

Тут всё понятно. Либо вот так:

R1(config-pmap-c)# police 8000 conform-action transmit exceed-action transmit violate-action drop

Вывод show:

Router#   show policy-map
  Policy Map PM_COPP
...
    Class COPP_ICMP
     police cir 8000 bc 1500 be 1500
       conform-action transmit 
       exceed-action transmit 
       violate-action drop 

Откуда взялись BC и ВE, мы же их не вводили? Рассчитаны автоматически. Кроме того, для превышающего всплеска:

R1(config-pmap-c)#$ction transmit exceed-action transmit violate-action ?
  drop                              drop packet
  set-clp-transmit                  set atm clp and send it
  set-cos-inner-transmit            set inner cos and send it
  set-cos-transmit                  set cos and send it
  set-discard-class-transmit        set discard-class and send it
  set-dscp-transmit                 set dscp and send it
  set-dscp-tunnel-transmit          rewrite tunnel packet dscp and send it
  set-frde-transmit                 set FR DE and send it
  set-mpls-exp-imposition-transmit  set exp at tag imposition and send it
  set-mpls-exp-topmost-transmit     set exp on topmost label and send it
  set-prec-transmit                 rewrite packet precedence and send it
  set-prec-tunnel-transmit          rewrite tunnel packet precedence and send it                            
  set-qos-transmit                  set qos-group and send it
  transmit                          transmit packet

Как уже говорилось, можно разрешить, можно дропнуть, можно перемаркировать. В начале внедрения та же схема, violate-action transmit для важных классов. И уже когда всё разобрано/подбрано, violate-action drop. Такие рекомендации Best Practice. Подводим итог: вы сами решаете какие схемы обработки для какого типа трафика вам нужны.

Надеюсь более-менее разобрал, но что-то может остаться непонятным. Кто хочет разобраться подробнее, а именно как конкретно работают BC и BE, заныривайте в QoS. Для этого есть: QOS Exam Certification Guide Second Edition.pdf. И пишите комментарии. Обзорное видео на тему.

Leave a Comment

Scroll to Top