Как скрыть 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
Отредактируйте файл /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

Тестирование: как правильно «стукать» по портам
На вашей рабочей машине установите клиент 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)
- Установить knockd и iptables-persistent на тестовом сервере.
- Описать безопасную последовательность портов и seq_timeout.
- Настроить команду открытия/закрытия (использовать -I и -D, плейсхолдер %IP%).
- Включить логирование и запустить сервис.
- Тестировать из внешней сети, фиксировать поведение через iptables -L.
- Постепенно переносить в продакшн и мониторить логи.
Чек-лист для ролей
Администратор:
- Установил knockd и iptables-persistent.
- Настроил грамотные последовательности и таймауты.
- Включил логирование.
DevOps:
- Автоматизировал развёртывание конфигурации.
- Добавил мониторинг и алертинг на неудачные попытки.
Security Engineer:
- Проверил совместимость с границей сети/файрволом.
- Оценил риск раскрытия IP при использовании NAT.
Критерии приёмки
- После «стука» доступ по SSH возможен в течение ожидаемого времени.
- Без «стука» попытки SSH блокируются.
- Логи фиксируют успешные/неуспешные последовательности.
- Правила iptables вставляются в начало цепочки INPUT и корректно удаляются.
Тестовые сценарии (acceptance)
- Корректная последовательность в пределах seq_timeout открывает SSH только для источника.
- Неполная или нарушенная последовательность не открывает доступ.
- Попытка повторного «открытия» не дублирует правила (при необходимости, предусмотреть idempotent-скрипт).
- Удаление правила после «закрытия» возвращает систему в исходное состояние.
Примеры команд и сниппеты (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-адрес клиента.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента