Port knocking используется, как правило, для "защиты" открытых наружу портов.
Общий механизм действия:
1. Пользователь стучится (посылает пакет) на определенный порт внешнего адреса.
2. Устройство, на основе данных прилетевшего пакета, создает динамичекое правило фаервола, которое открывает порт наружу для конкретного пользователя
3. Пользователь может установить интересующее его соединние, в то время как все останые этого сделать по-прежнему не могу.
В оригинальной статье используется немного усложненный вариант, когда неоходимо не только постучаться на порт, но и отправить на него определенный текст.
Итак. Первым делом добавляем правило layer7, которое будет смотреть содержимое пакетов:
Код: Выделить всё
/ip firewall layer7-protocol add comment="Port knocking regexp" name="port 1234" regexp="^test\$"
Это правило будет искать в теле пакетов слово test. Далее к нему нужно прикрутить определенные условия:
Код: Выделить всё
/ip firewall filter add action=add-src-to-address-list address-list=allow address-list-timeout=2h chain=input comment="Port knocking rule" disabled=no dst-port=1234 layer7-protocol="port 1234" protocol=udp
Итого: Если пакет пришел на udp порт 1234 и подходит под regexp "^test\$", то src-address стучащегося компьютера будет добавлен в список allow, который будет существовать 2 часа.
В этот промежуток времени мы можем что-нибудь делать. Например работать с web-сервером, который находится за микротиком:
Код: Выделить всё
/ip firewall nat
add action=dst-nat chain=dstnat comment="Allow access to web-server" disabled=no dst-port=80 in-interface=ether1-gateway protocol=tcp src-address-list=allow to-addresses=192.168.88.2 to-ports=80
Или подключаться по SSH к самому микротику:
Код: Выделить всё
/ip firewall filter add action=accept chain=input comment="Allow SSH to mikrotik" disabled=no dst-port=22 protocol=tcp src-address-list=allow
На этом - все. Пользователю нужно выполнить что-то типа nping 1.1.1.1 --udp -p 1234 --data-string "test" и порт будет открыт.
Минусы данного способа:
- нужна утилита, которая умеет генерировать пакеты с определенным содержанием (nping например http://nmap.org/)
- на протяжении 2-х часов будут доступны подключения с адреса, добавленного в address-list
В статье приводится ссылка, в которой описан способ, помогающий избежать оба этих минуса (http://mum.mikrotik.com/presentations/US10/discher.pdf).
Первый address-list будет доступен всего 10 секунд. За эти 10 секунд нужно постучаться на еще один порт, тогда откроется большое окно, которое позволит устанавливать соединения и полноценно работать. Там правда тоже предлагают использовать специальную утилиту, но будет достаточно обычного telnet, который есть почти везде.
Так же не лишним будет правило:
Код: Выделить всё
add action=accept chain=input comment="Allow Established connections" connection-state=established disabled=no
Надеюсь кому-нибудь пригодится.