Während ich mich vor kurzem mit dem iptables-Modul recent beschäftigt habe, ist mir eine Idee gekommen, wie das gewöhnlich verwendete Vorgehen im umgekehrter Weise zum Verschleiern des SSH-Ports verwendet werden könnte: Anstatt nur den Port bei zu vielen Zugriffen zu sperren, könnte man ihn ja auch erst dann freigeben, wenn auf einen bestimmten anderen zugegriffen wurde.

Auf diese Weise würde der Port für einfache Scanner und Bots, die an Port 22 suchen, unsichtbar. Sicher könnte man einfach einen anderen Port wählen, aber auch dort kann ein laufender SSH-Server erkannt werden. Wer ihn besser verstecken will, kann sich diese Lösung ansehen:

iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp --dport 5544 -m recent --name SSHOK --set -j REJECT
iptables -A INPUT -p tcp --dport 22 -m recent --name SSHOK --update --seconds 30 --hitcount 1 -j ACCEPT
[...weitere eigene Regeln für sonstige Dienste...]
iptables -A INPUT -j REJECT

Die erste Regel gibt an, dass bereits bestehende Verbindungen erhalten bleiben dürfen. So können wir eine SSH-Sitzung von unbegrenzter Dauer führen, sobald sie einmal aufgenommen wurde. Der zweite Befehl lässt die Zugriffe auf den Port 5544 in der Recent-Tabelle SSHOK speichern. Diese sollte dann unter /proc/net/xt_recent/SSHOK eingesehen werden können. Da der Port ebenfalls mit REJECT beantwortet wird, ist er nicht aufspürbar.

Der dritte Befehl schaltet schließlich den Port 22 frei und ermöglicht dort einen Verbindungsaufbau – aber nur, wenn sich der Host in der Tabelle SSHOK befindet. Ein Host, der auf Port 5544 zugegriffen hat, hat also 30 Sekunden Zeit, um die SSH-Verbindung aufzubauen. Danach kann er die Sitzung beliebig lang fortführen.

Will man sich nun mit Port 22 verbinden, dann erhält man einen Fehler:

florian@linuxpc ~ % ssh florian@192.168.1.6
ssh: connect to host 192.168.1.6 port 22: Connection refused

Auch der Port 5566 ergibt einen Fehler:

florian@linuxpc ~ % ssh -p 5566 florian@192.168.1.6
ssh: connect to host 192.168.1.6 port 5566: Connection refused

Nach dem Verbindungsversuch an Port 5566 kann man sich jedoch auf auf Port 22 einloggen:

florian@linuxpc ~ % ssh -p 5566 florian@192.168.1.6
ssh: connect to host 192.168.1.6 port 5566: Connection refused
florian@linuxpc ~ % ssh -p 22 florian@192.168.1.6
florian@192.168.1.6's password: 
Last login: Wed Nov 27 23:41:30 2013 from 192.168.1.10
[florian@rou1 /]$ 

nmap findet auf dem Testrechner nur den regulär zugänglichen HTTP-Server. Weder Port 22 noch 5544 werden erkannt:

sudo nmap -sS 192.168.1.6 -p 1-10000

Starting Nmap 6.00 ( http://nmap.org ) at 2013-11-28 00:19 CET
Nmap scan report for 192.168.1.6
Host is up (0.00034s latency).
Not shown: 9999 filtered ports
PORT   STATE SERVICE
80/tcp open  http
MAC Address: 08:00:27:68:12:63 (Cadmus Computer Systems)

Nmap done: 1 IP address (1 host up) scanned in 28.04 seconds