Я сторонник настройки фильтра в режиме "нормально закрытотого брандмауэра", это когда закрываем всё, открывая только необходимые порты или сети. Поэтому решил описать здесь базовый набор правил, и потом ссылаться на этот материал в других статьях (когда будем настраивать какой либо сервис, будет подразумеваться, что описанные здесь правила уже есть). Эти правила я рекомендую настраивать на всех устройствах, в том числе на точках доступа и коммутаторах, чтобы как минимум защитить их от попыток перебора паролей из пользовательской сети, открыв доступ к устройству только с определённых адресов или подсетей.
Перед тем как перейти непосредственно к настройке, полагаю нужным кратко ввести базовые теоретические понятия, связанные с фильтром RouterOS:
1. цепочка - сущность определяющая где будет обработан пакет, есть три встроенных цепочки:
- input - тут обрабатывается трафик, который идёт на само устройство (например если ваш роутер настроен в качестве кэширующего DNS, то в цепочке input надо будет открыть 53 порт UDP, соответственно клиенты будут делать запросы самому роутеру на этот порт, эти запросы и будут обработаны цепочкой input);
- forward - тут обрабатывается трафик проходящий транзитом через устройство, проходя из одного порта в другой (например когда у нас клиенты, находящиеся за одним портом сидят в какой то клиентской подсети, а DNS сервер находится за другим портом и в другой сети, тогда нам нужно будет создать правило в цепочке forward, где следует разрешить прохождение трафика в сеть DNS сервера из клиентской сети, на UDP порт 53);
- output - цепочка, которая обрабатывает трафик, исходящий от самого маршрутизатора (например, когда мы с маршрутизатора пингуем что то), эту цепочку обычно не фильтруем;
можно ещё самому создать цепочку, используя действие jump
2. В правиле фильтра RouterOS есть некоторый набор критериев, и набор действий, мы задаём критерии, под которые должен подпадать пакет и действие, которое должно совершиться, если пакет подпадает под критерии. Критерии задаются на вкладках General, Advanced, Extra (например подсеть или адрес источника/назначения, TCP/UDP порты, протоколы и т.д.)
Действия задаются на вкладке Action (это м.б. accept - пропуск трафика, drop - запрет, jump - создание новой цепочки и/или переход в созданную цепочку, есть ещё действия, но в этом материале поработаем только с accept и drop).
3. Действия бывают терминирующие и не терминирующие, если пакет подходит под условия правила с терминирующим действием, то его обработка прекращается, т.е. действие выполнится и дальше пакет не будет проходить проверки по остальным правилам (действия accept и drop - терминирующие), нетерминирующие действия не прекращают обработку пакета и он будет дальше проверять на совпадение по критериям следующими правилами (действие jump - нетерминирующее).
4. Обработка правил идёт по порядку, от нулевого до последнего. Порядок важен, т.к. если пакет подпадёт под условия терминирующего правила, его обработка прекратится.
5. Фильтр может работать в двух режимах:
- stateless - без отслеживания состаяния, когда независимо обрабатывается каждый пакет соединения (режим работы по умолчанию);
- statefull - с отслеживанием состояния, когда на критерии проверяется только первый пакет, а все остальные пакеты в рамках соединения уже не проверяются, т.к. относятся к уже проверенному соединению.
Режим statefull предпочтителен, т.к. уменьшает нагрузку на устройство (проверяться будет значительно меньше пакетов), в этом режиме отслеживается и в случае с действием accept, разрешается сессия, которая устанавливается между двумя устройствами, т.о. одним правилом устанавливаем двустороннюю связь.
6. Invalid траффик - неизвестный для роутера трафик, м.б. небезопасен, и блокировать его следует на ранних этапах.
7. Группы адресов - в фильтре можно создать группы адресов/подсетей, это во первых бывает удобно, можно объединить какие то адреса или подсети по определённому признаку, и можно уменьшить количество правил фильтра, подставив вместо источника или назначения группу.
По вводной части всё, перейдём к самим правилам.
- И первым делом включаем режим фильтра statefull в цепочках input и forward, для этого создаём по правилу в этих цепочках, в качестве критерия, на вкладке General раскрываем пункт "Connection State" (раскрывается он при нажатии на стрелочку вниз, которая находится справа от пункта), и проставляем галки в пунктах "established" и "related".
Выбираем действие "accept" и нажимаем ОК.
Для того, чтобы было удобно читать правила фильтра, я советую ставить комментарии. Их можно оставлять на первом правиле из однотипной группы, или если правило уникально, то на самом правиле. Для двух правил, включающих режим statefull достаточно одного комментария над верхним правилом. Комментарий можно оставить нажав кнопку "Comment" справа.
Можно сэкономить себе время, копируя однотипные правила, например создав правило в цепочке forward для включения режима statefull, можно сделать копию этого правила поменяв в ней цепочку на input (через кнопку "Copy").
- Следующим этапом, в цепочках input и forward, блокируем трафик, идентифицируемый устройством как invalid, для этого мы аналогичным образом создаём два правила (или создаём одно и потом из копии делаем второе), на вкладке General раскрываем список условий "Connection State" и ставим галку в пункте "invalid".
Действие в этих правилах будет "drop".
- Затем следует позаботится о доступе на устройство с админских ip адресов или подсетей, после того, как мы закроем фильтр финальными правилами, блокирующими весь трафик (drop all), это будет правило в цепочке input, здесь удобно использовать списки адресов (админов м.б. много и из разных подсетей, можно сделать одно правило для всех).
Вариантов как сделать доступ админам м.б. два:
- для устройств, где менее 5 правил в цепочке input можно обойтись одним правилом;
- на маршрутизаторах с большим количеством правил имеет смысл обрабатывать трафик через кастомные цепочки, используя jump, это снизит нагрузку на маршрутизатор, jump в этом материале мы не затронем.
Для начала соберём все админские адреса в адресный лист, пусть будет называться admins, для этого в настройка firewall перейдём на вкладку "Address Lists", по кнопке "+" создадим адресный лист, в поле "Name" укажем имя списка, в нашем случае это "admins", в поле "Address" укажем адрес админского хоста или целую подсеть, если существует админская подсеть, в случае с перечислением админов, советую указывать в комментариях кому даётся доступ, для предотвращения в дальнейшем путаницы.
Записи в списке адресов можно копировать аналогично правилам фильтра, имейте ввиду, что при копировании чего угодно в RouterOS (правила, записи в списках адресов, интерфейсы и т.д.), комментарии копируются в копию, и их надо будет редактировать.
Я добавил в список админов 2 записи, адрес и подсеть, и теперь список выглядит так:
Теперь составим правило, мы должны разрешить доступ на наше устройство по портам 8291 и 22 (winbox и ssh) для группы админов, для этого создаём правило фильтра, и в поле "Src. Address List" выбираем наш созданный список "admins" (в старых прошивках, поле "Src. Address List" находится на вкладке Advanced, в последней версии RouterOS это поле вынесено на вкладку General, я использую RouterOS версии long-term 6.49.13, и тут нужно нам поле находится в Advanced).
В General укажем для какого протокола действует правило (tcp), в поле "Dst. Port" через запятую перечисляем нужные порты 22,8291
Не забываем комментарии
Для отладки всякого, можно добавить правило, разрешающее icmp с адресов, находящихся в списке admins (чтобы админы могли пинговать ваше устройство со своих адресов или с адресов управляющей сети).
- Закрываем весь трафик правилами drop all в цепочках input и forward, правила просты, мы не трогаем ни какие критерии, получится совпадение по всем критериям, действие выбираем "drop".
Итого у нас получилось 7 правил. Фильтр работает в режиме Statefull, на ранних этапах отбрасывает мусорный траффик, даёт доступ на себя админам и является нормально закрытым.
Любые другие правила следует размещать между третьим правилом и пятым, если разместить выше нулевого правила, то они будут работать в режиме stateless, а ниже шестого, то просто не будут работать.
Так наши правила выглядят в текстовом виде:
/ip firewall filter
add action=accept chain=forward comment="Statefull filter" connection-state=established,related
add action=accept chain=input connection-state=established,related
add action=drop chain=forward comment="Drop invalid" connection-state=invalid
add action=drop chain=input connection-state=invalid
add action=accept chain=forward comment=Admins dst-port=22,8291 protocol=tcp src-address-list=admins
add action=drop chain=forward comment="Drop All"
add action=drop chain=input