К основному содержимому

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