Как использовать Port Knocking для скрытия SSH-порта на VPS?

В статье разберём:

  • что такое Port Knocking и как он защищает SSH;
  • как установить и запустить knockd на VPS;
  • как задать последовательность портов и команду открытия;
  • как протестировать доступ и устранить ошибки;
  • какие меры безопасности стоит соблюдать при настройке.

Что понадобится

  • VPS с Ubuntu или Debian и доступом по SSH с правами sudo.

  • Установленные утилиты iptables или ufw — они потребуются для фильтрации трафика.

  • Пакет knockd — демон, который отслеживает обращения к портам и выполняет команды.

  • Минимальные знания о сетевых портах, IP-адресах и базовых командах Linux.

Перед началом убедитесь, что на сервере открыт SSH-доступ (порт 22) и установлен фаервол. Если используется UFW, можно проверить его состояние командой:

sudo ufw status

Port Knocking не заменяет фаервол — он работает совместно с ним, добавляя дополнительный слой защиты. Все правила knockd применяются к существующим правилам iptables или UFW.

Как работает Port Knocking

Принцип работы Port Knocking прост: сервер не принимает соединения на порт SSH, пока пользователь не “постучит” по нескольким заранее заданным портам в нужном порядке. При правильной последовательности knockd выполняет команду, которая временно открывает SSH для IP-адреса, с которого поступили пакеты.

Например, вы задаёте последовательность 7000, 8000, 9000. Пока никто не обращался к этим портам в нужном порядке, SSH (22) остаётся закрытым. После правильного “стука” knockd добавляет правило iptables, разрешающее доступ с вашего IP:

/usr/sbin/iptables -A INPUT -s %IP% -p tcp --dport 22 -j ACCEPT

Это правило будет действовать до перезагрузки или пока не будет удалено вручную. Так ваш SSH остаётся невидимым для сканеров и ботов, но доступен вам после правильного набора портов.

Принцип работы Port Knocking на VPS

Совет: если вы используете публичный Wi-Fi, не открывайте SSH с этого IP. Настройте последовательность только для доверенных адресов — это снизит риск компрометации.

Установка и включение knockd

Пакет knockd доступен в стандартных репозиториях Ubuntu и Debian. Он работает как фоновый демон и отслеживает обращения к определённым портам, указанные в конфигурации.

Устанавливаем knockd

sudo apt update
sudo apt install knockd -y

После установки демон не запускается автоматически — необходимо включить его вручную.

Включаем автозапуск

sudo nano /etc/default/knockd

В открывшемся файле найдите строку:

START_KNOCKD=0

и измените её на:

START_KNOCKD=1

Сохраните изменения, затем активируйте сервис:

sudo systemctl enable knockd
sudo systemctl start knockd
sudo systemctl status knockd

Если сервис запущен корректно, статус будет “active (running)”. Теперь knockd готов принимать запросы и выполнять команды, заданные в конфигурации.

Установка и запуск knockd на сервере

Совет: если VPS использует UFW, убедитесь, что knockd работает до применения правил UFW — это можно указать в systemd unit, чтобы избежать конфликтов при загрузке.

Настройка последовательности портов

Основной файл конфигурации /etc/knockd.conf содержит секции с последовательностями портов и действиями. Каждая секция описывает отдельный сценарий — например, открытие SSH и его последующее закрытие.

Открываем файл для редактирования

sudo nano /etc/knockd.conf

Пример минимальной конфигурации

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

[openSSH]
    sequence = 7000,8000,9000
    seq_timeout = 10
    command = /usr/sbin/iptables -A INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
    tcpflags = syn

[closeSSH]
    sequence = 9000,8000,7000
    seq_timeout = 10
    command = /usr/sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
    tcpflags = syn

Эта конфигурация открывает SSH для вашего IP после правильного «стука» на порты 7000, 8000, 9000 и закрывает его при обратной последовательности. Параметр seq_timeout задаёт время (в секундах), в течение которого нужно успеть отправить всю комбинацию.

Настройка последовательности портов в knockd.conf

Совет: выбирайте порты выше 1024 и не используйте стандартные номера, чтобы затруднить подбор. Комбинация должна быть индивидуальной для каждого сервера.

Проверка работы Port Knocking

После настройки knockd нужно убедиться, что порт SSH действительно скрыт и открывается только после правильной последовательности. Для этого проведём несколько простых тестов.

Закрываем SSH-порт вручную

Сначала полностью блокируем доступ к порту 22, чтобы убедиться, что он закрыт:

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

Проверяем доступность SSH

ssh user@server_ip

Соединение не должно установиться. Это нормальное поведение — SSH скрыт.

Отправляем последовательность “стуков”

С локального компьютера используйте утилиту knock (она есть в Linux и macOS, а также в виде пакета knockd-client):

knock server_ip 7000 8000 9000

После правильной комбинации knockd добавит правило iptables, разрешающее доступ по SSH для вашего IP. Теперь можно подключиться:

ssh user@server_ip

Проверяем логи

sudo tail -f /var/log/knockd.log

Здесь будут отображаться все попытки “стука” — успешные и неудачные. Если последовательность неверная, запись всё равно появится, но команда не выполнится.

Проверка Port Knocking на сервере

Совет: можно добавить в cron задачу, которая автоматически очищает правила iptables каждые несколько часов, чтобы не оставлять SSH открытым надолго.

Типичные ошибки и безопасные рекомендации

Port Knocking не срабатывает

Если после отправки последовательности SSH остаётся закрытым:

  • Убедитесь, что сервис knockd запущен: sudo systemctl status knockd.

  • Проверьте, не блокирует ли UFW входящие соединения на используемые порты “стука”.

  • Проверьте лог /var/log/knockd.log — в нём видны все принятые комбинации и ошибки.

Ошибка “Invalid argument” при выполнении команд

Такое сообщение обычно означает, что команда iptables записана неверно или модуль не загружен. Проверьте синтаксис в /etc/knockd.conf и попробуйте выполнить команду вручную.

Увеличение seq_timeout

Если не успеваете отправить все “стуки” вовремя, увеличьте таймаут до 15–20 секунд:

seq_timeout = 20

Безопасные рекомендации

  • Используйте уникальные последовательности портов (4–6 чисел), не повторяющиеся на других серверах.

  • Не открывайте SSH с публичных сетей. Port Knocking лучше применять вместе с ограничением по IP.

  • Добавьте двухфакторную аутентификацию (например, Google Authenticator) для дополнительной защиты.

  • Создайте резервную копию конфигурации /etc/knockd.conf перед обновлением системы.

Типичные ошибки Port Knocking

Совет: если вы часто подключаетесь к серверу, настройте скрипт или алиас, автоматически выполняющий “стук” перед SSH-входом.

Итоги

  • Разобрали принцип работы технологии Port Knocking и её роль в защите SSH-доступа.

  • Установили и активировали демон knockd для обработки последовательностей портов.

  • Настроили собственную комбинацию портов для открытия и закрытия SSH-порта на VPS.

  • Проверили работоспособность механизма, просмотрели логи и устранили возможные ошибки.

  • Изучили практические советы по повышению безопасности: увеличение таймаута, выбор нестандартных портов, резервное копирование конфигурации.

Вывод: Port Knocking — это простой, но эффективный способ скрыть SSH-порт от автоматических сканеров и атакующих. Даже если пароль или ключи защищены, скрытие самого порта значительно снижает риск несанкционированного доступа. Технология не требует сложных настроек и совместима с любыми фаерволами, делая её отличным дополнением к стандартным средствам безопасности VPS.

Итоги настройки Port Knocking

Оставить комментарий