Создание списка доступа - дело непростое, но данную задачу можно облегчить, если строго следовать предлагаемым правилам и рекомендациям.

Большинство из нас ежедневно имеет дело с тем или иным видом передачи данных. Путешествуем ли мы по страницам Web, отправляем электронную почту, узнаем биржевой курс по сотовому телефону, работаем с программой обмена сообщениями или, используя средства Voice over IP, общаемся с приятелем или родственником, находящимся в другом городе, — все это в конечном итоге становится возможным благодаря перемещению битов данных. Их доставка осуществляется по соединениям глобальной инфраструктуры общедоступных и частных сетей на базе маршрутизаторов. В мире технологий связи маршрутизатор — такой же привычный атрибут, как и персональный компьютер, стоящий у вас дома или на работе.

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

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

В данной статье рассказывается о списках доступа маршрутизаторов, их основных разновидностях, формате и правилах применения. При составлении списка доступа довольно легко ошибиться, из-за чего процесс фильтрации может пойти совсем иначе, нежели предполагалось, поэтому в данной статье будет периодически заостряться внимание на правилах и процедурах, которые помогут вам воплотить в жизнь свой план фильтрации пакетов. К этим правилам не следует относиться как к догме — некоторые из них просто облегчают построение списков, однако есть среди них и такие, несоблюдение которых не позволит реализовать должный режим фильтрации.

В статье используется синтаксис списков доступа, разработанный компанией Cisco Systems, а также примеры списков, составленные для операционной системы Cisco IOS (Internetwork Operating System). Каждый производитель маршрутизаторов может использовать свою структуру списков доступа и по-своему реализовать поддержку некоторых их аргументов, но основная стратегия и процедуры, связанные с созданием и применением списков, обычно оказываются сходными. Конечно, сходство не означает полного совпадения, поэтому я настоятельно рекомендую при использовании продуктов от других производителей внимательно изучать прилагаемую документацию.

ОСНОВНЫЕ ПОНЯТИЯ

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

ПРАКТИКА

Фактически список доступа представляет собой набор операторов, помещенных в память маршрутизатора. Чтобы эти операторы возымели действие, нужно не только создать список, но и применить его к интерфейсу. Типичная ошибка многих сетевых администраторов в том, что они применяют список доступа не к тому интерфейсу, которому следует.

Рисунок 1. Список доступа можно применить к интерфейсу на входящем (стрелки указывают в сторону маршрутизатора) или на исходящем направлении (стрелки указывают в сторону от маршрутизатора).

Столь же важно проследить за тем, чтобы список доступа был применен к нужному направлению действия интерфейса. Список можно применить как ко входящему в маршрутизатор, так и к исходящему потоку данных. На Рисунке 1 показан маршрутизатор с одним последовательным портом и двумя портами Ethernet; стрелки, указывающие направление от маршрутизатора, обозначают исходящий поток через интерфейс, а стрелки, указывающие направление к маршрутизатору, — входящий поток. Исходя из вышеизложенного, можно ввести еще два правила: во-первых, всегда применяйте список доступа к соответствующему интерфейсу; во-вторых, убедитесь, что список применен к соответствующему направлению интерфейса.

ДВА ВАРИАНТА

Маршрутизаторы Cisco поддерживают списки доступа двух типов: стандартные и расширенные. Как и другие производители, Cisco встраивает в свои маршрутизаторы поддержку множества протоколов, однако в данной статье для наглядности будет рассматриваться только широко распространенный протокол IP.

Стандартный список доступа для протокола IP имеет ограниченные функциональные возможности: он позволяет фильтровать пакеты только на основании значений содержащихся в них адресов источников данных. Если вы хотите выполнять фильтрацию по типу протокола, адресу назначения, приложению, данные которого переносит транспортный протокол, или с помощью комбинации подобных критериев, то необходимо использовать расширенный список доступа. Отсюда два простых правила: во-первых, используйте стандартный список доступа IP, если нужно фильтровать только по адресу источника; во-вторых, используйте расширенный список доступа IP, если требуется фильтрация по дополнительным критериям. Стандартный список доступа IP имеет следующий формат:

access-list access-list-number 
{deny | permit} {source-address 
[source-wildcard] | any} [log]

Некоторые ключевые слова и параметры стандартного списка нуждаются в пояснении. Прежде всего, дефис между словами access-list обязателен. Жирным шрифтом набраны параметры оператора, которые переносятся в список в неизменном виде, а курсивом — которые заменяются условными символьными или числовыми значениями. В фигурные скобки помещен набор параметров, разделенный вертикальной чертой на части, одна из которых должна присутствовать в операторе обязательно. Параметры, заключенные в квадратные скобки, необязательны. Номер списка (access-list-number) — это число в диапазоне от 1 до 99, оно идентифицирует операторы из некоторого стандартного списка доступа IP.

Поскольку использование чисел из диапазона 1—99 сигнализирует системе IOS о том, что данный список доступа связан с протоколом IP, номер списка выполняет двойную функцию: он определяет протокол, которому соответствует список, и информирует IOS о том, что все операторы списка с этим номером должны рассматриваться как единое целое. Например, расширенные списки доступа IP задаются числом в диапазоне от 100 до 199. Итак, придерживайтесь следующего важного правила: используйте номер списка, соответствующий типу списка доступа, который вы хотите создать.

РАЗРЕШИТЬ ИЛИ ЗАПРЕТИТЬ?

В стандартном списке доступа IP есть ключевые слова permit или deny, которые указывают, разрешается ли пакетам, удовлетворяющим условиям некоторого оператора списка, проходить через интерфейс. Адрес источника (source-address) — это IP-адрес узла или группы узлов. Задание узла или группы узлов осуществляется с использованием маски шаблона (source-wildcard). Эта маска действует прямо противоположным образом по сравнению с маской подсети: двоичный нуль предполагает строгое совпадение в соответствующей позиции, а двоичная единица означает произвольное значение.

Чтобы проиллюстрировать использование адреса IP и маски шаблона, предположим, что в вашей организации имеется удаленный офис с IP-адресом сети класса C: 192.46.28.0. Предположим далее, что вы хотите разрешить каждой станции этой сети доступ к маршрутизатору головного офиса компании, подключенному к Internet. Для этого можно использовать маску 0.0.0.255: последний байт в адресе класса C представляет адрес узла, и установка 1 во всех разрядах разрешает доступ каждому узлу сети. Итак, стандартный список доступа IP примет следующий вид:

access-list 1 permit 192.46.28.0
 0.0.0.255.

Заметьте, что маска шаблона — это дополнительный код маски подсети. Поэтому, если вы хорошо ориентируетесь в подсетях, то можете определить маску подсети и инвертировать ее — получится соответствующая маска шаблона. Продолжая наш свод правил, подведем итог нашим рассуждениям: при составлении маски шаблона помните, что двоичные нули означают совпадение, а двоичные единицы — произвольные символы.

МАЛЕНЬКИЕ ХИТРОСТИ

Если вы хотите определить какой-то конкретный узел, то маску шаблона следует задать как 0.0.0.0. Например, чтобы разрешить прохождение пакетов от IP-адреса 192.46.27.7, можно использовать следующий оператор:

access-list 1 permit 192.46.27.7
 0.0.0.0

Чтобы избавить пользователей от необходимости вводить нули с точками, Cisco предусмотрела альтернативный способ указания конкретного узла в списке доступа — с помощью ключевого слова host. Так, чтобы разрешить передачу пакетов от узла 192.46.27.7, в список доступа достаточно включить следующий оператор:

access-list 1 permit host 192.
46.27.7

Далее, комбинацию, состоящую из адреса источника 0.0.0.0 и маски шаблона 255.255.255.255, можно заменять одним ключевым словом any. Например, если требуется запретить прохождение пакетов, отправляемых станцией с адресом 192.46.27.8, используйте следующую последовательность операторов:

access-list 1 deny host 192.
46.27.8
access-list 1 permit any

Обратите внимание на порядок этих операторов. Первый отвергает пакеты с адресом источника 192.46.27.8; второй разрешает прохождение пакетов от любых адресов через интерфейс, к которому применяется список доступа. Если операторы поменять местами, полученный список доступа не сможет блокировать пакеты, поступающие из сети 192.42.27.8. Это объясняется тем, что списки доступа обрабатываются сверху вниз. Поэтому первый оператор списка, которым теперь станет оператор access-list 1 permit any, будет пропускать через интерфейс все пакеты, независимо от их источника. Отсюда ясно, насколько важен порядок следования операторов в списке доступа.

НЕЯВНЫЙ ОПЕРАТОР DENY ANY

По умолчанию список доступа отсеивает весь трафик, кроме явно разрешенного. Таким образом, каждый список доступа в конце содержит неявный оператор deny any. Возвращаясь к нашему примеру стандартного списка доступа IP, перепишем его в том виде, в каком его воспринимает маршрутизатор:

access-list 1 deny host 192.
46.27.8
access-list 1 permit any
access-list 1 deny any

Хотя в данном примере неявный оператор deny не оказывает никакого воздействия из-за идущего в списке вторым явного оператора permit, в других случаях ситуация может оказаться иной. Например, если вы хотите разрешить транзит пакетов с адресами источников 192.46.27.8 и 192.46.27.12 через интерфейс маршрутизатора и заблокировать весь остальной трафик, задайте следующие операторы:

access-list 1 permit host 192.
46.27.8
access-list 1 permit host 192.
46.27.12

Заметьте, что вам не обязательно добавлять оператор deny, поскольку все списки доступа включают неявный оператор deny any в самом конце; таково еще одно правило составления списка доступа.

Завершая описание синтаксиса стандартного списка доступа IP, упомянем ключевое слово log, которое задает ведение журнала. Когда к интерфейсу применяется список с таким ключевым словом, информация обо всех пакетах, разрешаемых и отвергаемых его операторами permit и deny, записывается в журнал. Первый же поступивший на интерфейс пакет, которому найдено соответствие в одном из операторов списка доступа, немедленно инициирует запись в журнал. Последующие пакеты анализируются, и результаты анализа с пятиминутной периодичностью отображаются на консоли или заносятся в журнал в памяти, причем способ записи сообщения в журнал контролируется командой IOS logging console.

Итак, получив некоторое представление о том, как действует стандартный список доступа IP, рассмотрим некоторые связанные с ним ограничения. Поскольку фильтрацию можно проводить только по адресу источника, содержащемуся в пакете, первое ограничение очевидно: список доступа не позволяет фильтровать пакеты по адресу назначения. Это важно иметь в виду, если вам нужно ограничить доступ к одному или нескольким узлам сети. Другой существенный минус стандартного списка доступа состоит в том, что он не различает протоколы. Значит, вы не можете отбирать пакеты по протоколам — так, чтобы, например, разрешить обмен трафиком Web между определенными устройствами и блокировать передачу файлов для других узлов. Когда возникла естественная потребность в расширении возможностей фильтрации, списки доступа были усовершенствованы.

РАСШИРЕННЫЕ СПИСКИ ДОСТУПА IP

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

access-list access-list-number
{deny | permit}
{protocol | protocol-keyword}
{source-address source-
wildcard | any} [source-port]
{destination-address 
destination-wildcard | any}
[destination-port] [log]

Как и раньше, номер списка (access-list-number) идентифицирует тип списка доступа. Числа в диапазоне 100—199 позволяют определить сто различных расширенных списков доступа IP. Параметр protocol-keyword задает протокол, подлежащий фильтрации: например, IP, TCP, UDP, ICMP (Internet Control Message Protocol) и т. д. (Прим. ред.: использование параметра protocol подразумевает задание числового значения порта, используемого протоколом, из диапазона от 0 до 255.)

Если подробнее рассмотреть процесс формирования пакета, станет понятно, почему заданный тип протокола влияет на процесс фильтрации пакетов, причем иногда самым неожиданным образом. Например, на Рисунке 2 показано, как формируется дейтаграмма IP. Как видите, на транспортном уровне к прикладным данным обычно добавляется префикс в виде заголовка TCP или UDP, который содержит идентификатор порта, соответствующий приложению. При прохождении пакета через стек протоколов к нему на сетевом уровне добавляется еще и заголовок IP, содержащий адресные данные для итоговой дейтаграммы.

Поскольку заголовок IP обеспечивает транспортировку протоколов TCP или UDP, а также протоколов маршрутизации и ICMP, указание IP в качестве протокола в операторе списка доступа оказывается шире, чем спецификация конкретного протокола. Например, если разрешить передачу пакетов IP, то по умолчанию будет разрешено включать в дейтаграмму и сообщения ICMP, и сегменты TCP, и дейтаграммы UDP, что, возможно, и не входило в ваши намерения. Поэтому если вы хотите выполнять фильтрацию по определенному протоколу, нужно указать этот протокол. Таким образом, можно сформулировать следующее правило: операторы с более конкретными спецификациями всегда следует ставить перед операторами более общего характера.

В качестве иллюстрации рассмотрим следующие два оператора расширенного списка доступа IP. Предположим, ваша задача — блокировать доступ по TCP к серверу с IP-адресом 192.78.46.8, при этом разрешив к этому узлу передачу всех прочих видов трафика. Как вы считаете, достигнете ли вы цели с помощью этой пары операторов?

access-list 101 permit IP
any host 192.78.46.8
access-list 101 deny TCP
any host 192.78.46.8

Увы, ответ отрицательный: первый оператор разрешает доставку по указанному адресу всего трафика, так что второй оператор теряет смысл. Но если изменить порядок операторов, то вы блокируете трафик TCP по заданному адресу и разрешите передавать на него пакеты любых других протоколов — чего и требовалось добиться.

Еще одной отличительной особенностью расширенных списков доступа IP является поддержка логических операций применительно к номерам портов — lt (less than, меньше), gt (greater then, больше), eq (equal, равно), neq (not equal, не равно). Чтобы задать порт (порт источника — source-port, или порт назначения — destination-port), можно указать номер или мнемонический код порта либо использовать логическую операцию для задания диапазона портов. Следующий пример иллюстрирует использование логических операций в двух операторах:

access-list 101 permit tcp
any host 192.78.46.8 eq www
access-list 101 permit ICMP
any host 192.78.46.8 eq 8

Первый оператор разрешает передачу пакетов TCP с любого узла по конкретному адресу 192.78.46.8, если это пакеты Web. Вместо мнемонического кода www можно задать число 80, так как трафик Web обычно использует порт 80. Второй оператор разрешает все адресованные указанному узлу сообщения Ping — эхозапросы ICMP, которым назначен тип ICMP, равный 8. (Прим. ред.: синтаксис расширенных списков доступа позволяет задавать в конце оператора специфические для каждого протокола параметры; так, для протокола ICMP задаются не номера портов, как для протоколов UDP или TCP, а тип и — если нужно — код сообщений ICMP.) С учетом неявного оператора deny any в конце списка доступа этот список блокирует пакеты, предназначенные для указанного узла и не представляющие трафик Web, пакеты для того же узла, не являющиеся сообщениями Ping, и пакеты, направляемые по другим адресам.

ШАГ ЗА ШАГОМ

Процесс применения списка доступа к интерфейсу состоит из трех этапов. Во-первых, вы создаете сам список доступа. Это можно сделать непосредственно с консоли маршрутизатора или с помощью какого-либо текстового редактора, сохранив полученный файл в текстовом формате ASCII и передав его маршрутизатору командой TFTP. Во-вторых, вам нужен интерфейс, к которому будет применяться список доступа; он определяется с помощью команды маршрутизатора interface. В-третьих, необходимо задать направление применения списка доступа — для этого используется команда маршрутизатора access-group.

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

  • разрешить передачу на сервер Web с адресом 192.78.46.12 только трафика Web и сообщений Ping;
  • разрешить передачу всего трафика IP, кроме сообщений Ping, на другой узел с IP-адресом 192.78.46.8;
  • запретить все остальные виды передачи.

Этого можно добиться при помощи следующей последовательности строк:

interface serial 0
ip access-group 101 in
access-list 101 deny ICMP
any host 192.78.46.8 eq 8
access-list 101 permit ip
any host 192.78.46.8
access-list 101 permit ICMP
any host 192.78.46.12 eq 8
access-list 101 permit tcp
any host 192.78.46.12 eq 80
access-list 101 deny ip any any

Первая строка определяет интерфейс, к которому применяется список доступа, вторая — направление, в котором выполняется фильтрация. Первый оператор списка доступа блокирует сообщения Ping (эхозапросы ICMP) по указанному адресу узла. Второй оператор списка доступа разрешает передавать на этот узел все остальные виды трафика IP. Следующие два оператора разрешают доставку эхо-запросов ICMP и трафика Web на второй узел сети. Последний оператор — это deny any в явном виде: на самом деле он не нужен и добавлен лишь для того, чтобы придать списку черты завершенности.

ПОСЛЕДУЮЩИЕ ИЗМЕНЕНИЯ

Поскольку конфигурация сети постоянно меняется, любое обсуждение списков доступа будет неполным, если не упомянуть о возможности их модификации.

В рассмотренных нами примерах использовались нумерованные списки, а из такого списка доступа нельзя удалять отдельные записи. Записи можно добавлять в конец списка, но, если требуется изменить какую-то строку или несколько строк, для этого придется создать новый список, удалить старый и затем применить новый. Именованный список доступа, в котором номер заменен именем списка, предоставляет чуть более гибкие возможности: для исключения оператора из списка достаточно поставить перед первым ключевым словом permit или deny префикс no. Правда, именованный список доступа, как и нумерованный, не поддерживает выборочное добавление операторов. Поэтому для того, чтобы включить оператор в список любого из этих типов, необходимо удалить существующий список и заново применить новый или измененный список с соответствующими записями. Таково наше последнее правило работы со списками доступа.

Гилберт Хелд — автор многочисленных книг и статей на темы, связанные с компьютерами и их взаимодействием. С ним можно связаться по адресу: gil_held@yahoo.com.


Ресурсы Internet

Более подробную информацию о списках доступа по технологии Cisco Systems можно найти на узле http://www.cisco.com. Поскольку материалов о списках доступа там очень много, мы рекомендуем максимально конкретизировать поиск, например, следующим образом: time-based access list (список доступа с учетом времени).

Поделитесь материалом с коллегами и друзьями