Linux-Tipps & Tricks: Server, öffne dich

FĂŒr diejenigen, die sich den Zugang zu ihren Servern von ĂŒberall auf der Welt per SSH/RDP/anderes sichern möchten – eine kleine RTFM/Hilfe.

Wir mĂŒssen ohne VPN und andere Spielereien auskommen, von jedem verfĂŒgbaren GerĂ€t.

Und so, dass man sich nicht zu sehr mit dem Server herumÀrgern muss.

Alles, was dazu nötig ist – knockd, geschickte HĂ€nde und 5 Minuten Arbeit.

„Im Internet gibt es alles“, natĂŒrlich (sogar auf Habr), aber wenn es auf die konkrete Umsetzung ankommt – dann geht’s los


Wir ĂŒben am Beispiel von Fedora/CentOS, aber das ist nicht wichtig.

Die Hilfe eignet sich sowohl fĂŒr AnfĂ€nger als auch fĂŒr alte Hasen, daher wird es Kommentare geben, aber kĂŒrzer gehalten.

1. Server

  • installieren wir den knock-server:
    yum/dnf install knock-server

  • konfigurieren ihn (zum Beispiel fĂŒr ssh) – /etc/knockd.conf:

    [options]
        UseSyslog
        interface = enp1s0f0
    [SSHopen]
        sequence        = 33333,22222,11111
        seq_timeout     = 5
        tcpflags        = syn
        start_command   = iptables -A INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
        cmd_timeout     = 3600
        stop_command    = iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
    [SSHclose]
        sequence        = 11111,22222,33333
        seq_timeout     = 5
        tcpflags        = syn
        command         = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT

    Der „öffnende“ Teil ist so eingestellt, dass er sich nach 1 Stunde automatisch schließt. Wer weiß


  • /etc/sysconfig/iptables:

    ...
    -A INPUT -p tcp -m state --state NEW -m tcp --dport 11111 -j ACCEPT
    -A INPUT -p tcp -m state --state NEW -m tcp --dport 22222 -j ACCEPT
    -A INPUT -p tcp -m state --state NEW -m tcp --dport 33333 -j ACCEPT
    ...

  • weiter:

    service iptables restart
    service knockd start

  • man kann RDP fĂŒr den virtuellen Windows Server hinzufĂŒgen ( /etc/knockd.conf; den Namen der Schnittstelle nach Belieben einsetzen):

    [RDPopen]
        sequence        = 44444,33333,22222
        seq_timeout     = 5
        tcpflags        = syn
        start_command   = iptables -t nat -A PREROUTING -s %IP% -i enp1s0f0 -p tcp -m tcp --dport 3389 -j DNAT --to-destination 192.168.0.2
        cmd_timeout     = 3600
        stop_command    = iptables -t nat -D PREROUTING -s %IP% -i enp1s0f0 -p tcp -m tcp --dport 3389 -j DNAT --to-destination 192.168.0.2
    [RDPclose]
        sequence        = 22222,33333,44444
        seq_timeout     = 5
        tcpflags        = syn
        command         = iptables -t nat -D PREROUTING -s %IP% -i enp1s0f0 -p tcp -m tcp --dport 3389 -j DNAT --to-destination 192.168.0.2

    Alle unsere Pings vom Client verfolgen wir auf dem Server mit dem Befehl iptables -S.

2. Wegweiser durch die Fallstricke

knockd.conf:

In den Manpages steht auch alles (aber das ist ungenau), jedoch ist knockd ein recht geiziger Freund mit Nachrichten, daher sollte man sehr aufmerksam sein.

  • Version
    In den Repositories von Fedora/CentOS ist die neueste Version von knockd heute – 0.63. Wer UDP möchte – sucht nach Paketen 0.70.
  • interface
    In der Standardkonfiguration von Fedora/CentOS fehlt diese Zeile komplett.Man muss sie manuell hinzufĂŒgen, sonst funktioniert es nicht.
  • timeout
    Hier nach Geschmack anpassen. Es sollte genug Zeit fĂŒr den Client fĂŒr alle Pings geben – und der Bot-Port-Scanner sollte gestoppt werden (und scannen werden sie zu 146%).
  • start/stop/command.
    Wenn das Team eins ist — dann command, wenn zwei — dann start_command+stop_command.
    Wenn Sie einen Fehler machen — wird knockd schweigen, aber nicht funktionieren.
  • proto
    Theoretisch kann man UDP verwenden. Praktisch habe ich tcp und udp gemischt, und ein Client am Strand in Bali konnte sein Tor nur beim fĂŒnften Mal öffnen. Denn TCP kommt an, wenn es muss, UDP — nicht unbedingt. Aber das ist Geschmackssache.
  • sequence
    Die impliziten Fallstricke bestehen darin, dass Sequenzen sich nicht ĂŒberschneiden dĂŒrfen
 wie soll ich das sagen


Zum Beispiel so:

open: 11111,22222,33333
close: 22222,11111,33333

Beim Kick 11111 öffnen wird er auf den nĂ€chsten Kick bei 22222 warten. Aber bei diesem (22222) Kick wird er anfangen zu arbeiten schließen und alles wird kaputtgehen. Das hĂ€ngt auch vom Delay des Clients ab. So sieht's aus ©.

iptables

Wenn in /etc/sysconfig/iptables das hier steht:

*nat
:PREROUTING ACCEPT [0:0]

dann stört uns das nicht besonders, aber das hier:

*filter
:INPUT ACCEPT [0:0]
...
-A INPUT -j REJECT --reject-with icmp-host-prohibited

stört uns wirklich.

Da knockd Regeln am Ende der INPUT-Kette hinzufĂŒgt, werden wir eine Ablehnung erhalten.

Und diesen Ablehnung ausschalten — das wĂ€re es, die Maschine allen Winden auszusetzen.

Um nicht im iptables herumzuwĂŒhlen, was wohin vor was einzufĂŒgen (wie es die Leute vorschlagen) machen wir es einfacher:

  • StandardmĂ€ĂŸig in CentOS/Fedora erster Regel („was nicht verboten ist, ist erlaubt“) ersetzen wir durch das Gegenteil,
  • und die letzte Regel entfernen wir.

Am Ende sollte es so aussehen:

*filter
:INPUT DROP [0:0]
...
#-A INPUT -j REJECT --reject-with icmp-host-prohibited

Man kann natĂŒrlich statt DROP auch REJECT machen, aber mit DROP wird es Bots leichter fallen.

3. Client

An dieser Stelle wird es am interessantesten (meiner Meinung nach), da man nicht nur von jedem Strand aus arbeiten muss, sondern auch von jedem GerÀt.

Viele Clients sind auf Website dem Projekt aufgelistet, aber das gehört zur Kategorie „im Internet gibt’s alles“. Deshalb werde ich nur das auffĂŒhren, was ich hier und jetzt unter meinen HĂ€nden habe.

Bei der Auswahl eines Clients muss darauf geachtet werden, dass er die Option Delay zwischen den Paketen unterstĂŒtzt. Ja, Strand ist nicht gleich Strand und 100 Megabit garantieren nicht, dass die Pakete zur richtigen Zeit in der richtigen Reihenfolge von diesem Ort ankommen.

Und ja — bei der Konfiguration des Clients muss das Delay selbst angepasst werden. Zu viel Timeout — Bots werden angreifen, zu wenig — der Client hat keine Zeit. Zu viel Delay — der Client hat keine Zeit oder es kommt zu Konflikten bei den StĂ¶ĂŸen (siehe „Fallstricke“), zu wenig — die Pakete verirren sich im Internet.

Bei timeout=5s ist delay=100..500ms eine durchaus praktikable Option.

Windows

So lustig es auch klingt, aber es ist ziemlich untrivial, einen klaren Knock-Client fĂŒr diese Plattform zu finden. Einen, der CLI unterstĂŒtzt, Delay hat, TCP — und keine Schleifen.

Alternativ können Sie es versuchen das hier. Offensichtlich ist mein Google nicht das Wahre.

Linux

Hier ist alles einfach:

dnf install knock -y
knock -d   11111 22222 33333

MacOS

Am einfachsten ist es, das Paket aus Homebrew zu installieren:
brew install knock
und die benötigten Batch-Dateien in dieser Art zu erstellen:

#!bin/sh
knock -d <delay> <dst_ip> 11111 22222 33333

iOS

Eine funktionierende Variante ist KnockOnD (kostenlos, aus dem Store).

Android

„Knock on Ports“. Keine Werbung, sondern es funktioniert einfach. Und die Entwickler sind recht reaktionsschnell.

P.S. Markdown auf Habr, nun ja, möge es ihm irgendwann gut gehen


UPD1: Dank einem netten Menschen wurde gefunden ein funktionierender Client fĂŒr Windows.
UPD2: Noch ein netter Mensch hat erinnert, dass es nicht immer sinnvoll ist, neue Regeln ans Ende von iptables zu setzen. Aber - es kommt darauf an.

Quelle: habr.com

60GB SSD 8Gb DDR4