Mikrotik Vless xray container
571
ARG XRAY_VERSION=26.3.27 ARG HEV_VERSION=2.14.4 Custom Xray VLESS client container for MikroTik RouterOS with multi-architecture support.
Custom Xray VLESS client container for MikroTik RouterOS with multi-architecture support.
linux/arm64linux/arm/v7VLESS_URLsecurity=realitysecurity=tlsVLESS_URLLOG_LEVEL controls Xray logsDEBUG_STARTUP controls wrapper startup/debug output onlydeker1176/xray-mikrotik-custom:stable
deker1176/xray-mikrotik-custom:arm64
deker1176/xray-mikrotik-custom:armv7
Recommended tag:
deker1176/xray-mikrotik-custom:stable
The stable tag is multi-arch and contains:
linux/arm64linux/arm/v7When using TUN mode inside a MikroTik container, the default route may move to tun0.
Because of that, DNS requests and even the connection to the VLESS server itself may try to go through the same tunnel before it is fully established.
This image solves that by allowing you to define direct routes for:
VLESS_URLThe wrapper resolves the domain at startup and adds direct bypass routes through the normal container interface before traffic is moved to tun0.
If you do not already have a dedicated bridge for containers, create it first:
/interface/bridge/add name=containers
/ip/address/add address=172.17.0.1/24 interface=containers
/interface/veth/add name=veth-vless address=172.17.0.2/24 gateway=172.17.0.1
/interface/bridge/port/add bridge=containers interface=veth-vless
Use your real WAN interface list or WAN interface.
/ip/firewall/nat/add chain=srcnat src-address=172.17.0.0/24 out-interface-list=WAN action=masquerade
If you do not use out-interface-list=WAN, specify your WAN interface manually, for example:
/ip/firewall/nat/add chain=srcnat src-address=172.17.0.0/24 out-interface=ether1 action=masquerade
Minimal recommended set for MikroTik:
/container/envs/add list=vless-env key=VLESS_URL value="vless://[email protected]:443?type=tcp&security=reality&flow=xtls-rprx-vision&pbk=PUBLIC_KEY&fp=randomized&sni=www.google.com&sid=SHORTID&spx=%2F"
/container/envs/add list=vless-env key=CONTAINER_GW value=172.17.0.1
/container/envs/add list=vless-env key=CONTAINER_IFACE value=veth-vless
/container/envs/add list=vless-env key=BYPASS_DNS value=1.1.1.1,8.8.8.8
/container/envs/add list=vless-env key=RESOLV_DNS value=1.1.1.1,8.8.8.8
/container/envs/add list=vless-env key=BYPASS_DOMAINS value=server.example.com
/container/envs/add list=vless-env key=LOG_LEVEL value=warning
/container/envs/add list=vless-env key=DEBUG_STARTUP value=0
/container/envs/add list=vless-env key=XRAY_BUFFER_SIZE value=0
/container/envs/add list=vless-env key=HEV_STACK_SIZE value=16384
/container/envs/add list=vless-env key=ENABLE_UDP value=false
/container/envs/add list=vless-env key=MTU value=1280
Only VLESS_URL is strictly required, but the values above are recommended for MikroTik devices with limited RAM.
/container/add remote-image=deker1176/xray-mikrotik-custom:stable \
interface=veth-vless root-dir=disk1/containers/vless \
envlist=vless-env logging=yes start-on-boot=yes name=vless
/container/start vless
If you want to avoid cached old layers during testing, use a new root-dir, for example:
root-dir=disk1/containers/vless102
Create routing table and default route through the container:
/routing/table/add fib name=to_vpn
/ip/route/add dst-address=0.0.0.0/0 gateway=172.17.0.2 routing-table=to_vpn
Example for one subnet:
/routing/rule/add src-address=192.168.88.0/24 action=lookup-only-in-table table=to_vpn
Example for one client only:
/routing/rule/add src-address=192.168.88.100/32 action=lookup-only-in-table table=to_vpn
For MikroTik routers with small RAM, start with one client or a small group of clients before routing a whole subnet.
| Variable | Required | Default | Description |
|---|---|---|---|
VLESS_URL | Yes | - | Full VLESS share link |
LOG_LEVEL | No | info | Xray log level only |
DEBUG_STARTUP | No | 1 | Wrapper startup/debug output only |
TUN | No | tun0 | TUN interface name |
MTU | No | 1500 | TUN MTU size |
SOCKS_PORT | No | 1080 | Internal SOCKS5 port |
CONTAINER_GW | No | 172.17.0.1 | Container gateway used for direct bypass routes |
CONTAINER_IFACE | No | veth-vless | Container network interface used for direct bypass routes |
BYPASS_IPS | No | empty | Comma-separated list of IPs routed directly outside TUN |
BYPASS_DNS | No | empty | Comma-separated list of DNS server IPs routed directly outside TUN |
RESOLV_DNS | No | 1.1.1.1,8.8.8.8 | DNS servers written to /etc/resolv.conf |
BYPASS_DOMAINS | No | empty | Comma-separated list of domains resolved at startup and routed directly outside TUN |
XRAY_CONFIG | No | /etc/xray/config.json | Xray config path |
HEV_CONFIG | No | /etc/hev-socks5/config.yaml | HEV config path |
TUN_IPV4 | No | 198.18.0.1 | IPv4 address used on the TUN interface |
TUN_IPV6 | No | fc00::1 | IPv6 address used on the TUN interface |
ALLOW_INSECURE | No | false | Used only for security=tls |
XRAY_BUFFER_SIZE | No | 0 | Xray buffer size. 0 reduces memory usage |
HEV_STACK_SIZE | No | 16384 | HEV task stack size |
ENABLE_UDP | No | false | Enable or disable UDP in SOCKS/HEV |
ENABLE_SNIFFING | No | true | Enable or disable Xray sniffing |
For MikroTik routers with limited RAM:
LOG_LEVEL=warning
DEBUG_STARTUP=0
XRAY_BUFFER_SIZE=0
HEV_STACK_SIZE=16384
ENABLE_UDP=false
MTU=1280
If the router still kills the container under heavy load, try:
HEV_STACK_SIZE=8192
ENABLE_SNIFFING=false
Also reduce the number of clients routed through the container.
vless://[email protected]:443?type=tcp&security=reality&flow=xtls-rprx-vision&pbk=PUBLIC_KEY&fp=randomized&sni=www.google.com&sid=SHORTID&spx=%2F#Example
This generates Xray streamSettings with:
"security": "reality",
"realitySettings": {
"fingerprint": "randomized",
"serverName": "www.google.com",
"publicKey": "PUBLIC_KEY",
"spiderX": "/",
"shortId": "SHORTID"
}
For links with:
security=tls
the wrapper generates tlsSettings.
ALLOW_INSECURE is used only for TLS mode:
ALLOW_INSECURE=false
For Reality mode, separate TLS settings are not required because Xray uses security=reality and realitySettings.
At startup, the wrapper script:
/etc/resolv.conf from RESOLV_DNSBYPASS_IPSBYPASS_DNSBYPASS_DOMAINSVLESS_URLCONTAINER_GW and CONTAINER_IFACEtun0This avoids the common TUN loop problem where DNS or the VLESS server connection itself tries to go through tun0.
View container logs:
/log/print where message~"vless"
Enter container shell:
/container/shell vless
Useful checks inside the container:
ip a
ip route
cat /etc/resolv.conf
cat /etc/xray/config.json
cat /etc/hev-socks5/config.yaml
curl -v --socks5-hostname 127.0.0.1:1080 https://api.ipify.org
Check direct route to server:
nslookup server.example.com
ip route get SERVER_IP
The route to the VLESS server must go through the normal container interface, for example:
SERVER_IP via 172.17.0.1 dev veth-vless
BYPASS_DOMAINS is resolved only at container startup.BYPASS_DNS and RESOLV_DNS configured when using domain names.CONTAINER_IFACE is used for direct routes outside TUN.ENABLE_UDP=false is recommended on low-memory MikroTik routers.root-dirMIT
Кастомный контейнер-клиент Xray VLESS для MikroTik RouterOS с поддержкой нескольких архитектур.
linux/arm64linux/arm/v7VLESS_URLsecurity=realitysecurity=tlsVLESS_URLLOG_LEVEL управляет логами XrayDEBUG_STARTUP управляет только startup/debug выводом wrapper-скриптаdeker1176/xray-mikrotik-custom:stable
deker1176/xray-mikrotik-custom:arm64
deker1176/xray-mikrotik-custom:armv7
Рекомендуемый тег:
deker1176/xray-mikrotik-custom:stable
Тег stable является multi-arch и содержит:
linux/arm64linux/arm/v7При использовании TUN-режима внутри контейнера MikroTik маршрут по умолчанию может переключаться на tun0.
Из-за этого DNS-запросы и даже соединение до самого VLESS-сервера могут пытаться идти через этот же туннель еще до того, как он полностью поднялся.
Этот образ решает проблему за счет возможности задавать прямые маршруты для:
VLESS_URLWrapper при старте резолвит домен и добавляет прямые bypass-маршруты через обычный интерфейс контейнера до переключения трафика в tun0.
Если отдельного bridge для контейнеров еще нет, сначала создайте его:
/interface/bridge/add name=containers
/ip/address/add address=172.17.0.1/24 interface=containers
/interface/veth/add name=veth-vless address=172.17.0.2/24 gateway=172.17.0.1
/interface/bridge/port/add bridge=containers interface=veth-vless
Используйте ваш реальный WAN interface-list или WAN-интерфейс.
/ip/firewall/nat/add chain=srcnat src-address=172.17.0.0/24 out-interface-list=WAN action=masquerade
Если out-interface-list=WAN не используется, укажите WAN-интерфейс вручную, например:
/ip/firewall/nat/add chain=srcnat src-address=172.17.0.0/24 out-interface=ether1 action=masquerade
Минимальный рекомендуемый набор для MikroTik:
/container/envs/add list=vless-env key=VLESS_URL value="vless://[email protected]:443?type=tcp&security=reality&flow=xtls-rprx-vision&pbk=PUBLIC_KEY&fp=randomized&sni=www.google.com&sid=SHORTID&spx=%2F"
/container/envs/add list=vless-env key=CONTAINER_GW value=172.17.0.1
/container/envs/add list=vless-env key=CONTAINER_IFACE value=veth-vless
/container/envs/add list=vless-env key=BYPASS_DNS value=1.1.1.1,8.8.8.8
/container/envs/add list=vless-env key=RESOLV_DNS value=1.1.1.1,8.8.8.8
/container/envs/add list=vless-env key=BYPASS_DOMAINS value=server.example.com
/container/envs/add list=vless-env key=LOG_LEVEL value=warning
/container/envs/add list=vless-env key=DEBUG_STARTUP value=0
/container/envs/add list=vless-env key=XRAY_BUFFER_SIZE value=0
/container/envs/add list=vless-env key=HEV_STACK_SIZE value=16384
/container/envs/add list=vless-env key=ENABLE_UDP value=false
/container/envs/add list=vless-env key=MTU value=1280
Строго обязательна только переменная VLESS_URL, но значения выше рекомендуются для MikroTik с ограниченной RAM.
/container/add remote-image=deker1176/xray-mikrotik-custom:stable \
interface=veth-vless root-dir=disk1/containers/vless \
envlist=vless-env logging=yes start-on-boot=yes name=vless
/container/start vless
Если нужно исключить использование старых закешированных слоев при тестах, задайте новый root-dir, например:
root-dir=disk1/containers/vless102
Создайте таблицу маршрутизации и default route через контейнер:
/routing/table/add fib name=to_vpn
/ip/route/add dst-address=0.0.0.0/0 gateway=172.17.0.2 routing-table=to_vpn
Пример для подсети:
/routing/rule/add src-address=192.168.88.0/24 action=lookup-only-in-table table=to_vpn
Пример только для одного клиента:
/routing/rule/add src-address=192.168.88.100/32 action=lookup-only-in-table table=to_vpn
Для MikroTik с малым объемом RAM сначала пускайте через контейнер одного клиента или небольшую группу клиентов, а не всю подсеть сразу.
| Переменная | Обязательна | Значение по умолчанию | Описание |
|---|---|---|---|
VLESS_URL | Да | - | Полная VLESS-ссылка |
LOG_LEVEL | Нет | info | Уровень логирования только для Xray |
DEBUG_STARTUP | Нет | 1 | Startup/debug вывод только для wrapper-скрипта |
TUN | Нет | tun0 | Имя TUN-интерфейса |
MTU | Нет | 1500 | MTU для TUN |
SOCKS_PORT | Нет | 1080 | Внутренний порт SOCKS5 |
CONTAINER_GW | Нет | 172.17.0.1 | Шлюз контейнера для прямых bypass-маршрутов |
CONTAINER_IFACE | Нет | veth-vless | Сетевой интерфейс контейнера для прямых bypass-маршрутов |
BYPASS_IPS | Нет | пусто | Список IP через запятую, которые нужно маршрутизировать напрямую, минуя TUN |
BYPASS_DNS | Нет | пусто | Список IP DNS-серверов через запятую, которые нужно маршрутизировать напрямую, минуя TUN |
RESOLV_DNS | Нет | 1.1.1.1,8.8.8.8 | DNS-серверы, которые будут записаны в /etc/resolv.conf |
BYPASS_DOMAINS | Нет | пусто | Список доменов через запятую, которые будут резолвиться при старте и маршрутизироваться напрямую, минуя TUN |
XRAY_CONFIG | Нет | /etc/xray/config.json | Путь к Xray config |
HEV_CONFIG | Нет | /etc/hev-socks5/config.yaml | Путь к HEV config |
TUN_IPV4 | Нет | 198.18.0.1 | IPv4-адрес на TUN-интерфейсе |
TUN_IPV6 | Нет | fc00::1 | IPv6-адрес на TUN-интерфейсе |
ALLOW_INSECURE | Нет | false | Используется только для security=tls |
XRAY_BUFFER_SIZE | Нет | 0 | Размер буфера Xray. 0 снижает расход памяти |
HEV_STACK_SIZE | Нет | 16384 | Размер task stack для HEV |
ENABLE_UDP | Нет | false | Включить или отключить UDP в SOCKS/HEV |
ENABLE_SNIFFING | Нет | true | Включить или отключить Xray sniffing |
Для MikroTik с ограниченной RAM:
LOG_LEVEL=warning
DEBUG_STARTUP=0
XRAY_BUFFER_SIZE=0
HEV_STACK_SIZE=16384
ENABLE_UDP=false
MTU=1280
Если роутер всё равно убивает контейнер под большой нагрузкой, попробуйте:
HEV_STACK_SIZE=8192
ENABLE_SNIFFING=false
Также уменьшите количество клиентов, которые идут через контейнер.
vless://[email protected]:443?type=tcp&security=reality&flow=xtls-rprx-vision&pbk=PUBLIC_KEY&fp=randomized&sni=www.google.com&sid=SHORTID&spx=%2F#Example
Будет сгенерирован Xray streamSettings:
"security": "reality",
"realitySettings": {
"fingerprint": "randomized",
"serverName": "www.google.com",
"publicKey": "PUBLIC_KEY",
"spiderX": "/",
"shortId": "SHORTID"
}
Для ссылок с:
security=tls
wrapper генерирует tlsSettings.
ALLOW_INSECURE используется только в TLS-режиме:
ALLOW_INSECURE=false
Для Reality-режима отдельные TLS-настройки не нужны, потому что Xray использует security=reality и realitySettings.
При старте контейнера wrapper-скрипт:
/etc/resolv.conf из RESOLV_DNSBYPASS_IPSBYPASS_DNSBYPASS_DOMAINSVLESS_URLCONTAINER_GW и CONTAINER_IFACEtun0Это позволяет избежать типичной TUN-петли, когда DNS или соединение до самого VLESS-сервера пытается идти через tun0.
Просмотр логов контейнера:
/log/print where message~"vless"
Вход в shell контейнера:
/container/shell vless
Полезные проверки внутри контейнера:
ip a
ip route
cat /etc/resolv.conf
cat /etc/xray/config.json
cat /etc/hev-socks5/config.yaml
curl -v --socks5-hostname 127.0.0.1:1080 https://api.ipify.org
Проверить прямой маршрут до сервера:
nslookup server.example.com
ip route get SERVER_IP
Маршрут до VLESS-сервера должен идти через обычный интерфейс контейнера, например:
SERVER_IP via 172.17.0.1 dev veth-vless
BYPASS_DOMAINS резолвится только при старте контейнера.BYPASS_DNS и RESOLV_DNS.CONTAINER_IFACE используется для прямых маршрутов вне TUN.ENABLE_UDP=false рекомендуется для MikroTik с малым объемом RAM.root-dir контейнераMIT
Content type
Image
Digest
sha256:69a4b0304…
Size
20.5 MB
Last updated
21 days ago
docker pull deker1176/xray-mikrotik-custom:stable