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 Server (/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 тази линия липсва. Трябва да я добавите ръчно, иначе няма да работи.
  • таймаут
    Тук е нужно да подберете по вкус. Трябва да има достатъчно време за клиента да изпрати всички опити — и бот-скенерът да се затрудни (а сканирането ще бъде 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, ще получим отхвърляне.

А да отключите това отхвърляне — това е да отворите машината за всички ветрове.

За да не се занимаваме с iptables какво къде да сложим (както е предложено) ще направим по-просто:

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

В крайна сметка трябва да се получи:

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

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

3. Клиент

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

Всъщност, списък с клиенти е посочен на сайта проекта, но това е от същата серия «в интернет всичко има». Затова ще изброя това, което е тук и сега работи в ръцете ми.

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

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

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

Windows

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

Като вариант можете да опитате това тук. Очевидно, гугълът ми не е най-добрият.

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