MikroTik : RouterOS : Стучимся к себе домой. Firewall Filter PortKnocking

gost-portknocking-main Роутеры

Добро пожаловать!

При написании статьи актуальная RouterOS: 6.44.5 (long-term)

В одной из статей я рассказывал про настройку защиты своей сети через Firewall
Вот эта статья: Создание домашней сети на базе устройств MikroTik: Часть 6 – Firewall защита доступа

А, что делать, если нам некогда контролировать каждый чих снаружи? Может быть есть какой-то способ?
Да, такой способ есть и называется он «Port Knocking» или по нашему «Простукивание портов». В принципе в интернете уже присутствует достаточно много статей на эту тему и я бы хотел добавить свою ложку практического применения в эту кашу 🙂

Если Вы хотите изучить MikroTik, то это можно реализовать с помощью специального онлайн-курса "Настройка оборудования MikroTik". В курсе изучаются все темы из официальной программы MTCNA, а автором курса является официальный тренер MikroTik. Материал подходит и тем, кто уже давно работает с оборудованием MikroTik, и тем, кто даже не держал его в руках. В состав курса входят 162 видеоурока, 45 лабораторных работ и вопросы для самопроверки с конспектом. Кстати я получал сертификат MTCNA именно тут!

Данный метод заключается в простом переборе портов с заданными интервалами или же если использовать характеристики того же ICMP, то с различными размерами пакетов.
Добавлении IP адреса с таймаутом, с которого мы стучимся, в список IP адресов «Access List», с которого в свою очередь в Firewall Filter есть необходимые разрешения.
Тем самым мы даем доступ на ограниченное время только одному IP адресу под которым мы(или наш удаленный девайс) сидим.

У себя я выбрал путь наиболее простой, а именно вариант «ICMP Knocking», ниже будет дополнение, как сделать на различных портах, суть не особо меняется.

Основная настройка Firewall

Перед тем, как приступить непосредственно к описанию ICMP Knocking, я хочу показать, что получилось в итоге.
Перед тем, как приступить непосредственно к описанию ICMP Knocking, я хочу показать, что получилось в итоге.
За все время существования у меня продукции компании Mikrotik, а это без малого около 5 лет(с 2014 года) я перепробовал достаточно много различных конфигураций, одна из них описана в статье Создание домашней сети на базе устройств MikroTik: Часть 6 – Firewall защита доступа
Основным роутером у меня уже успел стать hEX S, а hAP ac уже успел стать простой Wi-Fi точкой доступа, подключенной к hEX S по PoE-out на 5 порту.
В данном блоке я представлю вам мой текущий Firewall на роутере hEX S
Собственно сам конфиг «Firewall Filter»:
gost-portknocking-firewall
Кликабельно
Консольно:
[RC]/ip firewall filter
add action=fasttrack-connection chain=forward connection-state=established,related protocol=tcp
add action=fasttrack-connection chain=forward connection-state=established,related protocol=udp
add action=accept chain=forward comment=»ALLOW — Established, Related and Untracked connections» connection-state=established,related
add action=accept chain=input connection-state=established,related in-interface-list=Internet
add action=accept chain=input comment=»ALLOW — All after ICMP knocking» in-interface-list=Internet src-address-list=»Access IP»
add action=accept chain=forward in-interface-list=Internet src-address-list=»Access IP»
add action=drop chain=forward comment=»DROP — Invalid connections» connection-state=invalid
add action=jump chain=forward comment=»DDoS — SYN flood protection» connection-state=new in-interface-list=Internet jump-target=SYN-Protect protocol=tcp tcp-flags=syn
add action=jump chain=input connection-state=new in-interface-list=Internet jump-target=SYN-Protect protocol=tcp tcp-flags=syn
add action=return chain=SYN-Protect limit=200,5:packet tcp-flags=»»
add action=add-src-to-address-list address-list=ddos-blacklist address-list-timeout=1d chain=SYN-Protect log=yes log-prefix=»DDoS: SYN-Protect» tcp-flags=»»
add action=jump chain=forward comment=»DDoS — Main protection» connection-state=new in-interface-list=Internet jump-target=DDoS-Protect
add action=jump chain=input connection-state=new in-interface-list=Internet jump-target=DDoS-Protect
add action=return chain=DDoS-Protect dst-limit=15,15,src-address/10s
add action=add-src-to-address-list address-list=ddos-blacklist address-list-timeout=1d chain=DDoS-Protect log=yes log-prefix=»DDoS: MAIN-Protect»
add action=jump chain=input comment=»Port Knocking — Permission to access the router» in-interface-list=Internet jump-target=port-knocking log-prefix=PING protocol=icmp
add action=add-src-to-address-list address-list=»Access IP Gate 1″ address-list-timeout=30s chain=port-knocking in-interface-list=Internet log-prefix=»Access IP Gate 1″ packet-size=255 protocol=icmp
add action=add-src-to-address-list address-list=»Access IP Gate 2″ address-list-timeout=30s chain=port-knocking in-interface-list=Internet log-prefix=»Access IP Gate 2″ packet-size=350 protocol=icmp src-address-list=»Access IP Gate 1″
add action=add-src-to-address-list address-list=»Access IP» address-list-timeout=8h chain=port-knocking in-interface-list=Internet log-prefix=»Access IP» packet-size=650 protocol=icmp src-address-list=»Access IP Gate 2″
add action=add-src-to-address-list address-list=»Access IP» address-list-timeout=8h chain=port-knocking in-interface-list=Internet log-prefix=»Access IP» packet-size=530 protocol=icmp src-address-list=»Access IP Gate 2″
add action=return chain=port-knocking
add action=drop chain=input comment=»DROP — Block all other input/forward connections on the WAN» in-interface-list=Internet
add action=drop chain=forward in-interface-list=Internet[/RC]

Конфиг «Firewall NAT» (перенаправления я вырезал, чтобы не смущать):

gost-portknocking-firewall-nat
Кликабельно
Консольно:
[RC]/ip firewall nat
add action=masquerade chain=srcnat comment=»MASQ — Internet out masquerade» out-interface-list=Internet src-address=192.168.88.0/24
add action=dst-nat chain=dstnat comment=»NTP — Sending all requests to the 88.1″ dst-port=123 in-interface-list=Local protocol=udp to-addresses=192.168.88.1 to-ports=123[/RC]

Конфиг «Firewall Mangle» практически пуст, разве что есть динамические правила от fasttrack connection.

Конфиг «Firewall Raw»:

gost-portknocking-firewall-raw
Кликабельно
Консольно:
[RC]/ip firewall raw
add action=drop chain=prerouting comment=»DDoS — Drop blacklist IP» in-interface-list=Internet src-address-list=ddos-blacklist
add action=accept chain=prerouting comment=»ALLOW — Resolved SIP provider» in-interface-list=Internet protocol=udp src-address-list=SIP
add action=drop chain=prerouting comment=»DROP — Not allow SIP» dst-port=5060,5061 in-interface-list=Internet protocol=udp
add action=drop chain=prerouting dst-port=5060,5061 in-interface-list=Internet protocol=tcp[/RC]

Как можно видеть у меня нет каких-то громоздких конструкций, я не использую IPsec, DualWAN или что-то еще, что обычно влечет за собой портянки правил.

Как обычно вы можете взять данную конструкцию и применить её у себя, доработать, указать мне на какую-то ошибку и т.д. 🙂
Я не считаю, что это идеальный вариант, но как мы знаем у каждого свое применение и моя конфигурация, это только моя конфигурация, собранная из опыта и исследований. На текущий момент она меня полностью устраивает, а завтра… кто знает, что будет завтра!

Если вы планируете проброс портов без Access IP листа в данной конфигурации, то столкнетесь с тем, что соединение будет блокироваться в Firewall Filter последним правилом action=drop chain=forward in-interface-list=Internet
Это связано с тем, что таблица NAT отрабатывает раньше таблицы FILTER (а таблица RAW раньше NAT) согласно Connaction Tracker. И соответственно chain,dst-address и dst-port меняются.
Для того, чтобы проброс работал корректно, необходимо либо добавлять правила в Firewall Filter по типу: chain=forward action=accept protocol=tcp dst-address=192.168.88.100 dst-port=22
Либо отключить последнее правило в Firewall Filter: action=drop chain=forward in-interface-list=Internet

Разбор ICMP Knocking в конфигурации Firewall Filter

Давайте взглянем на набор правил для ICMP стучалки:

gost-portknocking-knocking-1
 
Консольно:
[RC]add action=jump chain=input comment=»Port Knocking — Permission to access the router» in-interface-list=Internet jump-target=port-knocking log-prefix=PING protocol=icmp
add action=add-src-to-address-list address-list=»Access IP Gate 1″ address-list-timeout=30s chain=port-knocking in-interface-list=Internet log-prefix=»Access IP Gate 1″ packet-size=255 protocol=icmp
add action=add-src-to-address-list address-list=»Access IP Gate 2″ address-list-timeout=30s chain=port-knocking in-interface-list=Internet log-prefix=»Access IP Gate 2″ packet-size=350 protocol=icmp src-address-list=»Access IP Gate 1″
add action=add-src-to-address-list address-list=»Access IP» address-list-timeout=8h chain=port-knocking in-interface-list=Internet log-prefix=»Access IP» packet-size=650 protocol=icmp src-address-list=»Access IP Gate 2″
add action=add-src-to-address-list address-list=»Access IP» address-list-timeout=8h chain=port-knocking in-interface-list=Internet log-prefix=»Access IP» packet-size=530 protocol=icmp src-address-list=»Access IP Gate 2″
add action=return chain=port-knocking[/RC]

Все дальнейшие описания относятся к интерфейсам добавленным в интерфейс лист — Internet. В правилах это видно. Будьте внимательны!
Как видим первое правило это прыжок(action=jump) пакетов в icmpv4 протоколе (protocol=icmp) в другую цепочку (jump-target=port-knocking). Так будет проще обрабатывать icmp пакеты.
Следующее правило уже должно отработать по размеру ICMP пакета(packet-size=255) и добавить IP адрес источника(Src.Address — например IP нашего мобильного или ноутбука) в отдельный Address List по ступени 1(address-list=»Access IP Gate 1″) с временем до удаления из списка в 30 секунд(address-list-timeout=30s). Таких ступеней вы можете наделать целую кучу, усложняя всю цепочку. У меня их всего 3.
Далее идет аналогичное правило, только размер пакета и Address List немного другие — (address-list=»Access IP Gate 2″) (packet-size=350). При этом обязательным условием должно быть присутствие IP адреса источника(Src.Address) в первом Address List-е. Т.е. между подачей запросов должно пройти менее 30 секунд(вы можете это время настраивать, хоть от 1 секунды).

Последние два правила служат для RouterOS и Windows систем. Я заметил, что некоторые ПК на Windows не отправляют пакеты размером менее 200(Некоторые!), мой ноутбук относится к такому Windows.
Мне было лень перенастраивать клиентов и я просто добавил отдельное правило. Кстати это показывает, что можно включить лог и отслеживать откуда и кто проходит запрос 🙂
И предпоследнее правило, при прохождении, отправляет IP адрес источника(Src.Address) в Address List на доступ(address-list=»Access IP»). IP удалится из Address List через 8 часов(address-list-timeout=8h), мне этого обычно хватает с головой.
В самом конце нам необходимо вернуть ICMP запрос в основную цепочку(add action=return chain=port-knocking), где он уже получит сброс(drop) на chain=input.

Просто добавить данный набор правил не достаточно. Необходимо их расположить правильно в фильтре, среди других правил и еще не забыть дать необходимый доступ нашему Address List-у(address-list=»Access IP»).
Правила port-knocking располагаем сразу над блокирующими.

А вот правила доступа для address-list=»Access IP» необходимо располагать ближе к началу, под разрешающими правилами established и related соединений.

gost-portknocking-knocking-2
 
Консольно:
[RC]add action=accept chain=input comment=»ALLOW — All after ICMP knocking» in-interface-list=Internet src-address-list=»Access IP»
add action=accept chain=forward in-interface-list=Internet src-address-list=»Access IP»[/RC] Соответственно для всех IP присутствующих в листе Access IP будет предоставлен необходимый доступ. Конечно мы можем разрешить доступ только к определенным портам или службам, а не отдавать совсем все, тут уже на ваше усмотрение.

Как же нам воспользоваться всем этим хозяйством на практике? А об этом ниже…

Доступ с удаленного клиента Mikrotik RouterOS

Т.к. основной роутер закрыт от всех и вся и при этом доступен icmp knocking, необходимо позволить подключаться моим удаленным роутерам по OpenVPN. Не очень хочется держать открытым порт 1194 и другие порты для всех подряд.
Для этого я использую скрипт в RouterOS(scripts) и запускаю его через планировщик(scheduler) каждую минуту
Чтобы добавить новый скрипт необходимо пойти в System->Scripts и нажать кнопку плюс:

gost-portknocking-scripts-1
 
gost-portknocking-scripts-2
 
Консольно:
[RC]/system script
add dont-require-permissions=no name=icmp_knock policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source=»:\
local IP 1.1.1.1\r\
\n:local PING\r\
\n:set \$PING [/ping \$IP count=1]\r\
\n:if (\$PING<1) do={\r\ \n # Step 1\r\ \n /ping \$IP count=1 size=255\r\ \n :delay 2s\r\ \n # Step 2\r\ \n /ping \$IP count=1 size=350\r\ \n :delay 2s\r\ \n # Step 3\r\ \n /ping \$IP count=1 size=650\r\ \n :delay 2s\r\ \n :set \$PING [/ping \$IP count=1]\r\ \n :if (\$PING>0) do={\r\
\n :log info \»Access Granted\»\r\
\n } else={\r\
\n :log info \»Access Failed\»\r\
\n }\r\
\n}»[/RC] Естественно вы подставляете IP адрес своего основного роутера(или резолвите доменное имя)
[RC]:local IP [:resolve google.com][/RC]

Потом добавляем этот скрипт на выполнение в планировщик System->Scheduler

gost-portknocking-sched-1
 
 
Консольно:
[RC] /system scheduler
add interval=1m name=start_icmp_knock on-event=»/system script run \»icmp_knock\»» policy=\
ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon start-time=startup
[/RC]

Все, после добавления задачи в планировщик, можем наблюдать, как наш удаленный роутер стучится к основному роутеру каждую минуту, если пинга нет, то проходит все адрес листы и попадает в последний «Access IP» с временем жизни 8 часов. Далее этот скрипт просто пингует удаленный роутер и пока наш IP висит в разрешенных, мы имеем необходимые доступы.

А как же быть с Windows ПК если я хочу получить удаленный доступ скажем в командировке? Об этом ниже…

Доступ с удаленного клиента Windows

Для того, чтобы получить доступ из Windows создаем обычный BAT файл. Его можно создать самым простым блокнотом и сохранить файл с расширением .bat

gost-portknocking-windows-1
 
В данном файле должен быть код:
@ECHO OFF
echo ICMP KNOCK STEP 1
ping 1.1.1.1 -n 1 -f -l 227 > Nul
TIMEOUT /T 5 /NOBREAK
echo ICMP KNOCK STEP 2
ping 1.1.1.1 -n 1 -f -l 322 > Nul
TIMEOUT /T 5 /NOBREAK
echo ICMP KNOCK STEP 3
ping 1.1.1.1 -n 1 -f -l 622 > Nul
echo ICMP KNOCK END
TIMEOUT /T 5 /NOBREAK

Важное замечание!
Вы могли увидеть различные размеры icmp пакетов.
В скрипте RouterOS 255, а в bat файле 227. Разница в 28 байт, откуда она взялась?
Это связано с особенностью работы TCP/IP в ОС. Мы отнимаем 28 байт потому, что:
20 байт — зарезервировано для заголовка IP -адреса
8 байт — выделяется для заголовка запроса протокола ICMP(ICMP Echo Request)
 
Т.е. если наш роутер ожидает пакет размером 255 байт, то мы должны отправить 227 байт, а 28 байт к нему сами приклеятся.

В принципе этого будет достаточно для попадания нашего IP в адрес лист.
Что касается Linux, то те, кто с ним работают прекрасно знают, как можно повторить подобную схему на том же bash 🙂
И конечно macOS… У меня нет ПК от яблочной компании, потому призываю тех, у кого оно есть, написать в комментариях, как они решают этот вопрос, а я добавлю в статью )

Хорошо, с ПК мы доступ получаем, а как же мобильные устройства? А об этом еще ниже…

Доступ с удаленного клиента Android/iOS

Тут в принципе тоже все просто — ставим приложение позволяющее «простукивать» порты и использовать icmp протокол.
Я использую приложение «Knock on Ports». Пробовал разные и только в этом меня все устроило в части ICMP и различных параметров.

gost-portknocking-android-1
При открытии приложения в нем пусто, нажимаем кнопку плюс для добавления нового действия
gost-portknocking-android-2
Вводим название, IP адрес выданный провайдером, выбираем протокол ICMP. Настройки изменяться
gost-portknocking-android-3
В дополнительных настройках указываем время между запросами, я указал 2 секунды (это 2000 мс). А вот с заголовками отдельная история…
Отдельно хочется остановиться на настройке «Размер ICMP пакета», он тут почему-то инверсный. То ли переведено не правильно, то ли запрограммировано изначально. Надеюсь поправят, но опытным путем я выяснил, что вариант «с ICMP и IP заголовками» это как раз отправка запроса без них! Будьте внимательны.
Спасибо комментатору Alex. Небольшие правки!
Отдельно хочется остановиться на настройке «Размер ICMP пакета», он тут немного вводит в заблуждение.

  1. На самом деле, когда мы указываем этот параметр «без заголовков» программа формирует указанный пользователем размер пакета без учета заголовков. Т.е. происходит следующее:
    При отправке 100 байт без учета заголовков, программа формирует пакет размером 128 байт (100 байт, что указал пользователь в программе, плюс 8 байт ICMP заголовок, плюс 20 байт IP заголовок).
  2. Когда мы указываем этот параметр «с ICMP заголовком», программа формирует пакет размером 112 байт (получается 92 байта данных и 20 байт IP заголовок).
  3. Когда мы указываем этот параметр «с IP и ICMP заголовками» программа формирует пакет в 100 байт с учетом всех заголовков и делает пакет размером 100 байт (получается 72 байта данных, 8 байт ICMP заголовок, 20 байт IP заголовок).

Потому для более простого взаимодействия лучше ориентироваться на вариант «с IP и ICMP заголовками».

gost-portknocking-android-4
Так выглядит финальный результат основной настройки
gost-portknocking-android-5
Так выглядит финальный результат дополнительной настройки
gost-portknocking-android-6
Ну и для проверки кликаем на слово «Постучать»

Что касается iOS, то Рекомендую поискать аналогичное приложение. Если у вас есть на примете хорошее опробованное, сообщите мне в комментарии.

А если не хочется использовать ICMP, что использовать? Ответ ниже…

Альтернатива ICMP Knocking, это сам Port Knocking

Если не хочется использовать простой ICMP Knocking, можно использовать простукивание определенных портов TCP и UDP. Каждых портов нам доступно почти по 65000
Если кратко, то правила могут выглядеть так:
[RC] add action=add-src-to-address-list address-list=»Access IP Gate 1″ address-list-timeout=30s chain=input dst-port=50231 in-interface-list=Internet protocol=tcp
add action=add-src-to-address-list address-list=»Access IP Gate 2″ address-list-timeout=30s chain=input dst-port=41264 in-interface-list=Internet protocol=udp
[/RC] Т.е. необходимо «постучать» на TCP порт 50231 и потом сразу на UDP порт 41264. Номера выставляйте сами и делаете цепочки различной длины тем самым усложняя путь.
Есть еще не много информации на официальной Wiki(ENG): https://wiki.mikrotik.com/wiki/Port_Knocking

Заключение

Вот в принципе все, что я хотел вам показать по данной тематике. Надеюсь данная статья оказалась полезной и познавательной. Безусловно в сети достаточно уже много материала по Port Knocking на MikroTik, но я не мог обойти данную тему стороной т.к. многие не показывают в каком порядке они используют данные правила и как это можно применить на практике даже в домашних условиях!
Задавайте вопросы, делитесь мнениями, обсуждайте 🙂 Буду участвовать по мере своих возможностей.

Благодарю за ваше время!
Всего хорошего на просторах Интернета 😉

UPD: 06.11.2019
Добавлена заметка в Основную настройку Firewall по перенаправлению портов без «Access IP» адрес листа.

Выразить благодарность автору
Если Вам не безразлична судьба блога или Вы просто хотите отблагодарить Автора за его труд, смело переходите на страницу Поддержки, там описана вся информация, по тому, как это сделать. Заранее благодарен вам за данную инициативу!
Хочешь получать уведомления о выходе новых статей?
Loading
Если Вы хотите изучить MikroTik, то это можно реализовать с помощью специального онлайн-курса "Настройка оборудования MikroTik". В курсе изучаются все темы из официальной программы MTCNA, а автором курса является официальный тренер MikroTik. Материал подходит и тем, кто уже давно работает с оборудованием MikroTik, и тем, кто даже не держал его в руках. В состав курса входят 162 видеоурока, 45 лабораторных работ и вопросы для самопроверки с конспектом. Кстати я получал сертификат MTCNA именно тут!
GregoryGost

Мир интересен, если вы достаточно любопытны!!!

Оцените автора
GREGORY GOST
Добавить комментарий

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.

  1. Сергей

    Спасибо за новое знание в копилке)))
    Всë никак не получается прикрутить смарт на android 13 к ikev2… надоело. Стучалка прям выход из ситуации!
    Мне надо было разделить аксесс-листы по разным портам, сделал несколько комбинаций, и теперь не знаю бед.

    Ответить
  2. k1eman

    Добрый день, подскажите, ника не могу запустить скрипт на микротике, вообще никакой реакции! Скрипт добавлял и через консоль, и писал руками, результат 0
    Из под Win через bat файл все получается, основной роутер пингуется!

    Ответить
    1. k1eman

      Насчет через bat и Win проверял логи на основном роутере, пинг проходит, роутер правила отрабатывает, а вот при попытке запустить скрипт на втором микротике нет. Но запустил скрипт из терминала (/system/script> run icmp_knock) все работает, скрипт отрабатывает, при запуске через меню, посредством кнопки Run script, либо через шедулер отправляет только 1 пакет и все.

    2. k1eman

      Посмотрел логи, странно как-то отрабатывает скрипт, если запускать из терминала (system script/run icmp_knock) то скрипт работает, т.е. пингует удаленный роутер, после чего отправляет все 3 ICMP пакета нужной длины, если запускать из меню Scripts (либо через Scheduler), то только пингует удаленный роутер (1 ICMP пакет длиной 56) и на этом его работа заканчивается, т.е. не проходит проверку доступности, вернее наоборот, проходит и все!

  3. Евгений

    Для port knocking можно обойтись без приложения, если у вас есть где-то подконтрольный веб-сайт, любой.

    В HTML-код одной из страничек разбрасываете равномерно теги обращений к вашему роутеру, типа таких «пустышек»:

    … код сайта …


    В общем, чтоб запускались запросы к правильным портам в верной последовательности, с некоторыми интервалами по мере загрузки страницы.

    Адрес секретной страницы сайта сообщаете клиенту в почте, мессенджером… да хоть в SMS. Инструкция: зайти на страничку любым браузером, с этого устройства минуты на три можно подключаться, скажем, к RDP. Если оторвется надолго и не цепляется — снова зайти на страничку и попробовать.

    Простой и удобный способ. Достаточно секьюрный, если сайт и роутер никак не связаны. Выручает, бухи на удаленке не жалуются.

    Ответить
    1. Евгений

      Бот выжрал теги из комменария %(

      В общем, там теги img с src равным http с адресом вашего роутера и простукиваемым портом после двоеточия.

  4. Maks

    Обновили приложение и теперь нужно отнимать 28 байт от пакета, и в дополнительно ставить «без заголовков».

    Ответить
    1. GregoryGost автор

      Благодарю за актуальную информацию!

  5. Pavel

    Григорий, подскажите, переодически в ddos black list попадают айпи адреса моих провайдеров, фаерваол настроен полностью по этой статье

    Ответить
    1. GregoryGost автор

      Павел,
      Сообщите провайдеру о таком поведении с их адресов.
      Соответственно сообщите им параметры правил, по которым идет «попадание».

      У меня данные правила уже несколько лет работают успешно и никаких проблем я с этим не испытывал ни разу.

    2. Pavel

      Если у меня pptp подключение через ether1, должег ли ether1 входить в interface-list Internet?

    3. GregoryGost автор

      Должен

    4. Pavel

      DDoS: MAIN-Protect DDoS-Protect: in:ether2 out:(unknown 0), src-mac 88:43:e1:dc:73:00, proto 47, 172.16.4.45->10.15.39.250, len 1436

      вот такого плана логи, т е сам себя заносит в блек лист, помогите((

    5. GregoryGost автор

      Подгоняйте под себя параметры dst-limit=15,15,src-address/10s. Изучите работу правила dst-limit.
      Только важно понимать, что мы возвращаем в основную цепочку только те соединения, которые не превышают указанных значений.

      Либо настраивайте правила дальше т.к. proto 47 в логах это протокол GRE, который применяется в PPTP
      «Трафик PPTP использует TCP-порт 1723 и IP-протокол GRE»
      Если не будет получаться измените правило jump и исключите в нем GRE протокол. Но лучше разобраться в том, почему он не проходит в рамках текущей конфигурации.

      Также проверьте включен ли pptp в Firewall->Service Ports, если нет, то включите.

      Логично предположить, что запросы по GRE превышают указанный dst-limit.

      И еще, в логе указан in:ether2, а вы в прошлых комментариях указывали про pptp работающий через ether1. Так какие интерфейсы относятся к списку Internet ? И где истина?

    6. Pavel

      у меня 2 isp, оба pptp, один через ether1, другой через ether2. pptp в service ports включен. Не понятно как работает dst-limit и что-то инфы по нему не особо

  6. Николай

    Я правильно понял что строка 20 — лишняя в правилах?

    Ответить
    1. GregoryGost автор

      Не совсем, она показывает то, что описано следом в заметке.

  7. Анатолий

    Скажите, я правильно понял, что если фаервол настраивался примерно по вашим статьям (Часть 6 – Firewall защита доступа), то настроив icmp-кнокинг правила 1.5-1.7 теряют свою актуальность и их можно убрать, а правила 1.2-1.4 можно оставить?

    Ответить
    1. GregoryGost автор

      В целом да, 1.4. кстати тоже можно не использовать
      Можно оценить отличия по этому скрину https://gregory-gost.ru/wp-content/uploads/2019/10/gost-portknocking-firewall.png
      Я оставил только минимальный DDoS protect

  8. halfsky

    Добрый день, прекрасный конфиг, настроил, работает как часы.
    Есть пара вопросов. Версия RouterOS 6.46.5

    1) У меня не получается настроить VPN L2tp IPsec
    настраивал так

    /interface list
    add  name=VPN_L2TP_Users
    /interface list member
    add interface=LAN-Bridge list=VPN_L2TP_Users
    /ip firewall address-list
    add list=VPN_L2TP_Users
    /ip pool
    add  name=VPN_Users ranges=10.255.255.0/24
    /ppp profile
    set *0 interface-list=VPN
    add address-list=VPN_L2TP_Users change-tcp-mss=yes interface-list=\
        VPN_L2TP_Users local-address=10.255.255.1 name=L2TP_Profiles only-one=yes \
        remote-address=VPN_Users use-compression=no use-encryption=no
    
    /interface l2tp-server server
    set authentication=mschap2 caller-id-type=number default-profile=\
        L2TP_Profiles enabled=yes ipsec-secret=********* use-ipsec=required
    /ppp secret
    add name=user1 password=******** profile=L2TP_Profiles service=l2tp
    
    /ip firewall filter
    add action=accept chain=input comment="\"Allow port\r\
        \nfor L2TP server\"" dst-port=1701,500,4500 protocol=udp
    add action=accept chain=input comment=\
        "\"Allow esp protocol for\r\
        \nL2TP/Ipsec server\"" protocol=ipsec-esp

    После этого настроил подключение в винде, убрал галку «использовать основной шлюз удаленной сети»

    В итоге на клиентской машине видно, что соединение установлено, если после этого зайти в винбокс во вкладку ppp-active connections, то видно , что user1 благополучно подключился и получил адрес из пула 10.255.255.0/24 , но в итоге с клиентской машины ( ее сеть 192.168.55.0/24) нет доступа к локальной сети за натом 192.168.88.0/24

    я попробовал сделать следующее
    во вкладке PPP-Profiles-L2tp_Profiles поменял значения с
    local-address=10.255.255.1
    remote-address=VPN_Users
    на
    local-address=dhcp
    remote-address=dhcp

    в итоге vpn user1 получил адрес внутренней сети микротика 192.168.88.0/24 и все прекрасно заработало, то есть с клиентской машины (192.168.55.0/24 ) появился доступ в сеть 192.168.88.0/24 , так и обратно доступ из сети 192.168.88.0/24 в сеть 192.168.55.0/24

    подскажите пожалуйста ( если не сложно объясните подробно, можно в виде скрипта) что конкретно нужно сделать, чтоб все это заработало… полагаю, что сети 10.255.255.0/24 и 192.168.88.0/24 » не дружат» меж собой…

    Вопрос второй

    Стоит ли в текущий конфиг( то есть есть ли смысл ) добавлять правила по защите от скана портов и ставить трапы на самые » популярные» порты такие как 5060,5061,4569,3389,8291,22,23,389,445,53
    ниже сами правила

    /ip firewall address-list
    add comment="Trap for TCP traffic" list=TrapAddress
    add address=192.168.88.0/24 comment="White list Trap for TCP traffic" \
        list=NotTrapsIP
    /ip firewall filter
    
    add action=add-src-to-address-list address-list=TrapAddress \
        address-list-timeout=1w7s chain=input comment="Trap for port scanning" \
        in-interface-list=Internet protocol=tcp psd=10,10s,3,1 src-address-list=\
        !NotTrapsIP
    add action=add-src-to-address-list address-list=TrapAddress \
        address-list-timeout=3d3s chain=input comment="Trap for TCP traffic" \
        connection-nat-state=!dstnat dst-port=\
        5060,5061,4569,3389,8291,22,23,389,445,53 in-interface-list=Internet \
        protocol=tcp src-address-list=!NotTrapsIP
    add action=add-src-to-address-list address-list=TrapAddress \
        address-list-timeout=3d3s chain=input comment="Trap for UDP traffic" \
        connection-nat-state=!dstnat dst-port=5060,4569,389,53,161 \
        in-interface-list=Internet protocol=udp src-address-list=!NotTrapsIP
    
    /ip firewall raw
    add action=drop chain=prerouting comment="Drop Address from Trap" \
        src-address-list=TrapAddress
    Ответить
  9. Борис

    На IOS есть программа KnockOnD, попробуйте

    Ответить
    1. GregoryGost автор

      Спасибо, посмотрим

  10. Руслан

    Григорий настроил по вашей статье доступ получаю. Но перестал работать нат, порты не пробрасываются . Не могли бы вы в статье дополнить примером, как пробросить извне порт в локальную сеть без добавления айпи адреса в список разрешенных? Ситуация следующая: в локальной сети есть сервер видео наблюдения и клиенты через интернет подключаются к нему. Всем клиентам не настроишь же port knocking/
    Спасибо

    Ответить
    1. GregoryGost автор

      Здравствуйте,
      Для этого нужно исключить параметр Src.Address List из правила проброса.
      Таблица NAT отрабатывает раньше чем таблица FILTER, поэтому правила в Filter на Input не будут оказывать влияния на правила проброса. Можете убедиться в этом, при запросе счетчик байт и пакетов будет увеличиваться в nat правиле.
      Для примера правило работающее по разрешенному списку

      add action=dst-nat chain=dstnat dst-port=15555 in-interface-list=Internet protocol=tcp src-address-list="Access IP" to-addresses=192.168.88.100 to-ports=22

      И это же правило без разрешенного списка

      add action=dst-nat chain=dstnat dst-port=15555 in-interface-list=Internet protocol=tcp to-addresses=192.168.88.100 to-ports=22

      Далее, если вы следовали моей статье, правило попадет в ограничитель forward drop в самом низу таблицы /ip firewall filter
      Это означает, что нужно добавить еще разрешающее правило в /ip firewall filter, но уже с измененными параметрами в NAT

      add action=accept chain=forward dst-port=22 protocol=tcp dst-address=192.168.88.100

      Либо отключить последнее правило forward drop, тогда не будут нужны дополнительные правила в /ip firewall filter

  11. Денис

    Добрый вечер Григорий! Спасибо за новые настройки firewall. Я их применил и вроде бы пока все работает кроме bandwith test.
    Я пытаюсь подсоедениться к микротиковскому публичному серверу, но безуспешно(( хотя ранее со старыми настройками все работало. В чем я мог ошибиться?
    Команда для консоли: /tool bandwidth-test 207.32.194.24 user=btest password=btest direction=both

    Ответить
  12. Alex

    > Надеюсь поправят, но опытным путем я выяснил, что вариант “с ICMP и IP заголовками” это как раз отправка запроса без них!

    В любом случае пакеты уходят с заголовками, невозможно отправить пакет без заголовков.
    Вы неверно поняли суть параметра.
    Параметр определяет то, в каком виде Вы указываете в последовательности размер пакета.

    Допустим, прописали пакет в 100 байт.

    Если установлен режим «без заголовков»:
    Приложение смотрит — ага, пользователь хочет отправить 100 байт без учета заголовков, понятно, и формирует пакет размером 128 байт (100 байт, что указал пользователь, плюс 8 байт ICMP заголовок, плюс 20 байт IP заголовок).

    Если установлен режим «с IP и ICMP заголовками»:
    Приложение смотрит — ага, пользователю нужен пакет в 100 байт с учетом всех заголовков, ок, и делает пакет размером 100 байт (получается 72 байта данных, 8 байт ICMP заголовок, 20 байт IP заголовок).

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

    С уважением, автор.

    Ответить
    1. GregoryGost автор

      Приветствую,
      Благодарю за конструктивный комментарий, сделаю поправку!