Linux tips & tricks: сервер, відкрийся

Тим, кому треба забезпечити собі, коханому, доступ до своїх серверів з будь-якої точки світу за SSH/RDP/інше — невелике RTFM/шпора.

Нам потрібно обійтися без VPN та інших наворотів з будь-якого пристрою під руками.

І так, щоб із сервером не надто вправлятися.

Все, що для цього потрібно стукав, прямі руки та 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 перший правило («що не заборонено - дозволено») замінимо на зворотне,
  • а останнє правило прибираємо.

У результаті має вийти:

*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

Додати коментар або відгук