Home » Mikrotik » Port knocking в Mikrotik для защиты Winbox

Port knocking в Mikrotik для защиты Winbox

Небольшая заметка на тему использования известной технологии для защиты уязвимого сервиса при сохранении удаленного доступа к нему. Речь пойдет о настройке Port knocking в Mikrotik для защиты подключения к Winbox с сохранением доступа откуда угодно. Покажу работу технологии на простом и более сложном примере.

Углубленный онлайн-курс по MikroTik

Научиться настраивать MikroTik с нуля или систематизировать уже имеющиеся знания можно на углубленном онлайн-курcе по администрированию MikroTik. Автор курcа – сертифицированный тренер MikroTik Дмитрий Скоромнов. Более 40 лабораторных работ по которым дается обратная связь. В три раза больше информации, чем в MTCNA.

Что такое port knocking

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

В моем примере мы будет защищать порт 8291, который используется в mikrotik для подключения управляющей программы winbox. Для того, чтобы с ее помощью можно было подключиться к устройству, нужно будет отправить определенную последовательность пакетов по протоколу icmp.

Простая настройка port knocking из одного правила

Для того, чтобы не погружаться в теорию работы и настройки firewall в mikrotik, я буду считать, что вы настраивали его по моей статье на эту тему. Так как мое текущее повествование на достаточно узкую тему, сфокусируюсь только на ней. Если вы не очень знакомы с описываемым роутером, то читайте мою статью на тему базовой настройки mikrotik.

Допустим, вы ограничили доступ к порту 8291, который использует winbox для подключения, фиксированным списком ip адресов. Название списка winbox_remote. Сейчас я покажу, как сделать так, чтобы в этот список временно попал тот ip адрес, который вам нужен, и который отсутствует в этом списке. Причем доступа к микротику у вас не будет. Тут нам как раз поможет технология port knocking.

Создаем следующее правило в фаерволе микротика.

add action=add-src-to-address-list address-list=winbox_remote address-list-timeout=30m chain=input comment="icmp port knocking" in-interface=ether2-wan packet-size=144 protocol=icmp
Микротик port knocking
Выбор размера пакета
Добавить автоматически в белый список

Рассказываю, что мы тут настроили. При пинге с какого-то ip адреса размером пакета 116 байт, на микротик придет пакет размером 144 байта (28 байт заголовок) и адрес отправителя будет добавлен в список winbox_remote на 30 минут. Для проверки работы достаточно выполнить пинг с любого компьютера, примерно вот так:

ping 1.2.3.4 -l 116 -n 1

После этого адрес отправителя отправится в указанный список роутера. Там будет создана динамическая запись.

Динамический список ip адресов в микротике

Чтобы правило сработало, оно должно быть правильно расположено в списке правил. Правило с port knocking обязательно должно быть выше правила, разрешающего все icmp пакеты. Если этого не сделать, то первое разрешающее правило обработает все входящие icmp пакеты и до созданного нами в этой статье правила они просто не дойдут.

Более сложная проверка из трех правил

Теперь рассмотрим вариант немного посложнее. В список разрешенных ip адресов можно будет попасть, отправив не менее трех пакетов нужно длины. Для этого создаем 3 правила в firewall.

add action=add-src-to-address-list address-list=winbox_remote address-list-timeout=30m chain=input comment="icmp port knocking" in-interface=ether2-wan log=yes packet-size=144 protocol=icmp src-address-list=stage2
add action=add-src-to-address-list address-list=stage2 address-list-timeout=1m chain=input in-interface=ether2-wan log=yes packet-size=144 protocol=icmp src-address-list=stage1
add action=add-src-to-address-list address-list=stage1 address-list-timeout=1m chain=input in-interface=ether2-wan log=yes packet-size=144 protocol=icmp

Обращаю внимание на порядок правил. Он должен быть именно такой. Первый пакет попадает на третье правило и адрес отправителя записывается в список stage1. Следующий пакет будет иметь адрес отправителя из stage1 (src-address-list=stage1), поэтому его заносим в список stage2. Третий пакет будет иметь адрес отправителя из stage2, поэтому добавляем его в winbox_remote.

Тут есть один важный нюанс. Чаще всего у вас первым правилом в списке firewall на mikrotik будет разрешение на уже установленные соединения. Примерно такое:

add action=accept chain=input comment="accept establish & related" connection-state=established,related

Оно будет захватывать второй и последующие пакеты icmp, поэтому они не попадут на 3 наших правила выше. Чтобы этого избежать, нужно правила с port knocking в mikrotik ставить либо выше этого правила, либо в этом правиле сделать исключение для протокола icmp, примерно так:

add action=accept chain=input comment="accept establish & related" connection-state=established,related protocol=!icmp

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

Таким способом можно наполнять разные списки и использовать их для доступа к различным сервисам. Как говорится, просто и сердито. Настроить не сложно, обойти такую защиту в очень хлопотно, особенно если время жизни записей в списке оставить 1 минуту. Для подключения к сервису этого вполне хватит, а дальше соединение получит статус established и будет оставаться активным, пока не закроется.

Углубленный онлайн-курс по MikroTik

Научиться настраивать MikroTik с нуля или систематизировать уже имеющиеся знания можно на углубленном онлайн-курcе по администрированию MikroTik. Автор курcа – сертифицированный тренер MikroTik Дмитрий Скоромнов. Более 40 лабораторных работ по которым дается обратная связь. В три раза больше информации, чем в MTCNA.
Не понравилась статья и хочешь научить меня администрировать? Пожалуйста, я люблю учиться. Комментарии в твоем распоряжении. Расскажи, как сделать правильно!

Помогла статья? Подписывайся на telegram канал автора

Анонсы всех статей, плюс много другой полезной и интересной информации, которая не попадает на сайт.

Автор Zerox

Владимир, системный администратор, автор сайта. Люблю настраивать сервера, изучать что-то новое, делиться знаниями, писать интересные и полезные статьи. Открыт к диалогу и сотрудничеству. Если вам интересно узнать обо мне побольше, то можете послушать интервью. Запись на моем канале - https://t.me/srv_admin/425 или на сайте в контактах.

29 комментариев

  1. Возможно ли с помощью port knocking запустить какой-либо скрипт, либо отключать/включать интерефейсы одним батником, где первой строкой будет пинг, а дальше исполнение чего-либо?

    • Теоретически возможно, но для этого надо хорошо разбираться в написании скриптов в Микротик. Без постоянной практики это трудно делать, так как там своя логика и свой синтаксис, который надо изучать.

  2. А как можно настроить Port Knocking на микротике, если он второй, а интернет получает от роутера МТС?
    Есть белый адрес, webserver на Apache работает, а knok-knok не получается... ничего не записывает в address-list

  3. Константин

    Добрый день! Можно по этой теме задать пару "дилетантских" вопросов? Настроил правила для port knocking. На микротике вижу адресс-листы создаются, т.е по-идее, мой адрес (подключаюсь с "серого IP") попадает в список разрешенных. Но что делать дальше? Как подключиться к Winbox для управления микротик или как подключиться к определенному ПК? Спасибо за ответ

  4. Алексей

    Подскажите а как делать такие скриншоты с эффектом обрезки?

  5. Решение отличное, но приходится задваивать правила с дельтой в 28 байт из-за разницы payload у ping'ов Windows и Linux (и соответственно мобильных платформ)

  6. можно как то придумать, чтоб еще бан шел, по неверной длине пакета, или просто по левому стуку ?

  7. Здравствуйте, да, идея прикольная, я ее на хабре спер, в одном из коментариев)

    Может подскажите, требуется при потере пинга выполнить скрипт на компе, проблема в том что когда пинг теряется шлюз (микротик) шлет ответ что узел не доступен, а соотвесвенно скрипт не запускается, т.к. небыло потери.

    • вот как сделать чтобы микротик не слал ответы о недоступности узла, а просто пришла потеря.

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

  8. Александр

    Вот еще бы дополнить валидный стук оповещением на телеграм и будет совсем класс :)

    • Это не трудно сделать через скрипт, но мне лично это не нужно. Можно включить в правиле фаервола писать в лог попадание в правило. Потом скриптом это надо анализировать и слать в телеграмм. Если логи отправляются куда-то в удаленное хранилище, можно парсить их там и слать уведомления оттуда. Это еще проще.

  9. Идея прикольная. Можно автоматизировать и сделать целую последовательность, а потом ещё и поддерживать сессию пингами.

    Как вариант:
    `
    add action=add-src-to-address-list address-list=tmp_remote address-list-timeout=30m chain=input comment="icmp port knocking" in-interface= packet-size=125 protocol=icmp src-address-list=icmp_stage2
    add action=add-src-to-address-list address-list=icmp_stage2 address-list-timeout=3s chain=input in-interface= packet-size=124 protocol=icmp src-address-list=icmp_stage1
    add action=add-src-to-address-list address-list=icmp_stage1 address-list-timeout=3s chain=input in-interface= packet-size=123 protocol=icmp
    `
    --
    И шелл скрипт:
    `
    #!/bin/sh

    ping -s 95 -c1 -W1 2>&1 >/dev/null
    ping -s 96 -c1 -W1 2>&1 >/dev/null
    ping -s 97 -c1 -W1 2>&1 >/dev/null

    while true; do
    sleep 900
    echo "Ping..."
    ping -s 97 -c1 -W1 2>&1 >/dev/null
    done
    `

    Для винды додумайте сами :)

  10. Максим

    Подскажите пожалуйста, есть ли в MicroTik ограничение на количество проброшенных портов?

  11. Спасибо, очень интересный портал. Но это скорее какой-то частный случай port knocking так тут мы по порту вообще не стучимся.

    • Смысл тот же самый, просто вместо пакета на tcp порт используется пакет протокола icmp. Принципиальной разницы нет. С icmp проще в том плане, что пакет нужный откуда угодно можно послать. Пинговать все умеют.

      • Это понятно. Тем не менее спасибо за идею, по поводу обычного ICMP и определенного размера пакета даже ни разу не задумывался. Жду статейку по knockd.

    • я такое делал спецом для винды, чтобы без лишних программ можно было попасть на микрот. в остальных случаях есть прога на смартфоне, открыл - тапнул - готово. И пока что-то делаешь сессия не завершится, пакеты будут бегать, постоянно стучаться нет необходимости, поэтому я открываю порт на 5 мин всего.

      • Можно вообще на 1 минуту открывать. После того, как соединение установится, пакеты будут в правило с established попадать.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Нажимая кнопку "Отправить комментарий" Я даю согласие на обработку персональных данных.
Используешь Telegram? Подпишись на канал автора →
This is default text for notification bar