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

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

6 min read Сеть и безопасность Обновлено 24 Nov 2025
Knockd на Debian 10 — настроить port knocking
Knockd на Debian 10 — настроить port knocking

Схема порт-нокинга и защита 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-persistent

iptables-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

Частые проблемы и отладка

  1. Неправильный интерфейс — knockd слушает не тот интерфейс: проверьте Interface в /etc/knockd.conf.
  2. $EDITOR не настроен — убедитесь, что переменная окружения указывает на ваш редактор.
  3. Падение сервиса — смотрите journalctl и syslog.
  4. 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) для открытия доступа

  1. Со стороны клиента выполнить: knock server_ip 1000 2000 3000.
  2. В течение cmd_timeout выполнить ssh username@server_ip.
  3. После завершения работы убедиться в отсутствии лишних ACCEPT-прав для IP в iptables.

Инцидентный план и откат

Симптом: вы заблокировали себя и не можете подключиться по SSH.

План действий:

  1. Подключиться через консоль провайдера / KVM.
  2. Откатить правило DROP для порта 22:
iptables -D INPUT -p tcp --destination-port 22 -j DROP
ip6tables -D INPUT -p tcp --destination-port 22 -j DROP
  1. Восстановить /etc/knockd.conf.bak и перезагрузить knockd:
mv /etc/knockd.conf.bak /etc/knockd.conf
systemctl restart knockd.service
  1. Проанализировать логи и скорректировать 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 провайдера.

Краткая методология внедрения

  1. Тест на стенде с двумя хостами.
  2. Резервные доступы и резервные конфигурации.
  3. Внедрение на прод в часы низкой нагрузки.
  4. Мониторинг и ревью через 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).

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

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

Ciuvo — сравнение цен в браузере
Онлайн-шопинг

Ciuvo — сравнение цен в браузере

Блокировка потенциально нежелательных программ в Windows Defender
Безопасность

Блокировка потенциально нежелательных программ в Windows Defender

Тёмная тема в популярных приложениях Windows
Советы

Тёмная тема в популярных приложениях Windows

Изменение имени учётной записи в Windows
Windows

Изменение имени учётной записи в Windows

Настройка iptables в Linux — базовый файл правил
Безопасность

Настройка iptables в Linux — базовый файл правил

Исправить "This version of Netflix is not compatible"
Технологии

Исправить "This version of Netflix is not compatible"