Почему стук не открывает дверь
Стук либо вообще не достигает сервера, либо достигает его в виде, который демон не принимает, либо открывает дверь для адреса, который вы не используете. Проверяйте список сверху вниз — причины расположены по частоте возникновения.
1. Дверь открылась для другого адреса
Брандмауэр открывает порт для исходного адреса, который увидел сервер. Если вы стучали по IPv6, а затем SSH подключается по IPv4 — или наоборот, — дверь открыта для адреса, который вы не используете. Мобильная сеть, NAT оператора и VPN также меняют адрес.
Сравните адрес, который Secret Knock показывает на главном экране («Вы стучите с …»), с адресом в журнале сервера и закрепите IPv4 или IPv6 для двери, если они различаются.
2. Пакеты не достигают сервера
Сети в отелях, офисах и мобильные сети иногда блокируют необычные порты, а облачный брандмауэр перед сервером может отбрасывать пакеты ещё до того, как их увидит knockd или fwknopd. Наблюдайте за трафиком на сервере, пока стучите:
# knockd (UseSyslog): every recognised step and the command it ran
sudo journalctl -u knockd -f
# Do the packets reach the server at all? (use your interface and ports)
sudo tcpdump -ni eth0 'tcp port 7311 or tcp port 8822 or udp port 9133'
# fwknopd in the foreground with verbose output
sudo fwknopd -f -v 3. Последовательность приходит в неверном виде
- 1Повторно переданные SYN: когда TCP-стук не получает ответа, операционная система клиента повторно отправляет тот же SYN. knockd 0.8 сбрасывает последовательность при таком повторе. Secret Knock отправляет каждый TCP-стук как единственный SYN и немедленно прекращает попытку; другие клиенты могут вести себя иначе.
- 2Время: все шаги должны прийти по порядку в пределах seq_timeout. Добавьте небольшую задержку перед шагом, если промежуточный маршрутизатор меняет порядок пакетов.
- 3Протокол: шаг UDP должен отправляться как UDP, а шаг TCP — как TCP; сверяйте каждый шаг с knockd.conf.
- 4tcpflags = syn заставляет knockd игнорировать TCP-пакеты без флага SYN. Без этого другие пакеты соединения с тем же портом также считаются совпадениями и могут нарушить последовательность.
4. fwknop: ключи, часы и повторы
- 1Оба ключа должны совпадать с access.conf: ключ Rijndael и ключ HMAC с тем же дайджестом (по умолчанию SHA-256).
- 2fwknopd отклоняет пакеты старше MAX_SPA_PACKET_AGE (по умолчанию 120 секунд), поэтому при сильно неверном времени на устройстве каждый пакет выглядит устаревшим.
- 3Каждый SPA-пакет можно использовать только один раз; fwknopd намеренно отбрасывает повторно отправленный пакет.
- 4Если вы стучите по HTTP, что-то должно принимать TCP-подключения на этом порту, иначе запрос никогда не будет отправлен.
5. Дверь открывается, но SSH всё равно не работает
- 1Порядок правил: правило, добавляемое демоном, должно стоять перед правилом, которое отбрасывает порт — iptables -A добавляет его после существующего DROP, поэтому оно никогда не сработает.
- 2Окно: cmd_timeout или FW_ACCESS_TIMEOUT закрыло дверь до подключения SSH. Подключитесь в течение этого окна; уже установленные сеансы продолжают работать, если брандмауэр принимает установленные соединения.
- 3Проверка порта в Secret Knock после стука показывает, ответил ли порт вообще, отдельно от аутентификации SSH.
Все примеры на GitHub → Все конфигурации с этой страницы, готовые к копированию: github.com/mobilcomm/secretknock-examples (общественное достояние).
Вопросы
Как узнать, что именно отправило приложение?
История двери показывает каждый стук с его временем, результатом и семейством адресов, а редактор показывает тот же стук как команду терминала, которую можно выполнить с компьютера для сравнения.