До основного вмісту

Port knocking і SPA: прихований доступ до SSH

Безпека · 29.09.2026

Навіщо ховати SSH-порт від сканерів

Боти сканують весь діапазон IPv4 по кілька разів на добу в пошуках відкритого 22 порту і одразу починають перебір паролів. Fail2ban і зміна порту знижують кількість потрапляння в логи, але не прибирають порт із результатів сканування — сервіс так само відповідає на SYN-пакет і видає банер версії SSH. Port knocking і Single Packet Authorization (SPA) вирішують інше завдання: порт не відповідає взагалі, поки клієнт не надішле правильну послідовність.

Це не заміна паролям і ключам, а додатковий шар: навіть коли у зловмисника є валідний ключ, без знання послідовності він не достукається до sshd.

Як працює класичний port knocking

Ідея проста: клієнт надсилає пакети на закриті порти в заданому порядку, наприклад TCP 7000, 8000, 9000. Файрвол-демон слухає ці пакети через логи або через сирий сокет і, побачивши правильну послідовність за обмежений час, тимчасово відкриває потрібний порт для IP-адреси відправника.

Мінус класичного підходу — послідовність легко перехопити снІфером у відкритій мережі, а повторне відтворення відкриє порт зловмиснику. Тому сучасні впровадження використовують SPA — варіант із криптографічним підписом пакета замість голої послідовності портів.

Встановлення knockd: базовий port knocking

sudo apt install knockd

Конфігурація в /etc/knockd.conf:

[openSSH]
    sequence    = 7000,8000,9000
    seq_timeout = 5
    command     = /sbin/iptables -A INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
    tcpflags    = syn

[closeSSH]
    sequence    = 9000,8000,7000
    seq_timeout = 5
    command     = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
    tcpflags    = syn

Порт 22 в базових правилах iptables має бути закритий за замовчуванням — knockd лише тимчасово додає дозвільне правило для IP, який надіслав правильну послідовність.

fwknop: Single Packet Authorization

SPA передає всю інформацію одним зашифрованим UDP-пакетом замість серії підключень, що усуває загрозу перехоплення послідовності. Пакет містить часову мітку й одноразовий ідентифікатор — повторне надсилання того самого пакета відхиляється.

sudo apt install fwknop-server fwknop-client

На сервері в /etc/fwknop/access.conf задається ключ доступу і дозволена дія:

SOURCE: ANY
OPEN_PORTS: tcp/22
KEY_BASE64: згенерований_base64_ключ
FW_ACCESS_TIMEOUT: 30

Клієнт надсилає пакет і отримує доступ на 30 секунд для встановлення SSH-сесії:

fwknop -A tcp/22 -a $(curl -s ifconfig.me) -D vps.example.com

Обмеження підходу

Port knocking і SPA не захищають від атаки на саме правило файрвола і не скасовують потребу в надійній автентифікації на SSH. Коли сервер стоїть за NAT зі спільним зовнішнім IP для кількох користувачів, відкриття порту одному клієнту тимчасово відкриє його для всіх за цим IP. При втраті клієнтського ключа fwknop потрібно вручну перевипустити ключ на сервері і роздати заново.

Для хмарних серверів із частою перезбіркою інфраструктури простіше використовувати VPN — наприклад, WireGuard — і закрити SSH-порт для всіх, крім VPN-підмережі.

Чек-лист впровадження

  • Порт SSH закритий у файрволі за замовчуванням, доступ відкривається лише через knockd або fwknop.
  • Використовується SPA (fwknop), а не гола послідовність портів, коли мережа може прослуховуватися.
  • Тайм-аут відкритого доступу не перевищує 30-60 секунд.
  • Port knocking доповнює, а не замінює SSH-ключі, вимкнений вхід за паролем і fail2ban.
  • Ключі й послідовності зберігаються поза репозиторієм, відомі лише довіреним адміністраторам.
← Назад до бази знань Поставити питання підтримці