Port knocking: постучать в закрытую дверь

Цикл «Не светим лишнего». Выпуск 6.
Представим SSH, который снаружи вообще не отвечает. Порт закрыт firewall, баннера нет, перебирать пароль некуда. Но если клиент сначала обратится к порту 888, потом к 555 и затем к 222, его IP на полчаса попадёт в список secured, и SSH откроется.
Это и есть классический port knocking.
Как собирается последовательность
На первом шаге firewall ловит пакет к закрытому порту и добавляет источник в промежуточный список на 20–30 секунд. Второй шаг срабатывает только для адресов из первого списка и переносит их дальше. Последний шаг добавляет IP в рабочий allow-list с более длинным timeout.
Сервис на «стучащих» портах слушать не обязан. Firewall просто замечает попытки соединения.
Последовательность может использовать TCP, UDP или ICMP. В ICMP-варианте различают, например, размеры Echo Request или другие доступные признаки пакета. Это бывает удобно в сетях, где исходящие TCP/UDP ограничены, но ping проходит. Правда, бывает и наоборот: ICMP режут первым.
Что knocking даёт
Он хорошо скрывает поверхность атаки от обычного сканирования. Пока последовательность не выполнена, SSH, WinBox или служебный NAT выглядят закрытыми. Боты не видят форму входа и не начинают перебор.
Реализовать базовую схему можно прямо на MikroTik без отдельного сервера. Клиенту иногда достаточно нескольких команд nc или ping. Для аварийного доступа это может быть полезным резервом.
Чего knocking не даёт
Обычная последовательность портов не шифруется. Человек, который видит трафик, может её повторить. Даже без прослушивания секрет из трёх коротких портов теоретически перебирается, если нет ограничений частоты и защитных списков.
Firewall опять же открывает внешний IP. За общим NAT правильный стук одного инженера может открыть путь соседнему клиенту того же NAT. Собственная авторизация SSH или веб-системы остаётся обязательной.
Плюсы
- сервис не виден обычному сканеру;
- минимальная серверная инфраструктура;
- любые защищаемые протоколы после открытия;
- короткий timeout автоматически закрывает доступ;
- можно использовать как аварийный канал;
- легко сочетать с обычным allow-list.
Минусы
- последовательность можно подсмотреть и воспроизвести;
- неудобство на телефоне и чужом компьютере;
- NAT объединяет пользователей;
- ICMP/UDP могут фильтроваться;
- диагностика выглядит странно: правильные пакеты специально получают drop;
- состояние последовательности можно сбить или зашумить.
Где можно больно ошибиться
Сделать короткий секрет и длинное открытие. Последовательность из трёх известных портов с доступом на сутки — слабая конструкция.
Не сбрасывать неправильную последовательность. Если промежуточные списки слишком терпеливы, порты можно набрать вразнобой.
Открыть управление всем сервисам. Последний knock должен включать конкретную группу, а не общий accept from secured to any.
Считать knocking заменой пароля. Он уменьшает видимость сервиса, но не делает дырявый SSH безопасным и не заменяет ключи.
Забыть порядок firewall. Правила knocking должны увидеть пакет раньше финального drop, а рабочий allow — стоять в правильной цепочке input или forward.
Не ограничить перебор. Источники, которые постоянно стучат по шагам в неправильном порядке, можно временно отправлять в отдельный blacklist.
Когда применять
Port knocking хорош как лёгкий дополнительный слой для небольшой группы администраторов, особенно если отдельный портал пока избыточен. Для массового пользовательского доступа он неудобен. Для более сильной версии той же идеи существует Single Packet Authorization: один криптографически защищённый пакет вместо наблюдаемой последовательности.
Ранее в цикле
- 2. Firewall без магии: закрыть всё и открыть ровно нужное
- 5. Временный allow-list: открыть на час и не забыть закрыть