Подключение на MikroTik

В данной инструкции рассматривается работа с MikroTik RouterOS версии v7.18.2 и выше, а также настройка протокола XRay VLESS Reality для подключения к VPN.

Материал рассчитан на пользователей со средним уровнем подготовки. Перед применением приведённых настроек настоятельно рекомендуется иметь практический опыт конфигурирования устройств MikroTik.

Для опытных пользователей доступны готовые контейнеры на 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" и переместим его в самый верх правил:

Добавим правило транзитного трафика в mangle для address-list "to_vpn":

Добавим правило для транзитного трафика, указывающее использовать таблицу маршрутизации r_to_vpn для поиска маршрута к узлу назначения:

Маршрут по умолчанию в созданную таблицу маршрутизации "r_to_vpn" добавим чуть позже.

Сборка контейнера на Windows

Данный пункт настройки подходит только для устройств с архитектурой ARM, ARM64 или x86. Перед запуском контейнера в RouteOS убедитесь, что у вас включены контейнеры. С полным списком устройств можно ознакомится тут. Включаем поддержку контейнеров в RouterOS. Также предполагается, что на устройстве (либо на подключённой по USB флешке) доступно около 50 МБ свободного места для развертывания контейнера в RouterOS, а также не менее 150 МБ оперативной памяти. Если на накопителе недостаточно свободного места, его можно временно расширить за счёт оперативной памяти. После перезагрузки RouterOS, всё что находится в RAM, стирается.

Где взять контейнер? Его можно собрать самому из текущего репозитория каталога Containers или скачать готовый образ под выбранную архитектуру из Docker Hub. Скачав готовый образ, переходим сразу к настройке.

Для самостоятельной сборки следует установить подсистему Docker buildx, "make" и "go".

В текущем примере будем собирать на Windows:

  1. Скачиваем Docker Desktop и устанавливаем.

  2. Скачиваем каталог Containers.

  3. Открываем CMD и переходим в каталог "Containers" (cd <путь до каталога>).

  4. Запускаем 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):

Для ARMv7 (Containers\Dockerfile_arm):

Для amd64 (Containers\Dockerfile_amd64):

Иногда процесс создания образа может подвиснуть из-за плохого соединения с интернетом. Следует повторно запустить сборку. После сборки образа вы можете загрузить контейнер в приватный репозиторий Docker HUB и продолжить настройку по следующему пункту.

Вариант с локальным сохранением контейнера в .tar через docker save тоже может сработать, однако на последней версии Docker в RouterOS могут возникать ошибки при попытке импорта таким способом.

Настройка контейнера в RouterOS

В данном примере на устройстве MikroTik USB-накопитель отсутствует, поэтому всё будет храниться с использованием расширенного хранилища на базе оперативной памяти. Если у вас есть USB-порт и флешка, рекомендуется размещать контейнер именно на ней. Также возможно комбинированное размещение: образ контейнера можно загрузить во временное хранилище в оперативной памяти, а развернуть сам контейнер — в постоянной файловой системе.

Рекомендуется создать пространство из ОЗУ хотя бы для tmp директории. Размер регулируйте самостоятельно:

В RouterOS выполняем:

  1. Подключем Docker HUB в наш RouterOS.

  1. Создадим интерфейс для контейнера.

  1. Добавим правило в mangle для изменения mss для трафика, уходящего в контейнер. Поместите его после правила с RFC1918 (его мы создали ранее).

  1. Назначим на созданный интерфейс IP адрес. IP 172.18.20.6 возьмёт себе контейнер, а 172.18.20.5 будет адрес RouterOS.

  1. В таблице маршрутизации "r_to_vpn" создадим маршрут по умолчанию ведущий на контейнер.

  1. Включаем masquerade для всего трафика, уходящего в контейнер.

  1. Создадим переменные окружения envs под названием "xvr", которые позже при запуске будем передавать в контейнер.

Далее предстоит работа с ключом.

Размещаем данные параметры для передачи в контейнер:

  1. Теперь создадим сам контейнер. Здесь вам нужно выбрать репозиторий из Docker Hub с архитектурой под ваше устройство.

Варианты:

  • catesin/xray-mikrotik-amd64

  • catesin/xray-mikrotik-arm

  • catesin/xray-mikrotik-arm64

Пример импорта контейнера в ramstorage (по факту в оперативную память) для arm64. Подставьте в remote-image нужный репозиторий и отредактируйте местоположение контейнера в root-dir при необходимости.

Подождите, пока контейнер полностью распакуется. В результате вы должны увидеть структуру с распакованным контейнером и окружением envs. Если в процессе импорта возникают ошибки — внимательно изучите журнал логов в RouterOS.

Контейнер будет использовать только локальный DNS сервер на IP адресе 172.18.20.5. Необходимо разрешить DNS запросы TCP/UDP порт 53 на данный IP в правилах RouterOS в разделе /ip firewall filter

  1. Запускаем контейнер через WinBox в разделе меню WinBox "container". В логах MikroTik вы увидите характерные сообщения о запуске контейнера.

Настройка завершена. Можно проверить доступность IP 8.8.8.8 из списка "to_vpn" (этот адрес добавлен ранее).

Last updated