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

Порт-нокинг на Ubuntu: установка и настройка knockd

7 min read Security Обновлено 20 Oct 2025
Порт-нокинг на Ubuntu — установка knockd
Порт-нокинг на Ubuntu — установка knockd

Введение

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

Эта инструкция показывает, как установить и настроить порт-нокинг на Ubuntu (подходы работают и на Debian 8). Пример использует knockd — демон, который слушает «постукивания» по портам и выполняет команды (например, меняет правила iptables) при успешной последовательности.

Определение: Порт-нокинг — механизм, при котором доступ к закрытому порту временно открывается после получения корректной последовательности подключений на другие порты.

Шаг 1: Установите необходимые пакеты

Все команды ниже выполняются от имени root. В статье автор использует:

sudo su

чтобы стать root-пользователем и не писать sudo перед каждой командой. Первый шаг — обновить список пакетов Ubuntu:

apt-get update

Затем установите SSH-сервер, если он ещё не установлен:

apt-get install openssh-server

Установите knockd — демон, который управляет порт-нокингом:

apt-get install knockd

Ниже приведён пример вывода apt (оставлен как в оригинале):

Get:1 http://security.debian.org wheezy/updates Release.gpg [1,554 B]  
Get:2 http://security.debian.org wheezy/updates Release [102 kB]  
Get:3 http://security.debian.org wheezy/updates/main amd64 Packages [336 kB]  
Hit http://mirrors.digitalocean.com wheezy Release.gpg  
Hit http://mirrors.digitalocean.com wheezy Release  
Get:4 http://security.debian.org wheezy/updates/main Translation-en [195 kB]  
Hit http://mirrors.digitalocean.com wheezy/main amd64 Packages  
Hit http://mirrors.digitalocean.com wheezy/main Translation-en  
Fetched 635 kB in 1s (358 kB/s)  
Reading package lists... Done  
root@howtoforge:~#  
root@howtoforge:~# apt-get install openssh-server  
Reading package lists... Done  
Building dependency tree  
Reading state information... Done  
The following extra packages will be installed:  
 openssh-client  
Suggested packages:  
 ssh-askpass libpam-ssh keychain monkeysphere rssh molly-guard ufw  
The following packages will be upgraded:  
 openssh-client openssh-server  
2 upgraded, 0 newly installed, 0 to remove and 32 not upgraded.  
Need to get 1,364 kB of archives.  
After this operation, 0 B of additional disk space will be used.  
Do you want to continue [Y/n]? 

Нажмите Y и Enter чтобы продолжить.

Установка knockd на сервере

После этого установите iptables — системный файлровщик ядра:

apt-get install iptables

Шаг 2: Добавление правил в iptables

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

iptables --flush  
iptables -t nat --flush  
iptables -t mangle --flush  
iptables --policy OUTPUT ACCEPT

Разрешим все уже установленные и связанные соединения — это важно, иначе мы можем прервать собственное SSH-подключение:

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

Важно: в STABLISHED,RELATED нет пробелов вокруг запятой.

Далее добавим правило, которое будет блокировать входящие подключения на порт 22 (SSH):

iptables -A INPUT -p tcp --destination-port 22 -j DROP

Чтобы правила восстанавливались после перезагрузки, установим iptables-persistent:

apt-get install iptables-persistent

Во время установки вам предложат сохранить текущие правила (IPv4 и IPv6) — выберите Yes для обоих запросов.

Установка iptables-persistent, шаг 1

Установка iptables-persistent, шаг 2

Если вы видите подобный интерфейс, подтверждайте сохранение текущего набора правил.

Сохраните текущие правила в файл с помощью iptables-save. Этот файл затем можно загрузить через iptables-restore:

iptables-save

Пример вывода iptables-save:

 # Generated by iptables-save v1.4.14 on Tue Feb 23 04:59:28 2016  
*filter  
:INPUT ACCEPT [1:40]  
:FORWARD ACCEPT [0:0]  
:OUTPUT ACCEPT [17:1976]  
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT  
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT  
-A INPUT -p tcp -m tcp --dport 22 -j DROP  
COMMIT  
# Completed on Tue Feb 23 04:59:28 2016

После этих действий ваша текущая SSH-сессия останется активной, а остальные подключения к порту 22 будут отброшены.

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

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

nano /etc/knockd.conf

Редактирование knockd.conf в nano

Типичный пример секций в файле:

[options]  
 UseSyslog  
  
[openSSH]  
 sequence = 7000,8000,9000  
 seq_timeout = 5  
 command = /sbin/iptables -A INPUT -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: параметр UseSyslog включает логирование событий в системный журнал. Параметр logfile (если задан) указывает файл для логов.
  • openSSH / closeSSH — произвольные имена действий. openSSH открывает доступ на порт 22 для IP, который выполнил правильную последовательность. closeSSH удаляет это правило.
  • knockd автоматически заменяет %IP% на IP-адрес клиента, который послал «постукивания», поэтому вы можете открыть доступ только для авторизованного адреса.

sequence = 9000,8000,7000

Это означает, что будет распознан набор подключений с одного и того же IP: сначала 7000, затем 8000, затем 9000 (в примере выше указана последовательность 7000,8000,9000 для открытия). Рекомендуется изменить стандартные порты и порядок — значения по умолчанию известны атакующим.

seq_timeout = 5

Время в секундах, в течение которого нужно завершить последовательность. По умолчанию 5 секунд — обычно достаточно, особенно если вы используете автоматический генератор «стуков».

command = /sbin/iptables -A INPUT -s %IP% -p tcp –dport 22 -j ACCEPT

Команда, которую knockd выполнит при успешной последовательности. В ней %IP% заменится на адрес клиента.

tcpflags = syn

Указывает, какие TCP-флаги должен иметь пакет, чтобы считаться «постукиванием». Если указан syn, пакет с другими флагами будет проигнорирован.

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

Отредактируйте /etc/default/knockd:

nano /etc/default/knockd

и измените:

START_KNOCKD=0

на

START_KNOCKD=1

Сохраните и закройте файл. При наличии нескольких сетевых интерфейсов можно указать интерфейс вручную, раскомментировав KNOCKD_OPTS и добавив флаг -i .

Запустите демон:

service knockd start

Теперь knockd слушает последовательности портов и управляет правилами iptables в соответствии с конфигурацией.

Шаг 3: Доступ к серверу при запущенном knockd

После настройки вы не сможете подключиться к SSH напрямую — iptables блокирует порт 22. Клиент получит таймаут или отсутствие ответа. Если попытка подключения не закончилась автоматически, нажмите Ctrl-C.

Тестирование «постукиваний» с помощью telnet

Linux: установите пакет telnet через apt.

Windows: включите компонент Telnet Client в разделе «Программы» → «Включение или отключение компонентов Windows» (Turn Windows features on or off).

В командной строке выполните (замените последовательность портов на вашу):

telnet youripaddress 7000  
telnet youripaddress 8000  
telnet youripaddress 9000

Нужно выполнить все команды за время, указанное в seq_timeout (в примере 5 секунд). После успешной последовательности попробуйте подключиться по SSH — доступ должен открыться.

Чтобы закрыть доступ, выполните те же команды в обратном порядке (если вы настроили обратную секцию):

telnet youripaddress 9000  
telnet youripaddress 8000  
telnet youripaddress 7000

Преимущество порт-нокинга — его можно сочетать с аутентификацией по приватному ключу. Если для доступа требуется и корректная последовательность, и приватный ключ — вероятность неавторизованного доступа падает значительно.

Когда порт-нокинг не помогает (примеры и ограничения)

  • Если злоумышленник перехватил вашу сеть или у него есть контроль над прокси/шлюзом, последовательности могут быть воспроизведены.
  • Пассивные наблюдатели (многочисленные мониторинги трафика) могут заметить повторяющиеся попытки на нестандартные порты и вычислить последовательность.
  • Порт-нокинг не защищает от атак, направленных внутрь уже разрешённого IP (например, если %IP% — адрес прокси).
  • Неправильная конфигурация iptables может привести к блокировке доступа для администратора — всегда имейте аварийный канал (консоль облачного провайдера, IPMI, локальный доступ).

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

  • Single Packet Authorization (SPA), например fwknop — отправка единственного зашифрованного пакета вместо последовательности портов. SPA устойчивее к пассивному мониторингу.
  • VPN: скрыть службу за частной сетью (например, OpenVPN или WireGuard). Это даёт сильную изоляцию, но добавляет накладные расходы на настройку.
  • Публичный ключ + fail2ban + ограничение по IP — классический набор для SSH.

Ментальные модели и эвристики

  • Модель «ключ + дверь»: приватный ключ — это ключ, порт-нокинг — секретный код на звонок. Наличие обоих даёт высокий барьер для доступа.
  • Эвристика риск×усилие: порт-нокинг даёт высокую безопасность при низких усилиях настройки, но его эксплуатационная надёжность ниже, чем у VPN.

Факт-бокс: ключевые числа и параметры

  • По умолчанию seq_timeout = 5 (секунд).
  • Рекомендуется использовать последовательность из 3–5 портов, избегая распространённых чисел.
  • knockd заменяет %IP% на IP-клиента в параметре command.

Практическая шпаргалка (cheat sheet)

  • Проверка статуса knockd:
service knockd status
  • Перезапуск knockd:
service knockd restart
  • Просмотр текущих правил iptables:
iptables -L -n --line-numbers
  • Сохранение правил (если установлен iptables-persistent):
iptables-save > /etc/iptables/rules.v4

Ролевые чек-листы перед развертыванием

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

  • Убедиться в наличии резервного доступа (консоль провайдера, IPMI).
  • Зафиксировать текущие правила iptables (iptables-save).
  • Настроить и протестировать последовательность knock из доверенной сети.

DevOps/инженер по безопасности:

  • Выбрать непредсказуемую последовательность портов.
  • Проверить логирование (UseSyslog) и ротацию логов.
  • Настроить мониторинг попыток неудачных «постукиваний».

Пользователь/оператор:

  • Иметь утилиту для отправки последовательности (knock cli, telnet или скрипт).
  • Знать текущую seq_timeout и порядок портов.

Playbook: быстрый SOP для восстановления доступа

  1. Если вы потеряли доступ, войдите через резервный канал (консоль облачного провайдера или IPMI).
  2. Откатите временно правило блокировки SSH:
iptables -D INPUT -p tcp --dport 22 -j DROP
  1. Проверьте /etc/knockd.conf и /etc/default/knockd, исправьте конфигурацию.
  2. Перезапустите службу knockd:
service knockd restart
  1. Восстановите нужный набор правил и сохраните его (iptables-save > /etc/iptables/rules.v4).

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

  • После выполнения «постукиваний» с доверенного IP доступ по SSH открывается в течение seq_timeout-периода.
  • Правило, открывающее доступ, содержит корректный IP (%IP%).
  • Логи фиксируют успешные и неуспешные попытки

Жёсткая безопасность: рекомендации по hardening

  • Совмещайте порт-нокинг с аутентификацией по публичному ключу и отключением паролей (PasswordAuthentication no в /etc/ssh/sshd_config).
  • Логируйте попытки (UseSyslog) и настраивайте оповещения о подозрительных сериях попыток.
  • Рассмотрите SPA (fwknop) как более скрытый и безопасный вариант.

Примечания по приватности и локальным требованиям (GDPR)

Порт-нокинг сам по себе не собирает персональные данные, но логи содержат IP-адреса клиентов. Если вы обрабатываете персональные данные жителей ЕС, убедитесь, что хранение логов и доступ к ним соответствуют требованиям GDPR: минимизация доступа, срок хранения, шифрование архивов логов.

Тест-кейсы и приёмочные проверки

  1. Без «постукиваний» соединение к SSH порт 22 — таймаут/отказ.
  2. Правильная последовательность открывает доступ для IP отправителя.
  3. Неверная последовательность не даёт доступа и создаёт запись в логах.
  4. Смена последовательности в конфигурации применяется после перезапуска knockd.

Миграция и совместимость

  • Конфигурация knockd и формат /etc/knockd.conf совместимы между Ubuntu и Debian (включая старые версии вроде Debian 8), но поведение может отличаться в системах с systemd — проверяйте unit-файлы и параметры запуска.

Краткое резюме

Порт-нокинг — простой инструмент для сокрытия сервисов за «секретной последовательностью». Он эффективен в качестве ещё одного слоя защиты, особенно в сочетании с публичным ключом и ограничением по IP. Однако это не панацея: для критичных систем рассмотрите SPA или VPN как более надёжные решения.

Important: всегда имейте резервный доступ к серверу и тестируйте конфигурацию в контролируемой среде перед применением в проде.

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

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

Как скрыть историю браузера
Конфиденциальность

Как скрыть историю браузера

YouTube TV не работает на Roku — как исправить
Руководства

YouTube TV не работает на Roku — как исправить

Горячая клавиша для скачивания изображений в Windows
Windows

Горячая клавиша для скачивания изображений в Windows

Исправить ошибку «CDP.dll отсутствует» в Windows
Windows

Исправить ошибку «CDP.dll отсутствует» в Windows

Как распознать текст, сгенерированный ИИ вручную
Контент

Как распознать текст, сгенерированный ИИ вручную

Установка RabbitMQ на CentOS 7
DevOps

Установка RabbitMQ на CentOS 7