Port knocking (knockd) на Debian 10 — скрытие SSH

Что такое port knocking — кратко
Port knocking — метод скрытия сетевого сервиса: порт остаётся закрыт по умолчанию и временно открывается после того, как клиент “постучит” (послает соединения) по определённой последовательности портов. Это даёт дополнительный уровень защиты против автоматических сканеров и грубых переборов. Пример масштаба защиты: для угадывания упорядоченной последовательности из трёх TCP-портов потребуется перебрать 65535^3 ≈ 281 462 092 005 375 комбинаций.
Важное: port knocking скрывает сервис, но не заменяет надёжную аутентификацию и обновления. Всегда имейте резервный способ доступа к серверу (консоль, KVM, веб-консоль провайдера).
Кому пригодится эта инструкция
- Системным администраторам и DevOps-инженерам, которые хотят уменьшить шум сканирования и брутфорс-атаки.
- Тем, кто использует SSH и хочет добавить дополнительный слой защиты без сложных VPN/PKI решений.
Требования
- Сервер с Debian 10 (Buster).
- Доступ root на сервере.
- Переменная окружения $EDITOR настроена и указывает на ваш редактор (nano/vi и т.п.).
- Второй хост для тестирования подключения и выполнения последовательности knock.
Примечание: замените имя интерфейса (например, ens18) на имя вашего интерфейса в конфигурации ниже.
Подготовка: как узнать имя публичного интерфейса
Выполните команду на сервере:
ip link show | grep -v loПример вывода:
2: ens18: mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000 Запомните имя интерфейса (в примере — ens18). Оно понадобится в /etc/knockd.conf.
Шаг 1: установка knockd
knockd — демон порт-нокинга. Мы будем использовать его совместно с iptables. Установите пакеты:
apt update
apt install knockd iptables-persistentiptables-persistent сохранит правила межсетевого экрана между перезагрузками.
Шаг 2: конфигурация knockd
knockd использует файл /etc/knockd.conf. Сначала создайте резервную копию текущего файла:
mv /etc/knockd.conf /etc/knockd.conf.bakОткройте новый файл в редакторе:
$EDITOR /etc/knockd.confВставьте следующую конфигурацию (замените ens18 на ваше имя интерфейса):
[options]
UseSyslog
Interface = ens18
[SSH]
sequence = 1000,2000,3000
seq_timeout = 15
tcpflags = syn
start_command = /sbin/iptables -I INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
stop_command = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
cmd_timeout = 20Объяснение параметров:
- sequence — порты последовательности.
- seq_timeout — время (сек) между шагами последовательности.
- tcpflags — только SYN-пакеты учитываются (обычное поведение для knock).
- start_command/stop_command — команды, выполняемые при успешном распознавании последовательности; %IP% заменяется на IP клиента.
- cmd_timeout — время (сек), через которое выполняется stop_command.
Далее включите knockd через файл /etc/default/knockd:
$EDITOR /etc/default/knockdИзмените строчку:
START_KNOCKD=1Создайте systemd unit для корректного запуска и ограничений прав:
$EDITOR /etc/systemd/system/knockd.serviceВставьте следующие строки:
[Unit]
Description=Port-Knock Daemon
After=network.target
Requires=network.target
Documentation=man:knockd(1)
[Service]
EnvironmentFile=-/etc/default/knockd
ExecStartPre=/usr/bin/sleep 1
ExecStart=/usr/sbin/knockd $KNOCKD_OPTS
ExecReload=/bin/kill -HUP $MAINPID
KillMode=mixed
Restart=always
SuccessExitStatus=0 2 15
ProtectSystem=full
CapabilityBoundingSet=CAP_NET_RAW CAP_NET_ADMIN
[Install]
WantedBy=multi-user.targetЗагрузите и включите сервис:
systemctl daemon-reload
systemctl enable --now knockd.serviceПроверьте статус:
systemctl status knockd.service
journalctl -u knockd.service --since "5 minutes ago"Шаг 3: правила межсетевого экрана (iptables)
До того как порт будет скрыт, необходимо гарантировать, что существующие соединения не прерываются. Добавьте правила:
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
ip6tables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPTЗатем добавьте правила, которые по умолчанию блокируют доступ к 22/tcp:
iptables -A INPUT -p tcp --destination-port 22 -j DROP
ip6tables -A INPUT -p tcp --destination-port 22 -j DROPСохраните правила для сохранения после перезагрузки:
iptables-save > /etc/iptables/rules.v4
ip6tables-save > /etc/iptables/rules.v6Шаблон iptables для быстро разворачиваемой конфигурации (пример):
# Минимальный шаблон
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp --dport 22 -j DROP
COMMITШаг 4: тестирование
На втором хосте установите клиент knock (пакет knockd включает клиент). Затем выполните:
knock server_ip_address 1000 2000 3000
ssh username@server_ip_addressПоследовательность должна открыть порт 22 для вашего IP на cmd_timeout секунд (в примере 20 сек). Если подключение не проходит — проверьте логи knockd и iptables:
journalctl -u knockd.service -e
iptables -L -v -n
cat /var/log/syslog | grep knockdАльтернативная конфигурация: раздельные open/close последовательности
Если вы хотите открывать порт на длительный срок, используйте две отдельные последовательности: одна для открытия, другая — для закрытия:
$EDITOR /etc/knockd.confВставьте:
[options]
UseSyslog
Interface = your_interface
[openSSH]
sequence = 1000,2000,3000
seq_timeout = 15
tcpflags = syn
start_command = /sbin/iptables -I INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
[closeSSH]
sequence = 3000,2000,1000
seq_timeout = 15
tcpflags = syn
start_command = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPTПерезапустите сервис:
systemctl restart knockd.serviceЧастые проблемы и отладка
- Неправильный интерфейс — knockd слушает не тот интерфейс: проверьте Interface в /etc/knockd.conf.
- $EDITOR не настроен — убедитесь, что переменная окружения указывает на ваш редактор.
- Падение сервиса — смотрите journalctl и syslog.
- NAT / провайдер блокирует произвольные порты — port knocking может не сработать через некоторые NAT/CGNAT. В таких случаях используйте альтернативный канал (VPN).
Когда port knocking не подходит (контрпримеры)
- Мобильные клиенты с изменяющимися IP не подходят, если вы привязываете правила к IP клиента.
- Сетевые провайдеры, обрезающие нестандартные порты, помешают выполнению последовательности.
- Если вам критична аудитируемость и прозрачность доступа — скрытие порта усложняет логирование и мониторинг без дополнительной интеграции.
Альтернативные подходы
- Single Packet Authorization (SPA) — более современный метод: один зашифрованный пакет открывает доступ.
- VPN — безопасно и удобно для группы пользователей, но требует инфраструктуры.
- Fail2ban + строгие политики паролей и ключей — борется с брутфорсом, не скрывая порт.
Модель принятия решения (эвристика)
- Если у вас несколько администраторов и динамичные IP → используйте SPA или VPN.
- Если нужно быстро уменьшить шум сканеров и у вас фиксированные IP → port knocking прост в разворачивании.
- Если провайдер блокирует порты → VPN/Site-to-Site — более надёжно.
Роли и чек-листы
Администратор перед развёртыванием:
- Иметь альтернативный доступ (консоль, KVM).
- Сделать backup /etc/knockd.conf.
- Проверить имя интерфейса ip link show.
- Установить knockd и iptables-persistent.
- Настроить и включить systemd-unit.
- Создать и сохранить iptables-правила.
Тестировщик:
- Выполнить knock с другого хоста.
- Проверить открытие порта 22 в течение cmd_timeout.
- Проверить логи knockd и syslog.
Стандартная операция (SOP) для открытия доступа
- Со стороны клиента выполнить: knock server_ip 1000 2000 3000.
- В течение cmd_timeout выполнить ssh username@server_ip.
- После завершения работы убедиться в отсутствии лишних ACCEPT-прав для IP в iptables.
Инцидентный план и откат
Симптом: вы заблокировали себя и не можете подключиться по SSH.
План действий:
- Подключиться через консоль провайдера / KVM.
- Откатить правило DROP для порта 22:
iptables -D INPUT -p tcp --destination-port 22 -j DROP
ip6tables -D INPUT -p tcp --destination-port 22 -j DROP- Восстановить /etc/knockd.conf.bak и перезагрузить knockd:
mv /etc/knockd.conf.bak /etc/knockd.conf
systemctl restart knockd.service- Проанализировать логи и скорректировать seq_timeout/cmd_timeout/Interface.
Тест-кейсы и критерии приёмки
Критерии приёмки:
- После правильной последовательности порт 22 доступен с IP клиента в течение cmd_timeout.
- При отсутствии последовательности порт 22 недоступен для незнакомых IP.
- Сервис knockd автоматически стартует после перезагрузки.
Тест-кейсы:
- TC1: Корректная последовательность → успешный SSH.
- TC2: Неверная последовательность → SSH недоступен.
- TC3: Повторное выполнение start_command не даёт дублирующих правил (iptables -L проверка).
- TC4: Проверка сохранения правил через reboot.
Жёсткое укрепление безопасности
- Используйте ключи SSH (ed25519) и отключите парольную аутентификацию.
- Ограничьте доступ по IP в правилах iptables, если у вас фиксированные адреса.
- Логи: интегрируйте сообщения knockd в централизованный syslog/ELK для аудита.
- Обновления: держите систему и knockd в актуальном состоянии.
Совместимость и миграция
- knockd поддерживается в Debian 10; в более новых релизах проверьте наличие пакета в репозитории или соберите из исходников.
- На системах с nftables используйте адаптированные командные строки (nft) вместо iptables.
- Если вы планируете миграцию на cloud-платформы с ограничениями сетевого стека, протестируйте knock через публичный IP провайдера.
Краткая методология внедрения
- Тест на стенде с двумя хостами.
- Резервные доступы и резервные конфигурации.
- Внедрение на прод в часы низкой нагрузки.
- Мониторинг и ревью через 24—72 часа.
Примеры команд для быстрого разворачивания (шпаргалка)
apt update && apt install -y knockd iptables-persistent
mv /etc/knockd.conf /etc/knockd.conf.bak
# правка /etc/knockd.conf и /etc/default/knockd
systemctl daemon-reload
systemctl enable --now knockd.service
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j DROP
iptables-save > /etc/iptables/rules.v4Короткое объявление для команды (100–200 слов)
Knockd внедрён для дополнительной защиты SSH: порт 22 теперь закрыт по умолчанию и открывается только после выполнения безопасной последовательности портов. Это уменьшит количество автоматических попыток входа и снизит шум в логах. Важное: перед развертыванием у вас должен быть альтернативный доступ (консоль провайдера). Руководство по использованию и аварийному откату доступно в репозитории с операционными процедурами.
Заключение
Port knocking с knockd — простой и гибкий способ скрыть сервисы от массового сканирования. Он не заменяет базовые практики безопасности (ключи SSH, обновления, строгие политики), но хорошо дополняет их. Тестируйте на стенде, имейте резервный доступ и логируйте события для аудита.
Важное: перед внедрением на продовой инфраструктуре выполните проверку совместимости с вашим сетевым окружением (NAT, firewall провайдера, облачные ACL).
Похожие материалы
Ciuvo — сравнение цен в браузере
Блокировка потенциально нежелательных программ в Windows Defender
Тёмная тема в популярных приложениях Windows
Изменение имени учётной записи в Windows
Настройка iptables в Linux — базовый файл правил