Настройка L3 filter-map

Для управления трафиком разных направлений для L3 интерфейса могут применяться списки доступа filter-map. Под направлением в данном случае подразумевается момент, когда пакеты, проходящие через интерфейс, будут обработаны списком доступа: при “входе” в интерфейс — указание направления in, при “выходе” — направление out. На одном интерфейсе может быть применено несколько списков доступа в одном направлении. Каждый список доступа может быть применён к нескольким интерфейсам одновременно.

Использование filter-map производится в два этапа.

  1. Создание и наполнение правилами.
  2. Привязка к интерфейсу.

Создание filter-map производится в конфигурационном режиме. Для создания filter-map требуется выполнить следующие действия (в результате будет создан filter-map, содержащий одно правило):

  1. Первая строка. Ввести команду filter-map ipv4 <FILTER_MAP_NAME> [<SEQUENCE_NUMBER>], где FILTER_MAP_NAME — имя списка доступа, SEQUENCE_NUMBER — порядковый номер правила в списке доступа. Подробнее параметры описаны в таблице ниже.
  2. Вторая строка. Указать правило, на соответствие которому будут проверяться пакеты, следующего вида: match [fragments] <PROTOCOL> <SRC_ADDRESS> [<PORT_CONDITION>] <DST_ADDRESS>[<PORT_CONDITION>] [dscp <DSCPVALUE>] [<TTL>] [<FLAG>]. Подробнее параметры описаны в таблицах ниже.
  3. Третья строка. Указать действие, которое будет применяться к пакетам, удовлетворяющим условиям правила, следующего вида set <ACTION>. Подробнее параметры описаны в таблице ниже.

Список доступа может содержать несколько правил. Для добавления правила в существующий список доступа следует повторить шаги, описанные выше. В качестве FILTER_MAP_NAME следует указывать имя списка доступа, куда правило должно быть добавлено. Правило должно иметь уникальный номер SEQUENCE в рамках одного filter-map.

В конце любого filter-map ipv4 в неявном виде встроено запрещающее правило any any reject.

Таблица — Общие параметры filter-map ipv4

ПараметрОписание
FILTER_MAP_NAMEИмя списка фильтрации, может принимать любое значение
SEQUENCE_NUMBERНомер приоритета выполнения, допустимые значения 0–65535. Если значение не задано, то параметр для созданного filter-map ethernet автоматически получит последующее свободное значение с шагом 10
fragmentsУказывает на то, что отфильтровать необходимо только вторичные фрагменты пакетов. Нефрагментированные пакеты и первичные фрагменты отфильтрованы не будут. Использование данного ключевого слова исключает возможность использования параметра PORT_CONDITION.
PROTOCOLЗначение поля protocol. Может быть указано значение поля в диапазоне (0–255) или одно из следующих обозначений:
- ipinip;
- icmp;
- gre;
- igmp;
- pim;
- rsvp;
- ospf;
- vrrp;
- ipcomp;
- any (любой протокол);
- udp (внимание, для данного протокола доступны дополнительные параметры PORT_CONDITION);
- tcp (внимание, для данного протокола доступны дополнительные параметры PORT_CONDITION и FLAG).
SRC_ADDRESSIP-адрес источника, задается в одном из следующих форматов:
- A.B.C.D/M (IP-адрес с маской),
- A.B.C.D K.L.M.N (IP-адрес с инверсной маской),
- host A.B.C.D (если под правило должен подпадать единственный адрес),
- any (если под правило должны попадать все адреса)
DST_ADDRESSIP-адрес назначения, задается в одном из следующих форматов:
- A.B.C.D/M (IP-адрес с маской),
- A.B.C.D K.L.M.N (IP-адрес с инверсной маской),
- host A.B.C.D (если под правило должен подпадать единственный адрес),
- any (если под правило должны подпадать все адреса)
DSCPVALUEЗначение DSCP (Differentiated Services Code Point) для проверки пакета, целое число от 0 до 63
TTLЗначение TTL (time to live) пакета, задаётся в виде точного значения — eq, всех значений более указанного — gt, всех значений менее указанного — lt, диапазона — range. Полный синтаксис параметра TTL:
ttl {{ eq │ gt │ lt } <0-255> │ range <0-255> <0-255>}
set <ACTION>
set acceptРазрешить
set discardЗапретить без отправки ICMP-уведомления
set rejectЗапретить с отправкой ICMP-уведомления
set nexthop <A.B.C.D>Указать IP-адрес next hop. Пакеты, попавшие под действие правила, отсылаются на адрес next-hop c учётом существующих маршрутов в RIB
set class-map <NAME>Пакетам, попавшим под действие правила, присваивается указанный класс трафика class-map. Класс должен быть заранее создан (подробнее см.)
set vrf <VRF_NAME> [<A.B.C.D>]Для пакетов, попавших под действие правила, будет использоваться таблица маршрутизации vrf, где VRF_NAME — имя необходимого vrf. Для данного vrf можно при необходимости указать IP-адрес next hop

При указании протокола udp вторая строка команды создания filter-map будет иметь следующий вид: match udp <SRC_ADDRESS> [<PORT_CONDITION>] <DST_ADDRESS> [<PORT_CONDITION>] [dscp <DSCPVALUE>] [<TTL>].

Таблица — Дополнительные параметры при указании udp

ПараметрОписание
PORT_CONDITIONУсловие для значения порта. Может быть указано одно из следующих значений:

{{eq │ gt │ lt} {tftp │ bootp │ <0-65535>} │ range <0-65535> <0-65535>}
Значения PORT_CONDITION
eqНомер порта равен
gtНомер порта больше, чем
ltНомер порта меньше, чем
tftpUDP(69)
bootpUDP(67)
<0-65535>Точный номер порта, любое значение из указанного диапазона
range <0-65535> <0-65535>Номер порта входит в диапазон

При указании протокола tcp вторая строка команды создания filter-map будет иметь следующий вид: match tcp <SRC_ADDRESS> [<PORT_CONDITION>] <DST_ADDRESS> [<PORT_CONDITION>] [dscp <DSCPVALUE>] [<TTL>] [<FLAG>].

Таблица — Дополнительные параметры при указании tcp

ПараметрОписание
PORT_CONDITIONУсловие для значения порта. Может быть указано одно из следующих значений: {{eq | gt | lt} {ftp | ssh | telnet | www | <0-65535>} | range <0-65535> <0-65535>}
FLAGЗначения флага, по которым может производиться обработка пакетов. Может быть указано одно из следующих значений (префикс not- означает, что указанный флаг не установлен): ack | not-ack | fin | not-fin | psh | not-psh | rst | not-rst | syn | not-syn | urg | not-urg
- ack — установлен флаг ACK (номер подтверждения),
- fin — установлен флаг FIN (завершение соединения),
- psh — установлен флаг PSH (инструктирует получателя протолкнуть данные, накопившиеся в приёмном буфере, в приложение пользователя),
- rst — установлен флаг RST (оборвать соединение, очистить буфер),
- syn — установлен флаг SYN (синхронизация номеров последовательности),
- urg — установлен флаг URG (указатель важности),
- not-ack — не установлен флаг ACK,
- not-fin — не установлен флаг FIN,
- not-psh — не установлен флаг PSH,
- not-rst — не установлен флаг RST,
- not-syn — не установлен флаг SYN,
- not-urg — не установлен флаг URG.
Можно перечислить несколько флагов через пробел. При этом правило сработает, если в пакете будут установлены все перечисленные флаги. Например, правило not-rst syn ack сработает, если пакет содержит флаги SYN и ACK, но не содержит RST
Значения PORT_CONDITION
eqНомер порта равен
gtНомер порта больше, чем
ltНомер порта меньше, чем
ftpTCP(21)
sshTCP(22)
telnetTCP(23)
wwwTCP(HTTP-80)
<0-65535>Точный номер порта, любое значение из указанного диапазона
range <0-65535> <0-65535>Номер порта входит в диапазон
Фильтрация фрагментов пакетов

Когда пакеты слишком велики (в связи с ограничениями MTU) для передачи по сети, они делятся на несколько меньших фрагментов. Первый фрагмент в этом наборе называется первичный фрагмент и содержит заголовки четвёртого уровня. Последующие, вторичные фрагменты не содержат L4 заголовков.

В filter-map ipv4 существует возможность создания правила исключительно для вторичных фрагментов. Для их фильтрации с помощью команды match используется ключевое слово fragments. Нефрагментированные пакеты и первичные фрагменты такой командой отфильтрованы не будут.

Пример:

filter-map ipv4 TEST_TCP 10
match fragments any host 20.0.0.3 host 10.0.0.2
set reject

Данная filter-map, прикреплённая к интерфейсу, будет запрещать дальнейший транзит вторичных фрагментов пакетов любых L4 протоколов от хоста 20.0.0.3 к хосту 10.0.0.2.

Попытка ввести правило вида match fragments udp 10.10.10.0/24 20.20.20.0/24 eq 22, т.е. правило с указанием L4-порта, приведёт к ошибке, поскольку в заголовках вторичных фрагментов не может быть указан L4-порт.

Пример создания списка доступа и добавления правил в него

Создание списка доступа производится в конфигурационном режиме:

ecorouter(config)#filter-map ipv4 example 10
match udp 10.10.10.0/24 20.20.20.0/24 eq 22
set accept

Здесь:

  • example — имя списка доступа,
  • 10 — номер последовательности правила в списке доступа,
  • udp — указание на ожидаемый протокол,
  • 10.10.10.0/24 — указание сети-источника пакетов с префиксом, трафик из которой разрешается для прохождения,
  • 20.20.20.0/24 — указание сети назначения с префиксом, трафик в которую разрешается для прохождения,
  • eq 22 — аргумент, указывающий на точный номер порта назначения,
  • accept — разрешающий аргумент (трафик, удовлетворяющий условиям правила будет пропускаться).

Добавление правила к данному списку доступа (для пакетов, удовлетворяющих правило, также будет выполняться accept, правило будет проверяться вторым в списке доступа с именем example). Правило добавляет условие для проверки. Действие для всего списка выполняется одно и то же. Проверка правил внутри списка доступа производится в соответствии с указанными для них значениями SEQUENCE.

ecorouter(config)#filter-map ipv4 example 20
match 1 host 122.168.1.15 host 172.20.100.1

Здесь:

  • example — имя списка доступа,
  • 20 — номер последовательности правила в списке доступа,
  • 1 — указание на протокол, в данном случае ICMP,
  • host 122.168.1.15 — аргумент, указывающий на конкретный IP-адрес источник пакетов (указание маски не требуется),
  • host 172.20.100.1 — аргумент, указывающий на конкретный IP-адрес назначения пакетов (указание маски не требуется).

Добавление правила к данному списку доступа (для пакетов, удовлетворяющих правилу, также будет выполняться accept, правило будет проверяться третьим в списке доступа с именем example).

ecorouter(config)#filter-map ipv4 example 30
match ospf 192.168.32.0 0.0.7.255 any

Здесь:

  • example — имя списка доступа,
  • 30 — номер последовательности правила в списке доступа,
  • ospf — указание на протокол, в данном случае ospf,
  • 192.168.32.0 0.0.7.255 — аргумент, указывающий на IP-адрес источника пакетов с инверсной маской,
  • any — аргумент, указывающий на все IP-адреса назначения пакетов.

Просмотр filter-map.

Для просмотра созданных списков доступа L3 служит команда show filter-map ipv4. Она показывает только списки доступа без указания их привязок к интерфейсам.

ecorouter#show filter-map ipv4
 Filter map example
  Filter 10
  match udp 10.10.10.0/24 20.20.20.0/24 eq 22
  match 1 host 192.168.1.15 host 172.20.100.1
  match ospf 192.168.32.0 0.0.7.255 any
  set accept
 Filter map TEST
  Filter 20
  match any host 10.210.10.151 any
  set accept

Для назначения списка доступа на интерфейс используется команда контекстного режима настройки интерфейса set filter-map {in | out} <FILTER_MAP_NAME> [<SEQUENCE>] . К одному интерфейсу можно привязать несколько filter-map. Здесь параметр SEQUENCE в явном виде задаётся для каждого filter-map (а не для входящих в него правил!). Все привязанные к интерфейсу filter-map будут выполняться в порядке увеличения значений SEQUENCE. Неявное правило “запретить все” будет размещено после правил из всех привязанных filter-map.

Пример привязки filter-map к интерфейсу

ecorouter(config)#interface e20
ecorouter(config-if)#set filter-map in example 10
ecorouter(config-if)#set filter-map out TEST 20

Если при привязке filter-map к интерфейсу не указывать значение SEQUENCE, то для каждого привязываемого списка доступа его значение будет присваиваться автоматически с инкрементом 10.

Один и тот же список доступа может быть назначен на несколько интерфейсов одновременно.

В EcoRouterOS может быть создано до 64 тысяч filter-map. Однако существует ограничение на количество “активных” экземпляров filter-map, то есть, назначенных на L3 интерфейс. Можно настроить не более 64-х привязок списков доступа к интерфейсам. Это ограничение не зависит от количества созданных списков доступа или интерфейсов.

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

Просмотр привязанных к интерфейсу списков доступа производится, например, при помощи команды show counters interface <INTERFACE_NAME> filter-map {in | out}.

show counters interface e20 filter-map out
Interface e20
 Filter map TEST
 Filter 10 [0 packets]
    match any host 10.210.10.151 any
    set accept