Как работает port knocking
Преимущества и ограничения
- SSH-порт не отображается как обычный открытый сервис при внешнем сканировании;
- уменьшается количество автоматических попыток входа;
- доступ можно ограничить конкретным IP-адресом;
- SSH-порт открывается только на короткое время;
- решение не требует отдельного VPN-сервера.
- обычная последовательность передаётся без шифрования;
- атакующий, способный перехватить трафик, может воспроизвести её;
- потеря последовательности может привести к потере удалённого доступа;
- ошибки в настройках firewall способны заблокировать администратора;
- port knocking может быть неудобен за NAT, прокси и некоторыми фильтрами трафика.
Установка 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 может быть полезен как дополнительный барьер. Для инфраструктуры с высокими требованиями к безопасности его не следует рассматривать как самостоятельный механизм аутентификации.