Porady i triki dotyczące Linuxa: serwerze, otwórz się

Dla tych, którzy chcą zapewnić sobie dostęp do swoich serwerów z dowolnego miejsca na świecie przez SSH/RDP/inne — krótki przewodnik.

Musimy obejść się bez VPN i innych udziwnień, z dowolnego urządzenia pod ręką.

I tak, aby nie trzeba było zbytnio ćwiczyć z serwerem.

Wszystko, co jest potrzebne to — knockd, zdolne ręce i 5 minut pracy.

W Internecie wszystko znajdziesz, oczywiście (nawet na Habra), ale gdy przychodzi do konkretnej realizacji — wtedy zaczynają się problemy...

Będziemy ćwiczyć na przykładzie Fedora/CentOS, ale to nie ma znaczenia.

Przewodnik nadaje się zarówno dla nowicjuszy, jak i dla weteranów, więc będą komentarze, ale krótkie.

1. Serwer

  • instalujemy knock-server:
    yum/dnf install knock-server

  • konfigurujemy go (na przykład 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

    „Otwierająca” część jest skonfigurowana do automatycznego zamknięcia po 1 godzinie. Na wszelki wypadek...

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

  • jedziemy dalej:

    service iptables restart
    service knockd start

  • można dodać RDP do działającego wewnątrz wirtualnego serwera Windows (/etc/knockd.conf; nazwa interfejsu według uznania):

    [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

    Wszystkie nasze pingi od klienta śledzimy na serwerze komendą iptables -S.

2. Przewodnik po pułapkach

knockd.conf:

W dokumentacji też wszystko jest (ale to niepewne), jednak knockd to dość oszczędny w komunikatach towarzysz, więc trzeba być bardzo uważnym.

  • wersja
    W repozytoriach Fedora/CentOS najnowszy knockd to dzisiaj — 0.63. Kto chce UDP — niech szuka pakietów 0.70.
  • interfejs
    W domyślnej konfiguracji Fedora/CentOS ten wiersz nie istnieje. Dodaj ręcznie, inaczej nie będzie działało.
  • timeout
    Tutaj dobierz według uznania. Należy zadbać, aby klient miał wystarczająco czasu na wszystkie pingi — a bot-skanner portów się nie zesłania (a będą skanować na 146%).
  • start/stop/command.
    Jeśli jest jeden zespół — to command, jeśli dwa — to start_command+stop_command.
    Jeśli się pomylisz — knockd nie zareaguje, ale nie będzie działać.
  • proto
    Teoretycznie można używać UDP. W praktyce pomieszałem tcp i udp, a klient z plaży na Bali mógł otworzyć sobie furtkę dopiero za piątym razem. Bo TCP dotarło wtedy, kiedy miało, a UDP — to niepewne. Ale to kwestia gustu, znowu.
  • sequence
    Niekiedy można natknąć się na problem, że sekwencje nie powinny się pokrywać… jak to ująć…

Na przykład coś takiego:

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

Na pstryknięcie 11111 open będzie czekać na następne pstryknięcie na 22222. Jednak na tym (22222) pstryknięciu zacznie działać zamknąć i wszystko się zepsuje. Zależy to także od opóźnienia klienta. Takie sprawy ©.

iptables

Jeśli w /etc/sysconfig/iptables znajduje się to:

*nat
:PREROUTING ACCEPT [0:0]

nie przeszkadza nam za bardzo, to to:

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

przeszkadza.

Ponieważ knockd dodaje reguły na końcu łańcucha INPUT, otrzymujemy reject.

A wyłączenie tego reject — to otworzenie maszyny na wszystkie wiatry.

Aby nie komplikować sprawy w iptables, co gdzie wstawić (jak to ludzie proponują), zróbmy to prościej:

  • domyślne w CentOS/Fedora pierwszą regułę („co nie jest zabronione — jest dozwolone”) zastąpimy odwrotnością,
  • a ostatnią regułę usuwamy.

W rezultacie powinno wyjść:

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

Można, co prawda, zamiast DROP ustawić REJECT, ale z DROP botom będzie łatwiej.

3. Klient

W tym miejscu jest najciekawiej (z mojego punktu widzenia), ponieważ trzeba działać nie tylko z każdego plaży, ale i z każdego urządzenia.

Zasadniczo kilka klientów wymienionych jest na stronie projekcie, ale to w tej samej serii „wszystko jest w internecie”. Dlatego wymienię to, co aktualnie działa u mnie.

Przy wyborze klienta należy upewnić się, że wspiera opcję delay między pakietami. Tak, plaża plaży nierówna, a 100 megabitów wcale nie gwarantuje dotarcia pakietów we właściwej kolejności w odpowiednim czasie z tego miejsca.

I tak — przy konfiguracji klienta delay trzeba dobrać samodzielnie. Dużo timeout — boty zaatakują, mało — klient nie zdąży. Dużo delay — klient nie zdąży lub nastąpi konflikt stuknięć (patrz „pułapki”), mało — pakiety zagubią się w internecie.

Przy timeout=5s dość efektywną opcją jest delay=100..500ms.

Windows

Jak to dziwnie nie brzmi, ale znalezienie sensownego knock-klienta na tę platformę jest dość trudne. Takiego, który miałby CLI, wspierałby delay, TCP — i bez zbędnych ozdób.

Można spróbować to jest. Wygląda na to, że mój Google nie jest najlepszy.

Linuxa

Tutaj wszystko jest proste:

dnf install knock -y
knock -d   11111 22222 33333

MacOS

Najłatwiej zainstalować port z homebrew:
brew install knock
i stworzyć potrzebne skrypty w stylu:

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

iOS

Działająca wersja — KnockOnD (darmowy, z marketu).

Android

„Knock on Ports”. Nie jest to reklama, po prostu działa. A deweloperzy są dość responsywni.

P.S. markdown na Habra, oczywiście, oby żył długo…

UPD1: dzięki dobremu człowiekowi znalazł się działający klient na Windows.
UPD2: jeszcze jeden dobry człowiek przypomniał, że dodawanie nowych reguł na końcu iptables nie zawsze jest korzystne. Ale — to zależy.

Źródło: habr.com

Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS 🔥 Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS | ProHoster