Настройка оборудования Cisco. ACL.
Access Control List
В этот раз мы изучим следующие моменты:
1. Учимся настраивать различные списки контроля доступа (Access Control List).
2. Пытаемся понять разницу между ограничением входящего и исходящего трафика.
Для самоуспокоения скажу, что список доступа - вещь не особенно сложная и нам с вами в ней под силу разобраться. Легче стало? Едем дальше. Предназначены эти списки для нескольких очевидных вещей. Первое и самое логичное - ограничение доступа, запрет каких-либо действий для обеспечения безопасности. Даже инструменты в синтаксисе имеют говорящие имена - permit и deny. Фактически же ACL - это в умелых руках очень крутой инструмент фильтрации. С его помощью можно определить, на кого будут навешиваться определенные политики, кому разрешить участие в одних процессах и запретить в других, кому в конце концов скорость ограничить. Применений уйма.
Что уж там, давайте на примере. Опираясь на списки доступа работает Policy-Based Routing (PBR). Можно сделать так, что пакетики приходящие из сети 192.168.1.0/24 имели в качестве next-hop шлюз 10.0.1.1, а из 192.168.2.0/24 уже на 10.0.2.1. Как мы помним, обычная маршрутизация смотрит в пакете на его destination address, и исходя из него выбирает следующий хоп.
Виды ACL
Вообще говоря существует несколько видов списков доступа:
• Стандартные
• Расширенные
• Динамические
• Рефлексивные
• Повременные
Мы то с вами не гордые, и познакомимся пока с первыми двумя видами, а так конечно милости просим на сайт циски, проникаться.
Входящий и исходящий трафик
Входящий трафик — этот тот, который приходит на интерфейс извне.
Исходящий — тот, который отправляется с интерфейса вовне.
Список доступа можно применять на входящий трафик, тогда не прошедшие фейс-контроль пакеты будут дропаться, не попав в маршрутизатор и далее вашу сеть. В случае с ACL на исходящий трафик пакеты будут попадать на маршрутизатор, и далее в соответствии с правилом дропаться уже на целевом интерфейса.
Так в чем разница между стандартным и расширенным списком доступа?
Стандартный список доступа проверяет только адрес отправителя.
Расширенный - оперирует адресом отправителя, адресом получателя и портом.
Логично, что стандартные ACL следует ставить ближе к получателю, чтобы не "зарезать" больше, чем нужно. А вот расширенные - ближе к отправителю для возможности дропнуть нежелательный трафик как можно раньше.
Практика
Да, вот так сразу, чего лясы точить?
1. Доступ на WEB-сервер.
Задача. Разрешить доступ всем по порту TCP 80 (протокол HTTP). Для того устройства, с которого будет производиться управление (у нас же есть админ) нужно открыть telnet и ftp, но ему мы дадим полный доступ. Всем остальным отбой.
В данном случае будет работать политика "запрещено всё, что не разрешено". Потребуется открыть кое-что, а остальное позакрывать.
Сетка серверов у нас находится во VLAN 3, значит и лист будем вешать на соответствующий сабинтерфейс FE0/0.3. Только куда вешать правила - на in или на out? Мы не хотим пускать пакеты в сторону серверов, которые уже оказались на маршрутизаторе, логично? А значит трафик это исходящий, следовательно и адреса назначения (destination) будут расположены в сети серверов (там уже выберем конкретный сервер, на который пойдет трафик), а уже адреса источников (source) будут любыми - наши локальные или из внешней сети.
Да, список мы будем делать расширенный (extended), ведь фильтрация будет в т.ч. по адресу назначения (к примеру, правила для WEB-сервера и почтового будут разные).
Проверка правил проводится по списку сверху вниз до первого совпадения. При первом совпадении (permit это правило или deny - неважно) проверка заканчивается и трафик обрабатывается в соответствии со сработавшим правилом.
То есть первые правила должны разрешать нужное нам и лишь в конце скажем веское deny ip any any, чтобы прикрыть всё остальное.
Any — это специальное слово, которое означает адрес сети и обратную маску 0.0.0.0 0.0.0.0 и означает, что под правило подпадают абсолютно все узлы из любых сетей.
А слово host, наоборот, означает маску 255.255.255.255 — то есть именно один единственный указанный адрес.
Поехали писать правило. Первым будет разрешение для всех ходить на порт 80:
msk-arbat-gw1(config)# ip access-list extended Servers-out
msk-arbat-gw1(config-ext-nacl)# remark WEB
msk-arbat-gw1(config-ext-nacl)# permit tcp any host 172.16.0.2 eq 80
Тем самым мы разрешим (permit) TCP-трафик от любого узла (any) на хост (host — именно один адрес) 172.16.0.2, адресованный на 80-й порт.
Вешаем этот список доступа на интерфейс FE0/0.3:
msk-arbat-gw1(config)# int fa0/0.3
msk-arbat-gw1(config-subif)# ip access-group Servers-out out
Проверяем с любого нашего ПК:
Замечательно, страничка у нас открылась. А пинги будут ходить?
В чем дело? Просто после всех правил в ACL-ках циски дописывается deny ip any any (implicit deny). По факту это означает, что пакет не ответивший ни одному правилу в аксес-листе отбрасывается на мороз, попадая под implicit deny.
Ах да, теперь нужно дать полный доступ к серваку с админского ПК 172.16.6.66 из сети Other. Каждое новое правило автоматом добавляется в конец списка, если он у вас уже создан.
msk-arbat-gw1(config)# ip access-list extended Servers-out
msk-arbat-gw1(config-ext-nacl)# permit tcp host 172.16.6.66 host 172.16.0.2 range 20 ftp
msk-arbat-gw1(config-ext-nacl)# permit tcp host 172.16.6.66 host 172.16.0.2 eq telnet
Проверим, работает ли у нас, например, фтп.
Маршрутизатор проверил, что мы подходим под висящий на FE0/0.3 список доступа, и пропускает нас.
Пробуем с какого-нибудь "левого" узла.
Под правило данный пакетик и посылает на deny ip any any.
2. Доступ на файловый сервер
Кому сюда вообще давать доступ? Очевидно, что жителям сети 172.16.0.0/16! Для работы с общими папками уже давно придуман протокол SMB, работающий по порту TCP 445. Для железок постарше есть NetBios, очень жадный до портов товарищ, которому их нужно аж три - UDP 137 и 138, а также TCP 139. Поболтаем с нашим админом и сойдемся на 445-ом порту. Ах да, еще не забудем про 20 и 21 порты для FTP, к которым надо бы дать доступ не только с локалки, но и извне.
msk-arbat-gw1(config)# ip access-list extended Servers-out
msk-arbat-gw1(config-ext-nacl)# permit tcp 172.16.0.0 0.0.255.255 host 172.16.0.3 eq 445
msk-arbat-gw1(config-ext-nacl)# permit tcp any host 172.16.0.3 range 20 21
Конструкции вида range 20 21 применяются для задания одной строкой правил для нескольких портов. Для FTP недостаточно 21-го порта, у вас тогда будет проходить только авторизация, а вот передача файлов - нет.
0.0.255.255 — особая обратная маска (wildcard mask). Про них чуть позже.
3. Доступ на почтовый сервер
Фича, для широко распространенных протоколов можно указывать не номера портов, а их имена:
msk-arbat-gw1(config)# ip access-list extended Servers-out
msk-arbat-gw1(config-ext-nacl)#permit tcp any host 172.16.0.4 eq pop3
msk-arbat-gw1(config-ext-nacl)#permit tcp any host 172.16.0.4 eq smtp
4. DNS-сервер
msk-arbat-gw1(config)# ip access-list extended Servers-out
msk-arbat-gw1(config-ext-nacl)# permit udp 172.16.0.0 0.0.255.255 host 172.16.0.5 eq 53
5. ICMP
Досадно, что у нас возникла неприятная ситуация с пингом? Вылечим это, но попробуем одну фишку, чтобы поместить это правило в начало списка.
Скопируем ACL прямо из конфига циски и с помощью текстового редактора добавим туда следующее:
no ip access-list extended Servers-out
ip access-list extended Servers-out
permit icmp any any
remark WEB
permit tcp any host 172.16.0.2 eq www
permit tcp host 172.16.6.66 host 172.16.0.2 range 20 ftp
permit tcp host 172.16.6.66 host 172.16.0.2 eq telnet
remark FILE
permit tcp 172.16.0.0 0.0.255.255 host 172.16.0.3 eq 445
permit tcp any host 172.16.0.3 range 20 21
remark MAIL
permit tcp any host 172.16.0.4 eq pop3
permit tcp any host 172.16.0.4 eq smtp
remark DNS
permit udp 172.16.0.0 0.0.255.255 host 172.16.0.5 eq 53
Первая строка сносит начисто созданный нами список, далее он создается заново, но уже в нужном нам порядке. Третья строчка в приведенном коде разрешает ICMP запросы между всеми хостами в сети. Копируем всё в консоль, каждая строчка интерпретируется в качестве отдельной команды.
Проверяем пинги.
Ну просто замечательно.
Внимание! Не злоупотребляйте данным лайфхаком, иначе можно устроить апокалипсис в отдельно взятой сети. Еще и потерять доступ к удаленному маршрутизатору, что вообще смерти подобно.
Для добавления правила в начало или другое нужно место в ACL существует простой прием:
ip access-list extended Servers-out
1 permit icmp any any
Ставя перед permit/deny число вы отправите правило на соответствующее место в списке.
В случае необходимости всегда можно провести нумерацию правил заново с помощью такой команды:
ip access-list resequence Servers-out 10 10
В нашем примере первое правило имеет порядковый номер 10, а шаг между правилами также составляет 10.
Итоговый вид Access-листа для серверной сети:
ip access-list extended Servers-out
permit icmp any any
remark WEB
permit tcp any host 172.16.0.2 eq www
permit tcp host 172.16.6.66 host 172.16.0.2 range 20 ftp
permit tcp host 172.16.6.66 host 172.16.0.2 eq telnet
remark FILE
permit tcp 172.16.0.0 0.0.255.255 host 172.16.0.3 eq 445
permit tcp any host 172.16.0.3 range 20 21
remark MAIL
permit tcp any host 172.16.0.4 eq pop3
permit tcp any host 172.16.0.4 eq smtp
remark DNS
permit udp 172.16.0.0 0.0.255.255 host 172.16.0.5 eq 53
6. Права пользователей из сети Other
Все предыдущие правила строили козни, не пуская кого-то куда-то, соответственно, мы обращали внимание на адрес назначения (source address), вешая список доступа на исходящий с интерфейса трафик. Теперь будем не выпускать, ограничивая трафик из сети Other.
msk-arbat-gw1(config)# ip access-list extended Other-in
msk-arbat-gw1(config-ext-nacl)# remark IAM
msk-arbat-gw1(config-ext-nacl)# permit ip host 172.16.6.61 any
msk-arbat-gw1(config-ext-nacl)# remark ADMIN
msk-arbat-gw1(config-ext-nacl)# permit ip host 172.16.6.66 any
В данном случае вариант запретить всем, а потом уже раздавать разрешения не прокатит, т.к. всё попадет под deny ip any any, невзирая на наши permit.
Вешаем список на интерфейс.
msk-arbat-gw1(config)#int fa0/0.104
msk-arbat-gw1(config-subif)#ip access-group Other-in in
Таким образом пакеты с source address 172.16.6.61 или 172.16.6.66 могут лететь куда угодно.
Расширенный список доступа мы применили для разграничения, т.к. админу нужен доступ везде, а вот "гостю" разве что в интернеты.
7. Сеть управления
Настраиваем таким макаром:
msk-arbat-gw1(config)# ip access-list extended Management-out
msk-arbat-gw1(config-ext-nacl)# remark IAM
msk-arbat-gw1(config-ext-nacl)# permit ip host 172.16.6.61 172.16.1.0 0.0.0.255
msk-arbat-gw1(config-ext-nacl)# remark ADMIN
msk-arbat-gw1(config-ext-nacl)# permit ip host 172.16.6.66 172.16.1.0 0.0.0.255
И вешаем на Out интерфейса FE0/0.2:
msk-arbat-gw1(config)# int fa0/0.2
msk-arbat-gw1(config-subif)#ip access-group Management-out out
Маска и обратная маска
Там выше вы видели стрёмную маску вида 0.0.255.255 - так называемую обратную маску, использующуюся для определения хостов, попадающих под правило.
Но чтобы разобраться с обратной надо сначала понять обычную маску?
Возьмем пример.
Перед нами самая обычная сеть из 256 адресов - 172.16.5.0/24. Что это значит? А вот что:
IP-адрес - это 32-битный параметр, разбитый на четыре части, который мы с вами привыкли видеть в десятичном виде. Маска подсети также является 32-битной, это словно трафарет для определения принадлежности IP-адреса к той или иной подсети.
Часть, где в маске единицы (1111111) меняться не может, таким образом, часть IP 172.16.5 всегда будет неизменной, а часть с нулями вариативна.
То есть в нашем примере подсети 172.16.5.0/24 хосты будут от 172.16.5.1 до 172.16.5.254 (крайний IP 255 - широковещательный), потому что 00000001 — это 1, а 11111110 — 254. Речь тут о крайнем октете.
Посмотрим на маску длиной 30 бит и сеть 172.16.2.4/30.
В этой подсети могут меняться только два бита в конце, т.о. четвертый октет может принять только четыре значения:
00000100 — адрес подсети (4 в десятичной системе)
00000101 — адрес узла (5)
00000110 — адрес узла (6)
00000111 — широковещательный (7)
Вне диапазона - уже другая подсеть.
В общем маска - это последовательность из 32 бит, где единицы в начале определяют адрес подсети, а нули в конце - адрес хоста.
Чередование нулей и единиц в маске невозможно.
Маска вида (например) 11111111.11100000.11110111.00000000 - невозможна.
А теперь, что же такое обратная маска (wildcard)?
По сути своей - это инверсия обычной маски. Нули в начале задают адрес части, которая должна совпадать обязательно, а единицы - свободную часть.
То есть для фильтрации хостов из подсети 172.16.5.0/24 правило в Access-листе должно быть таким:
…. 172.16.5.0 0.0.0.255
Ведь в двоичном представлении эта обратная маска будет иметь вид 00000000.00000000.00000000.11111111
В примере же из подсети 172.16.2.4/30 обратная маска получится такой:
Тогда и параметр в Access-листе будет такой:
…. 172.16.2.4 0.0.0.3
В описанных ситуациях последний октет обратной маски получается вычитанием из 255 цифры последнего октета обычной маски (255-252=3) и т.д.
Но на самом деле обратная маска — это несколько более богатый инструмент, здесь вы можете объединять адреса внутри одной подсети или даже объединять подсети, но самое главное отличие, вы можете чередовать нули и единицы. Это позволяет вам, например, отфильтровать определённый узел (или группу) в нескольких подсетях одной строкой.
Здесь на хабре обратные маски раскрыты более подробно.
Работа ACL в картинках
Гипотетическая сеть:
На маршрутизаторе RT1 на интерфейсе FE0/1 на вход у нас разрешено всё, кроме ICMP.
На маршрутизаторе RT2 на интерфейсе FE0/1 на выход запрещены SSH и TELNET
Тестируем
1. Пинг с компьютера ПК1 на Сервер1
2. TELNET с компьютера ПК1 на Сервер1
3. SSH с компьютера ПК1 на Сервер2
4. Пинг с Сервера2 на ПК1
Важные дополнения
1. Правила, действующие на исходящий трафик (out) не будут фильтровать трафик самого устройства. То есть, если нужно запретить самой циске доступ куда-либо, то вам придётся на этом интерфейсе фильтровать входящий трафик (ответный оттуда, куда надо запретить доступ).
2. Аккуратнее с ACL, всегда запиливайте их вдумчиво, иначе можно потерять доступ до устройства.
Вот хотим мы запретить доступ сети 172.16.6.0/24 куда бы то ни было, кроме своего адреса 172.16.6.61:
deny ip 172.16.6.0 0.0.0.255 any
permit ip host 172.16.6.61 any
Ну всё, вы потеряли доступ до цисочки, т.к. уже попали под первое правило, а до пермита мы не добрались.
Также под ACL может попасть трафик, который не должен был попасть.
Вот у нас серверный FTP, до которого мы открыли доступ на 21-й порт в ACL Servers-out. Мы радостно коннектимся к нему, фтпшник разрешает нам трансфер, например, по 1523-му порту. Здесь сказка и заканчивается, разбившись о суровую реальность ACL. Выше мы открывали для FTP 20 и 21 порты, но в реальности всё несколько сложнее. Но это придет.
3. Теперь захотелось нам повесить на WAN-интерфейс такой вот лист:
access-list out permit tcp host 1.1.1.1 host 2.2.2.2 eq 80
access-list in permit tcp host 2.2.2.2 any eq 80
Вроде бы всё классно, исходящие соединения на 80-ый порт разрешены, и все входящие тоже, класс? А если обратный ответ придет на какой-нибудь 1054-ый порт? Тогда стучась на 1.1.1.1:1054 он разобьется о правило deny ip any any.
Воспользуемся тогда хитростью вида:
permit tcp host 2.2.2.2 any established.
О ней вспомним несколько позже. В другой раз.
4. Также требуют внимание т.н. объективные группы (Object-group). Есть задача выпустить несколько адресов по определенным портам, но с перспективой увеличения количества адресов и портов. В каменном веке это выглядит примерно так:
ip access-list extended TO-INTERNET
permit tcp host 172.16.6.66 any eq 80
permit tcp host 172.16.6.66 any eq 8080
permit tcp host 172.16.6.66 any eq 443
permit tcp host 172.16.6.67 any eq 80
permit tcp host 172.16.6.67 any eq 8080
permit tcp host 172.16.6.67 any eq 443
permit tcp host 172.16.6.68 any eq 80
permit tcp host 172.16.6.68 any eq 8080
permit tcp host 172.16.6.68 any eq 443
Человек разумный же воспользуется объективными группами:
object-group service INET-PORTS
description Ports allowed for some hosts
tcp eq www
tcp eq 8080
tcp eq 443
object-group network HOSTS-TO-INET
description Hosts allowed to browse the net
host 172.16.6.66
host 172.16.6.67
host 172.16.6.68
ip access-list extended INET-OUT
permit object-group INET-PORTS object-group HOSTS-TO-INET any
Страшно? Чуть разобраться и за уши вас не оттащишь.
5. Полезно для траблшутинга использование команды show ip access-lists %имя ACL%
Выводится не только список правил по данному ACL, но и кол-во совпадений по каждому правилу.
msk-arbat-gw1#sh ip access-lists nat-inet
Extended IP access list nat-inet
permit tcp 172.16.3.0 0.0.0.255 host 192.0.2.2 eq www
permit ip 172.16.5.0 0.0.0.255 host 192.0.2.3
permit ip 172.16.5.0 0.0.0.255 host 192.0.2.4
permit ip host 172.16.4.123 any
permit ip host 172.16.6.61 any
permit ip host 172.16.6.66 any(4 match(es))
permit ip host 172.16.16.222 any
permit ip host 172.16.17.222 any
permit ip host 172.16.24.222 any
Дописав же в конце любого правила log, мы будем получать сообщение по срабатыванию данного правила прямиком в консоль.
Все спасибы за удивительно доступные объяснения - Сети для самых маленьких.