Гид по технологиям

Как скрыть SSH на Linux с помощью knockd

• 6 min read • Безопасность • Обновлено 30 Nov 2025
Скрыть SSH на Linux с помощью knockd
Скрыть SSH на Linux с помощью knockd

Введение

Внешний вид сервера с сетевыми подключениями, иллюстрация концепции закрытых портов

Когда сервер доступен в публичной сети, злоумышленники могут просканировать его IP и найти открытые порты (особенно порт 22 для SSH). Один из способов «спрятать» сервисы — использовать knockd. knockd — это демонт порт-нокинга: он слушает весь входящий трафик на интерфейсах и ожидает особых последовательностей попаданий в порты. Клиент посылает «стуки» через утилиты вроде telnet, nc, либо специальную утилиту knock; после корректной последовательности knockd выполняет команду (например, временно открывает порт в iptables).

Коротко: knockd не заменяет фаервол и аутентификацию. Это уровень «маскировки», который снижает вероятность автоматических атак.

Что нужно понимать перед началом

  • Понятие «port knocking»: клиент последовательно отправляет пакеты на набор закрытых портов в нужном порядке. knockd распознаёт последовательность и запускает команду.
  • knockd не шифрует и не аутентифицирует содержимое команды — это сопутствующий механизм безопасности, а не полноценный доступ по ключу.
  • Всегда тестируйте на тестовой машине перед продакшном.

Установка knockd на Linux

На Debian/Ubuntu-подобных дистрибутивах:

sudo apt-get update
sudo apt-get install knockd

На CentOS/RHEL/Fedora (старые версии используют yum, современные — dnf):

sudo yum install knockd
# или
sudo dnf install knockd

После установки проверьте, что пакет установлен и служба доступна.

Установка и базовая настройка iptables

Если iptables ещё не установлен:

sudo apt-get install iptables iptables-persistent

Пакет iptables-persistent отвечает за автоматическую загрузку сохранённых правил.

Разрешите уже установленные соединения и связанные с ними пакеты (важно для корректной работы существующих сессий):

sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

Заблокируйте все входящие подключения к порту 22 (SSH):

sudo iptables -A INPUT -p tcp --dport 22 -j REJECT

Сохраните правила (Debian/Ubuntu):

sudo netfilter-persistent save
sudo netfilter-persistent reload

Проверьте, что порт закрыт с вашей рабочей машины:

ssh user@my-server-ip

Вы должны получить отказ или таймаут, если правило применено.

Конфигурация knockd

Файл конфигурации находится по пути /etc/knockd.conf. Откройте его в любимом редакторе (nano, vi):

sudo nano /etc/knockd.conf

Ниже — пример минимальной и безопасной конфигурации для открытия SSH на время при корректном наборе портов. Обратите внимание на корректный синтаксис и плейсхолдер %IP%, который knockd подставляет автоматически.

[options]
    UseSyslog
    logfile = /var/log/knockd.log

[openSSH]
    sequence    = 7000,8000,9000
    seq_timeout = 5
    command     = /sbin/iptables -I INPUT 1 -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

Пояснения к полям:

  • options: глобальные опции. Пример использует syslog и локальный лог.
  • sequence: последовательность портов, на которые должен «стукнуть» клиент.
  • seq_timeout: время в секундах, за которое последовательность должна быть выполнена.
  • command: команда, выполняемая от имени root. В примере мы вставляем правило в начало цепочки INPUT (опция -I INPUT 1), чтобы не нарушать существующую логику.
  • tcpflags: указывает тип TCP-флагов в «стуках» (обычно syn).

Важно: используйте -I (insert) вместо -A (append). -A добавляет правило в конец, что может привести к его игнорированию из‑за более ранних правил REJECT.

Фрагмент конфигурации knockd в текстовом редакторе

Включение и запуск сервиса knockd

Отредактируйте файл /etc/default/knockd и включите автозапуск:

sudo nano /etc/default/knockd

Измените строку:

START_KNOCKD=1

Сохраните файл.

Запустите сервис:

sudo systemctl enable knockd
sudo systemctl start knockd
# или
sudo service knockd start

Проверьте статус:

sudo systemctl status knockd

Настройка автозапуска knockd в /etc/default

Лог и подтверждение запуска knockd

Тестирование: как правильно «стукать» по портам

На вашей рабочей машине установите клиент knock (в Ubuntu пакет называется knockd, он содержит утилиту knock):

sudo apt-get install knockd

Выполните команду (замените my-server-ip на реальный IP):

knock -v my-server-ip 7000 8000 9000

Опция -v включает подробный вывод. Если последовательность принята, knockd выполнит команду и временно вставит правило iptables, разрешающее SSH от вашего IP.

Затем подключитесь по SSH:

ssh user@my-server-ip

Когда закончите, отправьте обратную последовательность для удаления правила:

knock -v my-server-ip 9000 8000 7000

Проверьте таблицу iptables на сервере:

sudo iptables -L -n --line-numbers

Убедитесь, что правило добавлено/удалено корректно.

Практические рекомендации по безопасности

  • Используйте длинные и уникальные последовательности портов и нестандартные диапазоны (не 7000/8000/9000 по умолчанию).
  • Ограничьте seq_timeout (например, 3–10 секунд) и используйте tcpflags = syn.
  • Логируйте успешные и неудачные попытки — анализ логов поможет обнаружить сканирование.
  • Не полагайтесь на knockd как единственный барьер: используйте ключи SSH, fail2ban, ограничение по IP, многослойную аутентификацию.
  • При работе через NAT/маршрутизатор убедитесь, что маршрутизатор не изменяет порты или флаги TCP, иначе knockd не увидит корректную последовательность.

Когда knockd не сработает

  • Клиент за NAT: если ваш публичный IP меняется или несколько клиентов используют один NAT, правило может открыть доступ не тому устройству.
  • Провайдер блокирует нестандартные порты или модифицирует пакеты.
  • Активные сетевые устройства (load balancer, firewall на границе) фильтруют/нормализуют трафик, что ломает сигнатуру «стуков».
  • Атаки целенаправленного злоумышленника, который умеет анализировать логи и имитировать последовательности.

Альтернативные подходы

  • SPA (Single Packet Authorization) — более современный метод, где авторизация выполняется в одном зашифрованном пакете (пример: fwknop).
  • VPN-подключение к внутр.кластерам, где SSH доступен только из внутренней сети.
  • Ограничение по IP/интеграция с динамическими списками доверенных адресов.

Быстрая методика внедрения (мини-SOP)

  1. Установить knockd и iptables-persistent на тестовом сервере.
  2. Описать безопасную последовательность портов и seq_timeout.
  3. Настроить команду открытия/закрытия (использовать -I и -D, плейсхолдер %IP%).
  4. Включить логирование и запустить сервис.
  5. Тестировать из внешней сети, фиксировать поведение через iptables -L.
  6. Постепенно переносить в продакшн и мониторить логи.

Чек-лист для ролей

Администратор:

  • Установил knockd и iptables-persistent.
  • Настроил грамотные последовательности и таймауты.
  • Включил логирование.

DevOps:

  • Автоматизировал развёртывание конфигурации.
  • Добавил мониторинг и алертинг на неудачные попытки.

Security Engineer:

  • Проверил совместимость с границей сети/файрволом.
  • Оценил риск раскрытия IP при использовании NAT.

Критерии приёмки

  • После «стука» доступ по SSH возможен в течение ожидаемого времени.
  • Без «стука» попытки SSH блокируются.
  • Логи фиксируют успешные/неуспешные последовательности.
  • Правила iptables вставляются в начало цепочки INPUT и корректно удаляются.

Тестовые сценарии (acceptance)

  1. Корректная последовательность в пределах seq_timeout открывает SSH только для источника.
  2. Неполная или нарушенная последовательность не открывает доступ.
  3. Попытка повторного «открытия» не дублирует правила (при необходимости, предусмотреть idempotent-скрипт).
  4. Удаление правила после «закрытия» возвращает систему в исходное состояние.

Примеры команд и сниппеты (cheat sheet)

Добавить правило в начало цепочки INPUT для конкретного IP:

sudo iptables -I INPUT 1 -s 203.0.113.5 -p tcp --dport 22 -j ACCEPT

Удалить правило (по идентификатору строки):

sudo iptables -D INPUT <номер_строки>

Сохранить правила (Debian/Ubuntu):

sudo netfilter-persistent save

Посмотреть таблицу правил:

sudo iptables -L -n --line-numbers

Совет по безопасности и жёсткая модель защиты

Важно комбинировать механизмы: knockd даёт «безопасную маскировку», но настоящая защита достигается комбинацией SSH-ключей, ограничений по IP, VPN и мониторинга.

Заключение

knockd — недорогой по усилиям способ снизить шум автоматических сканеров и уменьшить число попыток взлома по SSH. Он подходит для сценариев, где клиент контролируем и может выполнить последовательность «стуков». В более сложных сетях и при повышенных требованиях безопасности стоит рассмотреть SPA (fwknop) или VPN-решения.

Важно: протестируйте в тестовой среде, включите логирование и комбинируйте knockd с другими слоями защиты.

Короткая справка (глоссарий)

  • Port knocking — метод доступа, при котором последовательность попаданий в порты служит триггером для открытия порта.
  • SPA — Single Packet Authorization, альтернатива, использующая один зашифрованный пакет.
  • %IP% — плейсхолдер в knockd, подставляет IP-адрес клиента.
Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Несколько аккаунтов Skype: Multi Skype Launcher
Программное обеспечение

Несколько аккаунтов Skype: Multi Skype Launcher

Журнал для работы: повысить продуктивность
Productivity

Журнал для работы: повысить продуктивность

Персональные звуки уведомлений на Android
Android.

Персональные звуки уведомлений на Android

Скачивание шоу Hulu для офлайн‑просмотра
Стриминг

Скачивание шоу Hulu для офлайн‑просмотра

Microsoft Start: персонализированная новостная лента
Новости

Microsoft Start: персонализированная новостная лента

Как изменить имя в Epic Games быстро
Гайды

Как изменить имя в Epic Games быстро