Подключение на 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" и переместим его в самый верх правил:

/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" добавим чуть позже.

Сборка контейнера на 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):

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

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

  1. Подключем 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
  1. Создадим интерфейс для контейнера.

/interface veth add address=172.18.20.6/30 gateway=172.18.20.5 gateway6="" name=docker-xray-vless-veth
  1. Добавим правило в 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
  1. Назначим на созданный интерфейс 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
  1. В таблице маршрутизации "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
  1. Включаем masquerade для всего трафика, уходящего в контейнер.

/ip firewall nat add action=masquerade chain=srcnat out-interface=docker-xray-vless-veth
  1. Создадим переменные окружения envs под названием "xvr", которые позже при запуске будем передавать в контейнер.

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

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
  1. Теперь создадим сам контейнер. Здесь вам нужно выбрать репозиторий из 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

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

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

Last updated