Port Knocking allows one to open/close a remote port in the firewall of a server with the usage of a secret combination of ports (141 trillion possible combinations).
It creates an extra layer of security for sensitive services such as SSH Server.
SERVER-SIDE
sudo apt update sudo apt install knockd -y sudo nano /etc/knockd.conf
Edit the configuration accordingly:
[options] UseSyslog [openSSH] sequence = 54321,12345,10101 seq_timeout = 5 command = /sbin/iptables -A INPUT -s %IP% -p tcp --dport 22 -j ACCEPT tcpflags = syn [closeSSH] sequence = 12345,10101,54321 seq_timeout = 5 command = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT tcpflags = syn
Note: the port will be open for connections exclusively from the %IP% who is opening the port with the correct sequence, remaining closed for the whole internet. By default, it is set for 5 seconds since the first and last knock of the sequence with no other port being knocked.
Then,
sudo nano /etc/default/knockd
Change the following configuration:
START_KNOCKD=1
Start the service.
sudo systemctl start knockd sudo systemctl enable knockd sudo ufw enable sudo reboot
And make sure port 22 is not enabled on the firewall and is enabled.
CLIENT-SIDE
sudo apt update sudo apt install knockd -y
Send the knock sequence to open the port:
knock -v myserver.com 54321 12345 10101 --delay 100
Send the knock sequence to close the port:
knock -v myserver.com 12345 10101 54321 --delay 100
Note: the delay of 100 milliseconds is recommended because depending on the route each packet takes they may arrive in a different order.
The combination can be sent using telnet:
timeout 0.1 telnet myserver.com 54321 ; timeout 0.1 telnet myserver.com 12345 ; timeout 0.1 telnet myserver.com 10101 timeout 0.1 telnet myserver.com 12345 ; timeout 0.1 telnet myserver.com 10101 ; timeout 0.1 telnet myserver.com 54321