Port knocking

Выкладываем здесь готовые конфигурации под определенные типовые задачи
Ответить
plin2s
Сообщения: 417
Зарегистрирован: 26 сен 2012, 16:17
Контактная информация:

Была хорошая ссылочка, но недавно увидел, что она уже недоступна и есть только в кеше гугла (http://webcache.googleusercontent.com/s ... ent=ubuntu). Поэтому перепечатаю ее здесь. Думаю кому-нибудь будет полезно.

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

Надеюсь кому-нибудь пригодится.


EdkiyGluk
Сообщения: 241
Зарегистрирован: 21 сен 2014, 08:34
Откуда: 34
Контактная информация:

icmp кнок имхо проще.... пинг то точно есть везде, даже на телефоне


plin2s
Сообщения: 417
Зарегистрирован: 26 сен 2012, 16:17
Контактная информация:

EdkiyGluk писал(а):icmp кнок имхо проще.... пинг то точно есть везде, даже на телефоне

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


Аватара пользователя
MaxoDroid
Сообщения: 355
Зарегистрирован: 14 май 2019, 22:55
Откуда: Краснодар

Интересный метод применения пароля на вход в порт.
А как защитить порты таких устройств, как NAS, к которым подключаются приложения с мобильных устройств? У меня, например, стоит NAS Synology. У него службы для мобильных приложений используют порты 5000,5001,6690,80,443,5005,5006. Мы же не можем войти в приложение и "попросить" его перед аутентификацией передать заветное слово? Тогда как?
Может дать пять попыток правильного входа?
add action=drop chain=input comment="1 Knocking Port LockOut protection" src-address-list="Black List Knocking"

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

add action=add-src-to-address-list address-list="Black List Knocking " address-list-timeout=none-dynamic chain=input comment="2 ---------  ---------   Knocking Protection" connection-state=new dst-port=5000,5001,6690,80,443,5005,5006 in-interface-list=WAN log=yes log-prefix="BLACK KNOCKING " protocol=tcp src-address-list=" Knocking Stage 5"
add action=add-src-to-address-list address-list=" Knocking Stage 5" address-list-timeout=1m chain=input comment="3 ---------  ---------   Knocking Protection" connection-state=new dst-port=5000,5001,6690,80,443,5005,5006 in-interface-list=WAN protocol=tcp src-address-list= " Knocking Stage 4"
add action=add-src-to-address-list address-list=" Knocking Stage 4" address-list-timeout=1m chain=input comment="4 ---------  ---------   Knocking Protection" connection-state=new dst-port=5000,5001,6690,80,443,5005,5006 in-interface-list=WAN protocol=tcp src-address-list= " Knocking Stage 3"
add action=add-src-to-address-list address-list=" Knocking Stage 3" address-list-timeout=1m chain=input comment="5 ---------  ---------   Knocking Protection" connection-state=new dst-port=5000,5001,6690,80,443,5005,5006 in-interface-list=WAN protocol=tcp src-address-list= " Knocking Stage 2"
add action=add-src-to-address-list address-list=" Knocking Stage 2" address-list-timeout=1m chain=input comment="6 ---------  ---------   Knocking Protection" connection-state=new dst-port=5000,5001,6690,80,443,5005,5006 in-interface-list=WAN protocol=tcp src-address-list=" Knocking Stage 1"
add action=add-src-to-address-list address-list=" Knocking Stage 1" address-list-timeout=1m chain=input comment= "7 ---------  ---------   Knocking Protection" connection-state=new dst-port=5000,5001,6690,80,443,5005,5006 in-interface-list=WAN protocol=tcp
add action=accept chain=input comment="8 ---------  end of Knocking Protection" dst-port=5000,5001,6690,80,443,5005,5006 in-interface-list=WAN protocol=tcp
Правда, я не могу сказать про владельцев телефонов iPhone, у которых может быть проблема с подключением, описанная в этой теме viewtopic.php?t=8124

Тогда вариант решения будет вот таким (идея заимствована у Maxval memberlist.php?mode=viewprofile&u=8255):

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

add action=accept chain=input comment="Block ports brute forcer" dst-port=5000,5001,6690,80,443,5005,5006 protocol=tcp src-address-list=ports_success tcp-flags=""
add action=drop chain=input connection-state="" dst-port=5000,5001,6690,80,443,5005,5006 log=yes log-prefix="--==DROP PORT brute forcer==--" protocol= tcp src-address-list=ports_blacklist tcp-flags=""
add action=add-src-to-address-list address-list=ports_blacklist address-list-timeout=3d chain=input connection-state=new dst-port=5000,5001,6690,80,443,5005,5006 protocol= tcp src-address-list=ports_stage5 tcp-flags=""
add action=add-src-to-address-list address-list=ports_stage5 address-list-timeout=1m chain=input connection-state=new dst-port=5000,5001,6690,80,443,5005,5006 protocol= tcp src-address-list=ports_stage4 tcp-flags=""
add action=add-src-to-address-list address-list=ports_stage4 address-list-timeout=1m chain=input connection-state=new dst-port=5000,5001,6690,80,443,5005,5006 protocol= tcp src-address-list=ports_stage3 tcp-flags=""
add action=add-src-to-address-list address-list=ports_stage3 address-list-timeout=1m chain=input connection-state=new dst-port=5000,5001,6690,80,443,5005,5006 protocol= tcp src-address-list=ports_stage2 tcp-flags=""
add action=add-src-to-address-list address-list=ports_stage2 address-list-timeout=1m chain=input connection-state=new dst-port=5000,5001,6690,80,443,5005,5006 protocol= tcp src-address-list=ports_stage1 tcp-flags=""
add action=add-src-to-address-list address-list=ports_stage1 address-list-timeout=1m chain=input connection-state=new dst-port=5000,5001,6690,80,443,5005,5006 protocol= tcp tcp-flags=""
add action=accept chain=input comment="Allow PORT" dst-port=5000,5001,6690,80,443,5005,5006 protocol= tcp

/ppp profile
add change-tcp-mss=yes local-address=192.168.0.1 name=PORT-Server on-up="/ip firewall address-list add list=ports_success address=\$\"caller-id\" timeout=14d" remote-address=ports_pool use-encryption=yes use-mpls=yes


... CAPsMAN - вещь забавная и нужная.... Но провод - НАДЕЖНЕЕ!
Аватара пользователя
MaxoDroid
Сообщения: 355
Зарегистрирован: 14 май 2019, 22:55
Откуда: Краснодар

Выкладываю рабочую версию блокировки портов. Этот код написан для защиты портов NAS (моего Synology DS218), к которым обращаются с мобильных приложений:

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

/ip firewall filter
add action=accept chain=input comment="10.1 - Block NAS ports brute forcer" dst-port=5000,5001,6690,80,443,5005,5006 protocol=tcp src-address-list=NASports_success tcp-flags=""
add action=drop chain=input comment="10.2 ---------  ---------   NAS ports Protection" connection-state="" dst-port=5000,5001,6690,80,443,5005,5006 log=yes log-prefix="--==DROP NAS_PORTs brute forcer==--" protocol=tcp src-address-list=ports_blacklist tcp-flags=""
add action=add-src-to-address-list address-list=ports_blacklist address-list-timeout=3d chain=input comment="10.3 ---------  ---------   NAS ports Protection" connection-state=new dst-port=5000,5001,6690,80,443,5005,5006 protocol=tcp src-address-list=ports_stage5 tcp-flags=""
add action=add-src-to-address-list address-list=ports_stage5 address-list-timeout=1m chain=input comment="10.4 ---------  ---------   NAS ports Protection" connection-state=new dst-port=5000,5001,6690,80,443,5005,5006 protocol=tcp src-address-list=ports_stage4 tcp-flags=""
add action=add-src-to-address-list address-list=ports_stage4 address-list-timeout=1m chain=input comment="10.5 ---------  ---------   NAS ports Protection" connection-state=new вst-port=5000,5001,6690,80,443,5005,5006 protocol=tcp src-address-list=ports_stage3 tcp-flags=""
add action=add-src-to-address-list address-list=ports_stage3 address-list-timeout=1m chain=input comment="10.6 ---------  ---------   NAS ports Protection" connection-state=new dst-port=5000,5001,6690,80,443,5005,5006 protocol=tcp src-address-list=ports_stage2 tcp-flags=""
add action=add-src-to-address-list address-list=ports_stage2 address-list-timeout=1m chain=input comment="10.7 ---------  ---------   NAS ports Protection" connection-state=new dst-port=5000,5001,6690,80,443,5005,5006 protocol=tcp src-address-list=ports_stage1 tcp-flags=""
add action=add-src-to-address-list address-list=ports_stage1 address-list-timeout=1m chain=input comment="10.8 ---------  ---------   NAS ports Protection" connection-state=new dst-port=5000,5001,6690,80,443,5005,5006 protocol=tcp tcp-flags=""
add action=accept chain=input comment="10.9 ---------  ---------   NAS ports Protection - Allow PORT" dst-port=5000,5001,6690,80,443,5005,5006 protocol=tcp

/ppp profile
add change-tcp-mss=yes local-address=192.168.88.1 name=NAS_PORT-Server on-up="/ip firewall address-list add list=NASports_success address=\$\"caller-id \" timeout=1d" remote-address=pool1-dhcp
Текст on-up скрипта: "/ip firewall address-list add list=NASports_success address=$"caller-id" timeout=1d" - в поле WinBox должен выглядеть именно так, за исключением имени листа адресов.


... CAPsMAN - вещь забавная и нужная.... Но провод - НАДЕЖНЕЕ!
Sertik
Сообщения: 1598
Зарегистрирован: 15 сен 2017, 09:03

Хоть убейте меня но никак не пойму а это тут зачем ?
/ppp profile
add change-tcp-mss=yes local-address=192.168.88.1 name=NAS_PORT-Server on-up="/ip firewall address-list add list=NASports_success address=\$\"caller-id \" timeout=1d" remote-address=pool1-dhcp
Вы бы хоть пояснили ... Судя по всему Вы подключаетесь с планшета VPN-клиентом и тогда при подключении Вас как клиента в Фаерволл добавляется нужный адрес-лист для доступности Вашего Nas - для клиента с Внешним адресом, который выуживается из $caller-id ppp-profile так ?


фрагменты скриптов, готовые работы, статьи, полезные приемы, ссылки
viewtopic.php?f=14&t=13947
Аватара пользователя
MaxoDroid
Сообщения: 355
Зарегистрирован: 14 май 2019, 22:55
Откуда: Краснодар

Совершенно верно!
В электронике это называется "защита от дребезга контактов".
Если клиент единожды подключился к порту, то он заносится в список проверенных и больше в течение дня не проверяется.


... CAPsMAN - вещь забавная и нужная.... Но провод - НАДЕЖНЕЕ!
Ответить