Главная Кейсы Блог Связаться
Все статьи
2026-05-28 ⏱ 7 мин
MikroTikVPNБезопасностьFirewall

Port Knocking на MikroTik: скрываем VPN от сканеров и брутфорса

Как сделать так чтобы VPN-порт был невидим для сканеров и ботов, но открывался по секретной последовательности. Реальный конфиг из продакшна.

Проблема

Если у вас есть VPN-сервер с открытым портом наружу — боты найдут его в течение нескольких минут. Логи будут завалены попытками подбора паролей, нагрузка на роутер вырастет, а риск взлома станет реальным.

Я видел это на десятках объектов: открытый 1194/UDP или 500/UDP — и тысячи попыток в сутки.

Что такое Port Knocking

Port Knocking — механизм скрытия порта. Суть простая:

  • Порт закрыт для всех по умолчанию
  • Клиент отправляет секретную последовательность запросов на другие порты
  • Роутер «узнаёт» последовательность и временно открывает нужный порт для этого IP
  • Через 30 секунд — снова закрыт

Для сканеров и ботов порт просто не существует.

Реальный конфиг для MikroTik

Трёхэтапный стук: порты 7000 → 8000 → 9000, после чего открывается VPN на 1194/UDP на 30 секунд.

Создаём address-list для отслеживания

bash
# Первый стук — порт 7000
/ip firewall filter add chain=input protocol=tcp dst-port=7000 \
  action=add-src-to-address-list \
  address-list=knock_stage1 \
  address-list-timeout=10s \
  comment="Port Knock - Stage 1"

# Второй стук — порт 8000
/ip firewall filter add chain=input protocol=tcp dst-port=8000 \
  src-address-list=knock_stage1 \
  action=add-src-to-address-list \
  address-list=knock_stage2 \
  address-list-timeout=10s \
  comment="Port Knock - Stage 2"

# Третий стук — порт 9000
/ip firewall filter add chain=input protocol=tcp dst-port=9000 \
  src-address-list=knock_stage2 \
  action=add-src-to-address-list \
  address-list=knock_allowed \
  address-list-timeout=30s \
  comment="Port Knock - Stage 3 → Allowed"

Разрешаем VPN для «достучавшихся»

bash
/ip firewall filter add chain=input protocol=udp dst-port=1194 \
  src-address-list=knock_allowed \
  action=accept \
  comment="VPN - Port Knock Allowed"

/ip firewall filter add chain=input protocol=udp dst-port=1194 \
  action=drop \
  comment="VPN - Block All Others"
Важно: правила должны стоять до общего drop-правила в цепочке input.

Скрипт для клиента (Linux/Mac)

bash
#!/bin/bash
HOST="ваш.ip.адрес"
nmap -Pn --host-timeout 100 --max-retries 0 -p 7000 $HOST
nmap -Pn --host-timeout 100 --max-retries 0 -p 8000 $HOST
nmap -Pn --host-timeout 100 --max-retries 0 -p 9000 $HOST
sleep 1
echo "Готово — подключайтесь к VPN"

Результат

На одном из объектов до внедрения в логах было 400–600 попыток подключения к VPN в сутки. После — ноль. Порт стал невидимым.


Совет: меняйте порты стука на нестандартные. Не используйте 7000/8000/9000 из этой статьи — подберите свои.

Если нужна настройка под ключ — напишите мне.