Главная » 2016 » Декабрь » 18 » [NET] Port knocking MikroTik
15:49
[NET] Port knocking MikroTik

Port knocking – настолько простой, насколько и эффективный способ защиты вашей локальной сети от несанкционированного доступа снаружи в случаях, когда вам необходимо использовать проброс портов. В этой статье я расскажу, как реализовать этот простой алгоритм авторизации на роутере MikroTik.

О том, что использовать обычный проброс портов не является правильным, я уже упомянул вскользь в статье “Проброс портов в MikroTik“. Но порой все же возникает необходимость давать доступ к удаленным рабочим столам некоторым сотрудникам (например, бухгалтерам в период сдачи отчетности – знакомо, да?).

При этом:

  1. вам неизвестен адрес, с которого человек будет подключаться и ограничиться правилом в фаерволе у вас не получится;
  2. использование VPN не представляется возможным в силу нескольких причин, начиная с некомпетентности сотрудника и заканчивая принципиальным запретом VPN на устройствах, через которые этот самый сотрудник будет пытаться подключиться (например, какой-нибудь бесплатный Wi-Fi в отеле на острове Пасхи).

Поможет в этом случае port knocking. Суть этого метода заключается в том, что пользователь, прежде чем получить доступ к чему-то, должен представиться. В классическом решении port knocking используются проколы TCP или UDP – пользователь “простукивает” определенную последовательность портов (обычно не менее трех), после чего его IP добавляется в список адресов с определенными привилегиями: в нашем случае к пробросу порта RDP на его рабочее место. Это как “постучи в дверь три раза, потом – два, потом – пять, чтобы я понял, что это ты”. Знакомо, не правда ли?

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

Последовательность портов для простукивания и ее длина обусловлены только вашей фантазией. Но тут возникает небольшая проблема: если с простукиванием портов из Linux штатными средствами проблем никаких не наблюдается, то с Windows этот номер просто так не пройдет. Но у ваших бухгалтеров наверняка на ноутбуках стоит Windows, а слово Linux они вообще воспринимают, как ругательство.

Пример простукивания портов штатными средствами на Linux:

Здесь использовалась команда nc [параметры] [хост] [порт], где

  • z – говорит программе о том, что нужно просто “стукнуться”, не посылая каки-либо дополнительных данных и не слушая ответ;
  • u – использование UDP вместо TCP.

К сожалению, данный пример не решает нашей задачи со штатными средствами Windows. А решение простое и лежит на поверхности: вместо UPD или TCP использовать ICMP ping. Принцип port knocking мы оставим, а последовательность портов заменим последовательностью разных размеров пакета.

Выглядеть “простукивание” из Windows будет так:

Простой ping с параметрами:

  • -4 – использовать IPv4
  • -f – запрет фрагментации пакета;
  • -n – количество запросов;
  • -l – буфер отправки (объем данных, которые мы отправляем “в нагрузку”).
 

Т.к. стандартный размер MTU – 1500, который к тому же может быть уменьшен всякими VLAN’ами и пр., а нам нужно, чтобы все влезло в один Ethernet фрейм, то рекомендую использовать буфер отправки в диапазоне 0-1000. Еще следует учесть, что размер самого пакета эхо-запроса ICMP “без нагрузки” (с L=0) – 28 байт, т.к. помимо данных там еще присутствует TCP-, ICMP-заголовки и .т.д. Можете погуглить, что из себя представляет ICMP-пакет. Таким образом, на роутере ловим пакеты размером равным [буфер отправки+28].

Теперь наш MikroTik должен распознать последовательность из трех пакетов с размерами 460, 549, 626. “На пальцах” алгоритм выглядит так:

  • если размер пакета 460 (432+28), добавить этот IP в список “первый уровень”;
  • если размер пакета 549 (521+28) и IP-адрес в списке “первый уровень”, добавить этот IP в список “второй уровень”.
  • если размер пакета 626 (598+28) и IP-адрес в списке “второй уровень”, добавить этот IP в список “доступ к пробросу портов по RDP”

Реализация port knocking на MikroTik

Сначала в картинках:

port knocking mikrotik рис.1

Рис. 1 Создадим свою цепочку portKnocking и направим туда входящий ICMP

 

port knocking mikrotik рис.2

Рис.2 Создадим правило, которое в случае нужного размера пакета будет добавлять IP-адрес в список checkLevelOne

 

port knocking mikrotik-рис. 3

Рис.3 Аналогично первому создадим второе правило за тем лишь исключением, что проверим присутствие в списке прошедших первую проверку checkLevelOne. Добавлять будем в список checkLevelTwo

port knocking mikrotik рис.4

Рис.4 Аналогично второму создадим третье правило, которое уже добавит наш IP в список, которому разрешен доступ к пробросу порта. Четвертое правило в списке – возврат из цепочки обратно, если ни одно из правил не сработало.

Правила проверки port knocking в фаерволе надо разместить вверху до разрешений related/established. Иначе вы не уйдете дальше первой проверки – будут срабатывать правила related/established.

port knocking mikrotik рис.5

Рис.5 Сначала проверим, не стучится ли кто, потом разрешим related и established. В противном случае в цепочке portKnocking дальше первого правила не уйдем.

В скриптах:

Обратите внимание на параметр address-list-timeout в правилах, где IP добавляется в список адресов. Для этапов проверки я выставляю address-list-timeout=5s, т.к. считаю, что 5 секунд должно хватить для проверки следующего условия. Для завершающего правила, где адрес добавляется в разрешенные для подключения по RDP, address-list-timeout=30m – т.е. для подключения к удаленному рабочему столу человеку дается полчаса после успешного “простукивания” MikroTIk’а.

По истечении получаса адрес будет удален из списка AllowRDP, но сеанс не прервется, т.к. будут срабатывать правила allow related/established. Пользователю придется заново “представиться” в случае, если он сам прервет сеанс или за него это сделает плохая связь.

Для автоматизации процесса пишем пакетный файл (.bat или .cmd – кому как больше нравится) следующего содержания:

Теперь осталось только выслать каждому пользователю свой файл.

Как вы поняли, реализация алгоритма с простукиванием портов не только аналогична описанной выше, но даже проще – там не надо заморачиваться с размером пакета, а просто указать порт. Но для Windows нужны свои костыли…

Категория: Железо | Просмотров: 1183 | Добавил: davis74 | Рейтинг: 0.0/0
Всего комментариев: 0
Имя *:
Email *:
Код *: