Добро пожаловать!
В одной из статей я рассказывал про настройку защиты своей сети через Firewall
Вот эта статья: Создание домашней сети на базе устройств MikroTik: Часть 6 – Firewall защита доступа
А, что делать, если нам некогда контролировать каждый чих снаружи? Может быть есть какой-то способ?
Да, такой способ есть и называется он «Port Knocking» или по нашему «Простукивание портов». В принципе в интернете уже присутствует достаточно много статей на эту тему и я бы хотел добавить свою ложку практического применения в эту кашу 🙂
Данный метод заключается в простом переборе портов с заданными интервалами или же если использовать характеристики того же ICMP, то с различными размерами пакетов.
Добавлении IP адреса с таймаутом, с которого мы стучимся, в список IP адресов «Access List», с которого в свою очередь в Firewall Filter есть необходимые разрешения.
Тем самым мы даем доступ на ограниченное время только одному IP адресу под которым мы(или наш удаленный девайс) сидим.
У себя я выбрал путь наиболее простой, а именно вариант «ICMP Knocking», ниже будет дополнение, как сделать на различных портах, суть не особо меняется.
Основная настройка Firewall
Разбор ICMP Knocking в конфигурации Firewall Filter
Давайте взглянем на набор правил для ICMP стучалки:
Консольно:
[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 секунды).
Мне было лень перенастраивать клиентов и я просто добавил отдельное правило. Кстати это показывает, что можно включить лог и отслеживать откуда и кто проходит запрос 🙂
В самом конце нам необходимо вернуть ICMP запрос в основную цепочку(add action=return chain=port-knocking), где он уже получит сброс(drop) на chain=input.
Просто добавить данный набор правил не достаточно. Необходимо их расположить правильно в фильтре, среди других правил и еще не забыть дать необходимый доступ нашему Address List-у(address-list=»Access IP»).
Правила port-knocking располагаем сразу над блокирующими.
А вот правила доступа для address-list=»Access IP» необходимо располагать ближе к началу, под разрешающими правилами established и related соединений.
Консольно:
[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 и нажать кнопку плюс:
Консольно:
[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
Консольно:
[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
В данном файле должен быть код:
@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 и различных параметров.
Отдельно хочется остановиться на настройке «Размер ICMP пакета», он тут почему-то инверсный. То ли переведено не правильно, то ли запрограммировано изначально. Надеюсь поправят, но опытным путем я выяснил, что вариант «с ICMP и IP заголовками» это как раз отправка запроса без них! Будьте внимательны.
Спасибо комментатору Alex. Небольшие правки!
Отдельно хочется остановиться на настройке «Размер ICMP пакета», он тут немного вводит в заблуждение.
- На самом деле, когда мы указываем этот параметр «без заголовков» программа формирует указанный пользователем размер пакета без учета заголовков. Т.е. происходит следующее:
При отправке 100 байт без учета заголовков, программа формирует пакет размером 128 байт (100 байт, что указал пользователь в программе, плюс 8 байт ICMP заголовок, плюс 20 байт IP заголовок). - Когда мы указываем этот параметр «с ICMP заголовком», программа формирует пакет размером 112 байт (получается 92 байта данных и 20 байт IP заголовок).
- Когда мы указываем этот параметр «с IP и ICMP заголовками» программа формирует пакет в 100 байт с учетом всех заголовков и делает пакет размером 100 байт (получается 72 байта данных, 8 байт ICMP заголовок, 20 байт IP заголовок).
Потому для более простого взаимодействия лучше ориентироваться на вариант «с IP и ICMP заголовками».
Что касается 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» адрес листа.
Спасибо за новое знание в копилке)))
Всë никак не получается прикрутить смарт на android 13 к ikev2… надоело. Стучалка прям выход из ситуации!
Мне надо было разделить аксесс-листы по разным портам, сделал несколько комбинаций, и теперь не знаю бед.
Добрый день, подскажите, ника не могу запустить скрипт на микротике, вообще никакой реакции! Скрипт добавлял и через консоль, и писал руками, результат 0
Из под Win через bat файл все получается, основной роутер пингуется!
Насчет через bat и Win проверял логи на основном роутере, пинг проходит, роутер правила отрабатывает, а вот при попытке запустить скрипт на втором микротике нет. Но запустил скрипт из терминала (/system/script> run icmp_knock) все работает, скрипт отрабатывает, при запуске через меню, посредством кнопки Run script, либо через шедулер отправляет только 1 пакет и все.
Посмотрел логи, странно как-то отрабатывает скрипт, если запускать из терминала (system script/run icmp_knock) то скрипт работает, т.е. пингует удаленный роутер, после чего отправляет все 3 ICMP пакета нужной длины, если запускать из меню Scripts (либо через Scheduler), то только пингует удаленный роутер (1 ICMP пакет длиной 56) и на этом его работа заканчивается, т.е. не проходит проверку доступности, вернее наоборот, проходит и все!
Для port knocking можно обойтись без приложения, если у вас есть где-то подконтрольный веб-сайт, любой.
В HTML-код одной из страничек разбрасываете равномерно теги обращений к вашему роутеру, типа таких «пустышек»:
… код сайта …
…
В общем, чтоб запускались запросы к правильным портам в верной последовательности, с некоторыми интервалами по мере загрузки страницы.
Адрес секретной страницы сайта сообщаете клиенту в почте, мессенджером… да хоть в SMS. Инструкция: зайти на страничку любым браузером, с этого устройства минуты на три можно подключаться, скажем, к RDP. Если оторвется надолго и не цепляется — снова зайти на страничку и попробовать.
Простой и удобный способ. Достаточно секьюрный, если сайт и роутер никак не связаны. Выручает, бухи на удаленке не жалуются.
Бот выжрал теги из комменария %(
В общем, там теги img с src равным http с адресом вашего роутера и простукиваемым портом после двоеточия.
Обновили приложение и теперь нужно отнимать 28 байт от пакета, и в дополнительно ставить «без заголовков».
Благодарю за актуальную информацию!
Григорий, подскажите, переодически в ddos black list попадают айпи адреса моих провайдеров, фаерваол настроен полностью по этой статье
Павел,
Сообщите провайдеру о таком поведении с их адресов.
Соответственно сообщите им параметры правил, по которым идет «попадание».
У меня данные правила уже несколько лет работают успешно и никаких проблем я с этим не испытывал ни разу.
Если у меня pptp подключение через ether1, должег ли ether1 входить в interface-list Internet?
Должен
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
вот такого плана логи, т е сам себя заносит в блек лист, помогите((
Подгоняйте под себя параметры 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 ? И где истина?
у меня 2 isp, оба pptp, один через ether1, другой через ether2. pptp в service ports включен. Не понятно как работает dst-limit и что-то инфы по нему не особо
Я правильно понял что строка 20 — лишняя в правилах?
Не совсем, она показывает то, что описано следом в заметке.
Скажите, я правильно понял, что если фаервол настраивался примерно по вашим статьям (Часть 6 – Firewall защита доступа), то настроив icmp-кнокинг правила 1.5-1.7 теряют свою актуальность и их можно убрать, а правила 1.2-1.4 можно оставить?
В целом да, 1.4. кстати тоже можно не использовать
Можно оценить отличия по этому скрину https://gregory-gost.ru/wp-content/uploads/2019/10/gost-portknocking-firewall.png
Я оставил только минимальный DDoS protect
Добрый день, прекрасный конфиг, настроил, работает как часы.
Есть пара вопросов. Версия RouterOS 6.46.5
1) У меня не получается настроить VPN L2tp IPsec
настраивал так
После этого настроил подключение в винде, убрал галку «использовать основной шлюз удаленной сети»
В итоге на клиентской машине видно, что соединение установлено, если после этого зайти в винбокс во вкладку 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
ниже сами правила
На IOS есть программа KnockOnD, попробуйте
Спасибо, посмотрим
Григорий настроил по вашей статье доступ получаю. Но перестал работать нат, порты не пробрасываются . Не могли бы вы в статье дополнить примером, как пробросить извне порт в локальную сеть без добавления айпи адреса в список разрешенных? Ситуация следующая: в локальной сети есть сервер видео наблюдения и клиенты через интернет подключаются к нему. Всем клиентам не настроишь же port knocking/
Спасибо
Здравствуйте,
Для этого нужно исключить параметр Src.Address List из правила проброса.
Таблица NAT отрабатывает раньше чем таблица FILTER, поэтому правила в Filter на Input не будут оказывать влияния на правила проброса. Можете убедиться в этом, при запросе счетчик байт и пакетов будет увеличиваться в nat правиле.
Для примера правило работающее по разрешенному списку
И это же правило без разрешенного списка
Далее, если вы следовали моей статье, правило попадет в ограничитель forward drop в самом низу таблицы /ip firewall filter
Это означает, что нужно добавить еще разрешающее правило в /ip firewall filter, но уже с измененными параметрами в NAT
Либо отключить последнее правило forward drop, тогда не будут нужны дополнительные правила в /ip firewall filter
Добрый вечер Григорий! Спасибо за новые настройки firewall. Я их применил и вроде бы пока все работает кроме bandwith test.
Я пытаюсь подсоедениться к микротиковскому публичному серверу, но безуспешно(( хотя ранее со старыми настройками все работало. В чем я мог ошибиться?
Команда для консоли: /tool bandwidth-test 207.32.194.24 user=btest password=btest direction=both
> Надеюсь поправят, но опытным путем я выяснил, что вариант “с ICMP и IP заголовками” это как раз отправка запроса без них!
В любом случае пакеты уходят с заголовками, невозможно отправить пакет без заголовков.
Вы неверно поняли суть параметра.
Параметр определяет то, в каком виде Вы указываете в последовательности размер пакета.
Допустим, прописали пакет в 100 байт.
Если установлен режим «без заголовков»:
Приложение смотрит — ага, пользователь хочет отправить 100 байт без учета заголовков, понятно, и формирует пакет размером 128 байт (100 байт, что указал пользователь, плюс 8 байт ICMP заголовок, плюс 20 байт IP заголовок).
Если установлен режим «с IP и ICMP заголовками»:
Приложение смотрит — ага, пользователю нужен пакет в 100 байт с учетом всех заголовков, ок, и делает пакет размером 100 байт (получается 72 байта данных, 8 байт ICMP заголовок, 20 байт IP заголовок).
В природе существуют самые разные реализации. Где-то считают размер пакета с заголовками, где-то без заголовков.
И, собственно, этот параметр позволяет указывать размер пакета именно в том варианте, в котором вам нужно, не пересчитывая размеры пакетов.
С уважением, автор.
Приветствую,
Благодарю за конструктивный комментарий, сделаю поправку!