Подключение на MikroTik
В данной инструкции рассматривается работа с MikroTik RouterOS версии v7.18.2 и выше, а также настройка протокола XRay VLESS Reality для подключения к VPN.
Для опытных пользователей доступны готовые контейнеры на Docker Hub, которые можно использовать непосредственно в среде RouterOS. Контейнеры предоставлены для трёх архитектур: ARM, ARM64 и x86.
Преднастройка RouterOS
Создадим отдельную таблицу маршрутизации:
/routing table
add disabled=no fib name=r_to_vpn
Добавим address-list "to_vpn" что бы находившиеся в нём IP адреса и подсети заворачивать в пока ещё не созданный туннель:
/ip firewall address-list
add address=8.8.8.8 list=to_vpn
Добавим address-list "RFC1918" что бы не потерять доступ до RouterOS при дальнейшей настройке:
/ip firewall address-list
add address=10.0.0.0/8 list=RFC1918
add address=172.16.0.0/12 list=RFC1918
add address=192.168.0.0/16 list=RFC1918
Добавим правила в mangle для address-list "RFC1918" и переместим его в самый верх правил:
/ip firewall mangle
add action=accept chain=prerouting dst-address-list=RFC1918 in-interface-list=!WAN
Добавим правило транзитного трафика в mangle для address-list "to_vpn":
/ip firewall mangle
add action=mark-connection chain=prerouting connection-mark=no-mark dst-address-list=to_vpn in-interface-list=!WAN \
new-connection-mark=to-vpn-conn passthrough=yes
Добавим правило для транзитного трафика, указывающее использовать таблицу маршрутизации r_to_vpn
для поиска маршрута к узлу назначения:
add action=mark-routing chain=prerouting connection-mark=to-vpn-conn in-interface-list=!WAN new-routing-mark=r_to_vpn \
passthrough=yes
Маршрут по умолчанию в созданную таблицу маршрутизации "r_to_vpn" добавим чуть позже.
Два выше обозначенных правила будут работать только для трафика, проходящего через маршрутизатор. Если вы хотите заворачивать трафик, генерируемый самим роутером (например команда ping 8.8.8.8 c роутера для проверки туннеля в контейнере), тогда добавляем ещё два правила (не обязательно). Они должны находиться по порядку, следуя за вышеобозначенными правилами.
/ip firewall mangle
add action=mark-connection chain=output connection-mark=no-mark \
dst-address-list=to_vpn new-connection-mark=to-vpn-conn-local \
passthrough=yes
add action=mark-routing chain=output connection-mark=to-vpn-conn-local \
new-routing-mark=r_to_vpn passthrough=yes
Сборка контейнера на Windows
Данный пункт настройки подходит только для устройств с архитектурой ARM, ARM64 или x86. Перед запуском контейнера в RouteOS убедитесь, что у вас включены контейнеры. С полным списком устройств можно ознакомится тут. Включаем поддержку контейнеров в RouterOS. Также предполагается, что на устройстве (либо на подключённой по USB флешке) доступно около 50 МБ свободного места для развертывания контейнера в RouterOS, а также не менее 150 МБ оперативной памяти. Если на накопителе недостаточно свободного места, его можно временно расширить за счёт оперативной памяти. После перезагрузки RouterOS, всё что находится в RAM, стирается.
Где взять контейнер? Его можно собрать самому из текущего репозитория каталога Containers или скачать готовый образ под выбранную архитектуру из Docker Hub. Скачав готовый образ, переходим сразу к настройке.
Для самостоятельной сборки следует установить подсистему Docker buildx, "make" и "go".
В текущем примере будем собирать на Windows:
Скачиваем Docker Desktop и устанавливаем.
Скачиваем каталог Containers.
Открываем CMD и переходим в каталог "Containers" (cd <путь до каталога>).
Запускаем Docker с ярлыка на рабочем столе (окно приложения должно просто висеть в фоне при сборке) и через cmd собираем контейнер под выбранную архитектуру RouterOS.
ARMv8 (arm64/v8) — спецификация 8-го поколения оборудования ARM, которое поддерживает архитектуры AArch32 и AArch64.
ARMv7 (arm/v7) — спецификация 7-го поколения оборудования ARM, которое поддерживает только архитектуру AArch32.
AMD64 (amd64) — это 64-битный процессор, который добавляет возможности 64-битных вычислений к архитектуре x86.
Для ARMv8 (Containers\Dockerfile_arm64):
docker image prune -f
docker buildx build -f Dockerfile_arm64 --no-cache --progress=plain --platform linux/arm64/v8 --output=type=docker --tag user/docker-xray-vless:latest .
Для ARMv7 (Containers\Dockerfile_arm):
docker image prune -f
docker buildx build -f Dockerfile_arm --no-cache --progress=plain --platform linux/arm/v7 --output=type=docker --tag user/docker-xray-vless:latest .
Для amd64 (Containers\Dockerfile_amd64):
docker image prune -f
docker buildx build -f Dockerfile_amd64 --no-cache --progress=plain --platform linux/amd64 --output=type=docker --tag user/docker-xray-vless:latest .
Иногда процесс создания образа может подвиснуть из-за плохого соединения с интернетом. Следует повторно запустить сборку. После сборки образа вы можете загрузить контейнер в приватный репозиторий Docker HUB и продолжить настройку по следующему пункту.
Вариант с локальным сохранением контейнера в .tar
через docker save
тоже может сработать, однако на последней версии Docker в RouterOS могут возникать ошибки при попытке импорта таким способом.
Настройка контейнера в RouterOS
В данном примере на устройстве MikroTik USB-накопитель отсутствует, поэтому всё будет храниться с использованием расширенного хранилища на базе оперативной памяти. Если у вас есть USB-порт и флешка, рекомендуется размещать контейнер именно на ней. Также возможно комбинированное размещение: образ контейнера можно загрузить во временное хранилище в оперативной памяти, а развернуть сам контейнер — в постоянной файловой системе.
Рекомендуется создать пространство из ОЗУ хотя бы для tmp директории. Размер регулируйте самостоятельно:
/disk
add slot=ramstorage tmpfs-max-size=100M type=tmpfs
Если контейнер не запускается на флешке
Например, вы хотите разместить контейнер в каталоге /usb1/docker/xray. Не создавайте заранее каталог xray на USB-флеш-накопителе. При создании контейнера добавьте в команду распаковки параметр "root-dir=usb1/docker/xray", в этом случае контейнер распакуется самостоятельно создав каталог /usb1/docker/xray и запустится без проблем.
В RouterOS выполняем:
Подключем Docker HUB в наш RouterOS.
/file add type=directory name=ramstorage
/container config
set ram-high=200.0MiB registry-url=https://registry-1.docker.io tmpdir=ramstorage
Создадим интерфейс для контейнера.
/interface veth add address=172.18.20.6/30 gateway=172.18.20.5 gateway6="" name=docker-xray-vless-veth
Добавим правило в mangle для изменения mss для трафика, уходящего в контейнер. Поместите его после правила с RFC1918 (его мы создали ранее).
/ip firewall mangle add action=change-mss chain=forward new-mss=1360 out-interface=docker-xray-vless-veth passthrough=yes protocol=tcp tcp-flags=syn tcp-mss=1453-6553
Назначим на созданный интерфейс IP адрес. IP 172.18.20.6 возьмёт себе контейнер, а 172.18.20.5 будет адрес RouterOS.
/ip address add interface=docker-xray-vless-veth address=172.18.20.5/30
В таблице маршрутизации "r_to_vpn" создадим маршрут по умолчанию ведущий на контейнер.
/ip route add distance=1 dst-address=0.0.0.0/0 gateway=172.18.20.6 routing-table=r_to_vpn
Включаем masquerade для всего трафика, уходящего в контейнер.
/ip firewall nat add action=masquerade chain=srcnat out-interface=docker-xray-vless-veth
Создадим переменные окружения envs под названием "xvr", которые позже при запуске будем передавать в контейнер.
Чтобы получить ссылку вида vless://a1b2b3...
, обратитесь в нашу службу поддержки. Добавить можно только одну локацию, поэтому укажите название конкретной локации.
Далее предстоит работа с ключом.
vless://e3203dfe-9s62-4de5-bf9b-ecd36c9af225@myhost.com:443?type=tcp&security=reality&pbk=fTndnleCTkK9_jtpwCAdxtEwJUkQ22oY1W8dTza2xHs&fp=chrome&sni=apple.com&sid=29d2d3d5a398&spx=%2wF#d
Размещаем данные параметры для передачи в контейнер:
/container envs
add key=SERVER_ADDRESS name=xvr value=myhost.com
add key=SERVER_PORT name=xvr value=443
add key=USER_ID name=xvr value=e3203dfe-9s62-4de5-bf9b-ecd36c9af225
add key=ENCRYPTION name=xvr value=none
add key=FINGERPRINT_FP name=xvr value=chrome
add key=SERVER_NAME_SNI name=xvr value=apple.com
add key=PUBLIC_KEY_PBK name=xvr value=fTndnleCTkK9_jtpwCAdxtEwJUkQ22oY1W8dTza2xHs
add key=SHORT_ID_SID name=xvr value=29d2d3d5a398
Теперь создадим сам контейнер. Здесь вам нужно выбрать репозиторий из Docker Hub с архитектурой под ваше устройство.
Варианты:
catesin/xray-mikrotik-amd64
catesin/xray-mikrotik-arm
catesin/xray-mikrotik-arm64
Пример импорта контейнера в ramstorage (по факту в оперативную память) для arm64. Подставьте в remote-image
нужный репозиторий и отредактируйте местоположение контейнера в root-dir
при необходимости.
/container/add remote-image=catesin/xray-mikrotik-arm64:latest hostname=xray-vless interface=docker-xray-vless-veth logging=yes start-on-boot=yes envlist=xvr root-dir=ramstorage/container-xray-mikrotik
Подождите, пока контейнер полностью распакуется. В результате вы должны увидеть структуру с распакованным контейнером и окружением envs
.
Если в процессе импорта возникают ошибки — внимательно изучите журнал логов в RouterOS.


Контейнер будет использовать только локальный DNS сервер на IP адресе 172.18.20.5. Необходимо разрешить DNS запросы TCP/UDP порт 53 на данный IP в правилах RouterOS в разделе /ip firewall filter
Запускаем контейнер через WinBox в разделе меню WinBox "container". В логах MikroTik вы увидите характерные сообщения о запуске контейнера.
Настройка завершена. Можно проверить доступность IP 8.8.8.8 из списка "to_vpn" (этот адрес добавлен ранее).
Last updated