Тим, кому треба забезпечити собі, коханому, доступ до своїх серверів з будь-якої точки світу за 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 перший правило («що не заборонено - дозволено») замінимо на зворотне,
- а останнє правило прибираємо.
У результаті має вийти:
*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