Knockd - Erfahrungen?

  • Ich nutze knock schon eine ganze Weile (für Verbindungen außerhalb des eigenen VPN) und bin sehr zufrieden damit, man kann sich fail2ban und/oder will­kür­li­che Nicht­stan­dard­port­aus­wah­len für die ent­spre­chen­den Dien­ste sparen. Wie bei allen Schlüsselsequenzen sollte man ggf. eine regelmäßige Änderung vorsehen.

    VServer IOPS Comparison Sheet: https://docs.google.com/spreadsheets/d/1w38zM0Bwbd4VdDCQoi1buo2I-zpwg8e0wVzFGSPh3iE

  • Und wie nutze ich das dann per ssh-Client?

    Zeitnah vor der Ausführung von ssh […] [remoteuser:]remotehost […] ist einfach jeweils knock remotehost […] aufzurufen ([…]-Vorgaben lassen sich in den jeweiligen Konfigurationsdateien hinterlegen, also /etc/ssh/ssh_config bzw. ~/.ssh/config und /etc/knockd.conf).

    Leider ist es meines Wissens bislang nicht direkt möglich, einen hook für ssh zu definieren, welcher automatisch für den Aufruf sorgt, wenn bestimmte Hosts kon­tak­tiert wer­den. Man kann sich aber ein ssh-Wrapper-Skript erstellen, welches mittels PATH-Initialisierung oder /etc/alternatives/ssh aufgerufen wird und dies leistet.

    Tipp: Insbesondere, wenn man UDP-(Teil-)Sequenzen zur Portöffnung für die anklopfende IP-Adresse verwendet und/oder das Timeout etwas knapp ge­wählt ist, kann na­tür­lich auch einmal ein Paket verloren gehen, wodurch die Sequenz nicht erkannt wird; hier schadet wiederholtes Anklopfen nicht.

    VServer IOPS Comparison Sheet: https://docs.google.com/spreadsheets/d/1w38zM0Bwbd4VdDCQoi1buo2I-zpwg8e0wVzFGSPh3iE

    2 Mal editiert, zuletzt von m_ueberall (24. November 2022 um 21:19)

  • Zeitnah vor der Ausführung von ssh […] [remoteuser:]remotehost […] ist einfach jeweils knock remotehost […] aufzurufen

    Was auf meinem Windowsrechner, von dem aus ich mich per Bitvise-ssh-Client immer mit meinen Servern verbinde aber wohl von Haus aus nicht so einfach gehen wird. ;)

  • Was auf meinem Windowsrechner, von dem aus ich mich per Bitvise-ssh-Client immer mit meinen Servern verbinde aber wohl von Haus aus nicht so einfach gehen wird. ;)

    Laut Anleitung können BvSsh alle erforderlichen Parameter übergeben werden, um (direkt) einen bestimmten Host zu kontaktieren. Erstellt man eine Ver­knü­pfung zu ei­nem host-spezifischen Batch-Script, kann in die Zeile davor einfach der erforderliche knock-Aufruf. Eine Host-Auswahl per Menü ist auf diese Weise al­ler­dings eher schwie­rig. (Aber es gilt ja „no pain, no gain“ :P )

    VServer IOPS Comparison Sheet: https://docs.google.com/spreadsheets/d/1w38zM0Bwbd4VdDCQoi1buo2I-zpwg8e0wVzFGSPh3iE

  • Laut Anleitung können BvSsh alle erforderlichen Parameter übergeben werden, um (direkt) einen bestimmten Host zu kontaktieren. Erstellt man eine Ver­knü­pfung zu ei­nem host-spezifischen Batch-Script, kann in die Zeile davor einfach der erforderliche knock-Aufruf. Eine Host-Auswahl per Menü ist auf diese Weise al­ler­dings eher schwie­rig. (Aber es gilt ja „no pain, no gain“ :P )

    Na das mit dem Skript und dass es keine Menüauswahl gibt hatte ich auch nicht als Hürde angesehen :), sondern dass ich ja erstmal irgendwie ein "knock" auch auf Windows ausführen kann.

  • Na das mit dem Skript und dass es keine Menüauswahl gibt hatte ich auch nicht als Hürde angesehen :), sondern dass ich ja erstmal irgendwie ein "knock" auch auf Windows ausführen kann.

    Im WSL sollte eigentlich auch das funktionieren (wenn man kein Windows-Pendant verwendet), da iptables die Windows-Firewall ansteuern kann.

    Vielleicht testet das ja mal jemand und gibt hier Rückmeldung? Das von Ganzjahresgriller empfohlene Windows-Programm ist aber wohl der einfachere Weg.

    VServer IOPS Comparison Sheet: https://docs.google.com/spreadsheets/d/1w38zM0Bwbd4VdDCQoi1buo2I-zpwg8e0wVzFGSPh3iE

    Einmal editiert, zuletzt von m_ueberall (25. November 2022 um 08:52)

  • Nachdem m_ueberall im Forum schon an diversen Stellen "Werbung" für knockd gemacht hat, habe ich das auch schon eine Weile zum Öffnen/Schließen des SSH-Ports in Betrieb.

    Beispiel knockd Sequenz für 1 Minute SSH-Port öffnen
    Code
    [openSSH_IP-1min]
           sequence    = 10000,20000,30000
           seq_timeout = 5
           command     = ufw allow from %IP% to any port 22 proto tcp
           cmd_timeout = 60
           stop_command = ufw delete allow from %IP% to any port 22 proto tcp
    # Sequenz und Port 22 sind nur exemplarisch

    Dieser Umstand rechtfertigt nun erstmal diesen extra Beitrag hier nicht.
    Heute ist mir aber mal wieder ein kleiner Unfall passiert:

    Aufgrund selbstverschuldeter Schusseligkeit habe ich mich versehentlich per SSH ohne korrekte Verwendung des Public Key Verfahrens (Schlüssel war im Dateisystem verschoben) mit einem Server verbinden wollen. Da der Schlüssel nicht an Ort und Stelle war, schaltete SSH kurzerhand auf Passwortauthentifizierung um - was aber gesperrt ist und sofort zu einem ban mittels fail2ban geführt hat.

    Hab' ich mich also mal wieder ausgesperrt... :rolleyes:

    Nun gut, in Zeiten von Smartphones mit Mobilfunknetz konnte ich mich, auch ohne die Konsole im SCP samt Passworteingabe, bequem am Handy mit der noch nicht gesperrten Mobilfunk-IP per SSH & Key einloggen und die dynamische IP des DSL-Anschlusses per unban wieder manuell freischalten.

    Dabei ist mir das ohnehin verwendete Port knocking in den Sinn gekommen und ich habe mir einfach eine unban Sequenz angelegt (und auch getestet). :)

    Vielleicht ist das auch für jemand von Euch interessant:

    knockd Sequenz für ein unban der aktuellen IP bei fail2ban
    Code
    [fail2ban_IP-unban]
           sequence    = 50000,40000,30000,20000,10000
           seq_timeout = 5
           command     = fail2ban-client set sshd unbanip %IP%

    Wer sich mit fail2ban nicht bei SSH ausgesperrt hat sondern woanders, kann auch einfach die aktuelle IP bei allen Jails rausnehmen:

    unban der aktuellen IP in allen fail2ban Jails
    Code
    command     = fail2ban-client unban %IP%

    Die ganze Angelegenheit ist vor allem bei dynamischer IP eines DSL-Anschlusses sinnvoll.
    Wer eine statische IP bekommt hat es natürlich mit einer Whitelist bzw. ignoreip in fail2ban einfacher.

    Schöne Grüße,
    Win98SE4ever


    P.s:

    Was auf meinem Windowsrechner, von dem aus ich mich per Bitvise-ssh-Client immer mit meinen Servern verbinde aber wohl von Haus aus nicht so einfach gehen wird. ;)

    Angenommen ich würde Windows benutzen :S dann würde ich an dieser Stelle auch aus eigener Erfahrung berichten können, dass folgende Batch-Datei problemlos funktioniert und z.B. Putty automatisch nach dem Port Knocking startet. Das ist schon ziemlich bequem, weil per Doppelklick sowohl das Portknocking als auch der Verbindungsaufbau automatisch erfolgen.
    Das geht bestimmt auch mit dem Bitvise-ssh-Client:

    Windows Batchskript für Port Knocking mit autom. Aufruf von Putty mit dem Server
    Code
    @echo off
    set IP=12.345.678.90
    set PORTS=10000,20000,30000
    echo Klopfe an %IP% auf Ports %PORTS%...
    powershell -Command "%PORTS% | %%{ $c = New-Object System.Net.Sockets.TcpClient; $c.BeginConnect('%IP%', $_, $null, $null); Start-Sleep -m 200; $c.Close() }"
    echo Sequenz gesendet.
    start "" "Laufwerk:\Pfad-zu\putty.exe" -load "Mein fetter netcup Server"
    exit
  • Was auf meinem Windowsrechner, von dem aus ich mich per Bitvise-ssh-Client immer mit meinen Servern verbinde aber wohl von Haus aus nicht so einfach gehen wird. ;)

    Angenommen ich würde Windows benutzen :S dann würde ich an dieser Stelle auch aus eigener Erfahrung berichten können, dass folgende Batch-Datei problemlos funktioniert und z.B. Putty automatisch nach dem Port Knocking startet. Das ist schon ziemlich bequem, weil per Doppelklick sowohl das Portknocking als auch der Verbindungsaufbau automatisch erfolgen.
    Das geht bestimmt auch mit dem Bitvise-ssh-Client:

    Windows Batchskript für Port Knocking mit autom. Aufruf von Putty mit dem Server
    Code
    @echo off
    set IP=12.345.678.90
    set PORTS=10000,20000,30000
    echo Klopfe an %IP% auf Ports %PORTS%...
    powershell -Command "%PORTS% | %%{ $c = New-Object System.Net.Sockets.TcpClient; $c.BeginConnect('%IP%', $_, $null, $null); Start-Sleep -m 200; $c.Close() }"
    echo Sequenz gesendet.
    start "" "Laufwerk:\Pfad-zu\putty.exe" -load "Mein fetter netcup Server"
    exit

    Ah. Nice. :) Danke.:thumbup:

  • Hm. Ist das mit der NC Firewall und VPNs denn wirklich noch nötig? Der sicherste SSH Port ist der, der gar nicht von außen sichtbar ist. Nichtmal für 1 Minute.

    RS 2000 G12 Pro BW25 (8C EPYC 9645, 16GB, 1TB) | RS 500 G12 BW25 (2C EPYC 9645, 4GB, 128GB) | RS Cyber Quack (1C,2GB,40GB)

  • Sehe ich ganz genauso. Beste Lösung wäre per Jumphost und/oder VPN.

    Habe ich bei meinem Mailserver so gelöst. In der Firewall Port 22 alles geblockt, außer dem /64 Subnetz zuhause und den Jumphost IPs. Von zuhause aus merke ich keinen Unterschied zu vorher, weil sowieso IPv6 verwendet wird und mit der kann ich mich verbinden. Und von anderswo gehe ich dann über einen Jumphost auf den Server. Freilich verschiebt das das Problem auch nur auf den Jumphost, der dann eben sicher sein muss. Ist aber jedenfalls schön ruhig in fail2ban.