Введение
Использование списка адресов (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
Таким образом, работа с именованными списками адресов значительно расширяет возможности настройки фильтрации пакетов. А возможность заполнять эти списки из правил файрвола, а так же возможность указания времени на которое адрес попадает в список, позволяет создавать сложные интеллектуальные правила фильтрации трафика.