Każdy z nas ma chyba taką osobę, którą rozpoznaje po sposobie pukania do drzwi i już wie, czy iść otworzyć, czy udawać, że nikogo nie ma w domu. To można obrazowo wyjaśnić, czym jest port knocking, czyli wysyłanie umówionej sekwencji pakietów, np. UDP, TCP, ICMP, do serwera SSH, aby ten otworzył port umożliwiający połączenie przez SSH. Opcja, którą przed chwilą zobrazowałem, jest jedną z wielu. W tym artykule pokażę, jak skonfigurować usługę SSH tak, aby po wysłaniu danej sekwencji pakietów na wcześniej zdefiniowane porty serwer wystawił port, na którym będzie nasłuchiwał połączenia przychodzącego przez SSH.
Kiedy i gdzie wykorzystujemy takie rozwiązanie?
Na przykład, możemy je wykorzystać podczas wystawiania serwera czy routera na świat, gdy nie chcemy, aby wszyscy wiedzieli, jakie porty mamy otwarte. W większości przypadków nasze urządzenia są skanowane przez automaty, które sprawdzają domyślne porty popularnych usług w celu próby dostania się do serwera, wykorzystując domyślne poświadczenia lub luki w oprogramowaniu. Zakładamy jednak, że my akurat na bieżąco aktualizujemy swoje serwery, prawda? 😉
Dzięki port knockingowi tylko my znamy tajną sekwencję, po której serwer otworzy dla nas połączenie.
Osoba ręcznie skanująca nasz serwer może zauważyć, że niektóre porty są filtrowane i tu może zacząć się domyślać, że coś jest na rzeczy, ale nadal nie wie, jakie warunki musi spełnić, aby nasz serwer, a dokładniej firewall, wystawił na świat port, na którym będzie nasłuchiwała usługa SSH.
Jak możemy wywnioskować, taka konfiguracja znacznie podnosi bezpieczeństwo naszego serwera czy np. urządzenia sieciowego.
Naszą konfigurację będziemy wykonywać na serwerze z dystrybucją Debian.
W pierwszej kolejności aktualizujemy nasz serwer.
apt-get update && apt-get install –y
Po aktualizacji możemy przystąpić to instalacji i konfiguracji port knock.
sudo apt install knockd
A następnie edytujemy plik konfiguracyjny, zmieniając w nim domyślne wartości portów.
sudo nano /etc/knockd.conf

W mojej konfiguracji ustawione zostały porty 7070, 8010, 9050, a czas oczekiwania na sekwencję wydłużyłem do 50 sekund – lub według uznania. W tym czasie musimy 'zapukać’ w określonej kolejności na podane porty, aby firewall wystawił dla nas port 22, przez który następnie połączę się za pomocą SSH. Port jest otwierany wyłącznie dla adresu IP, z którego zostało wykonane pukanie; nikt inny nie zobaczy, że port jest dostępny publicznie. Możemy to zweryfikować, skanując serwer z innego adresu IP za pomocą narzędzia nmap.
Musimy jeszcze zmienić regułę firewalla: polecenie 'command = /sbin/iptables –A’ zmieniamy na '–I’.
W sekcji [closeSSH] ustawiamy sekwencję pukania, która zamknie naszą sesję SSH, a firewall ukryje port 22.

Zapisujemy zmiany. Do edycji pozostał nam jeszcze jeden plik konfiguracyjny, /etc/default/knockd
, w którym ustawiamy uruchamianie programu oraz definiujemy interfejs sieciowy. Ponieważ może być on różny w zależności od systemu, warto sprawdzić, którego chcemy użyć. Najlepiej zrobić to, wykonując polecenie ip -c a
; w moim przypadku jest to ens33.

Zapisujemy ustawianie i uruchamiamy naszą usługę port knock.
sudo systemctl start knockd
sudo systemctl enable knockd
Sprawdzamy czy usługa działa.
sudo systemctl status knockd

Aby konfiguracja firewalla była dla nas wygodniejsza i bardziej intuicyjna, możemy zainstalować nakładkę na iptables, czyli ufw.
sudo apt install ufw
Sprawdzamy czy działa ufw.
sudo ufw status
I w ten sposób mamy wyłączone nasłuchiwanie serwera na porcie 22.
Aby połączyć się przez SSH na porcie 22 musimy do naszego serwera zapukać w tej kolejności i na te porty które wcześniej zdefiniowaliśmy.
Połączenie się do serwera od strony klienta.
Aby połączyć się z naszym serwer który ma skonfigurowany port knock, musimy zainstalować sobie port knockd aby zautomatyzować nasze pukanie.
sudo apt install knockd
I teraz pukamy do naszego serwera w naszym przypadku będzie to.
Knock –v 192.168.88.242 7070 8010 9050
Teraz możemy spróbować połączyć się przez SSH.
Po zakończonej pracy wysyłamy sekwencję zamykającą port; w moim przypadku wyglądało to tak.
knock -v 192.168.88.242 9000 8000 7000