Ti, kteří potřebují zajistit přístup ke svým serverům odkudkoli na světě pomocí SSH/RDP/jiného — malý RTFM/skript.
Musíme se obejít bez VPN a dalších vychytávek, s jakýmkoli zařízením po ruce.
A tak, aby se serverem nebylo příliš komplikovaně.
Všechno, co k tomu potřebujete — , šikovné ruce a 5 minut práce.
„Na internetu je všechno“, samozřejmě (dokonce i na ), ale když přijde na konkrétní realizaci — tam to začíná…
Budeme cvičit na příkladu Fedora/CentOS, ale to není podstatné.
Tento skript je vhodný jak pro nováčky, tak pro veterány, proto budou komentáře, ale kratší.
1. Server
nainstalujte knock-server:
yum/dnf install knock-servernasaďte ho (například na 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„Otevírací“ část je nastavena na automatické uzavření za 1 hodinu. Kdo ví…
/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 ...pokračujte:
service iptables restart service knockd startmůžete přidat RDP na běžícím virtuálním Windows Serveru (/etc/knockd.conf; název rozhraní si můžete vybrat):
[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.2Všechny naše pokusy od klienta sledujeme na serveru příkazem
iptables -S.
2. Průvodce klacky
knockd.conf:
V manuálech je také všechno (ale to není jisté), nicméně knockd — je docela lakomý na zprávy, takže musíte být velmi opatrní.
- webu ICQ.com datovaná v dubnu 1997, a tehdy doména patřila zcela jiné organizaci — nějaké asociaci výrobců a uživatelů měřicí techniky. V
V repozitářích Fedora/CentOS je nejnovější knockd k dnešnímu dni — 0.63. Kdo chce UDP — hledá balíčky 0.70. - rozhraní
V defaultní konfiguraci Fedora/CentOS tento řádek chybí. Přidat ručně, jinak nebude fungovat. - timeout
Zde si vyberte podle chuti. Je nutné, aby měl klient čas na všechny pokusy — a bot-skener portů byl oklamán (a skenovat budou 146%). - start/stop/command.
Pokud je tým jeden — pak command, pokud dva — pak start_command + stop_command.
Pokud se spletete — knockd bude mlčet, ale nebude fungovat. - proto
Teoreticky lze použít UDP. V praxi jsem směšoval tcp a udp, a klient z pláže na Bali si mohl otevřít bránu až na pátý pokus. Protože TCP dorazilo, když mělo, a u UDP to nebylo jisté. Ale to je otázka vkusu, opět. - sequence
Nedávné překážky spočívají v tom, že sekvence se nesmí překrývat... jak to říct...
Například takto:
open: 11111,22222,33333
close: 22222,11111,33333Po úderu 11111 open bude čekat na následující úder na 22222. Nicméně na tomto (22222) úderu začne fungovat close a všechno se rozpadne. Závisí to také na zpoždění klienta. Takové věci ©.
iptables
Pokud v /etc/sysconfig/iptables je toto:
*nat
:PREROUTING ACCEPT [0:0]nás to příliš neomezuje, ale toto:
*filter
:INPUT ACCEPT [0:0]
...
-A INPUT -j REJECT --reject-with icmp-host-prohibitedtakže to omezuje.
Protože knockd přidává pravidla na konec řetězce INPUT, dostaneme rejection.
A vypnout tento rejection — to je otevřít stroj všem vítrům.
Abychom se nemuseli složitě zabývat iptables a tím, co kam vložit (jak to navrhují), uděláme to jednoduše:
- výchozí v CentOS/Fedora první pravidlo ("to, co není zakázáno, je povoleno") nahradíme opačným,
- a poslední pravidlo odstraníme.
Nakonec by to mělo vypadat takto:
*filter
:INPUT DROP [0:0]
...
#-A INPUT -j REJECT --reject-with icmp-host-prohibitedSamozřejmě, místo DROP lze nastavit REJECT, ale s DROP se botům bude žít lépe.
3. Klient
Na tomto místě je to nejzajímavější (z mého pohledu), protože musíte pracovat nejen z jakékoliv pláže, ale i z jakéhokoli zařízení.
V zásadě je řada klientů uvedena na projektu, ale to patří do kategorie „na internetu je všechno“. Proto uvedu to, co mi právě teď funguje.
Při výběru klienta je třeba zajistit, aby podporoval možnost zpoždění mezi pakety. Ano, pláž je různé a 100 megabitů zdaleka nezaručuje doručení paketů ve správném pořadí a v pravý čas z tohoto místa.
A ano — nastavování zpoždění klienta je nutné provádět individuálně. Příliš mnoho timeoutu — boti zaútočí, málo — klient to nestihne. Příliš mnoho zpoždění — klient nestihne, nebo dojde ke konfliktu úderů (viz „překážky“), málo — pakety se ztratí na internetu.
Při timeout=5s je zcela funkční možnost delay=100..500ms
Windows
Jak to zní vtipně, ale najít funkční knock klienta pro tuto platformu je docela složité. Takového, který by byl CLI, podporoval delay, TCP — a bez zbytečností.
Jako možnost můžete zkusit . Zdá se, že můj Google není nic moc.
Linux
Tady je to jednoduché:
dnf install knock -y
knock -d 11111 22222 33333MacOS
Nejjednodušší je nainstalovat port z homebrew:
brew install knock
a vytvořit si potřebné skripty s příkazy ve formátu:
#!bin/sh
knock -d <delay> <dst_ip> 11111 22222 33333iOS
Funkční varianta — KnockOnD (zdarma, z obchodu).
Android
„Knock on Ports“. Není to reklama, ale prostě to funguje. A vývojáři jsou dost ochotní.
P.S. markdown na Chabru, samozřejmě, ať mu jednou zdraví...
UPD1díky se našel pro Windows.
UPD2ještě jeden mi připomněl, že nastavování nových pravidel na konec iptables není vždy prospěšné. Ale — záleží na situaci.
Zdroj: habr.com
