Files
obsidian/nix/Port Knocking.md
T
2026-09-24 13:22:58 +05:00

4.1 KiB

#linux #ssh Port Knocking — это метод скрытой защиты, при котором все критически важные порты (например, 22) блокируются файрволлом и открываются только после получения специальной последовательности запросов (knocks) на заранее заданные закрытые порты. Пока атакующий не знает правильного порядка и тайминга, его порт-сканер увидит лишь, что порт 22 просто закрыт.

Как дополнительный фактор защиты, port knocking может снизить обнаружение сервиса, а не пытаться бороться с последствиями (брутфорс, эксплуатация уязвимости).

⚙️ Как настроить knockd на Linux

Самый популярный инструмент — демон knockd. В большинстве дистрибутивов он ставится стандартным способом.

1. Установка:

apt update && apt install knockd iptables-persistent -y

2. Настройка автозапуска:
Редактируем /etc/default/knockd. Меняем START_KNOCKD=0 на START_KNOCKD=1.

3. Конфигурация knockd в /etc/knockd.conf:

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

[openSSH]
    sequence    = 661,671,681
    seq_timeout = 5
    tcpflags    = syn
    start_command = /sbin/iptables -I INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
    stop_command  = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
    cmd_timeout   = 30

Описание параметров:

🟢 Interface — сетевой интерфейс, который будет прослушиваться.
🟢 logfile — файл логирования knockd (необязательный параметр).
🟢 sequence — последовательность портов для «стука». Можно также явно задать протокол (например, 661:udp, 671, 681:tcp).
🟢 seq_timeout — время в секундах, за которое необходимо завершить «стук».
🟢 tcpflags — флаги tcp, которые должны быть в «открывающей» последовательности. Можно указать несколько флагов или исключить их явно (например -fin,syn,ack), но в стандартной конфигурации используется флаг syn.
🟢 start_command — команда, выполняемая после успешного «стука».
🟢 stop_command — команда, выполняемая по истечении cmd_timeout.
🟢 cmd_timeout — время в секундах, на которое открывается порт.

4. Запуск демона:

systemctl enable knockd && systemctl start knockd

🔐 Как открыть порт (клиент):

С удаленного узла мы можем предъявить пропуск — простучать указанные порты в правильной последовательности.

knock -v target.host 661 671 681

В ответ ты увидишь: hitting tcp target.host:661hitting tcp target.host:671hitting tcp target.host:681. После этого соединение по SSH станет возможным.

💀 Атака через knockknock

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