Port Knocking на MikroTik — скрытый доступ
Port Knocking на MikroTik — скрытый доступ к WinBox и SSH
Port Knocking — техника защиты сетевых сервисов, при которой порт остаётся закрытым до тех пор, пока клиент не «постучит» в определённую последовательность портов. После правильной последовательности knock firewall открывает доступ к целевому сервису (WinBox, SSH, VPN) на ограниченное время. Сканеры портов видят закрытые порты — сервисы «невидимы» извне. Port Knocking не заменяет аутентификацию и шифрование, но добавляет дополнительный уровень защиты (security through obscurity + firewall rules). В RouterOS Port Knocking реализуется через цепочку address-list в firewall filter без дополнительных пакетов или скриптов. В этом руководстве настроим Port Knocking для WinBox и SSH, рассмотрим продвинутые схемы и сравним с VPN.
Описание
Зачем нужен Port Knocking
Любой сервис с открытым портом на WAN — потенциальная цель для атак:
| Угроза | Описание |
|---|---|
| Brute force | Перебор паролей к SSH, WinBox, VPN |
| Exploit | Эксплуатация уязвимостей в сервисе (CVE) |
| DDoS | Flood-атака на открытый порт |
| Enumeration | Сканер определяет ОС и версию по ответу порта |
| Zero-day | Неизвестная уязвимость — открытый порт = точка входа |
Port Knocking устраняет все эти угрозы: закрытый порт не отвечает на сканирование, brute force невозможен, exploit не может подключиться.
Как работает Port Knocking
Принцип: клиент отправляет TCP SYN (или UDP) пакеты на заранее определённую последовательность портов. Firewall отслеживает эту последовательность через address-list и открывает целевой порт после правильной серии knock.
codeСхема: knock 1234 → 5678 → 9012 → WinBox (8291) открывается на 30 минут Шаг 1: Клиент → SYN на порт 1234 Firewall: src-IP добавлен в address-list "knock-stage1" (timeout 15s) Шаг 2: Клиент → SYN на порт 5678 (в течение 15 секунд) Firewall: src-IP в "knock-stage1"? Да → добавлен в "knock-stage2" (timeout 15s) Шаг 3: Клиент → SYN на порт 9012 (в течение 15 секунд) Firewall: src-IP в "knock-stage2"? Да → добавлен в "knock-granted" (timeout 30m) Шаг 4: Клиент → подключение к WinBox 8291 Firewall: src-IP в "knock-granted"? Да → ACCEPT Через 30 минут: address-list "knock-granted" очищается → порт снова закрыт
Терминология
| Термин | Описание |
|---|---|
| Knock sequence | Последовательность портов для «стука» (секрет) |
| Stage | Этап — address-list, фиксирующий прохождение шага |
| Timeout | Время жизни записи в address-list (между knock и после открытия) |
| Granted | Финальный address-list — доступ открыт |
| Single Packet Authorization (SPA) | Продвинутая альтернатива: один зашифрованный пакет вместо sequence |
Port Knocking vs VPN vs IP Whitelist
| Критерий | Port Knocking | VPN (WireGuard) | IP Whitelist |
|---|---|---|---|
| Защита от сканирования | Да (порт закрыт) | Да (UDP, нет ответа без handshake) | Нет (порт открыт для whitelisted IP) |
| Защита от brute force | Да | Да | Частично |
| Работает с динамическим IP | Да | Да | Нет (нужно обновлять список) |
| Шифрование | Нет | Да | Нет |
| Сложность клиента | Низкая (nmap, скрипт) | Средняя (WireGuard клиент) | Нет |
| Дополнительная нагрузка | Минимальная | Шифрование (CPU) | Нет |
| Надёжность | Средняя (sequence может быть перехвачена) | Высокая | Высокая (для статических IP) |
| Удобство | Среднее (нужен knock-скрипт) | Высокое (подключился и работаешь) | Высокое (ничего не нужно) |
Рекомендация: Port Knocking — хорошее решение для доступа к WinBox/SSH, когда VPN избыточен, а IP непостоянный. Для постоянного удалённого доступа к сети лучше использовать VPN.
Настройка
Шаг 1: Планирование knock-последовательности
Выбираем параметры.
| Параметр | Значение | Рекомендация |
|---|---|---|
| Количество knock | 3 | Минимум 3, оптимально 4 |
| Порты | 1234, 5678, 9012 | Используйте случайные порты >1024, не из известных |
| Протокол | TCP | TCP SYN надёжнее; UDP может теряться |
| Timeout между knock | 15 секунд | 10–30 секунд; короче = безопаснее, но труднее вручную |
| Timeout доступа | 30 минут | 15–60 минут в зависимости от задачи |
| Целевые порты | 8291 (WinBox), 22 (SSH) | Порты, которые нужно защитить |
Важно: запишите knock-последовательность в безопасном месте (менеджер паролей). Если забудете — не сможете подключиться удалённо.
Шаг 2: Базовые firewall-правила (блокировка всего входящего)
Сначала убедимся, что входящий трафик на WAN заблокирован по умолчанию.
[admin@MikroTik] ># Разрешаем established и related /ip/firewall/filter add chain=input \ connection-state=established,related \ action=accept \ comment="Accept established/related" # Разрешаем ICMP (ping) — опционально /ip/firewall/filter add chain=input \ protocol=icmp \ action=accept \ comment="Accept ICMP" # Разрешаем доступ из LAN /ip/firewall/filter add chain=input \ in-interface=bridge-lan \ action=accept \ comment="Accept from LAN" # Drop invalid /ip/firewall/filter add chain=input \ connection-state=invalid \ action=drop \ comment="Drop invalid"
Правила для Port Knocking будут добавлены между LAN-правилом и финальным drop.
Шаг 3: Port Knocking — правила firewall (3 knock)
Создаём цепочку из правил, каждое из которых проверяет текущий stage и переводит на следующий.
[admin@MikroTik] ># === Port Knocking: 1234 → 5678 → 9012 → открыть WinBox + SSH === # Stage 1: первый knock на порт 1234 /ip/firewall/filter add chain=input \ protocol=tcp dst-port=1234 \ action=add-src-to-address-list \ address-list=knock-stage1 \ address-list-timeout=15s \ comment="Port Knock: Stage 1 (port 1234)" # Stage 2: второй knock на порт 5678 (только если прошёл Stage 1) /ip/firewall/filter add chain=input \ protocol=tcp dst-port=5678 \ src-address-list=knock-stage1 \ action=add-src-to-address-list \ address-list=knock-stage2 \ address-list-timeout=15s \ comment="Port Knock: Stage 2 (port 5678)" # Stage 3: третий knock на порт 9012 (только если прошёл Stage 2) /ip/firewall/filter add chain=input \ protocol=tcp dst-port=9012 \ src-address-list=knock-stage2 \ action=add-src-to-address-list \ address-list=knock-granted \ address-list-timeout=30m \ comment="Port Knock: Stage 3 - GRANTED (port 9012)" # Разрешаем доступ к WinBox и SSH для "knock-granted" /ip/firewall/filter add chain=input \ protocol=tcp dst-port=8291 \ src-address-list=knock-granted \ action=accept \ comment="Port Knock: Allow WinBox after knock" /ip/firewall/filter add chain=input \ protocol=tcp dst-port=22 \ src-address-list=knock-granted \ action=accept \ comment="Port Knock: Allow SSH after knock" # Финальное правило — drop всего остального на WAN /ip/firewall/filter add chain=input \ in-interface=ether1-wan \ action=drop \ comment="Drop all other input from WAN"
Шаг 4: Очистка промежуточных address-list
Добавим правила для очистки промежуточных stages, чтобы неправильный knock сбрасывал прогресс.
[admin@MikroTik] ># Если клиент стучит на неправильный порт после Stage 1 — сбрасываем /ip/firewall/filter add chain=input \ protocol=tcp \ src-address-list=knock-stage1 \ dst-port=!5678 \ action=add-src-to-address-list \ address-list=knock-stage1 \ address-list-timeout=0s \ comment="Port Knock: Reset Stage 1 on wrong port" \ place-before=[find where comment="Port Knock: Stage 2 (port 5678)"] # Если клиент стучит на неправильный порт после Stage 2 — сбрасываем /ip/firewall/filter add chain=input \ protocol=tcp \ src-address-list=knock-stage2 \ dst-port=!9012 \ action=add-src-to-address-list \ address-list=knock-stage2 \ address-list-timeout=0s \ comment="Port Knock: Reset Stage 2 on wrong port" \ place-before=[find where comment="Port Knock: Stage 3 - GRANTED (port 9012)"]
Примечание: правила reset добавляют запись с timeout=0s, что фактически удаляет IP из address-list. Это предотвращает brute force knock-последовательности.
Шаг 5: Продвинутая схема — 4 knock с TCP+UDP
Для большей безопасности используем 4 knock с комбинацией TCP и UDP.
[admin@MikroTik] ># === Продвинутый Port Knocking: TCP:7331 → UDP:8442 → TCP:6119 → UDP:9753 === # Stage 1: TCP knock /ip/firewall/filter add chain=input \ protocol=tcp dst-port=7331 \ action=add-src-to-address-list \ address-list=adv-knock-s1 \ address-list-timeout=10s \ comment="Advanced Knock: S1 TCP:7331" # Stage 2: UDP knock /ip/firewall/filter add chain=input \ protocol=udp dst-port=8442 \ src-address-list=adv-knock-s1 \ action=add-src-to-address-list \ address-list=adv-knock-s2 \ address-list-timeout=10s \ comment="Advanced Knock: S2 UDP:8442" # Stage 3: TCP knock /ip/firewall/filter add chain=input \ protocol=tcp dst-port=6119 \ src-address-list=adv-knock-s2 \ action=add-src-to-address-list \ address-list=adv-knock-s3 \ address-list-timeout=10s \ comment="Advanced Knock: S3 TCP:6119" # Stage 4: UDP knock — GRANTED /ip/firewall/filter add chain=input \ protocol=udp dst-port=9753 \ src-address-list=adv-knock-s3 \ action=add-src-to-address-list \ address-list=adv-knock-granted \ address-list-timeout=30m \ comment="Advanced Knock: S4 UDP:9753 - GRANTED" # Разрешаем доступ /ip/firewall/filter add chain=input \ protocol=tcp dst-port=8291,22 \ src-address-list=adv-knock-granted \ action=accept \ comment="Advanced Knock: Allow WinBox+SSH"
Комбинация TCP+UDP значительно усложняет случайное совпадение при сканировании.
Шаг 6: Как «стучать» — клиентская сторона
Linux / macOS — через nmap:
[admin@MikroTik] ># Knock: 1234 → 5678 → 9012 nmap -Pn --host-timeout 100 --max-retries 0 -p 1234 203.0.113.1 nmap -Pn --host-timeout 100 --max-retries 0 -p 5678 203.0.113.1 nmap -Pn --host-timeout 100 --max-retries 0 -p 9012 203.0.113.1 # Теперь подключаемся к WinBox # Доступ открыт на 30 минут
Linux — через knock (пакет knockd):
[admin@MikroTik] ># Установка sudo apt install knockd # Knock knock 203.0.113.1 1234 5678 9012 # Для TCP+UDP схемы knock 203.0.113.1 7331:tcp 8442:udp 6119:tcp 9753:udp
Windows — через PowerShell:
powershell# PowerShell knock-скрипт $target = "203.0.113.1" $ports = @(1234, 5678, 9012) foreach ($port in $ports) { $tcp = New-Object System.Net.Sockets.TcpClient try { $tcp.BeginConnect($target, $port, $null, $null) | Out-Null Start-Sleep -Milliseconds 500 } catch {} finally { $tcp.Close() } } Write-Host "Knock sequence complete. WinBox should be accessible."
Android / iOS:
Приложения: Port Knocker (Android), Knock on Ports (iOS). Введите IP и последовательность портов.
Bash-скрипт для автоматизации:
[admin@MikroTik] >#!/bin/bash # knock.sh — автоматический knock + подключение WinBox TARGET="203.0.113.1" PORTS=(1234 5678 9012) DELAY=0.5 for PORT in "${PORTS[@]}"; do echo "Knocking port $PORT..." nmap -Pn --host-timeout 200 --max-retries 0 -p $PORT $TARGET > /dev/null 2>&1 sleep $DELAY done echo "Knock complete. Connecting to WinBox..." # Для Linux с WinBox через Wine: # wine /path/to/winbox64.exe $TARGET
Проверка
Проверка firewall-правил
[admin@MikroTik] ># Проверяем все правила Port Knocking /ip/firewall/filter print where comment~"Port Knock" or comment~"Knock" # Проверяем порядок правил (критически важно!) /ip/firewall/filter print chain=input
Проверка address-list после knock
[admin@MikroTik] ># До knock — списки пусты /ip/firewall/address-list print where list~"knock" # После первого knock /ip/firewall/address-list print where list=knock-stage1 # Должен появиться IP клиента с timeout ~15s # После полной последовательности /ip/firewall/address-list print where list=knock-granted # IP клиента с timeout ~30m
Мониторинг в реальном времени
[admin@MikroTik] ># Наблюдаем за address-list в реальном времени /ip/firewall/address-list print interval=1 where list~"knock" # Проверяем счётчики правил /ip/firewall/filter print stats where comment~"Knock"
Тестирование отказа — неправильная последовательность
[admin@MikroTik] ># Knock в неправильном порядке: 5678 → 1234 → 9012 # Результат: knock-granted не должен содержать IP /ip/firewall/address-list print where list=knock-granted # Пусто — правильное поведение
Проверка через torch
[admin@MikroTik] ># Мониторим входящий трафик на knock-порты /tool/torch interface=ether1-wan protocol=tcp port=1234,5678,9012 duration=30
Проверка логирования
[admin@MikroTik] ># Добавляем логирование для knock-событий /ip/firewall/filter add chain=input \ protocol=tcp dst-port=8291 \ src-address-list=knock-granted \ action=log log-prefix="KNOCK-ACCESS" \ comment="Log successful knock access" \ place-before=[find where comment="Port Knock: Allow WinBox after knock"] # Проверяем логи /log print where message~"KNOCK"
Типичные ошибки
Ошибка 1: Неправильный порядок firewall-правил
Проблема: правила Port Knocking добавлены после финального drop, или правило accept для WinBox стоит перед knock-stages.
Симптомы: knock не работает, или WinBox доступен без knock.
Решение: правила должны идти в строго определённом порядке.
[admin@MikroTik] ># Правильный порядок (chain=input): # 1. accept established/related # 2. accept from LAN # 3. drop invalid # 4. Port Knock Stage 1 (add to address-list) # 5. Port Knock Stage 2 (add to address-list) # 6. Port Knock Stage 3 (add to address-list) # 7. accept WinBox/SSH if knock-granted # 8. drop all from WAN # Проверяем порядок /ip/firewall/filter print chain=input # Перемещаем правила при необходимости /ip/firewall/filter move [find where comment~"Port Knock: Stage 1"] destination=4
Ошибка 2: Слишком короткий timeout между stages
Проблема: timeout=5s между knock-stages. При медленном интернете или ручном knock клиент не успевает пройти все stages.
Решение:
[admin@MikroTik] ># Увеличиваем timeout между stages /ip/firewall/filter set [find where comment~"Stage 1"] address-list-timeout=30s /ip/firewall/filter set [find where comment~"Stage 2"] address-list-timeout=30s # Timeout для granted оставляем разумным /ip/firewall/filter set [find where comment~"GRANTED"] address-list-timeout=30m
Рекомендуемые значения: 15–30 секунд между stages, 15–60 минут для granted.
Ошибка 3: Knock-порты совпадают с реальными сервисами
Проблема: выбранные knock-порты (например, 80, 443, 53) совпадают с реальными сервисами в интернете. Сканеры и боты постоянно обращаются к этим портам, случайно проходя первый stage.
Решение:
[admin@MikroTik] ># Используйте высокие случайные порты, не из списка well-known # ПЛОХО: 80, 443, 8080, 3389 # ХОРОШО: 47291, 52834, 61047 # Генерация случайных портов (Linux): # shuf -i 10000-65535 -n 4 # Пример: 47291 52834 61047 38192
Ошибка 4: Port Knocking не работает за NAT провайдера (CG-NAT)
Проблема: клиент находится за NAT провайдера (CG-NAT). Несколько клиентов за одним публичным IP — knock-sequence от одного клиента может «открыть дверь» для другого клиента за тем же NAT.
Решение: это фундаментальное ограничение Port Knocking. Варианты:
- Использовать VPN вместо Port Knocking для доступа из CG-NAT.
- Комбинировать Port Knocking с аутентификацией (пароль WinBox, ключ SSH).
- Укоротить timeout granted до минимума (5–10 минут).
[admin@MikroTik] ># Укороченный timeout для granted /ip/firewall/filter set [find where comment~"GRANTED"] address-list-timeout=10m
Ошибка 5: Забыли knock-последовательность — заблокировали себя
Проблема: администратор забыл knock-последовательность и не может подключиться к роутеру удалённо.
Решение: профилактика важнее лечения.
- Сохраните knock-sequence в менеджере паролей (KeePass, Bitwarden).
- Оставьте доступ из LAN (правило accept in-interface=bridge-lan).
- Создайте резервный IP в knock-granted с большим timeout.
[admin@MikroTik] ># Аварийный IP — всегда имеет доступ (ваш резервный канал) /ip/firewall/address-list add list=knock-granted address=198.51.100.50 \ comment="Emergency access - backup ISP" timeout=0s # timeout=0s означает запись без истечения — будет удалена только вручную
- Если заблокировали себя — подключитесь через LAN, консольный порт (serial), или MikroTik Neighbor Discovery (MAC WinBox).
Ошибка 6: Port Knocking мешает работе FastTrack
Проблема: правила add-src-to-address-list в chain=input не влияют на FastTrack напрямую, но если вы случайно добавили правила в chain=forward, FastTrack перестаёт работать для этих пакетов.
Решение: Port Knocking должен быть только в chain=input (трафик к самому роутеру). Для forward-трафика используйте другие методы.
[admin@MikroTik] ># Проверяем, что все knock-правила в chain=input /ip/firewall/filter print where comment~"Knock" and chain!=input # Если есть правила в forward — переносим в input
Ошибка 7: Перехват knock-последовательности (снифинг)
Проблема: если злоумышленник перехватывает трафик (MITM, прослушка на промежуточном роутере), он может увидеть knock-последовательность и воспроизвести её.
Решение: Port Knocking — это security through obscurity, а не полноценная защита. Меры снижения риска:
- Регулярно меняйте knock-последовательность.
- Используйте 4–5 knock с TCP+UDP для увеличения сложности.
- Короткие timeout между stages (10 секунд).
- Мониторинг — логируйте все попытки knock.
[admin@MikroTik] ># Логирование всех успешных knock /system/logging add topics=firewall action=memory # Периодическая проверка логов /log print where message~"knock"
Для критически важных систем рекомендуется использовать VPN (WireGuard, IPsec IKEv2) вместо Port Knocking.
Итоговая конфигурация
[admin@MikroTik] ># === Port Knocking — полная настройка === # Sequence: TCP:1234 → TCP:5678 → TCP:9012 # Opens: WinBox (8291) + SSH (22) for 30 minutes # Базовый firewall /ip/firewall/filter add chain=input connection-state=established,related action=accept \ comment="Accept established/related" /ip/firewall/filter add chain=input protocol=icmp action=accept comment="Accept ICMP" /ip/firewall/filter add chain=input in-interface=bridge-lan action=accept \ comment="Accept from LAN" /ip/firewall/filter add chain=input connection-state=invalid action=drop \ comment="Drop invalid" # Port Knocking stages /ip/firewall/filter add chain=input protocol=tcp dst-port=1234 \ action=add-src-to-address-list address-list=knock-stage1 address-list-timeout=15s \ comment="Port Knock: Stage 1 (port 1234)" /ip/firewall/filter add chain=input protocol=tcp dst-port=5678 \ src-address-list=knock-stage1 \ action=add-src-to-address-list address-list=knock-stage2 address-list-timeout=15s \ comment="Port Knock: Stage 2 (port 5678)" /ip/firewall/filter add chain=input protocol=tcp dst-port=9012 \ src-address-list=knock-stage2 \ action=add-src-to-address-list address-list=knock-granted address-list-timeout=30m \ comment="Port Knock: Stage 3 - GRANTED (port 9012)" # Access rules /ip/firewall/filter add chain=input protocol=tcp dst-port=8291 \ src-address-list=knock-granted action=accept \ comment="Port Knock: Allow WinBox" /ip/firewall/filter add chain=input protocol=tcp dst-port=22 \ src-address-list=knock-granted action=accept \ comment="Port Knock: Allow SSH" # Final drop /ip/firewall/filter add chain=input in-interface=ether1-wan action=drop \ comment="Drop all other input from WAN"
Схема: knock 1234 → 5678 → 9012 → WinBox (8291) открывается на 30 минут
Шаг 1: Клиент → SYN на порт 1234
Firewall: src-IP добавлен в address-list "knock-stage1" (timeout 15s)
Шаг 2: Клиент → SYN на порт 5678 (в течение 15 секунд)
Firewall: src-IP в "knock-stage1"? Да → добавлен в "knock-stage2" (timeout 15s)
Шаг 3: Клиент → SYN на порт 9012 (в течение 15 секунд)
Firewall: src-IP в "knock-stage2"? Да → добавлен в "knock-granted" (timeout 30m)
Шаг 4: Клиент → подключение к WinBox 8291
Firewall: src-IP в "knock-granted"? Да → ACCEPT
Через 30 минут: address-list "knock-granted" очищается → порт снова закрыт
# Разрешаем established и related
/ip/firewall/filter add chain=input \
connection-state=established,related \
action=accept \
comment="Accept established/related"
# Разрешаем ICMP (ping) — опционально
/ip/firewall/filter add chain=input \
protocol=icmp \
action=accept \
comment="Accept ICMP"
# Разрешаем доступ из LAN
/ip/firewall/filter add chain=input \
in-interface=bridge-lan \
action=accept \
comment="Accept from LAN"
# Drop invalid
/ip/firewall/filter add chain=input \
connection-state=invalid \
action=drop \
comment="Drop invalid"
# === Port Knocking: 1234 → 5678 → 9012 → открыть WinBox + SSH ===
# Stage 1: первый knock на порт 1234
/ip/firewall/filter add chain=input \
protocol=tcp dst-port=1234 \
action=add-src-to-address-list \
address-list=knock-stage1 \
address-list-timeout=15s \
comment="Port Knock: Stage 1 (port 1234)"
# Stage 2: второй knock на порт 5678 (только если прошёл Stage 1)
/ip/firewall/filter add chain=input \
protocol=tcp dst-port=5678 \
src-address-list=knock-stage1 \
action=add-src-to-address-list \
address-list=knock-stage2 \
address-list-timeout=15s \
comment="Port Knock: Stage 2 (port 5678)"
# Stage 3: третий knock на порт 9012 (только если прошёл Stage 2)
/ip/firewall/filter add chain=input \
protocol=tcp dst-port=9012 \
src-address-list=knock-stage2 \
action=add-src-to-address-list \
address-list=knock-granted \
address-list-timeout=30m \
comment="Port Knock: Stage 3 - GRANTED (port 9012)"
# Разрешаем доступ к WinBox и SSH для "knock-granted"
/ip/firewall/filter add chain=input \
protocol=tcp dst-port=8291 \
src-address-list=knock-granted \
action=accept \
comment="Port Knock: Allow WinBox after knock"
/ip/firewall/filter add chain=input \
protocol=tcp dst-port=22 \
src-address-list=knock-granted \
action=accept \
comment="Port Knock: Allow SSH after knock"
# Финальное правило — drop всего остального на WAN
/ip/firewall/filter add chain=input \
in-interface=ether1-wan \
action=drop \
comment="Drop all other input from WAN"
# Если клиент стучит на неправильный порт после Stage 1 — сбрасываем
/ip/firewall/filter add chain=input \
protocol=tcp \
src-address-list=knock-stage1 \
dst-port=!5678 \
action=add-src-to-address-list \
address-list=knock-stage1 \
address-list-timeout=0s \
comment="Port Knock: Reset Stage 1 on wrong port" \
place-before=[find where comment="Port Knock: Stage 2 (port 5678)"]
# Если клиент стучит на неправильный порт после Stage 2 — сбрасываем
/ip/firewall/filter add chain=input \
protocol=tcp \
src-address-list=knock-stage2 \
dst-port=!9012 \
action=add-src-to-address-list \
address-list=knock-stage2 \
address-list-timeout=0s \
comment="Port Knock: Reset Stage 2 on wrong port" \
place-before=[find where comment="Port Knock: Stage 3 - GRANTED (port 9012)"]
# === Продвинутый Port Knocking: TCP:7331 → UDP:8442 → TCP:6119 → UDP:9753 ===
# Stage 1: TCP knock
/ip/firewall/filter add chain=input \
protocol=tcp dst-port=7331 \
action=add-src-to-address-list \
address-list=adv-knock-s1 \
address-list-timeout=10s \
comment="Advanced Knock: S1 TCP:7331"
# Stage 2: UDP knock
/ip/firewall/filter add chain=input \
protocol=udp dst-port=8442 \
src-address-list=adv-knock-s1 \
action=add-src-to-address-list \
address-list=adv-knock-s2 \
address-list-timeout=10s \
comment="Advanced Knock: S2 UDP:8442"
# Stage 3: TCP knock
/ip/firewall/filter add chain=input \
protocol=tcp dst-port=6119 \
src-address-list=adv-knock-s2 \
action=add-src-to-address-list \
address-list=adv-knock-s3 \
address-list-timeout=10s \
comment="Advanced Knock: S3 TCP:6119"
# Stage 4: UDP knock — GRANTED
/ip/firewall/filter add chain=input \
protocol=udp dst-port=9753 \
src-address-list=adv-knock-s3 \
action=add-src-to-address-list \
address-list=adv-knock-granted \
address-list-timeout=30m \
comment="Advanced Knock: S4 UDP:9753 - GRANTED"
# Разрешаем доступ
/ip/firewall/filter add chain=input \
protocol=tcp dst-port=8291,22 \
src-address-list=adv-knock-granted \
action=accept \
comment="Advanced Knock: Allow WinBox+SSH"
# Knock: 1234 → 5678 → 9012
nmap -Pn --host-timeout 100 --max-retries 0 -p 1234 203.0.113.1
nmap -Pn --host-timeout 100 --max-retries 0 -p 5678 203.0.113.1
nmap -Pn --host-timeout 100 --max-retries 0 -p 9012 203.0.113.1
# Теперь подключаемся к WinBox
# Доступ открыт на 30 минут
# Установка
sudo apt install knockd
# Knock
knock 203.0.113.1 1234 5678 9012
# Для TCP+UDP схемы
knock 203.0.113.1 7331:tcp 8442:udp 6119:tcp 9753:udp
**Android / iOS:**
Приложения: Port Knocker (Android), Knock on Ports (iOS). Введите IP и последовательность портов.
**Bash-скрипт для автоматизации:**
### Проверка
#### Проверка firewall-правил
#### Проверка address-list после knock
#### Мониторинг в реальном времени
#### Тестирование отказа — неправильная последовательность
#### Проверка через torch
#### Проверка логирования
### Типичные ошибки
#### Ошибка 1: Неправильный порядок firewall-правил
**Проблема**: правила Port Knocking добавлены после финального drop, или правило accept для WinBox стоит перед knock-stages.
**Симптомы**: knock не работает, или WinBox доступен без knock.
**Решение**: правила должны идти в строго определённом порядке.
#### Ошибка 2: Слишком короткий timeout между stages
**Проблема**: timeout=5s между knock-stages. При медленном интернете или ручном knock клиент не успевает пройти все stages.
**Решение**:
Рекомендуемые значения: 15–30 секунд между stages, 15–60 минут для granted.
#### Ошибка 3: Knock-порты совпадают с реальными сервисами
**Проблема**: выбранные knock-порты (например, 80, 443, 53) совпадают с реальными сервисами в интернете. Сканеры и боты постоянно обращаются к этим портам, случайно проходя первый stage.
**Решение**:
#### Ошибка 4: Port Knocking не работает за NAT провайдера (CG-NAT)
**Проблема**: клиент находится за NAT провайдера (CG-NAT). Несколько клиентов за одним публичным IP — knock-sequence от одного клиента может «открыть дверь» для другого клиента за тем же NAT.
**Решение**: это фундаментальное ограничение Port Knocking. Варианты:
1. **Использовать VPN** вместо Port Knocking для доступа из CG-NAT.
2. **Комбинировать** Port Knocking с аутентификацией (пароль WinBox, ключ SSH).
3. **Укоротить timeout** granted до минимума (5–10 минут).
#### Ошибка 5: Забыли knock-последовательность — заблокировали себя
**Проблема**: администратор забыл knock-последовательность и не может подключиться к роутеру удалённо.
**Решение**: профилактика важнее лечения.
1. **Сохраните knock-sequence** в менеджере паролей (KeePass, Bitwarden).
2. **Оставьте доступ из LAN** (правило accept in-interface=bridge-lan).
3. **Создайте резервный IP в knock-granted** с большим timeout.
4. **Если заблокировали себя** — подключитесь через LAN, консольный порт (serial), или MikroTik Neighbor Discovery (MAC WinBox).
#### Ошибка 6: Port Knocking мешает работе FastTrack
**Проблема**: правила add-src-to-address-list в chain=input не влияют на FastTrack напрямую, но если вы случайно добавили правила в chain=forward, FastTrack перестаёт работать для этих пакетов.
**Решение**: Port Knocking должен быть только в chain=input (трафик к самому роутеру). Для forward-трафика используйте другие методы.
#### Ошибка 7: Перехват knock-последовательности (снифинг)
**Проблема**: если злоумышленник перехватывает трафик (MITM, прослушка на промежуточном роутере), он может увидеть knock-последовательность и воспроизвести её.
**Решение**: Port Knocking — это security through obscurity, а не полноценная защита. Меры снижения риска:
1. **Регулярно меняйте** knock-последовательность.
2. **Используйте 4–5 knock** с TCP+UDP для увеличения сложности.
3. **Короткие timeout** между stages (10 секунд).
4. **Мониторинг** — логируйте все попытки knock.
Для критически важных систем рекомендуется использовать VPN (WireGuard, IPsec IKEv2) вместо Port Knocking.
### Итоговая конфигурация