Cisco с нуля 08. Списки доступа (ACL)
Note
Команды сверены с официальной документацией Cisco (руководства по настройке Cisco IOS XE 17.x для Catalyst 9000 и маршрутизаторов ISR; отличия классической IOS 15.x отмечены в тексте). Перед работой на боевом оборудовании проверьте их на тестовом стенде или сделайте резервную копию.
Список доступа (Access Control List, ACL) — это упорядоченный набор правил «разрешить» и «запретить», по которому устройство решает, пропускать ли пакет. В этой статье вы разберётесь, как ACL устроены, как считать wildcard-маску, и настроите два сценария: гостевой сети (VLAN 20) будет закрыт доступ в офис и в управление при открытом интернете, а SSH на R1 и SW1 будет разрешён только из сети MGMT. Третий сценарий — входящий HTTPS к серверу из интернета — разобран короче, как иллюстрация.
Important
Если вы уже настроили DHCP для гостевой сети по статье 07, гости пока получают адреса и выход в интернет, но видят сети OFFICE и MGMT. Не подключайте гостей к сети, пока не выполнен пример 1 этой статьи.
Что понадобится
- Рабочая сеть из предыдущих статей серии:
R1с подинтерфейсамиGigabitEthernet0/0/1.10,.20,.99(статья 05), выход в интернет и DHCP (статья 07). - Консольный доступ к
R1иSW1. Он нужен как запасной вход: ошибка в ACL легко отрежет вас от устройства по сети. - Настроенный SSH (статья 02). Там же (и кратко в статье 07) мог быть создан список 10 для vty: пример 2 ниже его разбирает и учитывает, что он уже может существовать.
- Компьютер администратора, подключённый к порту
GigabitEthernet1/0/20коммутатораSW1в VLAN 99 (MGMT, как в статье 02) и имеющий адрес из192.168.99.0/24: из этой сети мы будем разрешать SSH в примере 2. Если такого порта у вас нет, переведите один свободный порт доступа в VLAN 99 (switchport access vlan 99, см. статью 04) или временно добавьте в vty-список адрес вашего рабочего места, как описано в примере 2. - Понимание масок подсетей; шпаргалка есть в статье таблица масок подсети.
Что такое ACL и где он применяется
ACL сам по себе ничего не фильтрует. Это только «список условий», который становится действующим, когда вы подключаете его к какому-то месту в конфигурации. Основные места:
| Где применяется | Как подключается | Что делает |
|---|---|---|
| Интерфейс, входящее или исходящее направление | ip access-group <ACL> in / out |
Пропускает или отбрасывает трафик, проходящий через интерфейс |
| Линии удалённого доступа vty (виртуальные терминальные линии, на которые приходят сетевые подключения SSH) | access-class <ACL> in |
Ограничивает, с каких адресов можно подключаться по SSH к самому устройству |
| NAT | в команде ip nat inside source list <ACL> ... |
Определяет, чьи адреса транслируются (см. статью 07) |
| Управление маршрутизацией | например, route-map с условием match ip address <ACL> |
Отбирает, к каким адресам применить действие |
В последних двух случаях ACL работает как «фильтр-выборка»: permit означает «выбрать эту сеть», а не «пропустить трафик». Здесь и дальше мы говорим главным образом о фильтрации на интерфейсах и vty.
Направления in и out
Направление всегда считается с точки зрения устройства:
in— пакет только что пришёл на интерфейс. Проверка выполняется до поиска маршрута, поэтому отбрасываемый трафик не расходует ресурсы на маршрутизацию.out— пакет уже промаршрутизирован и собирается покинуть интерфейс.
Important
ACL на интерфейсе фильтрует транзитный трафик, а не пакеты, которые создаёт сам маршрутизатор. Исходящий ACL по умолчанию не ограничит, например, ping, запущенный с R1. Для таких случаев на IOS XE 17.x есть глобальная команда ip access-list match-local-traffic; для начала она вам не нужна. На классической IOS 15.x наличие этой команды зависит от версии (проверьте с помощью справки ? в командной строке), а интерфейсы там называются иначе: например, GigabitEthernet0/1.20 вместо GigabitEthernet0/0/1.20.
Входящий ACL при этом проверяет и трафик, адресованный самому маршрутизатору (например, пакеты к шлюзу 192.168.20.1) — это важно для гостевого примера ниже.
На коммутаторах Catalyst ACL для маршрутизируемого трафика ставятся на L3-интерфейсы (те, у которых есть IP-адрес: маршрутизируемые порты и интерфейсы VLAN, например interface Vlan20) и их подинтерфейсы; для портов L2 существуют отдельные port ACL (список, привязанный к физическому порту коммутатора без IP-адреса). В нашей топологии маршрутизация между VLAN выполняется на R1, поэтому ACL ставим там.
Виды ACL
По возможностям различают два вида:
- Standard (стандартный) проверяет только адрес источника.
- Extended (расширенный) проверяет протокол, адрес источника и приёмника, порты TCP/UDP и ряд других признаков.
По способу записи — тоже два:
- Нумерованный (старый стиль):
access-list 10 permit .... Номера: standard — 1–99 и 1300–1999, extended — 100–199 и 2000–2699. Если создавать такой список старой командойaccess-list N ...в глобальном режиме, новые строки добавляются только в конец, а отдельную строку нельзя ни вставить, ни удалить — только пересоздать весь список. Чтобы получить возможность править список по номерам строк, создавайте его сразу в именованном режиме:ip access-list extended 150(число допустимо как имя; см. подсказку в разделе про номера последовательностей). - Именованный:
ip access-list standard NAMEилиip access-list extended NAME. Внутри работает режим редактирования: можно вставлять строки в нужное место и удалять отдельные. Это предпочтительный способ.
Имя должно начинаться с буквы и не может содержать пробелов; стандартный и расширенный ACL не могут носить одно и то же имя. Для vty в этой статье используем нумерованный стандартный список: именно его описывают руководства по Catalyst и классической IOS, а именованные списки на линиях документированы не во всех руководствах (подробности далее).
Для сравнения, так выглядит именованный стандартный список (он проверяет только адрес источника, поэтому после permit указывается только источник). Это иллюстрация: никуда подключать его не нужно.
enable
configure terminal
ip access-list standard ADMIN-HOSTS
remark Allowed management sources
permit 192.168.99.0 0.0.0.255
end
В remark лучше использовать латиницу: кириллица, вставленная через терминал, на многих устройствах и в терминальных программах отображается некорректно.
Wildcard-маска
В записях ACL вместо маски подсети используется wildcard-маска (обратная маска). Она устроена наоборот:
- бит
0— значение этого бита адреса должно совпасть; - бит
1— значение этого бита безразлично.
Практическое правило: wildcard = 255.255.255.255 минус маска подсети.
| Подсеть | Маска | Wildcard |
|---|---|---|
| /24 | 255.255.255.0 |
0.0.0.255 |
| /27 | 255.255.255.224 |
0.0.0.31 |
| /30 | 255.255.255.252 |
0.0.0.3 |
| один узел (/32) | 255.255.255.255 |
0.0.0.0 |
Примеры из нашей сети:
192.168.20.0 0.0.0.255— вся сеть GUEST: первые три октета совпадают, последний любой.192.168.99.0 0.0.0.255— вся сеть MGMT.
Для двух частых случаев есть сокращения:
host 192.168.99.2— то же, что192.168.99.2 0.0.0.0(один узел);any— то же, что0.0.0.0 255.255.255.255(любой адрес).
В стандартном ACL wildcard можно опустить: permit 192.168.99.2 означает один узел.
Warning
Самая частая ошибка начинающих — написать вместо wildcard маску подсети: 192.168.20.0 255.255.255.0. Для устройства 255 в wildcard означает «октет безразличен», а 0 — «октет должен совпасть». Запись 192.168.20.0 255.255.255.0 не проверяет первые три октета, а последний требует равным 0. Такое правило совпадёт лишь с адресами, оканчивающимися на .0, то есть практически ни с одним реальным узлом: deny ничего не запретит, а permit ничего не пропустит. Всегда пишите 0.0.0.255 для /24.
Как ACL обрабатывает пакет
- Правила проверяются сверху вниз.
- На первом совпавшем правиле проверка заканчивается: дальше список не смотрится.
- Если совпадений нет, пакет отбрасывается: в конце каждого ACL существует невидимое правило
deny any(deny ip any any).
Отсюда три следствия:
- Конкретные правила ставьте выше общих.
permit ip any anyв середине списка делает все строки ниже него бесполезными. - В ACL должна быть хотя бы одна строка
permit, иначе не пройдёт ничего. - Если вы хотите «запретить несколько вещей, а остальное разрешить», в конце обязательно нужен
permit ip any any(или более узкийpermit). Забытыйpermit— частая ошибка.
Неявный deny не показывает счётчик совпадений. Поэтому в конец списка принято добавлять явный deny ip any any: тогда в show access-lists видно, сколько пакетов отброшено.
Куда ставить ACL: ближе к источнику или к приёмнику
Классическая рекомендация (не требование):
- Extended ACL ставят ближе к источнику трафика. Он достаточно точный, чтобы отбросить ненужное сразу и не гонять такой трафик по сети.
- Standard ACL ставят ближе к приёмнику. Он видит только адрес источника. Если поставить его рядом с источником, то он заблокирует этому источнику доступ вообще ко всему, а не только к нужному ресурсу.
Гостевой ACL ниже стоит на GigabitEthernet0/0/1.20 с направлением in — то есть прямо на входе трафика гостей в маршрутизатор: это самое близкое к источнику место.
Пример 1. Гостям — интернет, но не офис и не управление
Задача: из VLAN 20 (GUEST, 192.168.20.0/24) нельзя обращаться в OFFICE (192.168.10.0/24) и в MGMT (192.168.99.0/24), всё остальное (интернет) разрешено.
Caution
Вы меняете фильтрацию на подинтерфейсе GigabitEthernet0/0/1.20. Здесь вы не отрежете себе SSH, но ошибка в номере подинтерфейса или в направлении нарушит работу сети. Держите консоль под рукой; приём reload in 10 описан в примере 2 и для этой правки необязателен.
Сначала создайте ACL, и только потом применяйте его к интерфейсу. Если применить несуществующий список, пропускается всё; но стоит добавить в него первую строку, как действует только она плюс неявный deny — и вы мгновенно отрежете трафик.
enable
configure terminal
ip access-list extended GUEST-IN
permit udp any eq 68 host 255.255.255.255 eq 67
permit udp 192.168.20.0 0.0.0.255 eq 68 host 192.168.20.1 eq 67
deny ip 192.168.20.0 0.0.0.255 192.168.10.0 0.0.0.255
deny ip 192.168.20.0 0.0.0.255 192.168.99.0 0.0.0.255
deny ip 192.168.20.0 0.0.0.255 192.168.50.0 0.0.0.255
deny ip 192.168.20.0 0.0.0.255 10.0.12.0 0.0.0.3
permit ip 192.168.20.0 0.0.0.255 any
deny ip any any
exit
interface GigabitEthernet0/0/1.20
ip access-group GUEST-IN in
end
Что здесь происходит, строка за строкой:
- Две строки
permit udp ... eq 68 ... eq 67— запросы DHCP от клиентов (порты 68 и 67 — клиент и сервер DHCP). Клиент без адреса отправляет запрос с адресом источника0.0.0.0на широковещательный адрес255.255.255.255, и под строкуpermit ip 192.168.20.0 ...он не подходит; это первая строка. Вторая строка пропускает продление адреса: клиент уже имеет адрес и обращается напрямую к серверу, здесь этоR1(192.168.20.1). Правила намеренно узкие: они не позволяют гостю отправлять UDP 68→67 в запрещённые сети ниже. Если DHCP-сервер для гостей находится не наR1, а где-то ещё (запросы идут через relay), адрес сервера во второй строке нужно заменить. - Четыре строки
denyзапрещают доступ в OFFICE (192.168.10.0/24), MGMT (192.168.99.0/24), сеть заR2(192.168.50.0/24) и стык между маршрутизаторами (10.0.12.0/30). Они же закрывают гостям доступ к адресам самогоR1в этих сетях (192.168.10.1,192.168.99.1,10.0.12.1). permit ip 192.168.20.0 0.0.0.255 anyразрешает всё остальное, в том числе интернет, шлюз гостевой сети192.168.20.1и DNS192.0.2.53.- Последний
deny ip any anyформально лишний, но даёт счётчик отброшенного: туда попадают, например, пакеты с чужими адресами источника.
Список намеренно небольшой. Он ещё не закрывает гостям внешний адрес самого R1 (203.0.113.2) — эту строку мы добавим в разделе про номера последовательностей, — а также SSH к гостевому шлюзу 192.168.20.1: подключения к самому R1 по SSH мы ограничим в примере 2. Если у вас подключён второй канал (198.51.100.0/30), по тому же принципу закройте и его, добавив строку deny для этой сети.
Note
Обычный ACL не «помнит» соединений: он оценивает каждый пакет отдельно. Этот список фильтрует только пакеты, приходящие от гостей. Если офисный компьютер сам подключится к гостевому, ответ гостя пройти не сможет. Для нашей задачи это удобно, но настоящий межсетевой экран с отслеживанием соединений работает иначе.
Пока не сохраняйте настройку: в разделе про номера последовательностей ниже мы добавим в список ещё одно правило, и сохранить конфигурацию нужно после него.
Как проверить
С гостевого компьютера:
- интернет открывается, DNS отвечает, шлюз
192.168.20.1пингуется; 192.168.10.1, любой офисный узел и192.168.99.1не отвечают.
На маршрутизаторе:
enable
show access-lists GUEST-IN
show ip interface GigabitEthernet0/0/1.20
Пример вывода (счётчики и точный вид строк зависят от платформы и версии):
Extended IP access list GUEST-IN
10 permit udp any eq bootpc host 255.255.255.255 eq bootps (14 matches)
20 permit udp 192.168.20.0 0.0.0.255 eq bootpc host 192.168.20.1 eq bootps (2 matches)
30 deny ip 192.168.20.0 0.0.0.255 192.168.10.0 0.0.0.255 (6 matches)
40 deny ip 192.168.20.0 0.0.0.255 192.168.99.0 0.0.0.255 (3 matches)
50 deny ip 192.168.20.0 0.0.0.255 192.168.50.0 0.0.0.255
60 deny ip 192.168.20.0 0.0.0.255 10.0.12.0 0.0.0.3
70 permit ip 192.168.20.0 0.0.0.255 any (5120 matches)
80 deny ip any any
Что смотреть: у запрещающих строк растут счётчики, когда вы пробуете открыть офис или MGMT с гостевого ПК; у permit ip ... any счётчик растёт при работе в интернете. В выводе show ip interface найдите строки вида Inbound access list is GUEST-IN и Outgoing access list is not set: они показывают, что список подключён во входящем направлении.
Tip
На коммутаторах Catalyst 9000 show access-lists не учитывает пакеты, обработанные аппаратно, поэтому счётчики могут быть занижены. Для аппаратной статистики на Catalyst 9000 используется show platform software fed active acl counters hardware (в стеке: show platform software fed switch active acl counters hardware). Она показывает аппаратные счётчики ACL; формат вывода зависит от версии.
Правка списка: номера последовательностей
В именованном ACL каждая строка имеет номер (sequence number). Если вы не задали его сами, строки нумеруются 10, 20, 30... Это позволяет править список без пересоздания.
Допустим, нужно запретить гостям ещё и обращения к внешнему адресу самого R1 (203.0.113.2). Новая строка должна встать после запрещающих правил и до общего permit (номер 70), то есть между 60 и 70:
enable
configure terminal
ip access-list extended GUEST-IN
65 deny ip 192.168.20.0 0.0.0.255 host 203.0.113.2
end
Как проверить: выполните show access-lists GUEST-IN. Новая строка 65 должна стоять между строками 60 и 70.
Пример вывода (счётчики условные):
Extended IP access list GUEST-IN
10 permit udp any eq bootpc host 255.255.255.255 eq bootps (14 matches)
20 permit udp 192.168.20.0 0.0.0.255 eq bootpc host 192.168.20.1 eq bootps (2 matches)
30 deny ip 192.168.20.0 0.0.0.255 192.168.10.0 0.0.0.255 (6 matches)
40 deny ip 192.168.20.0 0.0.0.255 192.168.99.0 0.0.0.255 (3 matches)
50 deny ip 192.168.20.0 0.0.0.255 192.168.50.0 0.0.0.255
60 deny ip 192.168.20.0 0.0.0.255 10.0.12.0 0.0.0.3
65 deny ip 192.168.20.0 0.0.0.255 host 203.0.113.2
70 permit ip 192.168.20.0 0.0.0.255 any (5120 matches)
80 deny ip any any
Теперь список гостевой сети готов. Когда убедитесь, что всё работает, сохраните настройку. Если вы включали reload in, сначала отмените перезагрузку:
enable
reload cancel
copy running-config startup-config
Если reload in не использовали, команда reload cancel не нужна: оставьте только copy running-config startup-config.
Правила работы:
- строка с номером встаёт в список по этому номеру, а не в конец;
- удалить строку: войти в ACL и ввести
no <номер>(например,no 65); - если вставлять уже некуда (соседние номера идут подряд), перенумеруйте список:
ip access-list resequence GUEST-IN 10 10— начать с 10 с шагом 10. Команда работает с именованными ACL; старые нумерованные (access-list 101 ...) она не поддерживает.
Tip
Если вам нужно править нумерованный расширенный список, создайте его в именованном режиме: ip access-list extended 150. Номер в роли имени допустим, и редактирование по номерам строк будет работать. Функция номеров последовательностей не поддерживает старые списки, созданные командой access-list N ....
Номера строк на экране видны в show access-lists. Не рассчитывайте, что номера сохранятся неизменными после перезагрузки: порядок строк сохраняется, а сами номера могут быть присвоены заново.
Комментарии к строкам добавляют командой remark <текст> внутри ACL.
Пример 2. SSH к устройству только из сети MGMT
Теперь ограничим, откуда можно подключаться к самому R1 (и аналогично к SW1). Для этого ACL подключают не к интерфейсу, а к линиям vty командой access-class. Если вы последовательно проходили серию, такое ограничение уже могло быть настроено в статьях 02 и 07; здесь мы разбираем его подробно и показываем безопасный порядок действий.
Warning
Это самый опасный шаг статьи. access-class фильтрует по адресу источника подключения. Если вы сейчас сидите за компьютером не из MGMT (192.168.99.0/24) и примените правило, следующее подключение по SSH будет отклонено, а консоль — ваш единственный путь назад. Прежде чем продолжать, убедитесь, что вы подключены с адреса из 192.168.99.0/24 (компьютер в порту GigabitEthernet1/0/20 коммутатора SW1, назначенном в VLAN 99) или добавьте в список строку permit host <ваш адрес>: её нужно ввести ДО строки line vty, в том же блоке.
Безопасный приём: reload in
Перед рискованным изменением попросите устройство перезагрузиться через 10 минут: если вы заблокируете себя, оно само вернётся к сохранённой конфигурации. Это не откат одной настройки, а полная перезагрузка устройства: сеть будет недоступна несколько минут. Если всё прошло хорошо, перезагрузки не будет при условии, что вы вовремя выполните reload cancel. Поэтому выбирайте окно работ; 10 минут обычно хватает, чтобы проверить вход вторым сеансом.
Шаг 1. Убедитесь, что текущая конфигурация рабочая, и сохраните её: copy running-config startup-config. Именно к ней устройство вернётся после перезагрузки.
Шаг 2. Включите таймер:
enable
reload in 10
Если устройство спросит про сохранение изменённой конфигурации (Save? [yes/no]), отвечайте no: иначе новая, возможно ошибочная, конфигурация запишется. Вопрос появляется только если конфигурация менялась с момента последнего сохранения; после шага 1 его обычно не будет. Затем подтвердите перезагрузку.
Шаг 3. Посмотрите, какие линии vty есть на вашем устройстве: show running-config | section line vty. В блоке ниже использован диапазон line vty 0 15, как в статье 02; если на устройстве только линии 0 4, замените диапазон на line vty 0 4. Команда transport input ssh разрешает на линиях только SSH (Telnet будет отключён), поэтому она уместна только если SSH уже настроен по статье 02. Настройте ACL и подключите его к vty:
Note
Если вы уже выполняли статью 02 или статью 07, список 10 и access-class 10 in на линиях у вас уже есть. Проверьте это командами show access-lists 10 и show running-config | section line vty. Если строка permit 192.168.99.0, wildcard bits 0.0.0.255 на месте, выполните вариант Б ниже, а команду access-list 10 permit ... повторно не вводите: старый нумерованный список только дополняется в конец, и вы получите вторую одинаковую строку. Она безвредна, но лишняя, а удалить одну строку нумерованного списка нельзя, только пересоздать весь список. Если списка 10 нет, выполните вариант А. Пример вывода в разделе «Как проверить» относится к списку из одной строки.
Вариант А (списка 10 ещё нет):
enable
configure terminal
access-list 10 permit 192.168.99.0 0.0.0.255
line vty 0 15
access-class 10 in
transport input ssh
end
Вариант Б (список 10 уже создан ранее):
enable
configure terminal
line vty 0 15
access-class 10 in
transport input ssh
end
Шаг 4. Не закрывая текущую сессию, откройте второе подключение по SSH из сети MGMT. Если оно прошло, проверьте, что подключение с адреса вне MGMT (например, с офисного компьютера) отклоняется.
Шаг 5. Если всё работает, отмените перезагрузку и сохраните настройку:
enable
reload cancel
copy running-config startup-config
Если второе подключение не удалось, ничего не делайте и не сохраняйте: через 10 минут устройство перезагрузится с рабочей конфигурацией. Либо зайдите по консоли и уберите access-class командой no access-class 10 in в режиме линии.
Почему ограничение ставится на весь диапазон линий: пользователь может попасть на любую свободную линию vty, поэтому ограничения должны быть одинаковыми на всех.
Note
В руководствах по Catalyst и классической IOS для vty описаны нумерованные ACL, а в отдельных рекомендациях Cisco по защите IOS XE access-class используется и с именованным стандартным списком. Поскольку именованные списки на линиях документированы не во всех руководствах, здесь использован нумерованный. Если вам нужна правка такого списка по номерам строк, создайте его в именованном режиме (ip access-list standard 10, число допустимо как имя) и затем подключите тем же access-class 10 in.
Как проверить
enable
show access-lists 10
show running-config | section line vty
Пример вывода:
Standard IP access list 10
10 permit 192.168.99.0, wildcard bits 0.0.0.255 (4 matches)
Счётчик растёт, когда из MGMT к устройству успешно подключаются. Подключения из других сетей не попадают ни в одну строку и отбрасываются неявным deny. Если нужно видеть и их, добавьте в конец deny any log (о log — ниже).
Перенос на SW1: те же команды (SW1 сам находится в MGMT, 192.168.99.2). Подключения из офиса и от гостей к SW1 будут отклонены.
Учтите, что при таком ACL с офисного компьютера вы тоже больше не зайдёте на R1 по SSH. Если нужно оставить доступ с рабочего места администратора из сети OFFICE, добавьте в список его адрес: access-list 10 permit host <адрес рабочего места>. Строки permit в таком списке равноправны, их порядок не важен.
Пример 3. Входящий HTTPS на сервер (обзор)
Допустим, в сети OFFICE стоит веб-сервер с адресом 192.168.10.10, опубликованный наружу статическим NAT (проброс порта 443) на адрес 203.0.113.2. Проброс настроен в статье 07 командой ip nat inside source static tcp 192.168.10.10 443 203.0.113.2 443, здесь он только предполагается. Чтобы пропускать к нему только HTTPS, на внешний интерфейс ставят входящий ACL. Вот минимальная иллюстрация, а не готовый межсетевой экран:
enable
configure terminal
ip access-list extended OUTSIDE-IN
permit tcp any host 203.0.113.2 eq 443
permit tcp any any established
permit udp host 192.0.2.53 eq 53 any
permit udp host 192.0.2.123 eq 123 any
permit icmp any any echo-reply
permit icmp any any unreachable
permit icmp any any time-exceeded
deny ip any any
exit
interface GigabitEthernet0/0/0
ip access-group OUTSIDE-IN in
end
Что нужно понимать:
- Входящий ACL проверяется до трансляции NAT. По документу Cisco о порядке операций NAT, для трафика снаружи внутрь сначала проверяется входящий список и только потом выполняется трансляция, поэтому в ACL указывается внешний (глобальный) адрес
203.0.113.2, а не внутренний адрес сервера192.168.10.10. Гости, обращающиеся к203.0.113.2изнутри, блокируются строкой 65 спискаGUEST-IN. - Защита от подделки адреса источника (антиспуфинг) здесь опущена ради краткости: обычно на внешнем интерфейсе до остальных
permitдобавляютdenyдля частных адресов (например,192.168.0.0/16,10.0.0.0/8) в роли источника, ведь из интернета они прийти не могут. - ACL не имеет состояния, и без
permit tcp any any establishedперестанут работать ответы на всё, что пользователи открывают в интернете. Ключевое словоestablishedпропускает TCP-пакеты с выставленными флагами ACK или RST. Это приблизительный признак ответа, а не отслеживание соединения: любой внешний пакет с таким флагом пройдёт, в том числе поддельный. Поэтому защитой периметра это не является. - Для UDP-ответов приходится писать отдельные правила, как для DNS и NTP в примере. Всё, что не перечислено, будет отброшено: ответы по UDP-протоколам вроде QUIC, голоса и видео, VPN, а также ответы TFTP-сервера
192.0.2.10(он понадобится в статье 12). Если вы используете такие протоколы, нужны дополнительные правила или другой подход. - Строки для ICMP нужны для диагностики (ответы на ping, сообщения о недоступности и о превышении TTL).
- Порт HTTPS записан числом
443: числа работают на всех версиях. - Сервер, доступный из интернета, правильнее держать в отдельной изолированной сети (DMZ, демилитаризованная зона для публичных серверов), а не в сети OFFICE. Здесь он в OFFICE только ради краткости примера.
Caution
Не применяйте такой список на боевом маршрутизаторе без теста и без reload in 10: забытое правило отрежет интернет для всей сети или пропустит ответы провайдера по протоколам, которые мы здесь не учли. Для реальной защиты периметра используют межсетевой экран с отслеживанием соединений (например, зонный firewall IOS XE) — это отдельная тема.
Как проверить
enable
show access-lists OUTSIDE-IN
show ip interface GigabitEthernet0/0/0
Счётчик у строки permit tcp any host 203.0.113.2 eq 443 растёт при обращениях к серверу снаружи, а в выводе show ip interface должна быть строка Inbound access list is OUTSIDE-IN. Если у пользователей пропал интернет, сразу снимите список: no ip access-group OUTSIDE-IN in на интерфейсе GigabitEthernet0/0/0, либо дождитесь срабатывания reload in.
Минимальный базовый уровень для R1
К этому моменту R1 уже смотрит в интернет (статьи 06 и 07), поэтому подведём итог. Минимум, который стоит сделать на маршрутизаторе, пока у вас нет настоящего межсетевого экрана:
- SSH только из MGMT (
access-classна vty, пример 2) и только SSH на линиях (transport input ssh); - никаких пробросов портов наружу без необходимости (пример 3 — иллюстрация, а не рекомендация);
- отключённые встроенные веб-серверы (
no ip http server,no ip http secure-server), если веб-интерфейс вам не нужен: как это сделать, разобрано в статье 02.
Important
Перечисленное — базовая гигиена, а не защита периметра. ACL без отслеживания соединений не заменяет межсетевой экран (stateful firewall). Для сети, которая стоит в интернете всерьёз, нужен именно он — например, зонный firewall IOS XE или отдельное устройство.
Журналирование: log и log-input
К строке ACL можно добавить log:
enable
configure terminal
ip access-list extended GUEST-IN
no 80
80 deny ip any any log
end
Первый совпавший пакет сразу попадает в журнал, затем устройство накапливает пакеты за пятиминутные интервалы и выводит сводку: номер ACL, адрес источника, число пакетов, действие. Ключевое слово log-input в расширенных ACL добавляет входной интерфейс и MAC-адрес источника; поддержка зависит от платформы, проверьте наличие ключевого слова с помощью справки ? в командной строке.
Warning
Не вешайте log на «шумные» правила: например, на permit ip ... any, через которое идёт весь трафик гостей. Журналирование нагружает процессор и засоряет журнал. Включайте его временно и только на строках, которые нужно разобрать, например, на финальном deny. Учтите также, что на Catalyst пакеты, попавшие под log, обрабатываются программно.
Типичные ошибки
- Неверное направление
in/out. Если вы хотели отфильтровать трафик гостей, а применили списокoutна гостевом интерфейсе, он будет проверять пакеты, идущие к гостям, и ничего не отфильтрует. Помните:in— пакет входит в устройство через этот интерфейс. - Забыт
permitв конце. Список из однихdenyблокирует всё: срабатывает неявныйdeny any. Если нужно «запретить лишнее и разрешить остальное», завершайте список строкойpermit ip any any(или более узкой). - Неверный wildcard.
255.255.255.0вместо0.0.0.255даёт правило, которое не совпадает ни с чем нужным (только с адресами на.0), а0.0.0.254вместо0.0.0.255совпадёт лишь с частью адресов подсети. Проверяйте записи и счётчики вshow access-lists. - Применён ACL до того, как он создан или заполнен. Первая добавленная строка начинает действовать сразу, вместе с неявным
deny. - ACL на vty без своего адреса. Вы блокируете себя. Всегда делайте
reload in 10и проверяйте вход вторым сеансом. - Ожидание, что исходящий ACL остановит трафик самого маршрутизатора. Исходящий (
out) ACL на интерфейсе не фильтрует пакеты, которые создаёт сам маршрутизатор (например, ping сR1). Входящий ACL проверяет и трафик к самому устройству, но для ограничения SSH удобнееaccess-classна vty: он не зависит от того, через какой интерфейс пришло подключение.
Что дальше
- Cisco с нуля 09. STP и EtherChannel — защита от петель и объединение каналов.
- Cisco с нуля 10. Базовая защита коммутатора — port-security и DHCP snooping, другая часть общей картины безопасности.
- Cisco с нуля 12. Резервные копии, обновление IOS и диагностика — как сохранять конфигурацию перед рискованными правками.
- Таблица масок подсети — пригодится при расчёте wildcard.