port_knocking_в_mikrotik

Настройка Port Knocking в Mikrotik

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

При реализации данного метода следует соблюдать правильную последовательность правил в цепочке INPUT межсетевого экрана и основным правилом, вокруг которого будет строиться наша система будет разрешение уже установленных и связанных соединений (ESTABLISHED, RELATED).

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

Добавляем новое правило. На закладке General укажем: Chaininput, Protocoltcp, Dst. Port7890.


На закладке Action добавим действия: Actionadd src to address list, Address ListKNOCK-1, Timeout00:00:30


Данное правило при обращении к порту 7890 добавит адрес источника в список KNOCK-1 на 30 секунд, в течении этого времени мы должны успеть обратиться к следующему порту, чтобы получить доступ. Поэтому не следует указывать слишком высокие значения, предполагается, что 30 секунд вполне достаточно для выполнения нужных команд в терминале, в ряде случаев можно незначительно увеличить таймаут.

Теперь добавим еще одно правило. Закладка General: Chaininput, Protocoltcp, Dst. Port9870. Закладка Advanced: Src. Address ListKNOCK-1.

Закладка Action: Actionadd src to address list, Address ListKNOCK-ACCEPT, Timeout00:01:00.

Данное правило добавит в лист KNOCK-ACCEPT адрес того источника, который обратится к порту 9870 и при этом находится в списке KNOCK-1, время жизни записи в новом листе – 1 минута, за это время мы должны будем установить соединение с устройством.

Тоже самое в терминале:

/ip firewall filter
add action=add-src-to-address-list address-list=KNOCK-1 address-list-timeout=30s chain=input dst-port=7890 protocol=tcp
add action=add-src-to-address-list address-list=KNOCK-ACCEPT address-list-timeout=1m chain=input dst-port=9870 protocol=tcp src-address-list=KNOCK-1

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

На закладке General укажем: Chaininput, Protocoltcp, Dst. Port8291, на Advanced: Src. Address ListKNOCK-ACCEPT, вкладку Action не трогаем, так как accept действие по умолчанию.


Либо, выполним в терминале:

/ip firewall filter
add action=accept chain=input dst-port=8291 protocol=tcp src-address-list=KNOCK-ACCEPT

Данное правило следует расположить ниже разрешающего установленные и связанные подключения.

Теперь, пару слов о том, как это работает. Первые два правила заполняют листы с адресом источника, чтобы попасть в последний – KNOCK-ACCEPT – нам нужно в течение 30 секунд обратиться к последовательно к портам 7890 и 9870. Затем в течение минуты мы должны подключиться к целевому порту, в нашем случае это Winbox. После чего все пакеты этого соединения пойдут по правилу, разрешающему уже установленные соединения. Таким образом по истечении минуты новых соединений установить не удастся, а уже установленные будут продолжать работать до отключения.

Что же, правила есть, теперь попробуем постучаться. В Linux для этого можно использовать команду netcat – nc. Для того, чтобы постучаться на TCP-порт используем:

nc -zw 1 XXX.XXX.XXX.XXX 7890
nc -zw 1 XXX.XXX.XXX.XXX 9870

Для UDP-портов используем:

nc -zu XXX.XXX.XXX.XXX 7890
nc -zu XXX.XXX.XXX.XXX 9870

В Windows, из стандартных средств можно использовать PowerShell:

Test-NetConnection XXX.XXX.XXX.XXX -Port 7890
Test-NetConnection XXX.XXX.XXX.XXX -Port 9870

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

Другой вариант – использование утилиты tcping (также можно взять здесь), которая проще и удобнее в использовании, но позволяет опять-таки стучать только в TCP-порты:

tcping -n 1 XXX.XXX.XXX.XXX 7890
tcping -n 1 XXX.XXX.XXX.XXX 9870

Ключ -n указывает количество посылаемых пакетов, в нашем случае один.

Также существуют специальные утилиты, позволяющие автоматизировать этот процесс, например, PortKnock (также можно взять здесь парольна архив portknock), которая умеет работать как с TCP, так и с UDP портами и может обращаться последовательно к 4 портам.

Данный вариант отличается от классического тем, что вместо определенных портов мы будем использовать ICMP-пакеты различного размера. Это проще сделать стандартными средствами ОС и труднее поддается анализу при перехвате трафика, так как не столь бросается в глаза.

Несмотря на стандартный размер MTU в 1500 байт, это значение может быть уменьшено при использовании VLAN, VPN и т.д., поэтому мы не советуем использовать пакеты размером более 1000 байт, также, учтем размер заголовков ICMP-пакета в 28 байт.

Просто выберем два (или более) произвольных числа до 1000, которые и будут нашими ключами для Port Knocking, в данном случае это будут 250 и 209. Точно также, как и в предыдущем способе правила будут строиться относительно разрешения для уже установленных соединений.

Нам снова понадобится создать два правила для добавления адреса источника в соответствующие листы. В первом правиле укажем на General: Chaininput, Protocolicmp, а на Advanced: Packet Size278 (250 + 28) – размер нашего первого пакета, в Action: Actionadd src to address list, Address ListKNOCK-1, Timeout00:00:30

Во втором, зададим следующие значения: General: Chaininput, Protocolicmp, Advanced: Src. Address ListKNOCK-1, Packet Size237 (209 + 28) – размер второго пакета, в Action: Actionadd src to address list, Address ListKNOCK-ACCEPT, Timeout00:01:00.

Либо выполним в терминале:

/ip firewall filter
add action=add-src-to-address-list address-list=KNOCK-1 address-list-timeout=30s chain=input packet-size=278 protocol=icmp
add action=add-src-to-address-list address-list=KNOCK-ACCEPT address-list-timeout=1m chain=input packet-size=237 protocol=icmp src-address-list=KNOCK-1

Данные правила следует расположить выше правила разрешающего установленные и сопутствующие соединения. Остальные настройки полностью повторяют предыдущий способ.

Чтобы постучаться таким образом из Linux выполним:

ping XXX.XXX.XXX.XXX -s 250 -c 1
ping XXX.XXX.XXX.XXX -s 209 -c 1

Где ключ -s задает размер пакета (без учета заголовка), а ключ количество посылаемых пакетов, в нашем случае один.
В Windows синтаксис будет немного иной:

ping XXX.XXX.XXX.XXX -l 250 -n 1
ping XXX.XXX.XXX.XXX -l 209 -n 1

Здесь за размер пакета отвечает ключ -l, а за количество пакетов -n<html>.

Принцип работы не отличается от предыдущего метода, получив ICMP-пакет размером в 250 байт адрес источника будет занесен в первый список. Затем, в течение 30 секунд мы должны прислать второй пакет размером в 209 байт, в этом случае адрес будет занесен в список KNOCK-ACCEPT и в течение минуты с устройством можно будет установить соединение.

  • port_knocking_в_mikrotik.txt
  • Последнее изменение: 2022/10/24 09:47
  • admin