Как запустить XRay на Mikrotik. Часть 3

Как запустить XRay на Mikrotik. Часть 3

Запустить XRay на отдельных устройствах удалось. Но можно ли настроить прозрачную работу на роутере, в частности на Mikrotik?

Да, возможно с новой функцией container на Mikrotik. Но для этого нужен Mikrotik на arm или arm64 и достаточно места на диске на роутере.

Нам понадобятся два контейнера. Один - для подключения к нашему VPN. Второй для роутинга в первый контейнер.

Для начала соберем свой image для Mikrotik и запустим его подключение к нашему VPN.

Заходим на dockerhub и делаем приватный репозиторий, например my-xray.
Репозиторий надо сделать обязательно приватным, потому в image будут встроены данные для авторизации в нашем VPN.

Создаем config.json:

{
    "log": {
        "loglevel": "debug"
    },
    "inbounds": [
        {
            "port": 10800,
            "listen": "0.0.0.0",
            "protocol": "socks",
            "settings": {
                "udp": true
            },
            "sniffing": {
                "enabled": true,
                "destOverride": [
                    "http",
                    "tls",
                    "quic"
                ],
                "routeOnly": true
            }
        }
    ],
    "outbounds": [
        {
            "protocol": "vless",
            "settings": {
                "vnext": [
                    {
                        "address": "my-secret-domain.ru",
                        "port": 443,
                        "users": [
                            {
                                "id": "9f1c9469-61a7-4c08-8a77-05d895db20a5",
                                "encryption": "none",
                                "level": 0
                            }
                        ]
                    }
                ]
            },
            "streamSettings": {
                "network": "ws",
                "security": "tls",
                "tlsSettings": {
                    "serverName": "my-secret-domain.ru"
                },
                "wsSettings": {
                    "path": "/websocket"
                }
            },
            "tag": "proxy"
        }
    ]
}

Делаем вот такой Dockerfile:

FROM --platform=$BUILDPLATFORM alpine:latest
	
RUN apk add --no-cache \
	    curl \
	    unzip \
	    tzdata
	
# Загружаем версию Xray для нужной архитектуры
# С помощью аргумента BUILDPLATFORM определяем, какая архитектура используется при сборке
ARG TARGETPLATFORM
RUN mkdir -p /usr/local/etc/xray \
    && if [ "$TARGETPLATFORM" = "linux/amd64" ]; then \
         curl -L -o /tmp/xray.zip https://github.com/XTLS/Xray-core/releases/latest/download/Xray-linux-64.zip; \
       elif [ "$TARGETPLATFORM" = "linux/arm64" ]; then \
         curl -L -o /tmp/xray.zip https://github.com/XTLS/Xray-core/releases/latest/download/Xray-linux-arm64-v8a.zip; \
       elif [ "$TARGETPLATFORM" = "linux/arm/v7" ]; then \
         curl -L -o /tmp/xray.zip https://github.com/XTLS/Xray-core/releases/latest/download/Xray-linux-arm32-v7a.zip; \
       fi \
    && unzip /tmp/xray.zip -d /usr/local/bin/ \
    && rm /tmp/xray.zip \
    && chmod +x /usr/local/bin/xray
	
COPY config.json /etc/xray/config.json
	
EXPOSE 10800
	
CMD ["xray", "-config", "/etc/xray/config.json"]

Собираем docker image под нашу платформу:

docker build --platform linux/arm64 -t username/my-xray:latest -f Dockerfile .
docker push username/my-xray:latest

Запускаем контейнеры на микротике до настройки роутинга.
Устанавливем переменные окружения для подключения:

/container envs
  add key=TZ name=xray value=Europe/Moscow
  add key=SOCKS5_ADDR name=hev-socks5-tunnel value=172.17.0.2
  add key=SOCKS5_PORT name=hev-socks5-tunnel value=10800
  add key=LOG_LEVEL name=hev-socks5-tunnel value=none
  add key=TZ name=hev-socks5-tunnel value=Europe/Moscow

Устанавливаем монтирование для сохранения данных:

/container mounts
  add dst=/etc/xray name=xray src=/docker/xray/config

Устанавливаем подключение к dockerhub. Тут важно добавить ваши логин и пароль для логина в dockerhub:

/container config
  set registry-url=https://registry-1.docker.io tmpdir=/temp username=our_username password=our_password

Теперь на Mikrotik создаем два виртуальных интерфейса:

/interface veth
  add address=172.17.0.2/24 comment="Xray VLESS" gateway=172.17.0.1 gateway6="" name=veth1
  add address=172.17.0.3/24 comment=hev-socks5-tunnel gateway=172.17.0.1 gateway6="" name=veth2

Интерфейсы собираем в bridge:

/interface bridge add name=docker
/interface bridge port \
  add bridge=docker interface=veth1
  add bridge=docker interface=veth2

Вешаем на bridge адрес для docker-сети:

/ip address
  add address=172.17.0.1/24 comment="Xray VLESS" interface=docker network=172.17.0.0

Запускаем наши контейнеры:

/container
  add dns=172.17.0.1 envlist=xray remote-image=our-docker-username/my-xray:latest interface=veth1 logging=yes mounts=xray root-dir=docker/xray/container start-on-boot=yes
  add dns=172.17.0.1 envlist=hev-socks5-tunnel remote-image=snegowiki/hev-socks5-tunnel-mikrotik:latest interface=veth2 logging=yes root-dir=docker/hev-socks5-tunnel/container start-on-boot=yes

Добавляем новую таблицу для роутинга и маркировки трафика для нашего VPN:

/routing table
  add disabled=no fib name=proxy_mark

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

/ip firewall mangle
  add action=mark-routing chain=output comment="Xray VLESS" dst-address-list=route_proxy new-routing-mark=proxy_mark passthrough=no
  add action=mark-routing chain=prerouting comment="Xray VLESS" dst-address-list=route_proxy new-routing-mark=proxy_mark passthrough=no

Делаем NAT для нашего docker-интерфейса:

/ip firewall nat
  add action=masquerade chain=srcnat dst-address-list=route_proxy out-interface=docker

Делаем правило роутинга из контейнера в контейнер с VPN:

/ip route
 add comment="Tunnel -> Xray VLESS" disabled=no distance=10 dst-address=0.0.0.0/0 gateway=172.17.0.3 routing-table=proxy_mark scope=30 suppress-hw-offload=no target-scope=10

Дальше уже можно либо завернуть весь трафик через VPN, либо выбрать только нужные нам сети. Например, мы можем зароутить трафик только на российские IP.

Сгенерировать лист можно например здесь.

Скачиваем лист с адресами. Внутри будет что-то вроде:

/ip firewall address-list
add address=2.56.24.0/22 comment="RUSSIAN FEDERATION" list=CountryIPBlocks
add address=2.56.88.0/22 comment="RUSSIAN FEDERATION" list=CountryIPBlocks

Меняем для всех адресов list=CountryIPBlocks на list=route_proxy

Импортируем лист в Mikrotik. Трафик пойдет на российские адреса через наш VPN.

Точно такую же операцию можно провернуть и на роутере с Linux.