Расширенная безопасность 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.
Что это за уровни? Наглядно показано на картинке:

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

Как можно было увидеть, именно это и настраивали.
Команда 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
. BE
— excess 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. И пишите комментарии. Обзорное видео на тему.