Chi ha bisogno di accedere ai propri server da qualsiasi parte del mondo via SSH/RDP/altro — un piccolo RTFM/aiuto.
Dobbiamo evitare VPN e altre complicazioni, da qualsiasi dispositivo a portata di mano.
E in modo che non sia troppo complicato con il server.
Tutto ciò che serve è — , mani abili e 5 minuti di lavoro.
«Su internet c'è tutto», certo (anche su ), ma quando si arriva alla realizzazione concreta — qui comincia...
Ci eserciteremo con Fedora/CentOS, ma non è importante.
L'aiuto è adatto sia ai principianti che ai veterani, quindi ci saranno commenti, ma più brevi.
1. Server
installiamo knock-server:
yum/dnf install knock-serverconfiguriamolo (ad esempio su 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 ACCEPTLa parte «aperta» è configurata per chiudersi automaticamente dopo 1 ora. Non si sa mai…
/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 ...avanti:
service iptables restart service knockd startpuoi aggiungere RDP su un Windows Server virtuale (/etc/knockd.conf; sostituisci il nome dell'interfaccia come preferisci):
[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.2Teniamo traccia di tutti i ping dal cliente sul server con il comando
iptables -S.
2. Guida agli errori
knockd.conf:
Ci sono anche informazioni nella documentazione (ma non è preciso), tuttavia knockd è piuttosto avaro nelle comunicazioni, quindi è necessario prestare molta attenzione.
- versione
Nelle repository di Fedora/CentOS, l'ultima versione di knockd è 0.63. Se cerchi UDP, cerca i pacchetti 0.70. - interfaccia
Nella configurazione predefinita di Fedora/CentOS, questa riga è assente. Aggiungere manualmente, altrimenti non funzionerà. - timeout
Qui puoi scegliere secondo il tuo gusto. È importante che il cliente abbia tempo per tutti gli accessi — e il bot di scansione delle porte si sia bloccato (e scansioneranno il 146%). - start/stop/comando.
Se c'è un solo comando — allora comando, se ce ne sono due — allora start_command+stop_command.
Se sbagli, knockd non dirà nulla, ma non funzionerà. - proto
Teoricamente è possibile usare UDP. Nella pratica, avevo mescolato tcp e udp, e il cliente dalla spiaggia di Bali è riuscito ad aprire il cancello solo al quinto tentativo. Perché TCP è arrivato quando doveva, ma UDP — non è garantito. Ma questo è soggettivo, di nuovo. - sequence
I rischi impliciti sono che le sequenze non devono sovrapporsi... come spiegarlo...
Ad esempio, così:
open: 11111,22222,33333
close: 22222,11111,33333Per il comando 11111 open aspettare il prossimo accesso su 22222. Tuttavia, con questo (22222) accesso inizierà a funzionare close e tutto si guasterà. Questo dipende anche dal delay del cliente. È così ©.
iptables
Se in /etc/sysconfig/iptables abbiamo questo:
*nat
:PREROUTING ACCEPT [0:0]non ci dà fastidio, allora abbiamo questo:
*filter
:INPUT ACCEPT [0:0]
...
-A INPUT -j REJECT --reject-with icmp-host-prohibitedIn effetti dà fastidio.
Poiché knockd aggiunge regole alla fine della catena INPUT, otterremo un rifiuto.
Disattivare questo rifiuto significa aprire la macchina a tutti i venti.
Per evitare complicazioni con iptables riguardo a cosa inserire e dove (come alcuni la regola di default
- in CentOS/Fedora la prima regola ("ciò che non è vietato è consentito") la sostituiamo con l'opposto, e rimuoviamo l'ultima regola.
- In definitiva, dovrebbe risultare:
*filter :INPUT DROP [0:0] ... #-A INPUT -j REJECT --reject-with icmp-host-prohibited
Naturalmente, al posto di DROP si può impostare REJECT, ma con DROP i bot si troveranno meglio.3. Client
Qui arriva la parte più interessante (dal mio punto di vista), poiché si deve lavorare non solo da qualsiasi spiaggia, ma anche da qualsiasi dispositivo.
In linea di massima, diversi client sono elencati nel
progetto, ma fanno parte della stessa categoria di "c'è tutto su internet". Pertanto, elencherò ciò che qui e ora funziona a mia disposizione. Quando si sceglie un client, è necessario assicurarsi che supporti l'opzione di delay tra i pacchetti. Sì, una spiaggia è diversa dall'altra e 100 megabit non garantiscono che i pacchetti arrivino nell'ordine e nel tempo richiesti da quel posto.
E sì—nella configurazione del client, il delay deve essere scelto in modo personalizzato. Troppo timeout — i bot attaccheranno; troppo poco — il client non ce la farà. Troppo delay — il client non ce la farà o ci saranno conflitti (vedi "problemi"), troppo poco — i pacchetti si smarriranno in internet.
И да — при настройке клиента delay надо подбирать самостоятельно. Много timeout — боты нападут, мало — клиент не успеет. Много delay — клиент не успеет или будет конфликт простуков (см. «грабли»), мало — пакеты перезаблудятся в интернетах.
Con timeout=5s è davvero una valida opzione delay=100..500ms
Windows
Per quanto possa suonare strano, trovare un knock client decente per questa piattaforma è piuttosto complicato. Uno che supporti CLI, delay, TCP e senza fronzoli.
Come opzione, si può provare . Evidentemente Google non è molto utile.
Linux
Qui è tutto semplice:
dnf install knock -y
knock -d 11111 22222 33333MacOS
È più facile installare il pacchetto da homebrew:
brew install knock
e crearti i comandi batch necessari:
#!bin/sh
knock -d <delay> <dst_ip> 11111 22222 33333iOS
Una opzione funzionante è KnockOnD (gratuito, dal negozio).
Android
«Knock on Ports». Non è pubblicità, semplicemente funziona. E gli sviluppatori sono abbastanza reattivi.
P.S. il markdown su Habr, beh, gli auguro davvero buona fortuna un giorno...
UPD1: grazie a è stato trovato per Windows.
UPD2: un'altra ha ricordato che aggiungere nuove regole alla fine di iptables non è sempre utile. Ma — dipende.
Fonte: habr.com
