mikrotik-wiki.ru
Главная
Загрузка...

Port Knocking на MikroTik — скрытый доступ

RouterOS 7.xIP12 мин130 мар. 2026 г.
TelegramVK

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)
DDoSFlood-атака на открытый порт
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 KnockingVPN (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-последовательности

Выбираем параметры.

ПараметрЗначениеРекомендация
Количество knock3Минимум 3, оптимально 4
Порты1234, 5678, 9012Используйте случайные порты >1024, не из известных
ПротоколTCPTCP SYN надёжнее; UDP может теряться
Timeout между knock15 секунд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. Варианты:

  1. Использовать VPN вместо Port Knocking для доступа из CG-NAT.
  2. Комбинировать Port Knocking с аутентификацией (пароль WinBox, ключ SSH).
  3. Укоротить timeout granted до минимума (5–10 минут).
[admin@MikroTik] >
# Укороченный timeout для granted
/ip/firewall/filter set [find where comment~"GRANTED"] address-list-timeout=10m

Ошибка 5: Забыли knock-последовательность — заблокировали себя

Проблема: администратор забыл knock-последовательность и не может подключиться к роутеру удалённо.

Решение: профилактика важнее лечения.

  1. Сохраните knock-sequence в менеджере паролей (KeePass, Bitwarden).
  2. Оставьте доступ из LAN (правило accept in-interface=bridge-lan).
  3. Создайте резервный 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 означает запись без истечения — будет удалена только вручную
  1. Если заблокировали себя — подключитесь через 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, а не полноценная защита. Меры снижения риска:

  1. Регулярно меняйте knock-последовательность.
  2. Используйте 4–5 knock с TCP+UDP для увеличения сложности.
  3. Короткие timeout между stages (10 секунд).
  4. Мониторинг — логируйте все попытки 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"
[admin@MikroTik] >
Схема: 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.

### Итоговая конфигурация
IP / Port Knocking на MikroTik — скрытый доступ