Зачем прятать 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.
- Ключи и последовательности хранятся вне репозитория, известны только доверенным администраторам.