Linux tipy & triky: server, otevři se

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 — knockd, šikovné ruce a 5 minut práce.

„Na internetu je všechno“, samozřejmě (dokonce i na Habr), 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-server

  • nasaď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 start

  • můž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.2

    Vš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,33333

Po ú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-prohibited

takž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 lidé 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-prohibited

Samozř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 webu 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 tohle. Zdá se, že můj Google není nic moc.

Linux

Tady je to jednoduché:

dnf install knock -y
knock -d   11111 22222 33333

MacOS

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 33333

iOS

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 dobrému člověku se našel pracovní klient pro Windows.
UPD2ještě jeden dobrý člověk 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

Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster