Навіщо ховати 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.
- Ключі й послідовності зберігаються поза репозиторієм, відомі лише довіреним адміністраторам.