Что такое ACL и как его настраивать

В этой статье речь пойдёт об списках аксес листах (списки листов доступа, ACL, NACL, access lists, access control list — все эти слова — синонимы, пусть вас не пугает их разнообразие). Далее в статье, для краткости я буду пользоваться термином ACL.

В этой статье мы поговорим об общих принципах создания ACL, о применении ACL на интерфейсах, о правилах просмотра ACL. Конкретно же о создании самих ACL рассказывается в статьях «Создание стандартного ACL», и «Создание расширенного ACL». В любом случае, рекомендую начать изучение с этой статьи, чтобы было понятно, о чём вообще идёт речь.

Итак, ACL (access control list) — это строго говоря, механизм для выбора из всего потока трафика какой-то части, по заданным критериям. Например, через маршрутизатор проходит множество пакетов, и вот такой ACL выбирает из множества только те пакеты, которые идут из подсети 192.168.1.0/24:

access-list 1 permit 192.168.1.0

Что дальше делать с этим трафиком — пока неизвестно. Например, трафик, попавший под ACL может заворачиваться в VPN тоннель, или, подвергаться трансляции адресов (NAT). В курсе CCNA рассматривается два способа использования ACL: основной — это фильтрация трафика, второй — использование ACL при настройке NAT. Важно следующее: не имеет значения, где и для каких целей мы будем использовать ACL, правила написания ACL от этого не меняются. Кроме того, если мы только создали ACL, то он пока ни на что не влияет. ACL — это просто несколько неработающих строчек в конфиге, пока мы его не применим, например, на интерфейс, для фильтрации трафика.

Типы ACL

ACL-и бывают двух видов: стандартные и расширенные. Стандартные позволяют отфильтровывать трафик только по одному критерию: адрес отправителя, в CCNA рассматривается конкретно только ip адрес отправителя. Согласитесь, сильно много не нафильтруешь по такому признаку. Можно, например, поставить на выходе из нашей сети такой ACL:

access-list 1 permit host 192.168.10.50
access-list 1 permit host 192.168.10.53
access-list 1 permit host 192.168.10.60

Этот ACL будет разрешать выход в интернет только с перечисленных в нём трёх ip адресов (для такой задачи, как вы видите, нам хватило стандартного ACL).

Расширенный ACL позволяет фильтровать трафик по большому количеству параметров:

  1. Адрес отправителя
  2. Адрес получателя
  3. TCP/UDP порт отправителя
  4. TCP/UDP порт получателя
  5. Протоколу, завёрнутому в ip (отфильтровать только tcp, только udp, только icmp, только gre и т.п.)
  6. Типу трафика для данного протокола (например, для icmp отфильтровать только icmp-reply).
  7. Отделить TCP трафик, идущий в рамках установленной TCP сессии от TCP сегментов, которые только устанавливают соединение. Подробнее об этом можно прочитать в статье «Что делает established в ACL»
  8. И др.

Возможности расширенных ACL богаче стандартных, кроме того, они могут расширяться дополнительными технологиями:

  • Dynamic ACL — ACL, в котором некоторые строчки до поры до времени не работают, но когда администратор подключается к маршрутизатору по telnet-у, эти строчки включаются, то есть администратор может оставить для себя «дыру» в безопасности для отладки или выхода в сеть.
  • Reflexive ACL — зеркальные списки контроля доступа, позволяют запоминать, кто обращался из нашей сети наружу (с каких адресов, с каких портов, на какие адреса, на какие порты) и автоматически формировать зеркальный ACL, который будет пропускать обратный трафик извне вовнутрь только в том случае, если изнутри было обращение к данному ресурсу. Подробнее об этом можно прочесть в статье «Reflexive ACL — настройка и пример работы зеркальных списков контроля доступа»
  • TimeBased ACL, как видно из названия, это ACL, у которых некоторые строчки срабатывают только в какое-то время. Например, с помощью таких ACL легко настроить, чтобы в офисе доступ в интернет был только в рабочее время.

Все ACL (и стандартные, и расширенные) можно задавать по разному: именованным и нумерованным способом. Первый предпочтительнее, так как позволяет затем редактировать ACL, в случае же использования нумерованного способа, ACL можно только удалить целиком и заново создать, либо дописать очередную строчку в конец.

Порядок просмотра ACL

Итак, что из себя представляет ACL и как трафик проверяется на соответствтие?

ACL — это набор правил. Каждое правило состоит из действия (permit, deny) и критерия (для стандартных ACL — ip адрес отправителя, для расширенных — множество критериев). Рассмотрим такой пример стандартного нумерованного ACL:

access-list 1 permit host 192.168.1.1
access-list 1 deny 192.168.1.0
access-list 1 permit any

Этот ACL запрещает доступ для всей сети 192.168.1.0/24 кроме хоста 192.168.1.1 и разрешает доступ для всех остальных сетей. Как проверяется трафик на соответствие ACL? Построчно. То есть, приходит, например, пакет с адреса 192.168.2.2 на роутер, а на том интерфейсе через который он пришел стоит на вход указанный выше ACL, вот построчно Ip адрес отправителя сверяется с данным ACL, что важно — до первого совпадения. Как только пакет совпадёт с какой-то из строк, сработает действие (permit — пропустить пакет либо deny — уничтожить пакет) и дальше никаких проверок по оставшимся строчкам проводиться не будет. Если все строчки пройдены, а пакет так и не попал ни под одно из правил, то он по умолчанию уничтожается. В нашем случае, в примере выше любой пакет подходит под третью строчку, так как там вместо адреса стоит слово «any», означающее, что любой адрес подойдёт. Таким образом, приведённый ACL можно читать так:

  • Если пакет пришёл с адреса 192.168.1.1, то его надо сразу же пропустить и не делать больше никаких проверок в этом ACL;
  • В противном случае, если пакет пришел из сети 192.168.1.0 (кроме адреса 192.168.1.1, с которым мы уже разобрались строчкой выше), то пакет надо уничтожить и опять же, на этом закончить просмотр ACL, не переходить к следующему шагу;
  • Если пакет не попал под первые два правила. То есть он не с адреса 192.168.1.1, да и вообще, не из сети 192.168.1.0, то он всегда попадает под правило permit any, то есть, пакет надо пропустить дальше — пусть идёт.

Очень важно понимать приведённый выше порядок просмотра строк в ACL, он един для всех типов ACL (не только для стандартного). Кроме того, из этого порядка следует очевидное правило: «В ACL-е должны идти наиболее специфичные, узкие, точные строчки вначале и наиболее абстрактные, общие — в конце». Подумайте сами, если бы предыдущий пример был бы отсортирован в обратном порядке:

access-list 1 permit any
access-list 1 deny 192.168.1.0
access-list 1 permit host 192.168.1.1

То по нашему же предыдущему алгоритму, обходился бы он так:

  • Проверяем первую строчку, если пакет из любой сети (any) то его надо пропустить и просмотр дальше прекратить.

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

Применение ACL

ACL применяется для разных целей, но основная цель, для которой он используется в CCNA — фильтрация трафика на интерфейсе. Для этого надо сначала создать стандартный или расширенный ACL. Если ACL именованный, то у него есть имя, которое мы и укажем на интерфейсе, если нумерованный — то номер. Чтобы сделать это, заходим на интерфейс и пишем команду ip access-group, например, так:

R1#
R1#configure terminal
Enter configuration commands, one per line.  End with CNTL/Z.
R1(config)#interface FastEthernet0/0
R1(config-if)#ip access-group MY_ACLS_NAME in

В этом примере мы применили ACL с именем MY_ACLS_NAME наинтерфейсе Fa0/0 на весь входящий трафик (о чем говорит слово in) если бы мы неписали out — то фильтровался бы исходящий трафик.

Люди часто путаются с направлениями. Например, есть сеть, подключенная к маршрутизатору и стоит задача запретить входящий в эту сеть трафик. Так вот, в данном случае этот входящий трафик фильтруется применением ACL на out, то есть на выход. Всё просто, чтобы не запутаться, надо представить себя на месте маршрутизатора. Понятно, что если трафик входит в какую-то сеть, то он при том выходит из маршрутизатора и с точки зрения роутера, такой трафик исходящий.

Вообще, на один интерфейс можно навесить более одного ACL, но при условии, что у них будет отличаться направление, либо, протокол (есть ведь ещё IPX ACL AppleTalk ACL). Впрочем, для CCNA это не имеет значения, так как в нём речь идёт только об IP ACL. Таким образом, если ограничиваться только IP, то на каждый интерфейс можно навесить не более двух ACL: один на in, второй — на out.

Где лучше применять ACL? Вопрос, на самом деле, не тривиальный и студенты без должного опыта часто дают на него неправильный ответ. Рассмотрим пример: Дана топология, надо запретить доступ с компьютера в сеть ноутбука двумя способами по очереди (сначала с помощью стандартного, затем с помощью расширенного ACL).

Пример топологии для применения ACL

Подумайте над этим немного. Здравый смысл и рекомендация от cisco подталкивают нас к следующему правилу: «Стандартный ACL приходится размещать максимально близко к получателю трафика». Действительно, ведь с помощью стандартного ACL мы можем смотреть только на адрес отправителя и не знаем, куда именно этот трафик идёт. Поэтом, если мы разместим запрещающий доступ с Ip адреса компьютера список, например, на R1 на вход на Fa0/0, то мы сможем запретить или разрешить только весь трафик с компьютера сразу, то есть во все сети, а не только в сеть ноутбука. Поэтому, придётся ставить такой ACL максимально близко к получателю трафика, а именно, на R4 на выход из интерфейса Fa0/1. Если пакет дошел до сюда и собирается выйти через Fa0/1, значит он точно собирается в сеть ноутбука. Теперь с помощью стандартного ACL мы можем отсечь трафик, идущий от компьютера.

Если мы хотим использовать расширенный ACL, то мы, в принципе, можем его поставить где угодно, но разумнее всего его ставить максимально близко к отправителю трафика, то есть, в нашем примере, на Fa0/0 на R1 на вход. Действительно, если мы можем смотреть в расширенном ACL-е адрес получателя, то давайте сделаем это максимально быстро и если пакет идёт из компьютера в сеть ноутбука, то уничтожим его сразу же на входе в Fa0/0, чтобы дальше не нагружать сеть передачей этого пакета.

Таким образом, у нас есть небольшое правило, которое может упростить жизнь: «Стандартный ACL ставится максимально близко к получателю трафика, расширенный — максимально близко к источнику трафика». Правило не всегда супер эффективно, иногда надо и голову включать, но для начала оно неплохо работает. Лучше всего выбирать место изначально по этому правилу, а затем подумать над тем, откуда трафик идёт и как можно улучшить размещение ACL.

ACL можно применять не только для фильтрации трафика, но и для ограничения адресов, с которых можно подключиться к роутеру по telnet или ssh. Эта полезная функция описывается в отдельной статье «Ограничение доступа к маршрутизатору по telnet или ssh с помощью ACL»

Тэги: 

Комментарии

Интересно, какой командой можно определить интерфейс, к которому привязан Access-List ?
Перебирать все интерфейсы командой sh run int interface_name тяжеловато. )

sh run | in access-group
sh run | in access-class

Аватар пользователя bacek
include не поможет - он выведет просто строчку Ip access-group QWE in и не понятно на каком интерфейсе она. section должен помось по идее. sh run | sec QWE (QWE - имя ACL)

Утилита для проверки строк ACL на срабатывание по заданному условию:
https://www.youtube.com/watch?v=e31Uz46AKn0

Аватар пользователя bacek
Спасибо. Новичкам пригодится.

если бы мы неписали out — то фильтровался бы исходящий трафик.
очепятка "написали out"

ip access-list extended Lnew

permit tcp any any established
permit udp host 4.4.4.100 eq 53 any
permit udp host 4.4.4.1 eq 123 any
permit tcp any host 4.4.4.100 eq 80
permit tcp any host 4.4.4.100 eq 443
permit tcp any host 4.4.4.100 eq 2222

permit udp host 5.5.5.100 host 4.4.4.100 eq 500
permit esp any any
permit icmp any any

int gi 1
ip access-group Lnew in

Добавить комментарий