256-бит AES - тот же стандарт, что защищает банковские транзакции

0%
· 7 минут

VPN на MikroTik: VLESS через контейнер RouterOS 7 — полный гайд

Коротко: на MikroTik с RouterOS 7 рабочий путь один — протокол VLESS через функцию Container. На роутере запускается лёгкий контейнер с xray; нужна модель с архитектурой ARM/ARM64/x86 и место под образ. Это даёт маскировку трафика под обычный HTTPS и стабильность в любых сетях, и поддерживает в том числе XHTTP-конфигурации. Встроенный в RouterOS WireGuard для нашего сервиса не подойдёт, и ниже разобрано почему — это первое, что стоит прочитать, если вы рассчитывали настроить всё за 15 минут.

Не разбираешься в роутерах? Честная навигация

MikroTik — инструмент сетевых инженеров: тут нет мастеров настройки, а логика RouterOS требует понимания маршрутизации. Если ты выбираешь первый роутер под VPN для дома — посмотри сначала гайд по Keenetic или TP-Link: там всё настраивается кнопками в веб-интерфейсе. Если MikroTik уже стоит и ты с ним на «ты» — поехали. Застрянешь — поддержка Tainet поможет разобраться с твоей конфигурацией.

Что понадобится

  • Свежая стабильная ветка RouterOS 7 и пакет container из Extra packages под неё же. Версия важна: на старых сборках команда /container/envs/add принимает только name= вместо list=, и готовый набор команд отвечает expected end of command.
  • Модель на ARM, ARM64 или x86 (hAP ax2/ax3, RB5009, CCR2004 и новее, x86/CHR) и место под образ — USB-флешка, NVMe или свободный раздел. Свою архитектуру покажет /system/resource/print, поле architecture-name. На mmips и smips (hEX, hEX S, hAP lite) контейнеров нет вовсе; у hEX Refresh они есть, но принимают только образы arm32v5. Если модель не подходит, вопрос шире одной марки — как понять, подойдёт ли твой роутер разобрано в общем обзоре.
  • Ключ VLESS от сервиса. У Tainet он лежит в Telegram-боте или на этом сайте в личном кабинете; первые 7 дней — бесплатно, хватит обкатать настройку. В кабинете набор команд для MikroTik собирается готовым, с уже подставленными значениями ключа, — его остаётся вставить в терминал.

Дальше в статье - практические шаги; если нужно готовое подключение, Tainet настраивается за пару минут - через Telegram-бот или в личном кабинете на этом сайте.

Почему встроенный WireGuard не подойдёт

RouterOS 7 умеет WireGuard штатно, и файл конфигурации он даже примет. Но мы выдаём не обычный WireGuard, а AmneziaWG — тот же протокол плюс строки Jc, Jmin, Jmax, S1, S2 и H1H4 в секции [Interface]. Они меняют вид трафика, и благодаря им соединение живёт в российских сетях, где обычный WireGuard работает нестабильно.

RouterOS этих строк не знает и молча их пропускает. В результате клиент здоровается с сервером не тем способом, которого сервер ждёт, — и рукопожатие не происходит вовсе. Отличить это от «просто не работает» можно по трём признакам:

  • интерфейс в /interface/wireguard/print показывает running — он показывает так всегда, сам по себе это ничего не значит;
  • поле last-handshake у пира пустое;
  • счётчик rx стоит на нуле, tx растёт — роутер шлёт, ответа нет.

Поэтому «попробовать на пять минут» здесь нечего: работать не начнёт ни на одной модели и ни на одной версии прошивки. Официальной поддержки параметров AmneziaWG в RouterOS нет, и в планах MikroTik её тоже нет.

Рабочий путь один, и он ниже.

Настройка: VLESS через контейнер

Идея: на роутере поднимается контейнер, который держит VLESS-подключение, а RouterOS заворачивает в него трафик. Внутри образа два компонента — сам xray и hev-socks5-tunnel; второй обязателен, потому что роутер отдаёт в контейнер IP-пакеты, а xray принимает SOCKS. Голый образ xray, даже мультиархитектурный, шлюзом не станет.

Образ ниже — wiktorbgu/vless-hev-socks5-tunnel-mikrotik, собран под amd64, arm64 и 32-битный ARM. Он сторонний: не наш и не MikroTik. Тег mikro — сборка без файлов geoip.dat/geosite.dat, для моделей, где память общая с системой.

Порядок действий — пять шагов, дальше каждый расписан подробно:

  1. Включите поддержку контейнеров и подтвердите изменение на самом устройстве.
  2. Поднимите сеть для контейнера: veth, мост, адрес и NAT.
  3. Передайте контейнеру девять параметров своего ключа.
  4. Скачайте образ и запустите контейнер.
  5. Заверните в туннель нужные устройства правилом mangle.

Шаг 1. Включи поддержку контейнеров. Установи пакет container (Extra packages под свою версию), затем:

/system/device-mode/update container=yes

RouterOS попросит подтвердить изменение физически — нажатием кнопки Reset, а на x86 и CHR холодной перезагрузкой, то есть выключением и включением машины. Это защита MikroTik, без неё контейнеры не запустятся. Выключается контейнерный режим тем же способом.

Шаг 2. Сеть для контейнера.

/interface/veth/add name=veth-vless address=172.17.0.2/24 gateway=172.17.0.1
/interface/bridge/add name=containers
/interface/bridge/port/add bridge=containers interface=veth-vless
/ip/address/add address=172.17.0.1/24 interface=containers
/ip/firewall/nat/add chain=srcnat src-address=172.17.0.0/24 action=masquerade

Шаг 3. Передай контейнеру параметры своего ключа. Значения берутся из vless://-ссылки: адрес и порт — из её начала, остальное — из параметров после ?. В личном кабинете эти девять строк собираются готовыми, с уже подставленными значениями; в боте Tainet лежит сама ссылка.

/container/envs/add list=vless key=REMOTE_ADDRESS value=АДРЕС_СЕРВЕРА
/container/envs/add list=vless key=REMOTE_PORT    value=443
/container/envs/add list=vless key=ID             value=ТВОЙ_UUID
/container/envs/add list=vless key=ENCRYPTION     value=none
/container/envs/add list=vless key=FLOW           value=xtls-rprx-vision
/container/envs/add list=vless key=FINGER_PRINT   value=ЗНАЧЕНИЕ_FP
/container/envs/add list=vless key=SERVER_NAME    value=АДРЕС_СЕРВЕРА
/container/envs/add list=vless key=PUBLIC_KEY     value=ЗНАЧЕНИЕ_PBK
/container/envs/add list=vless key=SHORT_ID       value=ЗНАЧЕНИЕ_SID

Значения FINGER_PRINT, PUBLIC_KEY и SHORT_ID подставляйте свои — из ссылки или из готового набора в кабинете. Отпечаток сервис выдаёт не любой: подставив «популярный» наугад, вы получите тот, который наш же бэкенд считает приметным.

Параметр называется именно list=. В части руководств и в описании самого образа стоит name= — это старый синтаксис, и современный RouterOS отвечает на него expected end of command.

Шаг 4. Создай и запусти контейнер (root-dir — на твоём накопителе):

/container/config/set registry-url=https://registry-1.docker.io tmpdir=disk1/tmp
/container/add remote-image=wiktorbgu/vless-hev-socks5-tunnel-mikrotik:mikro \
  interface=veth-vless root-dir=disk1/containers/vless envlist=vless \
  dns=1.1.1.1,8.8.8.8 start-on-boot=yes logging=yes name=vless
/container/start vless

Две строки здесь неочевидны и обе стоят тихого отказа. registry-url задан явно, потому что по умолчанию RouterOS ходит на lscr.io, а образ лежит на Docker Hub. dns= задан явно, потому что без DNS контейнер не стартует вовсе.

Шаг 5. Заверни трафик. Простейший вариант — весь трафик через контейнер отдельной таблицей маршрутизации:

/routing/table/add name=to_vpn fib
/ip/route/add dst-address=0.0.0.0/0 gateway=172.17.0.2 routing-table=to_vpn
/ip/firewall/mangle/add chain=prerouting src-address=192.168.88.0/24 \
  dst-address=!192.168.88.0/24 \
  action=mark-routing new-routing-mark=to_vpn passthrough=yes

(Подставь свою локальную подсеть; для выборочной маршрутизации меняй условие в mangle — по адресам устройств или спискам назначения. Исключение dst-address=! обязательно: без него в туннель уедет и трафик между своими подсетями и VLAN. Отдельная таблица маршрутизации тоже не украшение — маршрут по умолчанию через контейнер в основной таблице увёл бы туда же обращение к самому серверу, и туннель замкнулся бы на себя.)

Проверка: /container/print — статус running; лог контейнера покажет установленное подключение; устройства из размеченной подсети выходят с IP сервера. Отдельно проверь DNS, игры и звонки: у потока xtls-rprx-vision UDP через туннель не гарантирован, поэтому DNS на роутере надёжнее задать статикой в /ip/dns.

Нюанс про типы конфигураций: внутри контейнера полноценный xray, поэтому он понимает и VLESS, и XHTTP-варианты из подписки Tainet — фильтровать ничего не нужно. Это отличает MikroTik-путь от роутерных решений на sing-box (как HomeProxy на OpenWRT), где XHTTP пока не поддерживается — подробности в гайде по OpenWRT.

Tainet работает с любым из путей: WireGuard-конфиг для штатного клиента, VLESS-подписка для OpenWRT — одна подписка, оба формата, плюс те же серверы на телефоне и компьютере. Подключение через Telegram-бот или в личном кабинете на этом сайте, от 8 ₽ в день.

Попробовать →

Проблемы и решения

Контейнер не стартует. Четыре классические причины: не подтверждён device-mode (повтори шаг 1 и подтверди кнопкой или холодной перезагрузкой), не задан DNS (dns= в /container/add или записи в /ip/dns), не хватает места (проверь накопитель и root-dir), архитектура (/system/resource/print → architecture-name; на arm32v5 наш образ не встанет).

Контейнер работает, трафик не идёт. Проверь NAT-правило для 172.17.0.0/24, маршрут в routing-table и mangle-правило — три места, где обычно теряется пакет. И сверь девять переменных окружения со своим ключом: пустое или обрезанное значение PUBLIC_KEY роутер принимает молча, контейнер стартует, а соединения нет.

Скорость ниже ожидаемой. Шифрование в контейнере нагружает CPU: на hAP ax-серии реалистично ожидать десятки—до сотни Мбит/с; для гигабитных задач смотри в сторону RB5009/CCR. Если нужен гигабит по дому, пусти через туннель не всю сеть, а только те устройства, которым он действительно нужен, — это и есть правило в mangle.

После обновления RouterOS всё пропало. Проверь, что пакет container установлен под новую версию, и перезапусти контейнер.

Не решилось — напиши в поддержку: подскажем по твоей модели и конфигурации.

Частые вопросы

Какие модели MikroTik подходят для VLESS-контейнера?

Любые на ARM/ARM64/x86 с местом под образ: hAP ax2/ax3, RB5009, CCR2004 и новее, виртуальный CHR. Модели на mmips и smips (hEX, hEX S, hAP lite) контейнеров не поддерживают вовсе. У hEX Refresh поддержка есть, но он принимает только образы arm32v5, а сборки под него у этого образа нет.

Почему нельзя просто взять встроенный WireGuard?

Потому что он не подключится: наш конфиг несёт параметры маскировки, RouterOS их не читает, и рукопожатия с сервером не происходит. Подробно это разобрано выше — вместе с признаками, по которым отказ видно на роутере. Как устроена маскировка у VLESS — в разборе протокола.

Можно ли пустить через VPN только часть устройств?

Да, это сильная сторона MikroTik: меняй условия в mangle-правиле — по адресам устройств, address-list или назначению. Телевизор через туннель, рабочий комп напрямую — штатная задача.

Одна подписка на роутер и телефон — можно?

Да: подписка Tainet мультиустройственная — контейнер на роутере и Happ на телефоне работают с одной ссылкой. Обзор всех платформ — в гайде по устройствам.

Если нужен сервис, который дружит с MikroTik: у Tainet в личном кабинете набор команд для контейнера собирается готовым, с уже подставленными значениями ключа, — остаётся вставить его в терминал роутера. Бесплатная первая неделя на обкатку, от 8 ₽ в день. Оформить — в Telegram-боте или на этом сайте в личном кабинете. Вопросы по твоей схеме — поддержка отвечает живыми людьми.