Тым, каму трэба забяспечыць сабе, каханаму, доступ да сваіх сервераў з любой кропкі свету па SSH/RDP/іншае – невялікае RTFM/шпора.
Нам трэба абысціся без VPN і іншых наваротаў, з любой прылады пад рукамі.
І так, каб з серверам не надта практыкавацца.
Усё, што для гэтага трэба -
"У інтэрнэце ўсё ёсць", вядома (нават на
Будзем практыкавацца на прыкладзе 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: дзякуючы
UPD2: яшчэ адзін
Крыніца: habr.com