ACL на коммутаторах CISCO — списки контроля доступа рассматриваются обычно в разрезе маршрутизаторов: пакетная фильтрация на интерфейсе, QoS, NAT, VPN, динамические протоколы маршрутизации. Ну а как же коммутаторы? Здесь ACLs тоже применяются.
На самом деле, про маршрутизаторы будет разговор, куда же без них.
Немного теории
Быстро пробежимся по наиболее важным моментам:
- Записи ACL (Access Control List) — ACE (Access Control Entry) обрабатываются сверху вниз, при совпадении происходит отработка ACE и выход из ACL;
- Последняя запись всегда неявный запрет deny [any | ip any any] (это концепция CISCO, она широко распространена, но есть и другие концепции);
- Новая запись добавляется вниз списка (перед неявным запретом);
- Чтобы добавить запись в конкретное место списка нужно в явном виде указать номер строки;
- Строки нумеруются 10, 20, 30.., соответственно чтобы добавить новую строку между первой и второй, нужно указать в явном виде номер 15 (или 11, 12,.. 19) перед ACE;
- Для интерфейса только 1 ACL для каждого протокола (IPv4 и IPv6) и для каждого направления (in и out);
- Создать ACL в режиме глобальной конфигурации, потом применить на интерфейсе;
- Убедиться, что наиболее важные (подробные, с наибольшим числом параметров, они же самые длинные) записи находятся в верхней части списка ACL;
- Помнить, что трафик создаваемый внутри устройства (самим маршрутизатором) не фильтруется исходящими ACLs;
- Стандартные ACLs размещать как можно ближе к месту назначения;
- Расширенные ACLs размещать как можно ближе к источнику;
- Помнить про внутренний алгоритм стандартных списков: ACE для хостов перед ACE для диапазонов.
Если есть сомнения в правильном понимании, лучше повторить. Основы ACL списков для маршрутизатора можно посмотреть во 2 части курса CCNA R&S.
Способы контроля трафика коммутаторов
Существует различных 3 способа контролировать трафик коммутаторов с помощью ACL:
- Router ACL (RACL) — применяется на маршрутизаторе либо на коммутаторе (на логическом интерфейсе SVI для коммутатора);

- Port ACL (PACL) — применяется на коммутаторе (на физическом интерфейсе);

- VLAN ACL (VACL) — применяется на коммутаторе (без привязки к интерфейсу, с указанием номера VLAN).

Попробую выполнить каждый способ на железе. Конфигурация следующая:
- На коммутаторе WS-C3550-24-EMI создан SVI на VLAN 1 с IP 192.168.64.251;
- К порту FastEthernet 0/18 этой VLAN подключён мой компьютер с IP 192.168.64.1 и MAC
7085.C275.E38F
; - К коммутатору WS-C3550 подключен коммутатор WS-C2950 создан SVI на VLAN 1 с IP 192.168.64.253.

Модельный ряд
Не все коммутаторы CISCO одинаково умеют использовать ACLs. В основном полная поддержка всех видов ACLs доступна для коммутаторов L3. Для коммутаторов L2 могут быть и есть ограничения. Так например, для модельного ряда 2950 есть два набора функционала: стандартный и расширенный. Набор функционала жёстко привязан к платформе. Мои WS-C2950-24 со стандартным функционалом практически ничего не умеют в плане ACLs (да ещё много других ограничений). Поэтому всё и рассматривается на коммутаторе L3 WS-C3550.
Порядок применения ACL
Схема такая, с хоста A, который находится во VLAN A, трафик идёт на хост B во VLAN B на этом же коммутаторе. На коммутаторе настроены SVI для VLANs A, B и маршрутизация между VLANs A,B. Порядок отработки ACLs:
- PACL A;
- VACL A;
- RACL на SVI VLAN A во входящем направлении;
- RACL на SVI VLAN B в исходящем направлении;
- VACL B.

Обращаю внимание на направление трафика, оно однозначно определено. Если на SVI настроено 2 RACLs: и in, и out, то сработает только один. В зависимости от направления трафика:
- Inbound (in) — трафик идёт с компьютера на интерфейс коммутатора;
- Outbound (out) — с интерфейса коммутатора на компьютер.
Логирование отдельных ACE (то есть опция log
на конце ACE) всегда происходит с утилизацией CPU коммутатора. Полезно будет проконтролировать загрузку CPU: Zabbix, NOC, другое ПО. И с помощью команды:
3550-1# sh proc cpu CPU utilization for five seconds: 1%/0%; one minute: 1%; five minutes: 0% PID Runtime(ms) Invoked uSecs 5Sec 1Min 5Min TTY Process 1 0 7 0 0.00% 0.00% 0.00% 0 Chunk Manager 2 0 43 0 0.00% 0.00% 0.00% 0 Load Meter ...
Обратный трафик
Для упрощения допустим, что других ACLs нет. Только 1 входящий ACL (in) и 1 исходящий ACL (out) на 1 интерфейсе SVI A. Всё.
На картинке выше было указано прохождение пакета в прямом направлении от компьютера A к компьютеру B. Но B ответит A. Важно не забывать, чтобы обратный трафик был разрешён.
Трафик проходит от компьютера A через интерфейс SVI A. Срабатывает in-список доступа. Приходит ответ от компьютера B, срабатывает out-список на интерфейсе SVI A. Поэтому нужно чтобы обратный трафик от компьютера B был разрешён:
- В явном виде в списке out на SVI A;
- В неявном виде с помощью параметра established в списке out на SVI A;
Параметр established можно применять только для расширенного списка и только для TCP-трафика. Потому что только TCP устанавливает сессию. И только в этом случае сессию можно отследить, а значит разрешить обратный трафик.
Без established
В чём разница? В первом случае, правило для обратного трафика должно быть указано в out-списке в явном виде:
permit ip IP_B MASK_B IP_A MASK_A
- Любой трафик TCP, UDP, ICMP, IP;
- Для источника трафика обычно указывается в явном виде IP и маска.
При этом пакеты (удовлетворяющие спискам доступа in, out) будут свободно ходить через интерфейс SVI A как от компьютера A к B, так и от компьютера B к A. При этом неважно какой из компьютеров инициировал подключение.
С established
Во втором случае, правило для обратного трафика указывается в out-списке "в неявном виде", то есть с помощью established
:
permit tcp any IP_A MASK_A established
- Только TCP трафик;
- Вместо IP и маски источника обычно указывается ANY;
- Завершающий параметр ESTABLISHED.
Таким образом только компьютер A может инициировать сессию TCP. А компьютер B нет. Для этого и было придумано. Этот метод прапрадедушка Stateful Firewalls.
VACL
Ещё случай, когда нужно разрешить обратный трафик:
- В случае использования VACL.
Поскольку VACL не имеет направления, обратные пакеты будут тоже проверены. Немного забегая вперёд скажу, на самом деле VACL удобно использовать чтобы заблокировать часть трафика, а весь остальной разрешить. Тогда карта классов будет выглядеть примерно так:
vlan access-map VACL 10
match ip address LIST_DENY_ALL - тут бабахаем что нужно запретить
action drop
vlan access-map VACL 20
action forward - тут безусловно разрешаем всё
!
Тогда никакой обратный трафик разрешать не надо.
Пример
На граничном роутере ACL висит на интерфейсе в сторону интернета. Поэтому трафик с интернета входящий, для него работает ACL in:
ip access-list extended INTERNET_ACL_IN .. 1002 permit tcp any host 187.187.197.239 eq 443 3337 1003 permit tcp any host 187.187.197.240 eq 443 www 1004 permit tcp any host 187.187.197.239 established 1005 permit tcp any host 187.187.197.240 established ..
Первые 2 правила в явном виде разрешают доступ из интернета до 187.187.197.239/240 по указанным портам. Два следующих интереснее, разрешают обратный TCP трафик из интернета, для сессий TCP, которые инициировали хосты 187.187.197.239/240, находящиеся внутри корпоративной сети.
Как работает Established
Можно подумать что роутер ведёт какую-то таблицу соединений. Нет, ничего такого. То что пакет принадлежит уже установленному соединению роутер понимает по флагам в заголовке TCP:
The established keyword indicates that packets belong to an existing connection if the Transmission Control Protocol (TCP) datagram has the Acknowledgment (ACK) or Reset (RST) bit set.
Почитать в оригинале. Поэтому возможна ситуация когда TCP сессия была инициирована через один роутер R1 (один провайдер), а ответы приходят на другой роутер R2 (другой провайдер). Если R2 имеет ACE с established для этого трафика, он увидит установленный флаг ACK и пропустит пакеты. Он не знает и ему неважно, что это не его сессия. Вот такой интересный момент. Возвращаемся к коммутаторам.
RACL
RACL в сущности обычный ACL:
- Применяется на интерфейсе 3 уровня, в основном на сабинтерфейсе транкового канала маршрутизатора, если в разрезе связки маршрутизатор-коммутатор;
- Может использоваться во входящем и исходящем направлении (inbound/outbound);
- Нужен чтобы контролировать трафик между VLANs;
- Для RACL поддерживаются Стандартные и Расширенные ACL.
Router on a stick: пакет приходит из какой-то VLAN, маршрутизируется на роутере и уходит в другую VLAN. Соответственно RACL может быть применён на сабинтерфейсе исходной VLAN во входящем направлении до маршрутизации или на сабинтерфейсе целевой VLAN в исходящем направлении после маршрутизации.
Также RACL может применяться на SVI интерфейсе коммутатора.
Пример RACL
3550-1(config)# access-list 1 permit 192.168.64.1 3550-1(config)# interface vlan 1 3550-1(config-if)# ip access-group 1 in 3550-1(config-if)# end 3550-1# sh ip access-lists 1 Standard IP access list 1 10 permit 192.168.64.1 (96 matches)
Разрешил подключение во входящем направлении для своего компьютера и сижу через SSH. Смотрю статистику, есть попадания, значит ACL работает.
Второй способ контролировать работу ACL — дополнять правило ACE параметром log
, тогда попадание будет выводится в консоль и отправляться на SYSLOG-сервер:
3550-1(config)# access-list 1 permit 192.168.64.1 log
Примечание. Как уже говорил, такая регистрация событий с параметром log
создаёт приличную нагрузку на устройство. Применять нужно обычно в случаях, когда сеть подвергается атаке и администратор ищет источник этой атаки.
По умолчанию сообщения выводятся только в локальную консоль, чтобы они выводились в удаленную нужно ввести команду привилегированного режима:
3550-1# terminal monitor
И наблюдаю результат:
00:09:11: %SEC-6-IPACCESSLOGS: list 1 permitted 192.168.64.1 65 packets
Теперь добавляю запрет на всё в явном виде:
3550-1(config)# access-list 1 deny any
Меняю на компьютере адрес на 64.2, подключение SSH недоступно. Возвращаю IP, подключаюсь, смотрю статистику:
3550-1# sh access-lists 1 Standard IP access list 1 10 permit 192.168.64.1 (311 matches) 20 deny any (33 matches) 3550-1#
Есть попадания, RACL работает. После проверки убираю RACL, чтобы он не мешал при проверке следующих ACL.
PACL
PACL применяется на интерфейсе 2 уровня, то есть на интерфейсе коммутатора. Имеются различия на разных платформах, но основные характеристики PACL:
- Обрабатывается аппаратно;
- Может использоваться только во входящем направлении;
- Может быть 2 видов: MAC PACL или IP PACL;
- На 1 интерфейсе можно использовать максимально 1 IP и 1 MAC PACL (совместно или по отдельности);
- Не фильтрует трафик 2 уровня CDP, VTP, DTP, UDLD и STP, потому что этот трафик обрабатывается до применения PACL.
Контролирует IP трафик (IP PACL) или non-IP трафик (MAC PACL).
IP PACL
Контролирует прохождение кадров на основе IP адреса в IP заголовке пакета. Полезная штука на мой взгляд.
Пример IP PACL
3550-1(config)# ip access-list extended IP_ACL 3550-1(config-ext-nacl)# permit ip host 192.168.64.1 any 3550-1(config-ext-nacl)# exit 3550-1(config)# interface fastEthernet 0/18 3550-1(config)# switchport - эту команду можно не вводить, подчеркнул что интерфейс 2 уровня 3550-1(config-if)# ip access-group IP_ACL in
Разрешил IP своего компьютера на порту, куда он подключен.
Проверяем:
3550-1# sh run | begin FastEthernet0/18 interface FastEthernet0/18 switchport mode access ip access-group IP_ACL in spanning-tree portfast spanning-tree bpduguard enable !
Меняю на компьютере IP адрес на 64.2, SSH подключения нет, IP PACL в действии. Возвращаю IP, подключение снова работает. Особенность: попадания кадров не отображаются при выводе show access-lists
. В консоль тоже ничего не выводится, скорее особенность именно моего оборудования. После проверки убираю IP PACL.
MAC PACL
Контролирует прохождение кадров на основании MAC-адреса. Не может контролировать IP или MPLS трафик и сообщения ARP. Используется только Расширенный Именованный список.
Если поискать в интернете, то все примеры сводятся к блокировке AppleTalk Address Resolution Protocol (AARP), пример нежизненный и смысловой нагрузки в нём мало.
Пример MAC PACL
Пробую следующее:
3550-1(config)# mac access-list extended MAC_ACL 3550-1(config-ext-macl)# deny any any 3550-1(config-ext-macl)# exit 3550-1(config)# interface fastEthernet 0/18 3550-1(config-if)# mac access-group MAC_ACL in
Запретил весь поддерживаемый PACL трафик 2 уровня.
Собственно для MAC PACL поддерживается не так уж много протоколов, поэтому наверное не такая уж полезная фича, опять же на мой взгляд:

Теперь проверка. Тут интересно. Очищаю ARP кэш на компьютере arp -d
. SSH не работает, пинг не проходит, в кэше ARP 192.168.64.251 нет. В чём дело? По идее компьютер должен отправить ARP запрос с адресом 192.168.64.251, получить MAC адрес 64.251, так как запросы ARP не блокируются MAC PACL и успешно установить SSH соединение, успешно пинговать 64.251, поскольку IP трафик, но этого не происходит.
Пробую по-другому: удаляю единственную ACE из ACL с тотальным запретом и добавляю:
3550-1(config-ext-macl)# permit any host FFFF.FFFF.FFFF
То есть разрешаю в явном виде только запросы ARP, остальное запрещено. Всё снова работает. Можно почистить каш ARP, работает. Теперь похоже на правду.
В теории ARP запросы не блокируется, но на практике вот иначе. Попробовал несколько раз, повторяемость результата присутствует. Может быть зависит от конкретного железа и версии IOS (платформа 3550?). Будет возможность, проверю на свежем железе.
Успешные попадания кадров не отображаются при выводе show access-lists
. После проверки убираю MAC PACL.
VACL
VACL также известные как VLAN Maps, применяются на VLANs, фильтруют все типы трафика, который перемещается внутри VLAN, маршрутизируется из/во VLAN. VACL не имеет направления, для задания направления указывается конкретный адрес источника или назначения. Для удобства можно считать что у каждого VACL есть сразу два направления (in+out).
Не имеет значения как трафик попадает во VLAN: через Access-порт, через Trunk-порт или через маршрутизируемый порт, VACL будет применён.
VACLs обрабатываются аппаратно, что является значительным преимуществом. VACL может осуществлять следующие действия:
forward
;drop [log]
;redirect
(только для коммутаторов Catalyst 6500).
Поэтому по сути только Разрешить или Запретить. Для отбрасываемых пакетов/кадров можно включить логирование.
3550-1(config-access-map)# action forward ? <cr> 3550-1(config-access-map)# action drop ? log Log dropped packets <cr>
Настройка VACL происходит в 4 этапа:
- Создание Стандартного или Расширенного IP ACL (или Расширенного Именованного MAC ACL);
- Создание записи Access Map (карты классов), куда добавлен ACL с помощью команды
match
и действие с помощью командыaction
; - Подобно ACL в конце карты классов есть неявная запись с запретом типа
deny all
. Поэтому или прописывать в ACL весь трафик в обе стороны, что сильно затруднительно по понятным причинам и его разрешать. Весь остальной трафик при этом заблочится. Или же вешать дополнительную записьaccess-map
в самом конце с безусловным разрешением всего трафика; - Задаётся целевая VLAN с помощью команды
vlan filter
с указанием имени карты классов.
Пример VACL с IP ACL
Запускаю пинг 192.168.64.253 и ввожу следующие команды, этапы выделяю цветом:
3550-1(config)# access-list 2 permit 192.168.64.1 3550-1(config)# vlan access-map VLAN1_MAP_IP 3550-1(config-access-map)# match ip address 2 3550-1(config-access-map)# action forward 3550-1(config-access-map)# exit 3550-1(config)# vlan filter VLAN1_MAP_IP vlan-list 1
Пинг прерывается. Почему так происходит? Сначала пинг идёт с IP адресом моего компьютера 64.1 в качестве источника, проходит через 64.251, VACL успешно проверяет пакеты и форвардит их, 64.253 получает пакеты и отвечает, но IP адрес источника становится уже 64.253, VACL пакеты блокирует. Пинга нет. Добавляю в ACL строчку:
3550-1(config)# access-list 2 permit 192.168.64.253
Пинг появляется. Убираю VACL.
Тут надо ещё отметить:
- В 1 этапе для списка доступа всегда используется
permit
, чтобы отобрать нужный трафик; - В 1 этапе может быть определено несколько списков доступа. Тогда во 2 этапе создаётся также несколько записей
access-map
, по одной записиaccess-map
на один список доступа. В этом случае после имени дляaccess-map
указывается число (10; 20; 30..), которое определяет порядок обработки этойaccess-map
по отношению к остальным. Похоже на вхождение ACE в ACL, роль ACE тут выполняетaccess-map
. А если запись одна, номер не нужен;
3550-1(config)# vlan access-map VLAN1_MAP_IP ?
<0-65535> Sequence to insert to/delete from existing vlan access-map entry
<cr>
- В 3 этапе целевая VLAN может быть: single VLAN (10), range of VLANs (10-20), list of multiple VLANs (1,3-5,7);
- Попробовал на EVE-NG, только у образов IOL (разумеется L2) есть такой функционал.
Пример VACL с MAC ACL
Пробую аналогично предыдущему примеру следующее:
3550-1(config)# mac access-list extended ALLOW_64.253 3550-1(config-ext-macl)# permit host 7085.C275.E38F host 000a.b8da.d140 3550-1(config-ext-macl)# permit host 000a.b8da.d140 host 7085.C275.E38F 3550-1(config-ext-macl)# permit any host FFFF.FFFF.FFFF 3550-1(config-ext-macl)# exit 3550-1(config)# vlan access-map VLAN1_MAP_MAC 3550-1(config-access-map)# match mac address ALLOW_64.253 3550-1(config-access-map)# action forward 3550-1(config-access-map)# exit 3550-1(config)# vlan filter VLAN1_MAP_MAC vlan-list 1
Где 000a.b8da.d140
MAC 64.253. Ну так с виду всё работает (CDP, STP), убираю:
3550-1(config-ext-macl)# permit any host FFFF.FFFF.FFFF
Ожидаемо отваливается SSH и пинг. Если отключить 1 из оставшихся правил, идёт перерасчёт STP, CDP в порядке. Ожидаемо.
Как я увидел, работа VACL с MAC ACL довольно-таки схожа с MAC PACL.
Для проверки VACL используются следующие команды:
3550-1# show vlan access-map Vlan access-map "VLAN1_MAP_IP" 10 Match clauses: ip address: 2 Action: forward
Показывает Что применяется и Как применяется.
3550-1# show vlan filter VLAN Map VLAN1_MAP_IP is filtering VLANs: 1
Показывает Где применяется.
Выводы
Обычно все эти 3 типа ACL применяются совместно. Обобщу, что удалось выяснить:
- RACL — ACL со стандартным применением и назначением. Поскольку сама CISCO рекомендует осуществлять маршрутизацию между VLANs силами коммутатора с поддержкой маршрутизации (даже 2960 может это делать, необязательно коммутатор 3 уровня), то схема RACL на SVI наверное самая подходящая для продакшена;
- IP PACL — аппаратный, будет полезным, если нужно ограничить конкретному компьютеру доступ куда-то внутри его VLAN. Если трафик идёт дальше, то проще воспользоваться ACL на интерфейсе 3 уровня;
- MAC PACL — непонятная довольно-таки вещь, по крайней мере на том оборудовании, что есть у меня. Кроме того количество фильтруемых протоколов ограничено;
- VACL — аппаратная штука для контроля трафика внутри VLAN. То есть может особенно пригодится когда трафик не ходит через интерфейсы 3 уровня.
В VACL может быть определено несколько списков доступа и несколько карт классов. Фильтр может быть добавлен одновременно для нескольких VLANs. Нужно применять очень аккуратно, иначе можно случайно заблокировать часть полезного трафика (или весь).
Что тут ещё? Есть Downloadable ACLs (dACLs), это разновидность PACL. Применяется на порту динамически, после удачной аутентификации доступа 802.1X и скачивается этот dACL с RADIUS сервера (например, ISE). Если на порту уже присутствует PACL, он будет перезаписан.
Это конечно же очень кратко, возможно есть неточности и как уже говорил, отличия на разных платформах коммутаторов.
Утилита для проверки списков доступа Cisco:
Гуд спс, посмотрю.