Skip to content

Instantly share code, notes, and snippets.

@nskforward
Last active February 24, 2026 20:41
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

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

Обратите особое внимание, что очередность правил в файрволле критически важна!

Выборочная маршрутизация по списку доменов

Если вы хотите пустить через VPN только часть трафика (по списку доменов), то необходимо прописать правила ниже:

/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

Сам список доменов для некоторых популярных сервисов приведен в конце инструкции.

Весь трафик через VPN

Инструкция подразумевает, что ваша домашняя сеть имеет адрес 192.168.88.0/24. Иначе замените в правилах ниже адрес сети на ваш.

Если вы хотите пуситить весь трафик через VPN, то нужно прописать правила ниже:

/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 src-address=192.168.88.0/24 dst-address=!192.168.88.0/24 connection-mark=no-mark routing-mark=!to_vpn_table 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

Если вам нужно пустить трафик через VPN только с одного конкретного домашнего IP, то в поле src-address правила mark-connection указываем не всю домашнюю сеть 192.168.88.0/24, а конкретный IP - например, 192.168.88.123/32. При этом IP-адрес этого устройства нужно сделать статичтным, чтобы адрес не менялся после истечения аренды (таблица /ip arp - через WinBox выделяем в таблице нужное устройство - жмём make static).

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

Если у вас есть 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://..."

Если у вас ещё нет своего VPN-сервера, то вы можете его развернуть самостоятельно по инструкции: https://gist.github.com/nskforward/b4ee345cf825bd38e1642c4d753648be

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

/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

Без DNS-over-HTTPS (DOH) примерно половина запрещенных ресурсов не будет открываться, даже с настроенным VPN. Так как маршрутизация работает по IP, но чтобы получить IP домена, нужно сперва сходить к DNS серверу (читайте азы про работу интернета). По-умолчанию, используется DNS-сервер провайдера, который цензурирует все DNS-запросы, проходящие через него.

К примеру, вы в браузере открываете ресурс "https://instagram.com", браузер отправляется запрос на трансляцию домена instagram.com в IP адрес. DNS-запрос каскадно доходит до DNS-сервера провайдера (если ранее где-то не закешировано локально), в этом месте происходит цензура и вам в ответ возвращается фейковый IP-адрес, который ведёт на ресурс, вроде такого: "Извините, ресурс заблокирован на территории РФ". Более того, DNS провайдера может перхватывать незашифрованные DNS-запросы к другим внешним серверам.

Чтобы решить эту проблему, в Mikrotik нужно включить DOH, тогда провайдер не сможет расшифровать 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
add type=FWD match-subdomain=yes address-list=to_vpn_list name=youtube.ru
add type=FWD match-subdomain=yes address-list=to_vpn_list name=withyoutube.com
add type=FWD match-subdomain=yes address-list=to_vpn_list name=youtubego.co.id
add type=FWD match-subdomain=yes address-list=to_vpn_list name=youtubego.co.in
add type=FWD match-subdomain=yes address-list=to_vpn_list name=youtubego.com
add type=FWD match-subdomain=yes address-list=to_vpn_list name=youtubemobilesupport.com
add type=FWD match-subdomain=yes address-list=to_vpn_list name=1e100.net

WhatsApp

/ip dns static
add type=FWD match-subdomain=yes address-list=to_vpn_list name=whatsapp.net
add type=FWD match-subdomain=yes address-list=to_vpn_list name=whatsapp.com

ChatGPT

/ip dns static
add type=FWD match-subdomain=yes address-list=to_vpn_list name=openai.com
add type=FWD match-subdomain=yes address-list=to_vpn_list name=chatgpt.com
add type=FWD match-subdomain=yes address-list=to_vpn_list name=oaiusercontent.com

JetBrains

/ip dns static
add type=FWD match-subdomain=yes address-list=to_vpn_list name=jetbrains.com
add type=FWD match-subdomain=yes address-list=to_vpn_list name=jetbrains.ai

PornHub

/ip dns static
add type=FWD match-subdomain=yes address-list=to_vpn_list name=pornhub.com
add type=FWD match-subdomain=yes address-list=to_vpn_list name=pornhub.org
add type=FWD match-subdomain=yes address-list=to_vpn_list name=phncdn.com

Interactive Brokers

/ip dns static
add type=FWD match-subdomain=yes address-list=to_vpn_list name=interactivebrokers.com.hk
add type=FWD match-subdomain=yes address-list=to_vpn_list name=interactivebrokers.com
add type=FWD match-subdomain=yes address-list=to_vpn_list name=interactivebrokers.ie
add type=FWD match-subdomain=yes address-list=to_vpn_list name=au10tixservices.com

Бэкап

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

KataeFF commented Feb 23, 2026

Добрый день. Спасибо за инструкцию. Есть несколько вопросов.

  1. Настроил у себя маршрутизацию по списку доменов, загрузил те что были в конце инструкции и те что были ниже приведя их в нужную команду. И тут непонятки, некоторые ресурсы например nnm не работают пока их не занести в address lists, даже если они есть внесены в ДНС, куда можно капнуть что бы не заводить домены в Адрес лист?
  2. Если на ноуте в настройках стоит галка ipv6, то не все сайты открываются, тот же ютуб просто висит, не которые ресурсы не грузят картинки вообще, если ipv6 убрать, то работает хорошо. На компах и ТВ вопрос решается, там есть возможность откл работы с ipv6, а вот на телефоне не получается. Так же хотелось бы понять куда капнуть?
  3. Телега так же тупит, хотя если этот vless поднять на телефоне или компе, то все работает идеально.
    Домены телеги добавил как и в ДНС, так и адрес лист.

Вы же в общих чертах понимаете, как работает маршрутизация ipv6? Что из себя представляет контейнер и как в него попадает маркированный трафик? В контейнере крутится обычный alpine linux, который маркированный трафик маршрутизирует к серверу vless. Ваш ipv6 трафик вообще не попадает в него. Он идёт напрямую. А так как ipv6 более приоритетен, соответственно все проходит мимо vless. Убедитесь, что контейнер получает ipv6 подключитесь шелом и посмотрите. Убедитесь, что трафик ipv6 идёт через vless. Создайте правила ipv6 firewall mangle , для маркировки трафика, который перенаправить в контейнер. Убедитесь, что vps, получает ipv6 и маршрутизация на vps по ipv6 работает. Я десяток раз на разных хостинг площадках сталкивался, что ipv6 адрес в vps отдается, а трафик не ходит.

Если не получается, отключите получение ipv6 префикса и используйте ipv4

Спасибо! Доходчиво объяснили! Полез в VPS ))))

@NikB-HQ
Copy link

NikB-HQ commented Feb 23, 2026

Добрый день. Спасибо за инструкцию. Есть несколько вопросов.

  1. Настроил у себя маршрутизацию по списку доменов, загрузил те что были в конце инструкции и те что были ниже приведя их в нужную команду. И тут непонятки, некоторые ресурсы например nnm не работают пока их не занести в address lists, даже если они есть внесены в ДНС, куда можно капнуть что бы не заводить домены в Адрес лист?
  2. Если на ноуте в настройках стоит галка ipv6, то не все сайты открываются, тот же ютуб просто висит, не которые ресурсы не грузят картинки вообще, если ipv6 убрать, то работает хорошо. На компах и ТВ вопрос решается, там есть возможность откл работы с ipv6, а вот на телефоне не получается. Так же хотелось бы понять куда капнуть?
  3. Телега так же тупит, хотя если этот vless поднять на телефоне или компе, то все работает идеально.
    Домены телеги добавил как и в ДНС, так и адрес лист.

Вы же в общих чертах понимаете, как работает маршрутизация ipv6? Что из себя представляет контейнер и как в него попадает маркированный трафик? В контейнере крутится обычный alpine linux, который маркированный трафик маршрутизирует к серверу vless. Ваш ipv6 трафик вообще не попадает в него. Он идёт напрямую. А так как ipv6 более приоритетен, соответственно все проходит мимо vless. Убедитесь, что контейнер получает ipv6 подключитесь шелом и посмотрите. Убедитесь, что трафик ipv6 идёт через vless. Создайте правила ipv6 firewall mangle , для маркировки трафика, который перенаправить в контейнер. Убедитесь, что vps, получает ipv6 и маршрутизация на vps по ipv6 работает. Я десяток раз на разных хостинг площадках сталкивался, что ipv6 адрес в vps отдается, а трафик не ходит.
Если не получается, отключите получение ipv6 префикса и используйте ipv4

Спасибо! Доходчиво объяснили! Полез в VPS ))))

До VPS лезть рано.
Сначала в контейнер. Убедится, что он получил ipv6 адрес из префикса выданного провайдером.
Далее маркируете ipv6 трафик в mangle по тем же спискам. Они создаются в адрес листе для ipv6 автоматически .
Вы вообще как получаете ipv6?
Вы когда его получаете вы какой вес маршрута указываете? Route distance

@KataeFF
Copy link

KataeFF commented Feb 23, 2026

Добрый день. Спасибо за инструкцию. Есть несколько вопросов.

  1. Настроил у себя маршрутизацию по списку доменов, загрузил те что были в конце инструкции и те что были ниже приведя их в нужную команду. И тут непонятки, некоторые ресурсы например nnm не работают пока их не занести в address lists, даже если они есть внесены в ДНС, куда можно капнуть что бы не заводить домены в Адрес лист?
  2. Если на ноуте в настройках стоит галка ipv6, то не все сайты открываются, тот же ютуб просто висит, не которые ресурсы не грузят картинки вообще, если ipv6 убрать, то работает хорошо. На компах и ТВ вопрос решается, там есть возможность откл работы с ipv6, а вот на телефоне не получается. Так же хотелось бы понять куда капнуть?
  3. Телега так же тупит, хотя если этот vless поднять на телефоне или компе, то все работает идеально.
    Домены телеги добавил как и в ДНС, так и адрес лист.

Вы же в общих чертах понимаете, как работает маршрутизация ipv6? Что из себя представляет контейнер и как в него попадает маркированный трафик? В контейнере крутится обычный alpine linux, который маркированный трафик маршрутизирует к серверу vless. Ваш ipv6 трафик вообще не попадает в него. Он идёт напрямую. А так как ipv6 более приоритетен, соответственно все проходит мимо vless. Убедитесь, что контейнер получает ipv6 подключитесь шелом и посмотрите. Убедитесь, что трафик ipv6 идёт через vless. Создайте правила ipv6 firewall mangle , для маркировки трафика, который перенаправить в контейнер. Убедитесь, что vps, получает ipv6 и маршрутизация на vps по ipv6 работает. Я десяток раз на разных хостинг площадках сталкивался, что ipv6 адрес в vps отдается, а трафик не ходит.
Если не получается, отключите получение ipv6 префикса и используйте ipv4

Спасибо! Доходчиво объяснили! Полез в VPS ))))

До VPS лезть рано. Сначала в контейнер. Убедится, что он получил ipv6 адрес из префикса выданного провайдером. Далее маркируете ipv6 трафик в mangle по тем же спискам. Они создаются в адрес листе для ipv6 автоматически . Вы вообще как получаете ipv6? Вы когда его получаете вы какой вес маршрута указываете? Route distance

ipv6 дается провайдером.
Route distance 0 от провайдера.
в ipv6 address list есть адрес на интерфейс контейнер.

@NikB-HQ
Copy link

NikB-HQ commented Feb 23, 2026

ipv6 дается провайдером. Route distance 0 от провайдера. в ipv6 address list есть адрес на интерфейс контейнер.

Ну так сделайте, что бы при попадании в таблицу маршрутизации дистанция для 0::/0 "via interface" была 2 , и добавьте ещё один дефолт с дистанцией 1 и таблицей маршрутизации to_vpn_mark.
Сделайте по аналогии с ipv4.
Поймите, у вас трафик идёт напрямую, а должен через туннель.
Возьмите mtr-tiny и посмотрите трассу, куда идёт трафик.
Вы должны v6 трафик промаркировать, что бы он попал в таблицу to_vpn_mark и добрался до контейнера.
Подключится шелом к контейнеру и посмотреть как идёт трафик, получил ли контейнер ipv6 адрес или нет.

@rafgfdhh-sudo
Copy link

Здравствуйте, если не по теме, пжл. не пинайте. Кто-нибудь пробовал прикрутить AmneziaWG 2.0, т.к. такое ощущение (скорость упала катастрофически), что 3 сторона (провайдер r_0_t), начал замедлять (блочить) vless (пробывал менять транспорт не помогло). Может faq есть?

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