Порт-нокинг на 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 чтобы продолжить.
После этого установите 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-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
Типичный пример секций в файле:
[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 для восстановления доступа
- Если вы потеряли доступ, войдите через резервный канал (консоль облачного провайдера или IPMI).
- Откатите временно правило блокировки SSH:
iptables -D INPUT -p tcp --dport 22 -j DROP
- Проверьте /etc/knockd.conf и /etc/default/knockd, исправьте конфигурацию.
- Перезапустите службу knockd:
service knockd restart
- Восстановите нужный набор правил и сохраните его (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: минимизация доступа, срок хранения, шифрование архивов логов.
Тест-кейсы и приёмочные проверки
- Без «постукиваний» соединение к SSH порт 22 — таймаут/отказ.
- Правильная последовательность открывает доступ для IP отправителя.
- Неверная последовательность не даёт доступа и создаёт запись в логах.
- Смена последовательности в конфигурации применяется после перезапуска knockd.
Миграция и совместимость
- Конфигурация knockd и формат /etc/knockd.conf совместимы между Ubuntu и Debian (включая старые версии вроде Debian 8), но поведение может отличаться в системах с systemd — проверяйте unit-файлы и параметры запуска.
Краткое резюме
Порт-нокинг — простой инструмент для сокрытия сервисов за «секретной последовательностью». Он эффективен в качестве ещё одного слоя защиты, особенно в сочетании с публичным ключом и ограничением по IP. Однако это не панацея: для критичных систем рассмотрите SPA или VPN как более надёжные решения.
Important: всегда имейте резервный доступ к серверу и тестируйте конфигурацию в контролируемой среде перед применением в проде.
Похожие материалы

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

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

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

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

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