# Port knocking и SPA: скрытый доступ к SSH

> Port knocking и Single Packet Authorization скрывают SSH-порт от сканеров: доступ открывается только после секретной последовательности пакетов.

## Зачем прятать SSH-порт от сканеров

Боты сканируют весь диапазон IPv4 по нескольку раз в сутки в поисках открытого 22 порта и сразу начинают перебор паролей. [Fail2ban](https://www.zevshost.net/ru/kb/nastroit-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](https://www.zevshost.net/ru/kb/iptables-firewall-nastroika/) должен быть закрыт по умолчанию — 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](https://www.zevshost.net/ru/kb/wireguard-vpn-vps/) — и закрыть SSH-порт для всех, кроме VPN-подсети.

## Чек-лист внедрения

- Порт SSH закрыт в файрволе по умолчанию, доступ открывается только через knockd или fwknop.
- Используется SPA (fwknop), а не голая последовательность портов, если сеть может прослушиваться.
- Тайм-аут открытого доступа не превышает 30-60 секунд.
- Port knocking дополняет, а не заменяет SSH-ключи, отключённый вход по паролю и fail2ban.
- Ключи и последовательности хранятся вне репозитория, известны только доверенным администраторам.

---

Источник: https://www.zevshost.net/ru/kb/port-knocking-spa/
