Skip to content

Instantly share code, notes, and snippets.

@nskforward
Last active January 24, 2026 18:52
Show Gist options
  • Select an option

  • Save nskforward/d143f4adde26ddf92001b0a84bc4de19 to your computer and use it in GitHub Desktop.

Select an option

Save nskforward/d143f4adde26ddf92001b0a84bc4de19 to your computer and use it in GitHub Desktop.
Настройка VPN-туннеля VLESS на роутере MikroTik

Настройка VPN (VLESS + Reality) на роутере Mikrotik

Обновление от 08.01.2026

Инструкция предполагает, что ваш роутер сброшен до заводских настроек.

Инструкция проверена на RouterOS версии 7.20

Проверка поддержки контейнеров

Не все модели Mikrotik поддерживают работу с контейнерами. Командами ниже пробуем проверить поддержку и установить.

Проверяем, установлен ли пакет container:

/system package print

Если в выводе нет container, то пытаемся установить:

/system package update
/system package enable container

Проверяем включена ли поддердка container в ядро ОС:

/system/device-mode/print

Если в выводе вы видите container: no, то пытаемся включить и перезагрузить устрйоство:

/system/device-mode/update container=yes

# После этой команды обязательно перезагружаем роутер по питанию
# Сразу после перезагрузки проверяем, появилась ли поддержка контейнеров командой:
/system/device-mode/print
# В выводе должно быть "container: yes"
# Если у вас не так, скорее всего ваша модель не поддерживает контейнеры. Возможно, вам поможет официальное руководство: https://help.mikrotik.com/docs/spaces/ROS/pages/84901929/Container

Создание сети

Создаём необходимые интерфейсы:

/interface/bridge add name=container
/ip/address add address=192.168.89.1/24 interface=container network=192.168.89.0
/interface/veth add address=192.168.89.2/24 gateway=192.168.89.1 name=vless
/interface/bridge/port add bridge=container interface=vless

Настройка маршрутизации:

/routing table add disabled=no fib name=to_vpn_table
/ip route add dst-address=0.0.0.0/0 gateway=192.168.89.2 distance=1 routing-table=to_vpn_table

Настройка файрвола:

/ip firewall address-list add list=to_vpn_list address=2ip.ru
/ip firewall mangle add action=change-mss chain=forward new-mss=1360 out-interface=container passthrough=yes protocol=tcp tcp-flag=syn tcp-mss=1453-6553
/ip firewall mangle add action=mark-connection chain=prerouting connection-mark=no-mark dst-address-list=to_vpn_list in-interface-list=!WAN new-connection-mark=to_vpn_mark passthrough=yes
/ip firewall mangle add action=mark-routing chain=prerouting connection-mark=to_vpn_mark new-routing-mark=to_vpn_table passthrough=no in-interface=!container
/ip firewall filter set [find action~"fasttrack-connection"] connection-mark=!to_vpn_mark

Создание контейнера

Если у вас есть USB флешка в роутере (рекомендуется), которая примонтирована, например, в usb1, то необходимо выполнить команду:

/container config set registry-url=https://registry-1.docker.io tmpdir=usb1/container-tmp layer-dir=usb1/container-tmp/layer

Иначе будет достаточно команды:

/container config set registry-url=https://registry-1.docker.io tmpdir=ramstorage

Создадим ENV переменную для контейнера с параметрами подключения к внешнему VPN-серверу:

# value заполняем своим значением от VLESS сервера (например, из 3X-UI панели):
/container envs add list=mihomo key=SRV1 value="vless://..."

Создаём и запускаем контейнер:

/container add envlists=mihomo interface=vless logging=no remote-image=registry-1.docker.io/wiktorbgu/mihomo-mikrotik:latest root-dir=usb1/container-tmp/docker/mihomo dns=8.8.8.8,8.8.4.4 start-on-boot=yes
/container start mihomo

Проверка работы

Пробуем из любого локальной сети отрыть в браузере ресурс: https://2ip.ru

При корректной работе в браузере должен отобразиться IP-адрес внешнего VPN-сервера

Также, в браузере должна открываться UI-панель самого Mihomo, работающая в контейнере по адресу: http://192.168.89.2:9090/ui/#/setup?hostname=192.168.89.2&port=9090&secret=

Настройка DNS

# Установка доверенных сертификатов (необходимо для DOH)
/certificate/settings/set builtin-trust-anchors=trusted

# Сохранение адресов вышестоящего DNS сервера, чтобы его самого не резолвить из вне
/ip dns static
add type=A name=dns.google address=8.8.8.8
add type=A name=dns.google address=8.8.4.4

# Включение DOH
/ip dns set use-doh-server=https://dns.google/dns-query verify-doh-cert=yes doh-max-server-connections=100 doh-max-concurrent-queries=300 doh-timeout=10s

# Отключаем старые DNS настройки
/ip dhcp-client set numbers=0 use-peer-dns=no
/ip dns set servers="" allow-remote-requests=yes

Открываем доступ к сревисам

# Instagram
/ip dns static
add type=FWD match-subdomain=yes address-list=to_vpn_list name=instagram.com
add type=FWD match-subdomain=yes address-list=to_vpn_list name=facebook.com
add type=FWD match-subdomain=yes address-list=to_vpn_list name=cdninstagram.com
add type=FWD match-subdomain=yes address-list=to_vpn_list name=fbcdn.net
# YouTube
/ip dns static
add type=FWD match-subdomain=yes address-list=to_vpn_list name=youtube.com
add type=FWD match-subdomain=yes address-list=to_vpn_list name=googlevideo.com
add type=FWD match-subdomain=yes address-list=to_vpn_list name=ytimg.com
add type=FWD match-subdomain=yes address-list=to_vpn_list name=ggpht.com
add type=FWD match-subdomain=yes address-list=to_vpn_list name=gvt1.com
add type=FWD match-subdomain=yes address-list=to_vpn_list name=youtube-nocookie.com
add type=FWD match-subdomain=yes address-list=to_vpn_list name=googleapis.com
add type=FWD match-subdomain=yes address-list=to_vpn_list name=gstatic.com
add type=FWD match-subdomain=yes address-list=to_vpn_list name=googleusercontent.com
add type=FWD match-subdomain=yes address-list=to_vpn_list name=l.google.com
add type=FWD match-subdomain=yes address-list=to_vpn_list name=yt.be
add type=FWD match-subdomain=yes address-list=to_vpn_list name=youtu.be

Бэкап

/system backup save name=usb1/backup/with_vpn.backup
@klim88
Copy link

klim88 commented Dec 9, 2025

http://192.168.89.2:9090/ui/#/setup?hostname=192.168.89.2&port=9090&secret=
не открывается , можно как то исправить? или это криво встал контейнер ?
остальное работает
а какое дописать правило чтобы весь трафик от одного ip отправлял в туннель?

@hitechpol-web
Copy link

При установке на чистую OS настройка файрволла
/ip firewall mangle add action=mark-connection chain=prerouting connection-mark=no-mark dst-address-list=to_vpn_list in-interface-list=!WAN new-connection-mark=to_vpn_mark passthrough=yes пишет input does not match any value of interface-list
на что он ругается ? что нужно сделать.

@nskforward
Copy link
Author

http://192.168.89.2:9090/ui/#/setup?hostname=192.168.89.2&port=9090&secret= не открывается , можно как то исправить? или это криво встал контейнер ? остальное работает а какое дописать правило чтобы весь трафик от одного ip отправлял в туннель?

/ip firewall address-list add list=to_vpn_list address=ВАШ_IP_ИЛИ_ДОМЕН

@nskforward
Copy link
Author

При установке на чистую OS настройка файрволла /ip firewall mangle add action=mark-connection chain=prerouting connection-mark=no-mark dst-address-list=to_vpn_list in-interface-list=!WAN new-connection-mark=to_vpn_mark passthrough=yes пишет input does not match any value of interface-list на что он ругается ? что нужно сделать.

Значит, что у вас нет псевдонима WAN для выходного интерфейса, что я впервые встречаю. Сходу других идей нет, нужно смотреть ваши настройки. Попробуйте через UI админки роутера найти это поле и посмотреть, что предлагается в вариантах значений для поля in-interface-list. У вас вообще интернет то работает без VPN?

@Doomedzxc
Copy link

Doomedzxc commented Jan 6, 2026

В чем может быть ошибка? все работает кроме веб панели ( ошибка 404 )
так же не работает команда ramstorage

@nskforward
Copy link
Author

По веб-панели - нужно исследовать, короткого ответа нет. Включите логи контейнера и перезапустите его. Скорее всего увидите какую-то ошибку.
По ramstorage тоже нужно описание ошибки. Просто не работает - мало о чём говорит.

@Doomedzxc
Copy link

микрот не знает такой команды как ramstorage, мб с патчем поменяли синтаксис

@NikB-HQ
Copy link

NikB-HQ commented Jan 7, 2026

В чем может быть ошибка? все работает кроме веб панели ( ошибка 404 ) так же не работает команда ramstorage

В свойствах контейнера нужно указать первичный DNS 8.8.8.8 вместо 192.168.89.1
Смотрите логи при запуске. там же все написано, что проблема из за разрешения имен.

@klim88
Copy link

klim88 commented Jan 7, 2026

В чем может быть ошибка? все работает кроме веб панели ( ошибка 404 ) так же не работает команда ramstorage

В свойствах контейнера нужно указать первичный DNS 8.8.8.8 вместо 192.168.89.1 Смотрите логи при запуске. там же все написано, что проблема из за разрешения имен.

супер, спасибо, заработало

@nskforward
Copy link
Author

Дополнил инструкцию - явно прописал команду для варианта с ramstorage и исправил DNS контейнера на 8.8.8.8

@solojed
Copy link

solojed commented Jan 13, 2026

Подскажите - можно как то добавлять в "to_vpn_list" листы из внешних источников?
Можно ли их автоматически поключить или конвертировать? Как например в OpenWRT через PODKOP - выбрать нужный и все, он сам с заданной периодичностью обновляется.
Например из https://github.com/itdoginfo/allow-domains
там есть в Russia inside список готовый для микротик
https://raw.githubusercontent.com/itdoginfo/allow-domains/refs/heads/main/Russia/inside-mikrotik-fwd.lst
Или взять сырой RAW https://raw.githubusercontent.com/itdoginfo/allow-domains/main/Russia/inside-raw.lst
И дописать в начале каждой строки?
add type=FWD match-subdomain=yes address-list=to_vpn_list name=
UPD - добавил, сработало

P.S. - укажите пожалуйста, что носитель USB должен быть в ext4 - я полчаса убил на понимание, почему команды не могут создать директории (-.-)
Или ссыла для подготовки носителя
https://wiki.dbpbox.com/vpn/mikrotik/vless/podgotovka-mikrotik

P.P.S. Судя по всему - в панели доступно обновление и проверка версии на более актуальную (Версия v1.235.0 / v1.19.18 )
Но когда тыкаешь на бесконечность (обновление?) - она крутится но ничего не происходит.
В логах при этом это
time="2026-01-14T01:35:20.502248706+03:00" level=warning msg="[TCP] dial GLOBAL (match Match/) mihomo --> github.com:443 error: dns resolve failed: couldn't find ip"
time="2026-01-14T01:35:20.502723331+03:00" level=warning msg="can't download file: Get "https://github.com/MetaCubeX/metacubexd/archive/refs/heads/gh-pages.zip\": EOF"

P.P.P.S.
При выполнении на прошивке 7.21 выдает ошибку - там настройки по другому сделаны, больше галок стало.
/certificate/settings/set builtin-trust-anchors=trusted
expected end of command (line 1 column 27)

P.P.P.P.S.
В "Настройка DNS" - может п.2 в начале поставить это для скачивания и импорта сертификатов?
/tool fetch url=https://curl.se/ca/cacert.pem
/certificate import file-name=cacert.pem passphrase=""

@NikB-HQ
Copy link

NikB-HQ commented Jan 15, 2026

По поводу списков.
Russia inside список готовый для микротик
https://raw.githubusercontent.com/itdoginfo/allow-domains/refs/heads/main/Russia/inside-mikrotik-fwd.lst
Что вам мешает привести их к нужному формату? Для примера вот адрес из списка.
/ip dns static add name=4pda.to type=FWD address-list=allow-domains match-subdomain=yes forward-to=localhost
простой скрипт и сможете его привести к любому нужному формату.
Или добавьте еще одно правило mangle для списка allow-domains.
Дело 2х минут.
То, что касается DoH он всегда так ведет себя в зависимости от версии.
Приведите к в соответствии к
/certificate/settings/print
builtin-trust-store: all
crl-download: no
crl-use: no
crl-store: ram
Для первичного скачивания сертификатов укажите DNS явно.
По поводу панели, в чем проблема скачать образ с гита и поправить сборку, как вам удобно.
У меня например текущая 1.235.0 от 2025-12-25 https://github.com/MetaCubeX/metacubexd
На текущий момент последняя. Может стоит пересобрать контейнер?

@rafgfdhh-sudo
Copy link

rafgfdhh-sudo commented Jan 15, 2026

Для счастливых обладателей чат-ботов в телеге, крохотный скрипт для оповещения (только один раз, без долбёжки) при остановке контейнера.

Настройка:

  • botToken - ваш токен бота
  • chatId - ваш ID чата
  • interval - период проверки статуса (в мин.)

Установка: всё выделить и вставить (с вашими данными) в New Terminal.

RoutersOS: 7.20.1 (на других не тестил, предполагаю проблем не должно быть)

Вывод в 📱:

🔴 Микротик: ОШИБКА КОНТЕЙНЕРА

Статус: STOPPED
Время: 14:32:15

Код:
/system script add name=monitor-container policy=read,write,test source={
:local botToken "_________________________________"
:local chatId "__________________________________"
:local containerName "mihomo-mikrotik:latest"
:do {
    :local cId [/container find name=$containerName]
    
    :if ([:len $cId] > 0) do={
        :local isRunning [/container get $cId running]
        :local currentState
        
        :if ($isRunning = true) do={
            :set currentState "running"
        } else={
            :set currentState "not-running"
        }
        
        :local schedId [/system scheduler find name="check-container"]
        :local lastState ""
        
        :if ([:len $schedId] > 0) do={
            :set lastState [/system scheduler get $schedId comment]
        }
        
        :if ($currentState = "not-running" && $lastState = "running") do={
            :local isStopped [/container get $cId stopped]
            :local isStopping [/container get $cId stopping]
            :local statusText "UNKNOWN"
            
            :if ($isStopped = true) do={ :set statusText "STOPPED" }
            
            :local time [/system clock get time]
            :local msg "%F0%9F%94%B4%20%D0%9C%D0%B8%D0%BA%D1%80%D0%BE%D1%82%D0%B8%D0%BA:%20%D0%9E%D0%A8%D0%98%D0%91%D0%9A%D0%90%20%D0%9A%D0%9E%D0%9D%D0%A2%D0%95%D0%99%D0%9D%D0%95%D0%A0%D0%90%0A%0A%D0%A1%D1%82%D0%B0%D1%82%D1%83%D1%81:%20"
            :set msg ($msg . $statusText . "%0A%D0%92%D1%80%D0%B5%D0%BC%D1%8F:%20" . $time)
            
            /tool fetch mode=https url="https://api.telegram.org/bot$botToken/sendMessage?chat_id=$chatId&text=$msg" keep-result=no
        }
        
        :if ([:len $schedId] > 0) do={
            /system scheduler set $schedId comment=$currentState
        }
    }
} on-error={}
}
/delay 1s
/system scheduler add name=check-container on-event=monitor-container interval=________m start-time=startup policy=read,write,test comment=""

@FecitFatum
Copy link

Спасибо за отличный гайд, всё настроил, работает отлично! Были проблемы с установкой контейнера "mihomo" на внешний HDD, приколоченному к роутеру. Настройка в APP, а именно место установки "usb1" решило проблему.
Простите, но я ни черта не смыслю в микротах, да и в общем и целом. Поэтому к вам вопрос, если, конечно, не затруднит. Как мне одно устройство, подключенное к роутеру, полностью завернуть в vpn-vless?

@iz241459-source
Copy link

iz241459-source commented Jan 24, 2026

Спасибо за отличный гайд, всё настроил, работает отлично! Были проблемы с установкой контейнера "mihomo" на внешний HDD, приколоченному к роутеру. Настройка в APP, а именно место установки "usb1" решило проблему. Простите, но я ни черта не смыслю в микротах, да и в общем и целом. Поэтому к вам вопрос, если, конечно, не затруднит. Как мне одно устройство, подключенное к роутеру, полностью завернуть в vpn-vless?

У всех микротик настроен индиувидуально, поэтому универсальной команды нет. Если вам это поможет, то вот:

/ip dhcp-server lease make-static [find address=192.168.1.41] (сделать локальный динамический IP адрес статическим - рекомендация! )

/ip firewall address-list
add address=192.168.1.41 list=ip_to_vpn comment="lokal_IP_to_freedom"

/ip firewall mangle
add action=mark-connection chain=prerouting src-address-list=ip_to_vpn
connection-mark=no-mark new-connection-mark=to_vpn_mark
comment="lokal_IP_to_freedom"

перетащить это правило, выше всех остальных mangle правил. Всё.

Если это затруднительно адаптировать к своим настройкам, тогда:
export file=conf.rsc сохранить конфиг в текстовой файл в корневой папке микротика. Далее перетащить на ПК, открыть в блокноте всё скопировать и скормить более менее нормальной языковой модели например (Claude-Sonnet-4.5 https://chatru.net/, если предложенный ИИ вариант не сработал, начинайте смело новую беседу (экономия денег), данная языковая модель мне дала правильный ответ уже на второй попытке). Всё

@nskforward
Copy link
Author

Спасибо за отличный гайд, всё настроил, работает отлично! Были проблемы с установкой контейнера "mihomo" на внешний HDD, приколоченному к роутеру. Настройка в APP, а именно место установки "usb1" решило проблему. Простите, но я ни черта не смыслю в микротах, да и в общем и целом. Поэтому к вам вопрос, если, конечно, не затруднит. Как мне одно устройство, подключенное к роутеру, полностью завернуть в vpn-vless?

У всех микротик настроен индиувидуально, поэтому универсальной команды нет. Если вам это поможет, то вот: /ip firewall address-list add address=192.168.1.41 list=ip_to_vpn comment="lokal_IP_to_VPN"

/ip firewall mangle add action=mark-connection chain=prerouting src-address-list=ip_to_vpn connection-mark=no-mark new-connection-mark=to_vpn_mark comment="lokal_IP_to_VPN"

Я правильно понял, что у вас домашняя сеть 192.168.1.0/24? Если так, то необходимо также добавить исключение по попаданию локального трафика в VPN-туннель. Иначе ни VPN, ни вообще сеть на устройстве 192.168.1.41 не будет работать.

@rafgfdhh-sudo
Copy link

rafgfdhh-sudo commented Jan 24, 2026

Спасибо за отличный гайд, всё настроил, работает отлично! Были проблемы с установкой контейнера "mihomo" на внешний HDD, приколоченному к роутеру. Настройка в APP, а именно место установки "usb1" решило проблему. Простите, но я ни черта не смыслю в микротах, да и в общем и целом. Поэтому к вам вопрос, если, конечно, не затруднит. Как мне одно устройство, подключенное к роутеру, полностью завернуть в vpn-vless?

У всех микротик настроен индиувидуально, поэтому универсальной команды нет. Если вам это поможет, то вот: /ip firewall address-list add address=192.168.1.41 list=ip_to_vpn comment="lokal_IP_to_VPN"
/ip firewall mangle add action=mark-connection chain=prerouting src-address-list=ip_to_vpn connection-mark=no-mark new-connection-mark=to_vpn_mark comment="lokal_IP_to_VPN"

Я правильно понял, что у вас домашняя сеть 192.168.1.0/24? Если так, то необходимо также добавить исключение по попаданию локального трафика в VPN-туннель. Иначе ни VPN, ни вообще сеть на устройстве 192.168.1.41 не будет работать.

Вы правильно поняли, этот момент я упустил (конфиг достаточно пухлый, некоторые детали забываешь),, поэтому человеку предложил поработать с ИИ.

@FecitFatum
Copy link

У всех микротик настроен индиувидуально, поэтому универсальной команды нет. Если вам это поможет, то вот:

Спасибо, взял на заметку, точно пригодится. Но, я решил пойти другим путём. Чтобы весь траффик не отправлять в vpn-туннель, нашёл и просто вбил в фаер пул адресов, блокируемых РКН /ip firewall address-list add list=to_vpn_list address=35.156.0.0/14 (с трудом нашёл) Вроде работает. Так можно? Больше никаких манипуляций не нужно? Просто взял из этого гайда, по примеру: /ip firewall address-list add list=to_vpn_list address=2ip.ru

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment