Меню
Контакты
109147, Москва, ул.Воронцовская, 35Б, корп.2 офис.11, 4 этаж
Пн-Пт: с 9-00 до 17-00   Сб-вс: выходной
Интернет-магазин
сетевого оборудования
Москва +7 (495) 103-41-03 +7 (915) 420-28-94
109147, Москва, ул.Воронцовская, 35Б, корп.2 офис.11, 4 этаж
Пн-Пт: с 9-00 до 17-00   Сб-вс: выходной
Заказать звонок

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

 24 Май 2018    MikroTik, О настройках и установке оборудования производителя Mikrotik, Практика и программирование MikroTik, Firewall, Scripts

Введение

Использование списка адресов (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

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

Источник