Стук в дверь (Мария Делинская https://www.instagram.com/madel.artist)
Port knocking — это способ управления доступом к сетевому порту с помощью заранее заданной последовательности соединений. В типичном сценарии SSH-порт закрыт правилами межсетевого экрана, а демон  knockd  открывает его только для IP-адреса клиента, отправившего правильную последовательность «стуков».
Технология помогает уменьшить видимость SSH-сервиса для автоматических сканеров, однако не заменяет ключевую аутентификацию, firewall и другие меры защиты.

Как работает port knocking

Схема работы выглядит следующим образом:
1. Межсетевой экран блокирует входящие подключения к TCP-порту SSH.
2. Клиент отправляет несколько запросов на заранее определённые порты в установленном порядке.
3.  knockd  отслеживает сетевые попытки и проверяет последовательность.
4. При совпадении сервер временно добавляет правило firewall для IP-адреса клиента.
5. Пользователь подключается к SSH.
6. После завершения работы порт можно закрыть автоматически или отдельной последовательностью.
 
Например, последовательность может выглядеть так: 41001 → 42002 → 43003.
 
Использовать стандартные комбинации вроде  7000, 8000, 9000  не следует: они часто встречаются в примерах и быстро угадываются.
 

Преимущества и ограничения

Port knocking полезен как дополнительный уровень защиты:
  • SSH-порт не отображается как обычный открытый сервис при внешнем сканировании;
  • уменьшается количество автоматических попыток входа;
  • доступ можно ограничить конкретным IP-адресом;
  • SSH-порт открывается только на короткое время;
  • решение не требует отдельного VPN-сервера.
Но у технологии есть существенные ограничения:
  • обычная последовательность передаётся без шифрования;
  • атакующий, способный перехватить трафик, может воспроизвести её;
  • потеря последовательности может привести к потере удалённого доступа;
  • ошибки в настройках firewall способны заблокировать администратора;
  • port knocking может быть неудобен за NAT, прокси и некоторыми фильтрами трафика.
Поэтому SSH всё равно следует защищать ключами, отключать вход по паролю и ограничивать доступ на уровне firewall.
 

Установка  knockd


Пример ниже рассчитан на Debian и Ubuntu:

sudo apt update
sudo apt install knockd

После установки необходимо определить сетевой интерфейс, на котором демон будет принимать пакеты:

ip -br link

Откройте конфигурацию:

sudo nano /etc/knockd.conf

Пример конфигурации:
[options]
    UseSyslog
    Interface = eth0

[openSSH]
    sequence    = 41001,42002,43003
    seq_timeout = 8
    tcpflags    = syn
    command     = /usr/sbin/iptables -I INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
    cmd_timeout = 20

[closeSSH]
    sequence    = 43003,42002,41001
    seq_timeout = 8
    tcpflags    = syn
    command     = /usr/sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT

В этом примере правильная последовательность открывает SSH-порт 22 для IP-адреса клиента. Обратная последовательность удаляет соответствующее правило. Сам принцип использования последовательности для динамического изменения правил firewall описан в документации по port knocking.

Включение службы

На некоторых системах параметр запуска необходимо проверить в файле  /etc/default/knockd :

sudo nano /etc/default/knockd

Убедитесь, что демон разрешён к запуску:
START_KNOCKD=1

Затем включите и запустите службу:
sudo systemctl enable --now knockd
sudo systemctl status knockd

Проверить сообщения службы можно с помощью  journalctl :
sudo journalctl -u knockd -f

Настройка firewall

До включения port knocking нужно продумать порядок правил. Если firewall безусловно разрешает входящие подключения к TCP-порту 22, механизм теряет смысл.

Пример для  iptables :

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

При использовании удалённого сервера сначала подготовьте резервный канал доступа — консоль провайдера, VPN или уже установленную SSH-сессию. Нельзя закрывать текущий рабочий доступ, не проверив новую схему: ошибка в конфигурации может потребовать восстановления через out-of-band-консоль.
Также важно сохранить правила firewall, иначе они могут исчезнуть после перезагрузки. Способ сохранения зависит от дистрибутива и используемого firewall.

Подключение с клиента

Установите клиентскую часть:

sudo apt install knockd

Отправьте последовательность:
knock -v singularity2.lytkins.ru 41001 42002 43003

После этого подключитесь к SSH:
ssh Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в браузере должен быть включен Javascript.

Для закрытия порта используйте обратную последовательность:
knock -v singularity2.lytkins.ru 43003 42002 41001

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

knock singularity2.lytkins.ru 41001 42002 43003 && \
ssh Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в браузере должен быть включен Javascript.

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

С другого компьютера проверьте состояние порта:

nmap -Pn -p 22 singularity2.lytkins.ru

До правильной последовательности SSH-порт должен быть недоступен или отображаться как фильтруемый. После выполнения  knock  проверьте порт снова:

nmap -Pn -p 22 singularity2.lytkins.ru

Если правило добавилось корректно, порт 22 станет доступен с IP-адреса клиента. Проверить правила можно так: sudo iptables -L INPUT -n --line-numbers

Логи  knockd :
sudo journalctl -u knockd --since "10 minutes ago"

Для диагностики сетевого интерфейса удобно временно использовать:
sudo tcpdump -ni eth0 'tcp port 41001 or tcp port 42002 or tcp port 43003

Усиление защиты SSH

Port knocking следует применять вместе с базовым hardening SSH. В  /etc/ssh/sshd_config  обычно рассматривают следующие параметры:

PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
MaxAuthTries 3
AllowUsers admin

Перед применением изменений проверьте конфигурацию:

sudo sshd -t

Затем перезапустите SSH-службу:

sudo systemctl restart ssh

Не отключайте парольную аутентификацию, пока не проверили вход по ключу в отдельной сессии. Для критически важных серверов также стоит использовать VPN, ограничение источников доступа, многофакторную аутентификацию и централизованный мониторинг.

Более безопасная альтернатива

Главный недостаток классического port knocking — отсутствие криптографической защиты последовательности. Если атакующий наблюдает сетевой трафик, он потенциально может повторить правильные запросы. Для серверов с постоянным административным доступом чаще подходит VPN, например WireGuard или IPsec/strongSwan. В таком варианте SSH-порт вообще не публикуется в интернет и доступен только из защищённой VPN-сети. Для эпизодического доступа port knocking может быть полезен как дополнительный барьер. Для инфраструктуры с высокими требованиями к безопасности его не следует рассматривать как самостоятельный механизм аутентификации.

Добавить комментарий