Сравнение Закладки
Бесплатно по России:
8 800 700 97 66
Санкт-Петербург:
8 812 385 40 55
Перезвонить вам?

Настройка фильтрации трафика на Mikrotik. Часть 4

Использование списка адресов (address list)

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

Одним из вариантов создания динамических правил в файерволе является использование именованных списков адресов (address lists)

В именованный список, можно добавлять, как адреса, так и подсети. Вполне корректны следующие команды:

  • /ip firewall address-list
  • add address=192.168.0.10 list=test
  • add address=192.168.1.0/24 list=test
  • add address=192.168.2.1-192.168.2.15 list=test

Здесь мы добавили в Address-list с именем test сразу три разных записи

  • Одиночный хост 192.168.0.10
  • Подсеть 192.168.1.0/24
  • Диапазон адресов 192.168.2.1-192.168.2.15

Теперь мы все это одновременно можем обработать в файерволе в одном правиле. Например:

  • /ip firewall filter
  • add chain=forward src-address-list=test

разрешит прохождение трафика через маршрутизатор, если адрес источника находится в именованном списке test.

Однако у именованного списка адресов есть еще один замечательный параметр, который называется timeout. Он обозначает,что через какое время, после попадания в список, адрес будет оттуда автоматически удален. И если раньше, когда у Вас возникала необходимость временно разрешить или запретить какому-нибудь хосту прохождение трафика, Вы создавали правило в файерволе, а потом старались не забыть что его надо удалить, то теперь все проще.

Пример:

Нам иногда надо временно запретить прохождение трафика с какого либо из компьютеров сети.

Для начала создадим правило:

  • /ip firewall filter
  • add action=drop chain=forward src-address-list=deny-forward

А теперь мы хотим отключить хост 192.168.100.100 от Интернет на 1 час.

Набираем команду:

  • /ip firewall address-list
  • add list=deny-forward address=192.168.100.100 timeout=1h

И в общем-то и все. По истечении часа, эта запись автоматически удалится и хост получит доступ в Интернет. Удобно? Безусловно да. Но самая сильная функциональность именованных списков заключается в том, что их можно добавлять из других правил файервола, при помощи Action add dst to address list и add src to address list

Это позволяет делать динамические правила фильтрации трафика.

Например мы хотим защитить встроенный ssh сервер микротик от атаки на подбор пароля (brute force)

Создадим следующие правила:

  • /ip firewall filter
  • add action=drop chain=input dst-port=22 protocol=tcp src-address-list=ssh_blacklist
  • add action=add-src-to-address-list address-list=ssh_blacklist \
  • address-list-timeout=1w3d chain=input connection-state=new dst-port=22 \
  • protocol=tcp src-address-list=ssh_stage3
  • add action=add-src-to-address-list address-list=ssh_stage3 \
  • address-list-timeout=1m chain=input connection-state=new dst-port=22 \
  • protocol=tcp src-address-list=ssh_stage2
  • add action=add-src-to-address-list address-list=ssh_stage2 \
  • address-list-timeout=1m chain=input connection-state=new dst-port=22 \
  • protocol=tcp src-address-list=ssh_stage1
  • add action=add-src-to-address-list address-list=ssh_stage1 \
  • address-list-timeout=1m chain=input connection-state=new dst-port=22 \
  • protocol=tcp

Разберемся как это работает.

Итак, если происходит подключение к ssh-серверу, срабатывает последнее правило из списка, в результате чего адрес отправителя пакета попадает в список адресов с именем ssh_stage1 на одну минуту.Если подключение к серверу было осуществлено успешно, соединение перейдет в состояние established и эти правила, ориентированные на connection-state=new не будут срабатывать.

Если же, подключающийся не знает пароля, сервер его отключит. И при попытке подключения в течении одной минуты после первой попытки, сработает второе снизу правило. В результате чего адрес отправителя пакета попадет на одну минуту в список адресов с именем ssh_stage2.

Третья попытка подбора пароля в течении минуты приведет к попаданию атакующего на одну минуту в список с именем ssh_stage3. Если атакующий попытается подключиться в течении одной минуты после попадания его адреса в список ssh_stage3, он попадет в список ssh_blacklist на длительное время (в примере на 10 дней).

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

Понятно, что если Вы замените в примере цепочку input на forward, а dst-port замените на 3389, Вы защитите таким образом опубликованный терминальный сервер. Кстати, данный пример легко модифицируется для реализации такой технологии как Port Knocking.

Суть данной технологии заключается в том, что для того, чтобы адрес источника пакета получил доступ к защищаемому ресурсу, он должен сначала «постучать» в заранее определенной последовательности в заранее определенные порты по протоколам TCP и/или UDP.

Попробуем теперь модифицировать пример. Теперь нам надо добиться того, чтобы удаленный компьютер получил доступ к ssh серверу, «простучав» порты в последовательности tcp:2000, udp:1000, tcp:5000

Между «стуками» не должно пройти более 5 секунд. Доступ для попытки подключения после успешного простукивания портов предоставляется на 1 минуту.

Решение:

  • /ip firewall filter
  • add chain=input connection-state=new dst-port=22 protocol=tcp src-address-list=port_knock-OK
  • add action=add-src-to-address-list address-list=port_knock-OK address-list-timeout=1m \ 
  • chain=input dst-port=5000 protocol=tcp src-address-list=port_knock2
  • add action=add-src-to-address-list address-list=port_knock2 address-list-timeout=5s \ 
  • chain=input dst-port=1000 protocol=udp src-address-list=port_knock1
  • add action=add-src-to-address-list address-list=port_knock1 address-list-timeout=5s \ 
  • chain=input dst-port=2000 protocol=tcp add action=drop chain=input connection-state=new dst-port=22 protocol=tcp

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

Почитать предыдущие части:

Технический директор Илья Князев (MTCNA,MTCWE,MTCTCE,MTCRE,MTCINE)

15197
Комментарии (25)

Артем01.07.2016

Проверил защиту терминального сервера как указано в статье, но ведь сначала обрабатываются правила NAT, соответственно пакет сразу уходит на RDP сервер и не попадает в цепочку блокировки forward

ответить
Сменить картинку

Илья Князев10.07.2016

Вы бы с Packet Flow разобрались. Пакет приходит на dst-nat. После чего идет на маршуртизацию (Route Decision).
Если адрес назначения пакета равен одному из адресов маршрутизатора уходит в цепочку Input (где в том числе есть Filter Input)
Если не равен и есть маршрут до хоста назначения - уходит в цепочку Forward.

ответить
Сменить картинку

Юрий19.05.2016

Скажите, а сколько максимум правил может быть в фаерволе?

ответить
Сменить картинку

Илья Князев10.07.2016

На тренинге как-то ребята сделали бесконечный скрипт создающий правила файрвола. HAP завис после создания 31 тыс, какого-то правила. Кончилась память и место на флешке. Думаю на CCR можно и больше )))

ответить
Сменить картинку

Pavel07.04.2016

Подскажите решение!
НЕ пингуются PPPoE абоненты с внешними ip-адресами в пределах одного mikrotik, также не пингуются внешние ip если в разных vlan.
Все кто в списке allow имеют доступ к нету, все другие нет.
Правила:

/ip firewall filter \
add chain=forward action=accept in-interface="bridge1" out-interface="ether1-WAN" src-address-list="ALLOW"
add chain=forward action=accept in-interface="ether1-WAN" out-interface="bridge1" dst-address-list="ALLOW"
add chain=forward action=drop

ответить
Сменить картинку

Илья Князев10.07.2016

В пределах Mikrotik это не Forward. Рекомендую обратиться на форум. Там разберемся.

ответить
Сменить картинку

Mark24.02.2016

Добрый день. После отключения от питания почему то изчезает blackliat список. Как можно это исправить?

ответить
Сменить картинку

Илья Князев29.02.2016

Список динамический и хранится в ОЗУ.
Если нужно восстанавливать - пишите скрипты.

ответить
Сменить картинку

Сурен20.02.2016

Добрый день. Я изменил правило для защити терминального сервера но не понял одно? как мне делать чтоб не блокировать и пустил мой ип для подключения?

ответить
Сменить картинку

Сурен20.02.2016

вот после этих правил я написал
add action=accept chain=forward connection-state=new dst-port=3389 \
protocol=tcp
и после этого смог подключиться. так правильно?

ответить
Сменить картинку

Сурен20.02.2016

вот после этих правил я написал
add action=accept chain=forward connection-state=new dst-port=3389 \
protocol=tcp
и после этого смог подключиться. так правильно?

ответить
Сменить картинку

Сурен20.02.2016

вот после этих правил я написал
add action=accept chain=forward connection-state=new dst-port=3389 \
protocol=tcp
и после этого смог подключиться. так правильно?

ответить
Сменить картинку

Сурен20.02.2016

вот после этих правил я написал
add action=accept chain=forward connection-state=new dst-port=3389 \
protocol=tcp
и после этого смог подключиться. так правильно?

ответить
Сменить картинку

Сурен20.02.2016

вот после этих правил я написал
add action=accept chain=forward connection-state=new dst-port=3389 \
protocol=tcp
и после этого смог подключиться. так правильно?

ответить
Сменить картинку

Сурен20.02.2016

вот после этих правил я написал
add action=accept chain=forward connection-state=new dst-port=3389 \
protocol=tcp
и после этого смог подключиться. так правильно?

ответить
Сменить картинку

Сурен20.02.2016

вот после этих правил я написал
add action=accept chain=forward connection-state=new dst-port=3389 \
protocol=tcp
и после этого смог подключиться. так правильно?

ответить
Сменить картинку

Сурен20.02.2016

вот после этих правил я написал
add action=accept chain=forward connection-state=new dst-port=3389 \
protocol=tcp
и после этого смог подключиться. так правильно?

ответить
Сменить картинку

Сурен20.02.2016

вот после этих правил я написал
add action=accept chain=forward connection-state=new dst-port=3389 \
protocol=tcp
и после этого смог подключиться. так правильно?

ответить
Сменить картинку

Илья Князев29.02.2016

Например добавив свой IP в правило со знаком исключения (!).
src-address=!MY_IP

ответить
Сменить картинку

Виталий06.11.2016

Простите, но в статье черным по серому написано, что: "Если подключение к серверу было осуществлено успешно, соединение перейдет в состояние established и эти правила, ориентированные на connection-state=new не будут срабатывать."
Тогда как именно должно быть сконфигурировано данное правило (или их последовательность)?
У меня, при первой же попытке подключиться через putty - черное окно без приглашения консоли ввести логин и пароль (т.е. подключение просто не дошло до адресата, т.к. в данном списке правил - нет action=accept), а через 20 секунд я уже в ssh_blacklist'е

ответить
Сменить картинку

Виталий06.11.2016

... а теперь вы пишете, что надо свой ip вносить в исключения... или я что-то не правильно понял?

ответить
Сменить картинку

Виталий06.11.2016

... если я все же - все правильно понял, то:
какой смысл тогда в этой ступенчатой защите, если результат один, любой (и хакер, и правильный юзверь) попадет в блеклист... сразу, тогда уж, в блеклист всех, кто не с правильным ip, без всяких промежуточных минутных правил
и соответственно - польза, от такого правила (речь, именно о приведенном в статье примере) как-то сомнительна
т.е. данный пример, требует существенной доработки, для того, чтобы он работал так, как описано в статье

ответить
Сменить картинку

Виталий07.11.2016

для полноты картины - привожу часть листинга фаервола:
> /ip firewall export
# nov/07/2016 03:56:07 by RouterOS 6.37.1
#
/ip firewall address-list
add address=0.0.0.0/8 list=BOGON
add address=10.0.0.0/8 list=BOGON
add address=100.64.0.0/10 list=BOGON
add address=127.0.0.0/8 list=BOGON
add address=169.254.0.0/16 list=BOGON
add address=172.16.0.0/12 list=BOGON
add address=192.0.0.0/24 list=BOGON
add address=192.0.2.0/24 list=BOGON
add address=192.168.0.0/16 list=BOGON
add address=198.18.0.0/15 list=BOGON
add address=198.51.100.0/24 list=BOGON
add address=203.0.113.0/24 list=BOGON
add address=224.0.0.0/4 list=BOGON
add address=240.0.0.0/4 list=BOGON
/ip firewall filter
add action=drop chain=input comment="Drop from BOGON to WAN" disabled=no \
in-interface=WAN1 src-address-list=BOGON
add action=accept chain=input comment="Input connection state=established" \
connection-state=established
add action=accept chain=input comment="Input connection state=related" \
connection-state=related
add action=accept chain=input comment=ICMP protocol=icmp
add action=accept chain=input comment="SSH & WinBox" connection-state=new \
dst-port=8291,22 protocol=tcp disabled=yes
add action=drop chain=input dst-port=22 protocol=tcp src-address-list=\
ssh_blacklist
add action=add-src-to-address-list address-list=ssh_blacklist \
address-list-timeout=1w3d chain=input connection-state=new dst-port=22 \
protocol=tcp src-address-list=ssh_stage3
add action=add-src-to-address-list address-list=ssh_stage3 \
address-list-timeout=1m chain=input connection-state=new dst-port=22 \
protocol=tcp src-address-list=ssh_stage2
add action=add-src-to-address-list address-list=ssh_stage2 \
address-list-timeout=1m chain=input connection-state=new dst-port=22 \
protocol=tcp src-address-list=ssh_stage1
add action=add-src-to-address-list address-list=ssh_stage1 \
address-list-timeout=1m chain=input connection-state=new dst-port=22 \
protocol=tcp

ответить
Сменить картинку

Виталий09.11.2016

Раз уж ответа н кто не дал - отвечу сам:
Правило:
add action=accept chain=input comment="SSH & WinBox" connection-state=new \
dst-port=8291,22 protocol=tcp disabled=no
должно быть после всех ниже приведенных правил (add action=add-src-to-address-list)


также добавлю, что это, все же достаточно посредственный пример.. так как, закрывать таким правилом, к примеру 80 порт роутера, сродни автобану из-за количества одновременных запросов отправляемых браузером

ответить
Сменить картинку

Яр11.01.2016

Супер! Я всё больше начинаю любить Микротик!
Шикарно было бы увидеть статью, как сохранять в журнал Микротика данные через свободный порт с COM-порта упса APC о состоянии электросети.

ответить
Сменить картинку
Комментировать
Сменить картинку

Похожие решения

все события