Как запустить 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.