ACL: списки контроля доступа в Cisco IOS

Сегодня я расскажу вам о том, как отфильтровать трафик в сети с помощью списков контроля доступа. Рассмотрим как они работают соответственно, что собой представляют, для чего предназначены. Позже я покажу как они настраиваются в Cisco IOS и выложу архив с лабораторными работами для закрепления ваших знаний.

Введение


ACL (Access Control List) — это набор текстовых выражений, которые что-то разрешают, либо что-то запрещают. Обычно ACL разрешает или запрещает IP-пакеты, но помимо всего прочего он может заглядывать внутрь IP-пакета, просматривать тип пакета, TCP и UDP порты. Также ACL существует для различных сетевых протоколов (IP, IPX, AppleTalk и так далее). В основном применение списков доступа рассматривают с точки зрения пакетной фильтрации, то есть пакетная фильтрация необходима в тех ситуациях, когда у вас стоит оборудование на границе Интернет и вашей частной сети и нужно отфильтровать ненужный трафик.
Вы размещаете ACL на входящем направлении и блокируете избыточные виды трафика.

Теория


Функционал ACL состоит в классификации трафика, нужно его проверить сначала, а потом что-то с ним сделать в зависимости от того, куда ACL применяется. ACL применяется везде, например:
  • На интерфейсе: пакетная фильтрация
  • На линии Telnet: ограничения доступа к маршрутизатору
  • VPN: какой трафик нужно шифровать
  • QoS: какой трафик обрабатывать приоритетнее
  • NAT: какие адреса транслировать

Для применения ACL для всех этих компонентов нужно понять как они работают. И мы в первую очередь будем касаться пакетной фильтрации. Применительно к пакетной фильтрации, ACL размещаются на интерфейсах, сами они создаются независимо, а уже потом они прикручиваются к интерфейсу. Как только вы его прикрутили к интерфейсу маршрутизатор начинает просматривать трафик. Маршрутизатор рассматривает трафик как входящий и исходящий. Тот трафик, который входит в маршрутизатор называется входящим, тот который из него выходит — исходящий. Соответственно ACL размещаются на входящем или на исходящем направлении.
image
Из вашей частной сети приходит пакет на интерфейс маршрутизатора fa0/1, маршрутизатор проверяет есть ли ACL на интерфейсе или нет, если он есть, то дальше обработка ведется по правилам списка доступа строго в том порядке, в котором записаны выражения, если список доступа разрешает проходить пакету, то в данном случае маршрутизатор отправляет пакет провайдеру через интерфейс fa0/0, если список доступа не разрешает проходить пакету, пакет уничтожается. Если списка доступа нет — пакет пролетает без всяких ограничений. Перед тем как отправить пакет провайдеру, маршрутизатор ещё проверяет интерфейс fa0/0 на наличие исходящего ACL. Дело в том, что ACL может быть прикреплен на интерфейсе как входящий или исходящий. К примеру у нас есть ACL с правилом запретить всем узлам в Интернете посылать в нашу сеть пакеты.
Так на какой интерфейс прикрепить данную ACL? Если мы прикрепим ACL на интерфейс fa0/1 как исходящий, это будет не совсем верно, хотя и ACL работать будет. На маршрутизатор приходит эхо-запрос для какого-то узла в частной сети, он проверяет на интерфейсе fa0/0 есть ли ACL, его нет, дальше проверяет интерфейс fa0/1, на данном интерфейсе есть ACL, он настроен как исходящий, всё верно пакет не проникает в сеть, а уничтожается маршрутизатором. Но если мы прикрепим ACL за интерфейсом fa0/0 как входящий, то пакет будет уничтожатся сразу как пришел на маршрутизатор. Последнее решение является правильным, так как маршрутизатор меньше нагружает свои вычислительные ресурсы. Расширенные ACL нужно размещать как можно ближе к источнику, стандартные же как можно ближе к получателю. Это нужно для того, чтобы не гонять пакеты по всей сети зря.

Сам же ACL представляет собой набор текстовых выражений, в которых написано permit (разрешить) либо deny (запретить), и обработка ведется строго в том порядке в котором заданы выражения. Соответственно когда пакет попадает на интерфейс он проверяется на первое условие, если первое условие совпадает с пакетом, дальнейшая его обработка прекращается. Пакет либо перейдет дальше, либо уничтожится.
Ещё раз, если пакет совпал с условием, дальше он не обрабатывается. Если первое условие не совпало, идет обработка второго условия, если оно совпало, обработка прекращается, если нет, идет обработка третьего условия и так дальше пока не проверятся все условия, если никакое из условий не совпадает, пакет просто уничтожается. Помните, в каждом конце списка стоит неявный deny any (запретить весь трафик). Будьте очень внимательны с этими правилами, которые я выделил, потому что очень часто происходят ошибки при конфигурации.

ACL разделяются на два типа:
  • Стандартные (Standard): могут проверять только адреса источников
  • Расширенные (Extended): могут проверять адреса источников, а также адреса получателей, в случае IP ещё тип протокола и TCP/UDP порты

Обозначаются списки доступа либо номерами, либо символьными именами. ACL также используются для разных сетевых протоколов. Мы в свою очередь будем работать с IP. Обозначаются они следующим образом, нумерованные списки доступа:
  • Стандартные: от 1 до 99
  • Расширенные: от 100 до 199

Символьные ACL разделяются тоже на стандартные и расширенные. Расширенные напомню могут проверять гораздо больше, нежели стандартные, но и работают они медленнее, так как придется заглядывать внутрь пакета, в отличии от стандартных где мы смотрим только поле Source Address (Адрес отправителя). При создании ACL каждая запись списка доступа обозначается порядковым номером, по умолчанию в рамках десяти (10, 20, 30 и т.д). Благодаря чему, можно удалить конкретную запись и на её место вставить другую, но эта возможность появилась в Cisco IOS 12.3, до 12.3 приходилось ACL удалять, а потом создать заново полностью. Нельзя разместить более 1 списка доступа на интерфейс, на протокол, на направление. Объясняю: если у нас есть маршрутизатор и у него есть интерфейс, мы можем на входящее направление для IP-протокола разместить только один список доступа, например под номером 10. Ещё одно правило, касающееся самих маршрутизаторов, ACL не действует на трафик, сгенерированный самим маршрутизатором.
Для фильтрации адресов в ACL используется WildCard-маска. Это обратная маска. Берем шаблонное выражение: 255.255.255.255 и отнимаем от шаблона обычную маску.
255.255.255.255-255.255.255.0, у нас получается маска 0.0.0.255, что является обычной маски 255.255.255.0, только 0.0.0.255 является WildCard маской.

Виды ACL

Динамический (Dynamic ACL)

Позволяет сделать следующее, например у вас есть маршрутизатор, который подключен к какому-то серверу и нам нужно закрыть доступ к нему из внешнего мира, но в тоже время есть несколько человек, которые могут подключаться к серверу.
Мы настраиваем динамический список доступа, прикрепляем его на входящем направлении, а дальше людям, которым нужно подключиться, подключаться через Telnet к данному устройству, в результате динамический ACL открывает проход к серверу, и уже человек может зайти скажем через HTTP попасть на сервер. По умолчанию через 10 минут этот проход закрывается и пользователь вынужден ещё раз выполнить Telnet чтобы подключиться к устройству.

Рефлексивный (Reflexive ACL)

Здесь ситуация немножко отличается, когда узел в локальной сети отправляет TCP запрос в Интернет, у нас должен быть открытый проход, чтобы пришел TCP ответ для установки соединения. Если прохода не будет — мы не сможем установить соединение, и вот этим проходом могут воспользоваться злоумышленники, например проникнуть в сеть. Рефлексивные ACL работают таким образом, блокируется полностью доступ (deny any) но формируется ещё один специальный ACL, который может читать параметры пользовательских сессий, которые сгенерированны из локальной сети и для них открывать проход в deny any, в результате получается что из Интернета не смогут установить соединение. А на сессии сгенерированны из локальной сети будут приходить ответы.

Ограничение по времени (Time-based ACL)

Обычный ACL, но с ограничением по времени, вы можете ввести специальное расписание, которое активирует ту или иную запись списка доступа. И сделать такой фокус, например пишем список доступа, в котором запрещаем HTTP-доступ в течении рабочего дня и вешаем его на интерфейс маршрутизатора, то есть, сотрудники предприятия пришли на работу, им закрывается HTTP-доступ, рабочий день закончился, HTTP-доступ открывается,
пожалуйста, если хотите — сидите в Интернете.

Настройка


Сами ACL создаются отдельно, то есть это просто некий список, который создается в глобальном конфиге, потом он присваивается к интерфейсу и только тогда он и начинает работать. Необходимо помнить некоторые моменты, для того, чтобы правильно настроить списки доступа:
  • Обработка ведется строго в том порядке, в котором записаны условия
  • Если пакет совпал с условием, дальше он не обрабатывается
  • В конце каждого списка доступа стоит неявный deny any (запретить всё)
  • Расширенные ACL нужно размещать как можно ближе к источнику, стандартные же как можно ближе к получателю
  • Нельзя разместить более 1 списка доступа на интерфейс, на протокол, на направление
  • ACL не действует на трафик, сгенерированный самим маршрутизатором
  • Для фильтрации адресов используется WildCard маска


Стандартный список доступа

Router(config)#access-list <номер списка от 1 до 99> {permit | deny | remark} {address | any | host} [source-wildcard] [log]
  • permit: разрешить
  • deny: запретить
  • remark: комментарий о списке доступа
  • address: запрещаем или разрешаем сеть
  • any: разрешаем или запрещаем всё
  • host: разрешаем или запрещаем хосту
  • source-wildcard: WildCard маска сети
  • log: включаем логгирование пакеты проходящие через данную запись ACL

Расширенный список доступа

Router(config)#access-list <номер списка от 100 до 199> {permit | deny | remark} protocol source [source-wildcard] [operator operand] [port <порт или название протокола> [established]
  • protocol source: какой протокол будем разрешать или закрывать (ICMP, TCP, UDP, IP, OSPF и т.д)
  • deny: запретить
  • operator:
    A.B.C.D — адрес получателя
    any — любой конечный хост
    eq — только пакеты на этом порте
    gt — только пакеты с большим номером порта
    host — единственный конечный хост
    lt — только пакеты с более низким номером порта
    neq — только пакеты не на данном номере порта
    range — диапазон портов
  • port: номер порта (TCP или UDP), можно указать имя
  • established: разрешаем прохождение TCP-сегментов, которые являются частью уже созданной TCP-сессии

Прикрепляем к интерфейсу

Router(config-if)#ip access-group <номер списка или имя ACL> {in | out}
  • in: входящее направление
  • out: исходящее направление

Именованные списки доступа

Router(config)#ip access-list {standard | extended} {<номер ACL> | <имя ACL>}
Router(config-ext-nacl)# {default | deny | exit | no | permit | remark}
  • standard: стандартный ACL
  • extended: расширенный ACL
  • default: установить команду в значение по умолчанию

Ограничение доступа к маршрутизатору

R(config)#line vty 0 4 — переходим в режим настройки виртуальных линий.
R(config-line)#password <пароль>
R(config-line)#login
R(config-line)#access-class 21 in
— настраиваем логин и пароль, а также закрепляем список доступа с разрешенными IP-адресами.

Динамические списки доступа



R3(config)#username Student password 0 cisco — создаем пользователей для подключения через Telnet.
R3(config)#access-list 101 permit tcp any host 10.2.2.2 eq telnet
R3(config)#access-list 101 dynamic testlist timeout 15 permit ip 192.168.10.0 0.0.0.255 192.168.30.0 0.0.0.255 — разрешаем подключаться к серверу по Telnet всем узлам.
R3(config)#interface serial 0/0/1
R3(config-if)#ip access-group 101 in
— закрепляем 101 ACL за интерфейсом в входящем направлении.
R3(config)#line vty 0 4
R3(config-line)#login local
R3(config-line)#autocommand access-enable host timeout 5
— как только пользователь аутентифицируеться, сеть 192.168.30.0 будет доступна, через 5 минут бездействия сеанс закроется.

Рефлексивные списки доступа


R2(config)#ip access-list extended OUTBOUNDFILTERS
R2(config-ext-nacl)#permit tcp 192.168.0.0 0.0.255.255 any reflect TCPTRAFFIC
R2(config-ext-nacl)#permit icmp 192.168.0.0 0.0.255.255 any reflect ICMPTRAFFIC
— заставляем маршрутизатор отслеживать трафик, который инициировался изнутри.
R2(config)#ip access-list extended INBOUNDFILTERS
R2(config-ext-nacl)#evaluate TCPTRAFFIC
R2(config-ext-nacl)#evaluate ICMPTRAFFIC
— создаем входящую политику, которая требует, чтобы маршрутизатор проверял входящий трафик, чтобы видеть инициировался ли изнутри и связываем TCPTRAFFIC к INBOUNDFILTERS.
R2(config)#interface serial 0/1/0
R2(config-if)#ip access-group INBOUNDFILTERS in
R2(config-if)#ip access-group OUTBOUNDFILTERS out
— применяем входящий и исходящий ACL на интерфейс.

Ограничение по времени



R1(config)#time-range EVERYOTHERDAY
R1(config-time-range)#periodic Monday Wednesday Friday 8:00 to 17:00
— создаем список времени, в котором добавляем дни недели и время.
R1(config)#access-list 101 permit tcp 192.168.10.0 0.0.0.255 any eq telnet time-range EVERYOTHERDAY — применяем time-range к ACL.
R1(config)#interface s0/0/0
R1(config-if)#ip access-group 101 out
— закрепляем ACL за интерфейсом.

Поиск проблем

R#show access-lists {ACL номер | имя} — смотрим информацию о списке доступа.
R#show access-lists — смотрим все списки доступа на маршрутизаторе.

Пример

Router#show access-lists
Extended IP access list nick
permit ip host 172.168.1.1 host 10.0.0.5
deny ip any any (16 match(es))
Standard IP access list nick5
permit 172.16.0.0 0.0.255.255


Мы видим что у нас есть два ACL (стандартный и расширенный) под названиями nick и nick5. Первый список разрешает хосту 172.16.1.1 обращаться по IP (это значит что разрешены все протоколы работающие поверх IP) к хосту 10.0.0.5. Весь остальной трафик запрещен показывает команда deny ip any any. Рядом с этим условием в нашем примере пишет (16 match(es)). Это показывает что 16 пакетов попали под это условие.
Второй ACL разрешает проходить трафик от любого источника в сети 172.16.0.0/16.

Практика

Я собрал лабораторные работы для Packet Tracer с 5 главы курса CCNA 4 по теме ACL. Если у вас есть желание закрепить знания на практике, пожалуйста — ссылка, зеркало — FTP. Размер — 865.14 KB.

Литература

CCNA Exploration: Accessing the WAN (5 chapter)
Поделиться публикацией

Похожие публикации

Комментарии 35

    +2
    Хорошо изложили материал, и довольно обьемно.
      +2
      Я бы порекомендовал приводить не только команды для ввода правил ACL, но и полученные в результате списки (т.е. результат show access-lists). Читается лучше.
        +3
        Спасибо за совет, обновил статью.
        +3
        Добро пожаловать на Хабр!

        Приятно, что в таком достаточно юном возрасте люди увлекаются Циско и, как видно со скриншотов, проходят курс CCNA :-)

        Желаю удачи и дальнейших успехов в учебе и карьере!
          +3
          Спасибо большое! Буду и дальше стараться писать интересные статьи :)
          +2
          В очередной раз расстраиваюсь что хорошая специализированная статья получает так мало голосов =( Обидно.
          На счет рефлексивных ACL, у циски есть еще немного похожее средство — ip inspect. Позволяет вешать только один ACL, допустим на IN. После прохождения пакета, инспект открывает входную «дырку» для него и ожидает получения ответа.
            +6
            Ничего страшного, блог Cisco — это вообще от своих, для своих, про свое :-) Зато минусов такие статьи почти не получают.
              +3
              Да, точно ))) Скажем так — для тех, кто в теме =))
            +3
            Да и еще стоит упомянуть, что wildcard — это не просто маска подсети задом на перед) Она дает удивительные возможности в плане выборки адресов =) Что-то вроде — каждый десятый IP из всех четных подсетей =)
              +2
              Это discontinuous subnet mask — вроде ж, отменили их поддержку, разве нет?
                +2
                Это видимо несколько иное.
                Про wildcard mask вот неплохая статья — www.telecombook.ru/index.php/cisco/5-ciscodirectory/4-wildcard-mask
                  +1
                  Не-не, я знаю про wildcard :-) Я только никогда не понимал, зачем они нужны. Вроде бы ж поддержки discontinuous subnet mask, а следовательно и аналогичных wildcard bits, больше нет.

                  Кстати, небезызвестный Jeremy Cioara тоже как-то в своем курсе говорил, что он не понимает, зачем нужны wildcard bits :-)
                    +2
                    можно очень хитро группировать строчки в ацл, что маска не позволит
                      +2
                      А можно пример?
                        +2
                        можно. подсети
                        10.0.0.0/24
                        10.0.0.0/24
                          +2
                          сорри, отправился.
                          10.0.0.0/24
                          10.0.1.0/24
                          10.1.0.0/24
                          10.1.1.0/24

                          группируется в 10.0.0.0 0.1.1.255

                          с маской без захвата соседних не получится
              +2
              1) неявный deny ip any any лучше делать явным и дополнять в конце log
              т.е — порой сильно упрощает траблшутинг
              2) подробнее написать о редактировании ACL, если строчки в нем не нумерованы(блокнот в помощь) или нумерованы (например не стоит принудительно заполнять строчки подряд 1, 2, 3, 4...)
              3) Про обратную маску не стоит писать что это просто инверсия к обычной, это гораздо более мощный инструмент и может сработать неожиданно для тех кто это не понимает. Например, можем разрешить только четные IP. Или «сгруппировать» хосты в разных подсетях
                +2
                1-е только на время, т.к. приводит к процесс-свитчингу этих пакетов
                2-3 согласен
                  +2
                  хм…
                  Т.е. явно заданный
                  deny ip any any
                  всегда приводит к процесс свитчингу?
                  Я правильно понял?
                    +2
                    Нет, что Вы. дело в слове log
                      +2
                      Ясно, спасибо за пояснения.
                +4
                ACL необходимо размещать как можно ближе к источнику

                Не совсем так. Расширенные ACL необходимо размещать как можно ближе к источнику, а стандартные — как можно ближе к назначению.
                  +1
                  Да, вы правы.
                  +3
                  ACL не действует на трафик, сгенерированный самим маршрутизатором
                    +3
                    В NAT'е очень даже хорошо действуют :)
                    А аксесс-листы на интерфейсе таки да.
                    +2
                    Отличное изложение!

                    Если хорошо владете предметом было бы интересно увидеть в вашем изложении описание VACL — Vlan ACL, а также их отличия от PACL и RACL.
                      +2
                      К сожалению, не знаю данной темы, возможно в будущем напишу.
                      Сейчас планирую написать что-то из курса CCNP. Там намного всё сложнее, а свой топик помогает лучше понять материал :)
                        +1
                        в текущем сснп все почти так же просто, сложности начнутся дальше :)
                      –1
                      Если вам просто дается материал CCNP — я за вас только рад!
                      Мне он в отличие от CCNA идет в разы сложнее, приходится ещё читать литературу чтобы понимать хоть что-то. Это правда касается не всех тем, но многих.

                      Сложности начнутся дальше
                      Рассказывайте :)
                        +1
                        это гнутие пальцев, это просто опыт инструктора, на глазах которого поменяли трек ССНП, оставив в нем самые простые и понятные вещи. В том смысле, что не ждите сверхсложностей от него, треки по IP или по SP в разы сложнее и объемнее
                          +1
                          сорри, это не гнутие пальцев
                        0
                        Я, честно говоря, плохо понимаю смысл таких статей и их (статей) целевую аудиторию. Это люди с ограниченными возможностями имеющие сложности с набором в google словосочетания cisco acl?
                        Предмет раскрыт где только можно и всеми возможными способами. К чему выкладывать скриншоты с официальных курикулимов в обрамлении переведенного (скопипасченого) текста?
                          +1
                          Я попытался очень понятным языком объяснить данную тему. Чтобы люди, которые хотят разбираться в ACL или потом будут работать с ACL открыли эту статью, прочитали теорию, посмотрели команды и собственно настроили в своей сети фильтрацию трафика. Я уверен что эта статья пригодится кому-то.
                            0
                            А может им лучше открыть тот материал, из которого вы просто скопировали это вместе со скриншотами? :) Кстати, как к этому относится сама Cisco? :)
                              0
                              Скриншоты видов списков доступа взяты из официальной литературы CCNA Exploration: Accessing the WAN. В пятой главе описываются списки доступа, я написал в конце самой статьи об этом. Первый скриншот нарисован мною в GIMP'e. Что касается копирования, эта статья была опубликована на других ресурсах после того как я опубликовал её на хабре, можете проверить.

                        Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                        Самое читаемое