Linux съвети и трикове: сървър, отвори се

За тези, които искат да имат достъп до собствените си сървъри от всяка точка на света чрез SSH/RDP/и др. — малък RTFM/справочник.

Трябва да се справим без VPN и други сложни решения, от всяко устройство под ръка.

И всичко да е така, че да не се занимаваме твърде много със сървъра.

Всичко, от което се нуждаем — knockd, сръчни ръце и 5 минути работа.

«В интернет всичко има», разбира се (дори на Хабр), но когато стане въпрос за конкретна реализация — точно там започват…

Ще упражняваме на примера на Fedora/CentOS, но това не е толкова важно.

Справочникът е подходящ както за начинаещи, така и за ветерани в областта, така че ще има коментари, но по-кратки.

1. Сървър

  • инсталираме knock-server:
    yum/dnf install knock-server

  • настройваме го (например на 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

    «Отварящата» част е настроена на автоматично затваряне след 1 час. Все пак…

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

  • напред:

    service iptables restart
    service knockd start

  • може да добавите RDP на виртуален Windows сървър (/etc/knockd.conf; наименованието на интерфейса да се подстави по желание):

    [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

    Всички наши опити от клиента следим на сървъра с командата iptables -S.

2. Пътеводител по грабленията

knockd.conf:

В ръководствата също всичко има (но не точно), но knockd — е много стиснат на съобщения, затова трябва да сте много внимателни.

  • версия
    В репозиториите на Fedora/CentOS последната версия на knockd днес е 0.63. Който иска UDP — да търси пакети 0.70.
  • интерфейс
    В подразбиращата се конфигурация на Fedora/CentOS този ред липсва. Трябва да се добави ръчно, иначе няма да работи.
  • timeout
    Тук можете да изберете по вкус. Необходимо е клиентът да има достатъчно време за всички удари — и бот-скенерът да се провали (а сканирането ще е 146%).
  • start/stop/command.
    Ако командата е една — то command, ако са две — то start_command+stop_command.
    Ако направите грешка — knockd ще замълчи, но няма да работи.
  • proto
    Теоретично е възможно да се използва UDP. На практика аз бях смесил tcp и udp, а клиентът от плажа в Бали успя да отвори портата си само от петия път. Защото TCP пристигна, когато трябва, а UDP — не е сигурно. Но това е въпрос на вкус.
  • sequence
    Неявните проблеми са, че последователностите не трябва да се припокриват… как да го кажа…

Например, нещо такова:

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

По удара 11111 open ще чака следващия удар на 22222. Въпреки това, по този (22222) удар ще започне да работи close и всичко ще се счупи. Това зависи и от закъснението на клиента. Такива работи ©.

iptables

Ако в /etc/sysconfig/iptables е това:

*nat
:PREROUTING ACCEPT [0:0]

не ни пречи особено, то тогава това:

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

пречи.

Тъй като knockd добавя правила в края на веригата INPUT, ще получим reject.

Ако деактивираме този reject — това е все едно да отворим машината за всички ветрове.

За да не се мъча с iptables какво къде да поставя (както хората предлагат) ще направя по-просто: дефолтното

  • в CentOS/Fedora първото правило («каквото не е забранено — е разрешено») ще заменим с обратното, а последното правило ще премахнем.
  • В крайна сметка трябва да е така:

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

Разбира се, вместо DROP може да се постави REJECT, но с DROP на ботите ще им е по-лесно.

3. Клиент

Тук е най-интригуващото (от моя гледна точка), защото трябва да работим не само от всеки плаж, но и с всяко устройство.

Всъщност, няколко клиента са посочени на

проекта, но това е от същата серия «в интернет всичко има». Затова ще изброя това, което в момента работи при мен. сайта При избора на клиент е необходимо да се уверите, че той поддържа опцията delay между пакетите. Да, плажовете са различни и 100 мегабита не гарантират доставянето на пакетите в нужния ред и време от всяко място.

И да — при настройката на клиента delay трябва да се подбира индивидуално. Много timeout — ботите ще нападнат, малко — клиентът няма да успее. Много delay — клиентът няма да успее или ще има конфликт на пристъпи (вижте «грабли»), малко — пакетите ще се загубят в интернет.

При timeout=5s е напълно работещ вариант delay=100..500ms

С timeout=5s е напълно работещ вариант delay=100..500ms

Windows

Како звучи смешно, но трудно е да се намери ясен knock клиент за тази платформа. Така че, CLI, да поддържа закъснение, TCP — без излишества.

Можете да опитате това. Изглежда, че моят Google не е на ниво.

Linux

Тук всичко е просто:

dnf install knock -y
knock -d   11111 22222 33333

MacOS

Най-лесно е да инсталирате порта от homebrew:
brew install knock
и да си създадете нужните командни скриптове:

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

iOS

Работещ вариант — KnockOnD (безплатен, от магазина).

Android

«Knock on Ports». Не е реклама, а просто работи. И разработчиците са доста отзивчиви.

P.S. markdown на Хабре, разбира се, дай Боже да му върви някога…

UPD1: благодарение на добър човек беше намерен работещ клиент за Windows.
UPD2: още един добър човек напомни, че добавянето на нови правила в края на iptables не винаги е полезно. Но — зависи.

Източник: habr.com

Купете надежден хостинг за сайтове с защита от DDoS, VPS VDS сървъри 🔥 Купете надежден хостинг за сайтове с защита от DDoS, VPS VDS сървъри | ProHoster