Linux tips & tricks: сервер, адкрыйся

Тым, каму трэба забяспечыць сабе, каханаму, доступ да сваіх сервераў з любой кропкі свету па 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 прамаўчыць, але працаваць не будзе.
  • таму
    Тэарэтычна можна выкарыстоўваць UDP. На практыцы я было змяшаў tcp і udp, а кліент з пляжу ў Балі змог адкрыць сабе брамку толькі з пятага разу. Бо TCP даляцелі калі трэба, а UDP – не факт. Але гэтая справа густу, ізноў жа.
  • паслядоўнасць
    Няяўныя граблі ў тым, што паслядоўнасці не павінны перасякацца… як бы гэта сказаць…

Напрыклад, такое:

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

Па выспятку 11111 адкрыць будзе чакаць наступнага выспятка на 22222. Аднак па гэтым (22222) выспятка пачне працаваць блізка і ўсё паламаецца. Гэта залежыць ад delay кліента у тым ліку. Такія справы ©.

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 1. правіла («што не забаронена - дазволена») заменім на зваротнае,
  • а апошняе правіла прыбіраем.

У выніку павінна атрымацца:

*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

Windows

Як гэта ні смешна гучыць, але нагугліць выразны knock-кліент пад гэтую платформу даволі нетрывіяльна. Такі, каб CLI, падтрымліваў delay, TCP і без банцікаў.

Як варыянт можна паспрабаваць гэта вось. Мабыць у мяне гугль не торт.

Linux

Тут усё проста:

dnf install knock -y
knock -d <delay> <dst_ip> 11111 22222 33333

MacOS

Прасцей за ўсё паставіць порт з homebrew:
brew install knock
і намаляваць сабе патрэбныя батнікі каманднікі выгляду:

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

IOS

Працоўны варыянт - KnockOnD (бясплатны, з крамы).

Android

"Knock on Ports". Не рэклама, а проста ён працуе. І распрацоўшчыкі дастаткова спагадныя.

PS markdown на Хабры, вядома, дай бог яму здароўя калі-небудзь…

UPD1: дзякуючы добраму чалавеку знайшоўся працоўны кліент пад Windows.
UPD2: яшчэ адзін добры чалавек нагадаў, што ставіць новыя правілы ў канец iptables не заўсёды карысна. Але - it depends.

Крыніца: habr.com

Дадаць каментар