Рубрики
network \ сеть

Port knocking / icmp knoking

Ссылки:

https://putty.org.ru/articles/port-knocking
https://habr.com/ru/companies/inDrive/articles/673976/
http://www.portknocking.org/




https://ipset.netfilter.org/iptables.man.html
https://ipset.netfilter.org/ipset.man.html
https://ipset.netfilter.org/iptables-extensions.man.html


iptables: конспект / iptables / conntrack / NAT / sysctl
Конспект: mikrotik firewall

knockd

0. Сервис knockd служит для прослушивания любого порта и выполнения любой команды commnad.
apt install -y knockd


1. Настройка:
vim /etc/knockd.conf 
--------------------
[options]
 UseSyslog
 Interface = enp3s0

[SSH]
 sequence    = 7000,8000,9000
 seq_timeout = 5
 tcpflags    = syn
 start_command     = /sbin/iptables -I INPUT -s %IP% -p tcp --dport 45916 -j ACCEPT
 stop_command     = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 45916 -j ACCEPT
 cmd_timeout   = 60
---------------------

Interface
вы можете определить, какой интерфейс прослушивать в случае, если в вашей системе он не является единственным.

Значение параметра sequence определяет последовательность. Числа являются номерами TCP-портов. 
Также, вы можете явно указать, TCP или UDP порт использовать, при помощи суффиксов :tcp и :udp. 
Например:
sequence = 3333:tcp,9999:udp,1010:udp,8675:tcp

Значение параметра seq_timeout задаёт максимальное время в секундах, которое отводится на совершение клиентом последовательности подключений. 
Если клиент не укладывается в это время — подключение будет отклонено.

Значение параметра command определяет путь и параметры вызываемой программы в случае обнаружения корректной последовательности.

Параметром tcpflags вы можете определять, какие флаги должны иметь пакеты, участвующие в последовательности. 
Несколько флагов необходимо разделять запятой:
tcpflags = syn,ack,urg

А для явного исключения отельных флагов нужно использовать восклицательный знак:
tcpflags = syn,!ack,urg

Параметр start_command по смыслу идентичен параметру command. 
Значение параметра cmd_timeout определяет временной интервал в секундах, по истечении которого запустится команда, 
определённая значением параметра stop_command. 
Таким образом, вы можете открывать определённый порт лишь на некоторый промежуток времени.




2. Автозапуск:
ip a - имя интерфеса
vim /etc/default/knockd
-----------------------
START_KNOCKD=1
KNOCKD_OPTS="-i enp3s0"
-----------------------
Здесь enp3s0 это сетевой интерфейс на котором работает программа knockd.

systemctl start knockd
systemctl enable knockd
systemctl status knockd

Собственно а как стучать в порты?!

!!! Port Knocking  есть строенный в PuTTY

Программа knock для постукивания в порт:
knock 10.0.1.100 3333:tcp 9999:udp 1010:udp 8675:tcp

Программа nmap:
for x in 7000 8000 9000; do nmap -Pn --max-retries 0 -p $x 10.10.0.12; done 


Для windows:  
ping -l 2 -n 5 10.0.0.25 - при такой команде будет послано пять пакетов размером 2 на адрес 10.0.0.5
Для linux: 
ping -s 2 -c 5 10.0.0.25 - - при такой команде будет послано пять пакетов размером 2 на адрес 10.0.0.5

icmp knoking / iptables / ipset


Пример правил в iptables:
iptables -N INPUT_NEW
iptables -N PORTKNOCKING
iptables -A INPUT -m conntrack --ctstate INVALID -j DROP
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -m conntrack --ctstate NEW -j INPUT_NEW
iptables -A INPUT_NEW -j PORTKNOCKING
iptables -A INPUT_NEW -p tcp -m tcp --dport 22 -m set --match-set knock_allow src,src -j ACCEPT
iptables -A PORTKNOCKING -p icmp --icmp-type 8 -m connbytes --connbytes 500:500 --connbytes-mode bytes --connbytes-dir original -m set --match-set knock_step_2 src -j SET --add-set knock_allow src,src --exist
iptables -A PORTKNOCKING -p icmp --icmp-type 8 -m connbytes --connbytes 1028:1028 --connbytes-mode bytes --connbytes-dir original -m set --match-set knock_step_1 src -j SET --add-set knock_step_2 src
iptables -A PORTKNOCKING -p icmp --icmp-type 8 -m connbytes --connbytes 999:999 --connbytes-mode bytes --connbytes-dir original -j SET --add-set knock_step_1 src
iptables -P INPUT DROP

Создание списков:
ipset create knock_allow hash:net,iface timeout 60
ipset create knock_step_1 hash:ip timeout 2
ipset create knock_step_2 hash:ip timeout 2

Вот так пингуем:
ping -l 971 -w 100 -n 1 mysrv.com; ping -l 1000 -w 100 -n 1 mysrv.com; ping -l 472 -w 100 -n 1 mysrv.com; ssh mysrv.com

Mikrotik port knoking icmp

!!! может быть полезно для создания portknoking
!!! по умолчанию размер пакета ping равен 28
!!! Для windows:  ping -l 2 -n 5 10.0.0.25 - при такой команде будет послано пять пакетов размером 2 на адрес 10.0.0.5
!!! Для linux: ping -s 2 -c 5 10.0.0.25 - - при такой команде будет послано пять пакетов размером 2 на адрес 10.0.0.5

/ip firewall filter
add action=add-src-to-address-list address-list=ping_size_2_me address-list-timeout=10m chain=input in-interface-list=WAN packet-size=30 protocol=icmp