Linux tips & tricks: server, open up

Cei care doresc să își asigure accesul la serverele lor din orice colț al lumii prin SSH/RDP/altceva - un mic RTFM/ghid.

Trebuie să ne descurcăm fără VPN și alte complicații, de pe orice dispozitiv la îndemână.

Și astfel, pentru a nu te complica prea mult cu serverul.

Tot ce ai nevoie pentru aceasta este - knockd, mâini abil și 5 minute de muncă.

„Pe internet se găsește tot”, desigur (chiar și pe Habr), dar când vine vorba de implementarea concretă, aici începe…

Ne vom exersa pe exemplul Fedora/CentOS, dar asta nu contează.

Ghidul se potrivește atât celor începători, cât și celor experimentați în domeniu, așa că vor fi comentarii, dar mai scurte.

1. Serverul

  • instalăm knock-server:
    yum/dnf install knock-server

  • îl configurăm (de exemplu pentru 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

    Partea „de deschidere” este setată să se închidă automat după 1 oră. Cine știe…

  • /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
    ...

  • în continuare:

    service iptables restart
    service knockd start

  • poți adăuga RDP pe un Windows Server virtual ( /etc/knockd.conf; numele interfeței să fie ales după preferință):

    [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

    Toate încercările noastre de la client sunt monitorizate pe server cu comanda iptables -S.

2. Ghidul capcanelor

knockd.conf:

În documentații se găsește tot (dar nu este sigur), totuși knockd este o resursă destul de zgârcită în mesaje, așa că trebuie să fii foarte atent.

  • versiune
    În repositoarele Fedora/CentOS, cea mai recentă versiune a lui knockd este - 0.63. Cei care doresc UDP - căutați pachetele 0.70.
  • interfață
    În configurația implicită Fedora/CentOS, această linie ). În SUSE/openSUSE, vulnerabilitatea nu se manifestă din cauza utilizării ramurii Exim 4.88.. Adăugați manual, altfel nu va funcționa.
  • timeout
    Aici poți alege după preferință. Trebuie să asiguri suficient timp clientului pentru toate încercările - și să blochezi scanerul de porturi (iar scanarea va fi de 146%).
  • start/stop/command.
    Dacă echipa este una — atunci command, dacă sunt două — atunci start_command+stop_command.
    Dacă greșiți — knockd va tăcea, dar nu va funcționa.
  • proto
    Teoretic se poate folosi UDP. În practică am amestecat tcp și udp, iar clientul de pe plaja din Bali a reușit să-și deschidă poarta doar din a cincea încercare. Deoarece TCP au ajuns când trebuiau, iar UDP — nu e o certitudine. Dar aceasta este o chestiune de gust, iarăși.
  • sequence
    Capcanele neobservate sunt că secvențele nu trebuie să se suprapună… cum să spun…

De exemplu, ceva de genul:

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

Pe lovitura 11111 open va aștepta următoarea lovitură pe 22222. Totuși, la această (22222) lovitură va începe să funcționeze close și totul se va strica. Aceasta depinde și de delay-ul clientului. Asta e situația ©.

iptables

Dacă în /etc/sysconfig/iptables este aceasta:

*nat
:PREROUTING ACCEPT [0:0]

nu ne deranjează prea mult, dar aceasta:

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

chiar deranjează.

Deoarece knockd adaugă reguli la finalul lanțului INPUT, vom primi reject.

Iar dezactivarea acestui reject — înseamnă să deschidem mașina tuturor vânturilor.

Pentru a evita să ne complicăm în iptables ce și unde să punem (așa cum oamenii sugerează) să facem mai simplu:

  • default în CentOS/Fedora prima regulă („ce nu este interzis — este permis”) să o înlocuim cu inversa,
  • iar ultima regulă să o eliminăm.

În final, ar trebui să iasă:

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

Se poate, desigur, în loc de DROP să facem REJECT, dar cu DROP botii vor avea o viață mai simplă.

3. Client

În acest loc este cel mai interesant (din punctul meu de vedere), deoarece trebuie să funcționeze nu doar de pe orice plajă, ci și de pe orice dispozitiv.

În principiu, o serie de clienți sunt enumerați pe site proiect, dar aceasta face parte din aceeași serie „totul se găsește pe internet”. De aceea voi enumera ceea ce acum și aici funcționează cu mine.

Când alegeți un client, trebuie să urmăriți că acesta să susțină opțiunea delay între pachete. Da, plaja diferă de plajă și 100 de megabiți nu garantează deloc livrarea pachetelor în ordinea necesară la timpul dorit din acel loc.

Și da — la configurarea clientului, delay-ul trebuie ajustat individual. Mult timeout — vor ataca boții, puțin — clientul nu va reuși. Mult delay — clientul nu va reuși sau va fi un conflict de lovituri (vezi „capcanele”), puțin — pachetele se vor pierde în internet.

Cu timeout=5s este o opțiune funcțională delay=100..500ms

Windows

Cum ar suna amuzant, dar a găsi un client knock decent pentru această platformă este destul de complicat. Să fie CLI, să susțină delay, TCP — și fără briz-brizuri.

Ca alternativă, poți încerca aceasta. Se pare că Google meu nu este foarte bun.

Linux

Aici este totul simplu:

dnf install knock -y
knock -d   11111 22222 33333

MacOS

Cel mai simplu este să instalezi portul din homebrew:
brew install knock
și să îți creezi camnduri de tip bat:

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

iOS

O variantă funcțională - KnockOnD (gratuit, din magazin).

Android

„Knock on Ports”. Nu este publicitate, doar că funcționează. Și dezvoltatorii sunt destul de receptivi.

P.S. markdown pe Habr, bineînțeles, să-i dea Dumnezeu sănătate cândva…

UPD1: datorită unei persoane bune s-a găsit un client funcțional pentru Windows.
UPD2: încă o persoană bună mi-a amintit că adăugarea de reguli noi la sfârșitul iptables nu este întotdeauna utilă. Dar - depinde. Celor care doresc să își asigure accesul la serverele lor din orice colț al lumii prin SSH/RDP/alte metode - un mic RTFM/ghid. Trebuie să ne descurcăm fără.

Sursa: habr.com

Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS 🔥 Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS | ProHoster