Защита VPN через Port Knocking на DD‑WRT
Быстрые ссылки
- Предисловие
- Обзор
- Требования, допущения и рекомендации
- Базовое правило «Блокировать новые VPN» на DD‑WRT
- Что делает «волшебная» команда
- Конфигурация knockd
- Советы автора
- Тестирование и отладка
- Альтернативы и ограничения
- Контрольный чеклист администратора
Мы показали, как запускать Wake‑On‑LAN удалённо командой Port Knocking в предыдущей статье. Здесь — как применять тот же приём, чтобы защитить VPN‑сервис от массовых атак и сократить количество нежелательных подключений.
Изображение: Aviad Raviv & bfick.
Предисловие
Если вы используете встроенный VPN DD‑WRT или у вас есть отдельный VPN‑сервер в локальной сети, вы можете скрыть точку входа VPN от сканеров, поместив её «за» последовательностью knock. Это значительно снижает количество автоматизированных попыток взлома. Однако port knocking не заменяет сильный пароль и другие меры безопасности: настойчивый злоумышленник может открыть последовательность (или выполнить повторную атаку — replay), если у него достаточно времени и ресурсов.
Также учитывайте удобство пользователей: для подключения клиентам придётся выполнить последовательность заранее. Если последовательность не выполнена — подключение не установится.
Обзор
Идея простая:
- Изначально блокируем входящие новые соединения к порту, который «инициирует» VPN (в нашем примере PPTP использует TCP 1723).
- Настраиваем knockd на обнаружение серии «стуков» (последовательности TCP/UDP пакетов к указанным портам) от одного IP‑адреса.
- Когда последовательность обнаружена, knockd временно вставляет в iptables правило, разрешающее доступ к VPN‑порту только с этого IP.
- Через заданный таймаут правило удаляется; уже установленные VPN‑сессии при этом остаются живыми.
В примере используется PPTP, но тот же подход применим к другим типам VPN: поменяйте номер порта и/или протокол (TCP/UDP) в командах.
Требования, допущения и рекомендации
- Нужен DD‑WRT с opkg (Opkg‑enabled DD‑WRT) и поддержкой установки knockd.
- Предполагается, что вы уже применили шаги из руководства «How To Knock Into Your Network (DD‑WRT)» (настройка knockd и базовая проверка).
- Базовые сетевые знания и понимание iptables обязательны.
- Рекомендуется: короткие таймауты последовательности и cmd_timeout, ведение логов для событий knock, использование защищённых паролей и MFA для аккаунтов VPN.
Приступим.
Базовое правило «Блокировать новые VPN» на DD‑WRT
Мы добавим правило iptables в скрипт «Firewall» через веб‑интерфейс DD‑WRT, чтобы правило применялось при каждой перезагрузке/обновлении файрвола.
Из Web‑GUI DD‑WRT:
- Перейдите в “Administration” -> “Commands”.

- Вставьте в текстовое поле следующий фрагмент:
inline="$( iptables -L INPUT -n | grep -n "state RELATED,ESTABLISHED" | awk -F : {'print $1'} )"; inline=$(($inline-2+1)); iptables -I INPUT "$inline" -p tcp --dport 1723 -j DROP- Нажмите “Save Firewall”.
- Готово — по умолчанию новые подключения к порту 1723 будут DROP.
Важно: этот фрагмент ориентирован на расположение правил в конкретной версии DD‑WRT, поэтому тестирование обязательно.
Что делает эта команда
Коротко:
- Ищет номер строки в выводе iptables -L INPUT, где указано правило, разрешающее уже установленные и связанные соединения (state RELATED,ESTABLISHED).
- Вычисляет позицию, сразу после этой строки, с учётом смещения из‑за заголовков вывода iptables, и вставляет новое правило именно туда.
- Добавленное правило делает iptables -I INPUT <позиция> -p tcp –dport 1723 -j DROP — то есть блокирует новые соединения к 1723, но пропускает уже существующие сессии.
Почему так: при вставке правила выше правила, разрешающего ESTABLISHED, вы рискуете разорвать уже живые VPN‑сессии. Поэтому мы вставляем DROP сразу после правила, разрешающего ESTABLISHED.
Конфигурация knockd
На маршрутизаторе (или на сервере с knockd) отредактируйте файл /opt/etc/knockd.conf:
vi /opt/etc/knockd.confДобавьте блок (пример для PPTP/TCP 1723):
[enable-VPN]
sequence = 02,02,02,01,01,01,2010,2010,2010
seq_timeout = 60
start_command = iptables -I INPUT 1 -s %IP% -p tcp --dport 1723 -j ACCEPT
cmd_timeout = 20
stop_command = iptables -D INPUT -s %IP% -p tcp --dport 1723 -j ACCEPTПояснения:
- seq_timeout = 60 — окно на выполнение всей последовательности (секунды). Чем короче, тем лучше для безопасности.
- Последовательность: три стука на порт 2, три на порт 1 и три на 2010 — порядок намеренно хитрый, чтобы запутать сканеры.
- start_command вставляет правило ACCEPT в начало цепочки INPUT для исходного IP (%IP% заменяется knockd автоматом на IP, с которого пришли стуки).
- cmd_timeout = 20 — через 20 секунд будет выполнена stop_command, удаляющая правило, тем самым закрывая доступ.
- Уже установленные соединения продолжат работать, так как правило DROP было вставлено ниже ESTABLISHED.
Настройка для OpenVPN (пример, UDP 1194): замените port/protocol и DROP‑правило:
# Пример для OpenVPN (UDP 1194)
start_command = iptables -I INPUT 1 -s %IP% -p udp --dport 1194 -j ACCEPT
stop_command = iptables -D INPUT -s %IP% -p udp --dport 1194 -j ACCEPTЕсли ваш VPN использует отдельный сервер (не на маршрутизаторе), вы можете запустить knockd на нём. Тогда команды будут модифицироваться без учёта DD‑WRT‑специфики.
Советы автора
- Отладка: если что‑то не работает, сначала проверьте логи knockd и вывод iptables -L -n –line‑numbers. Это даст ясность, где правило вставилось и живёт ли оно.
- Множественные команды: в start_command/stop_command можно выполнить несколько команд через “;” или вызвать скрипт (рекомендуется). Так вы сможете логировать, отправлять уведомления по e‑mail или вести учёт сессий.
- Мобильные клиенты: существуют приложения (например, Android knocker), которые отправляют последовательность портов с телефона. Это удобно для мгновенного доступа.
- Метод применим для любой TCP/UDP‑службы — RDP (3389), SSH (22), HTTP(S) и др. — но учитывайте, что для некоторых сервисов SPA (single‑packet authorization) более надёжен.
Важно: чтобы отправлять e‑mail прямо с роутера, может потребоваться настроить внешние утилиты (ssmtp, sendmail и т. п.) и убедиться в доступности репозиториев пакетов.
Тестирование и отладка
Шаги проверки:
- Убедитесь, что при отсутствии «стуков» порт 1723 не отвечает: nc -zv
1723 (ожидается timeout/connection refused). - Сымитируйте последовательность с клиента (используя клиент‑knocker или сценарий через nmap): дождитесь, пока knockd установит правило.
- Проверьте iptables: iptables -L INPUT -n –line‑numbers — должно быть правило ACCEPT от вашего IP.
- Попробуйте подключиться по VPN. Подключение должно пройти, и при успехе сессия останется живой, даже если stop_command удалит ACCEPT‑правило.
- Проверьте удаление правила через время cmd_timeout.
Частые проблемы и решения:
- NAT и прокси: если клиент находится за NAT, knockd увидит публичный IP шлюза, а не внутренний адрес устройства. В этом случае последовательность нужно выполнять снаружи, или настраивать дополнительную маршрутизацию/проброс.
- Несовпадение протокола: если вы случайно используете UDP в knock, а правило DROP/ACCEPT ожидает TCP — открытие не сработает.
- Последовательность короткая/слишком простая: повышайте сложность и длину последовательности, но держите разумный баланс удобства.
Альтернативы и пределы метода
Когда port knocking не подходит:
- Replay‑атаки и запись последовательности: если последовательность статична и передаётся в открытом виде, злоумышленник может её записать и воспроизвести.
- Те, кто контролирует трафик между клиентом и роутером (ISP, корпоративный NAT), могут препятствовать отправке специфических портов.
- Мобильные сети/Carrier NAT иногда мешают корректной работе knock — пакеты могут меняться или отбрасываться.
Альтернативы:
- SPA (Single Packet Authorization), например fwknop: защищает от записи последовательности, использует криптографию и один зашифрованный пакет.
- VPN с двухфакторной аутентификацией (пароль + OTP) — общий более надёжный подход.
- Ограничение доступа по IP‑белому списку (если клиенты имеют стабильные IP).
Контрольный чеклист администратора
Для оперативного развертывания и поддержки:
- Установлен и работает knockd на маршрутизаторе или VPN‑сервере.
- Сохранён скрипт в “Save Firewall” DD‑WRT и протестирован при перезагрузке.
- Настроены короткие seq_timeout и cmd_timeout (рекомендуется 20–60 с).
- Логи knockd собираются и ротируются (важно для инцидентов).
- Документирована последовательность и процедура восстановления/отката.
- Рассмотрены альтернативы SPA и двухфакторная аутентификация.
Критерии приёмки
- При отсутствии «стуков» порт VPN недоступен извне.
- После выполнения последовательности, правило ACCEPT появляется только для IP, совершившего стуки.
- ACCEPT удаляется по таймауту, при этом существующие VPN‑сессии остаются работоспособными.
- Система корректно восстанавливает правило после перезагрузки маршрутизатора.
Безопасность и приватность
- Логируйте события knock аккуратно: записи содержат IP‑адреса, которые являются персональными данными в контексте GDPR. Храните логи минимально необходимое время, применяйте псевдонимизацию/удаление, если журналы не нужны для расследований.
- Port knocking прибавляет слой «безопасности через скрытие», но не шифрование — всегда используйте защищённые VPN‑протоколы и сильные учётные данные.
Короткий глоссарий
- Knockd: демон, который отслеживает сетевые «стуки» (пакеты на определённых портах) и выполняет команды при совпадении последовательности.
- Port Knocking: механизм скрытия сервиса, когда доступ открывается только после корректной последовательности запросов к портам.
- SPA: Single Packet Authorization — современная альтернатива с криптографической защитой.
Примеры конфигураций и сниппеты (шпаргалка)
- Блокировать новые TCP‑подключения к порту 1723 (ручная вставка):
iptables -I INPUT 5 -p tcp --dport 1723 -j DROP(где 5 — позиция; лучше автоматизировать как в примере выше)
- Открыть для конкретного IP (одна команда):
iptables -I INPUT 1 -s 198.51.100.23 -p tcp --dport 1723 -j ACCEPT- Удалить правило:
iptables -D INPUT -s 198.51.100.23 -p tcp --dport 1723 -j ACCEPT- Пример секции для OpenVPN (UDP 1194) в knockd.conf:
[enable-openvpn]
sequence = 1000,1001,1002
seq_timeout = 30
start_command = /usr/sbin/iptables -I INPUT 1 -s %IP% -p udp --dport 1194 -j ACCEPT
cmd_timeout = 60
stop_command = /usr/sbin/iptables -D INPUT -s %IP% -p udp --dport 1194 -j ACCEPTКогда это сработает плохо — галерея краёвых случаев
- Клиент в мобильной сети с изменяющимся публичным IP: правило может открыться для другого устройства оператора.
- Отключение knockd или неправильная запись firewall скрипта: сервис станет недоступен даже для легитимных клиентов.
- Атаки replay: при отсутствии криптографической защиты последовательности, её можно переиграть.
План действий при инциденте (быстрая инструкция)
- Если замечены подозрительные «стуки» — немедленно увеличьте логирование и проверьте, какие IP инициировали открытие.
- При подозрении на компрометацию VPN‑учётной записи — сбросьте пароли и откатите сессии (удалите соответствующие правилa в iptables и перезапустите службу VPN).
- Если правило DROP было удалено/повреждено — восстановите firewall‑скрипт и перезапустите файрвол.
Итог
Port knocking на DD‑WRT позволяет скрыть VPN‑порт и уменьшить объём автоматизированных атак, оставляя уже установленные сессии нетронутыми. Это эффективный инструмент в арсенале администратора, но не единственная и не окончательная мера безопасности: комбинируйте его с сильной аутентификацией, шифрованием и, при возможности, SPA.
Кто потревожил мой сон?
Похожие материалы
Клонирование USB в Windows 10 — как создать и записать образ
AirPlay на Mac: приём и трансляция
Установка и удаление Google Chrome — полное руководство
Экранная блокировка Nintendo Switch: включение и советы
Сумма в Excel: быстрые способы и подсказки