Страница 1 из 1

Пример Port Knocking

Добавлено: 01 сен 2024, 22:23
kukur
Привет всем!
На моём микротике есть возможность подключения через WAN(интернет) и для безопасности решил настроить Port Knocking.
Тут я хочу разместить пример своей настройки, который вы можете применить у себя или высказать свою критику, которая тоже одобряется.
И так. Мой Port Knocking был реализован на протоколе TCP. Клиент, который должен стучаться на порты, отправляет TCP пакеты на определённые порты в определённой последовательности. В моём случае для этого я написал программу для автоматизации процесса. Если захотите реализовать такой же вариант конфигурации, то ПО можно найти тут: https://github.com/kukurua/Port-Knocking.
Микротик, в свою очередь, обрабатывает получаемые пакеты TCP с помощью фаервола и посылает ответ TCP-reset(чтобы моя программа поняла, что она стучится в тот порт). От отправки ответа можно и избавиться. Мне это необходимо для работы программы.
В случае, если клиент стучится на верный порт, микротик добавляет на небольшой промежуток времени IP адрес клиента в список прошедших первую ступень проверки. За то время, пока клиент находится в списке прошедших проверку он должен постучаться на второй порт, который также добавит IP адрес клиента в список прошедших вторую ступень проверки и т.д. Количество необходимых портов для "простукивания" определяет сам администратор сети. После всех этих кругов ада микротик предоставляет вам доступ уже к полезным портам(к примеру: SSH, WinBox) или выполняет другие функции, которые вы настроили.

От теории к конфигурации
Лично я вывел Port Knocking в отдельную цепочку, а для того чтобы в неё попасть создал правило в цепочке input с действием jump, которое отслеживает входящие tcp пакеты на определённых портах.
Правило из цепочки input:

Код: Выделить всё

12   ;;; Port Knoking Chain Jump
      chain=input action=jump jump-target=Security Port Knock connection-state=new protocol=tcp in-interface-list=WAN dst-port=1111,1112,1113 log=no log-prefix=""
Далее идёт цепочка Port Knocking:

Код: Выделить всё

 0    ;;; security: Port Knoking
      chain=Security Port Knock action=add-src-to-address-list protocol=tcp src-address-list=knock 2 address-list=knock 3 address-list-timeout=2h dst-port=1113 
      log=yes log-prefix="accept port knocking" 

 1    chain=Security Port Knock action=reject reject-with=tcp-reset protocol=tcp src-address-list=knock 2 dst-port=1113 log=no log-prefix="" 

 2    chain=Security Port Knock action=add-src-to-address-list protocol=tcp src-address-list=knock 1 address-list=knock 2 address-list-timeout=30s dst-port=1112 
      log=no log-prefix="" 

 3    chain=Security Port Knock action=reject reject-with=tcp-reset protocol=tcp src-address-list=knock 1 dst-port=1112 log=no log-prefix="" 

 4    chain=Security Port Knock action=add-src-to-address-list protocol=tcp address-list=knock 1 address-list-timeout=30s dst-port=1111 log=no log-prefix="" 

 5    chain=Security Port Knock action=reject reject-with=tcp-reset protocol=tcp dst-port=1111 log=no log-prefix=""

 6    chain=Security Port Knock action=drop log=no log-prefix="" 
В данном примере клиенту нужно будет "постучаться" по трём портам прежде чем он попадёт в список knock 3, который открывает доступ к полезным портам клиенту.

Правила под номерами: 5, 3 и 1 не обязательны. В моём случае они нужны для корректной работы программы.