Всем привет! Это моя первая статья на хабре, которая точно кому-то пригодится в данное время. Здесь я расскажу как ускорить ютуб и разблокировать доступ к некоторым заблокированным ресурсам прямо на роутере Mikrotik и без VPN.
В моем случае используется MikroTik hAP ax3. Стоит упомянуть, что подойдут только роутеры с архитектурой ARM, ARM64 или x86 (CHR), которые и поддерживают контейнеры.

-
Прошивку желательно использовать 7.16, т.к. только в ней завезли DNS Forward запросы с использованием встроенного DoH.
Скоро версия выйдет в стабильном канале обновления, а пока в тестировании предрелизная версия на данный момент 7.16rc2.
Кто подходит под эти условия, велком под кат)
Для новичков добавил много скриншотов, т.к. не все ориентируются по командной строке.
-
Перед началом настройки рекомендую сделать бэкап конфигурации, чтобы быстро вернуться в рабочее состояние и начать заново при необходимости.
По настройке контейнеров есть официальная вики, но постараюсь всё кратко описать здесь.
Если команда /system/device-mode print
показывает container: yes
, то все ок, если нет, то для включения режима контейнеров на устройстве нужно выполнить следующую команду и следовать инструкциям в консоли:
/system/device-mode/update container=yes
Скорее всего придется скачать и доустановить пакеты Extra packages - Container для вашей платформы.
Для установки контейнеров не рекомендуется использовать внутреннюю память, поэтому на роутерах нужна внешняя память USB это флешка или жесткий диск и желательно USB 3.0 и выше отформатированный в ext3/ext4.
Для удобного доступа к файлам контейнеров я расшарил флешку на бридже локальной сети, куда устанавливаются контейнеры (здесь и далее обращайте внимание на имя usb накопителя в вашей системе):
/ip smb set enabled=yes interfaces=bridge
/ip smb shares add directory=usb1 name=flash
-
По умолчанию для samba присутствует пользователь guest без пароля. Для безопасности создайте своего пользователя и пароль.
UI SMB настройки

Далее мы создаем бридж для контейнеров, задаем ему адрес, создаем 2 интерфейса VETH с адресами и добавляем их в наш бридж:
/interface bridge add name=Bridge-Docker port-cost-mode=short
/ip address add address=192.168.254.1/24 interface=Bridge-Docker network=192.168.254.0
/interface veth
add address=192.168.254.5/24 gateway=192.168.254.1 name=BYEDPI-SOCKS
add address=192.168.254.2/24 gateway=192.168.254.1 name=TUN2SOCKS
/interface bridge port
add bridge=Bridge-Docker interface=BYEDPI-SOCKS
add bridge=Bridge-Docker interface=TUN2SOCKS
UI настройки Bridge, VETH


Установим URL-адрес реестра для загрузки контейнеров из реестра Docker и установим каталог извлечения tmpdir для подключенного usb носителя:
/container config set registry-url=https://registry-1.docker.io tmpdir=/usb1/docker/pull
UI Container config

Скачиваем образы контейнеров, привязываем их к созданным интерфейсам VETH и ставим на автоматический запуск при загрузке устройства:
-
В контейнере byedpi при запуске используется набор команд в аргументе cmd, которые вам возможно придется подбирать для своего провайдера (у меня дом.ру), чтобы обходить DPI, справку по настройке параметров можно посмотреть на гитхабе проекта.
/container/add remote-image=tazihad/byedpi:latest interface=BYEDPI-SOCKS cmd="--disorder 1 --auto=torst --tlsrec 1+s --debug 1" root-dir=/usb1/docker/byedpi start-on-boot=yes
/container/add remote-image=xjasonlyu/tun2socks:latest interface=TUN2SOCKS root-dir=usb1/docker/tun2socks start-on-boot=yes
Далее открываем файл 192.168.88.1flashdockertun2socksentrypoint.sh
-
Если вы будете искать файлы через проводник в WinBox и не увидите содержимое каталогов контейнеров, всему виной файлы пустышки с именем .type в каталогах, они скрывают их содержимое, чтобы не нагружать проводник файлов.

и до запуска контейнера заменяем его содержимое этим (рекомендую использовать редактор Notepad++):
Проводник файлов редактирование entrypoint.sh

#!/bin/sh
ip tuntap add mode tun dev tun0
ip addr add 198.18.0.1/15 dev tun0
ip link set dev tun0 up
ip route del default
ip route add default via 198.18.0.1 dev tun0 metric 1
ip route add default via 192.168.254.1 dev eth0 metric 100
ip route add 192.168.0.0/16 via 192.168.254.1 dev eth0
tun2socks -device tun0 -proxy socks5://192.168.254.5:1080 -interface eth0
-
Предпоследней командой мы настраиваем локальный маршрут через роутер к BYEDPI-SOCKS контейнеру, т.к. без этого все запросы на шлюз TUN2SOCKS будут уходить на более приоритетный маршрут tun0 с метрикой 1 внутрь туннеля, при этом коннекта с самим туннелем не будет.
Теперь можно запустить контейнеры. Проще всего это сделать через WinBox в окне Container
есть кнопка start.
UI Containers start

И как минимум кого-то может устроить вариант использования только контейнера BYEDPI-SOCKS с указанием его IP адреса и порта (192.168.254.5:1080)
в настройках или плагинах браузера, такой вариант удобно использовать сразу для проверки обхода DPI провайдера. Я использую браузер Мозила и плагин FoxyProxy.
-
Плагин настраивается достаточно просто, например, для ютуба можно экспортировать настройки, так же есть очень удобная фича в окне плагина "
Set tab proxy
", отлично подходит для проверок работоспособности сайта, чтобы не выискивать все используемые им хосты, а включить прокси только в текущей вкладке.
UI плагина FoxyProxy


Сначала рассмотрим настройку без получаемых маршрутов для роутинга на наши контейнеры по BGP
Будем использовать DNS Forward и списки хостов, которые будем пускать через нашу карусель из контейнеров анти dpi системы :)
Для начала установим срок хранения попавших в спискок адресов до одного дня, чтобы они не удалялись сразу же как только заканчивается TTL у полученной DNS записи:
/ip dns set address-list-extra-time=1d
Обязательно должен быть настроен DoH DNS, ибо можно получить "подарок" от провайдера с липовыми адресами используя не шифрованные запросы DNS.
Затем добавим хосты, которые нужно пускать через контейнер анти DPI:
/ip/dns/static/
add address-list=za_dpi_FWD forward-to=localhost match-subdomain=yes name=googlevideo.com type=FWD
add address-list=za_dpi_FWD forward-to=localhost match-subdomain=yes name=youtube.com type=FWD
add address-list=za_dpi_FWD forward-to=localhost match-subdomain=yes name=youtubei.googleapis.com type=FWD
add address-list=za_dpi_FWD forward-to=localhost match-subdomain=yes name=ytimg.com type=FWD
add address-list=za_dpi_FWD forward-to=localhost match-subdomain=yes name=youtu.be type=FWD
add address-list=za_dpi_FWD forward-to=localhost match-subdomain=yes name=ggpht.com type=FWD
add address-list=za_dpi_FWD forward-to=localhost match-subdomain=yes name=rutracker.org type=FWD
add address-list=za_dpi_FWD forward-to=localhost match-subdomain=yes name=rutracker.cc type=FWD
add address-list=za_dpi_FWD forward-to=localhost match-subdomain=yes name=medium.com type=FWD
-
Указанные домены с их поддоменами будут добавляться в список za_dpi_FWD, называется он так, чтобы быть в конце всех списков при сортировке по имени списка)
UI DNS static

Добавляем новую таблицу маршрутизации:
/routing table add disabled=no fib name=dpi_mark
И добавляем маршрут в эту таблицу на наш шлюз контейнер tun2socks:
/ip route add disabled=no distance=22 dst-address=0.0.0.0/0 gateway=192.168.254.2%Bridge-Docker pref-src="" routing-table=dpi_mark scope=30 suppress-hw-offload=no target-scope=10
Теперь добавим mangle правило, чтобы заворачивать все полученные в список хосты в таблицу маршрутизации dpi_mark где весь трафик пойдет на наш анти dpi туннель:
/ip firewall mangle add action=mark-routing chain=prerouting comment="заворачивание списка хостов по DNS FWD на тунель tun2socks => byedpi" connection-state="" dst-address-list=za_dpi_FWD in-interface-list=LAN new-routing-mark=dpi_mark passthrough=yes
UI таблица маршрутов и mangle mark route



Так же в правиле forward fasttrack connection нужно включить на вкладке general фильтр routing mark = main, так сайты из списков по манглу будут открываться быстрее.

Теперь чтобы это все работало корректно, нужно все запросы DNS отправлять на роутер, для этого нужно отключить в браузере запросы DoH (например в мозилле) и добавить перехват всех запросов DNS из локальной сети:
/ip firewall nat
add action=redirect chain=dstnat dst-port=53 in-interface-list=LAN protocol=udp
add action=redirect chain=dstnat dst-port=53 in-interface-list=LAN protocol=tcp
UI Firewall NAT

Всё! Можно начинать тестировать ютуб и сайты из добавленного списка, но с одним замечанием, нужно либо перезагрузить все устройства, что иногда сделать проще всего, чтобы на них очистился кеш DNS запросов, либо очистить его вручную и на роутере в том числе. Иначе необходимые адреса не попадут в списки для роутинга.
Все это прекрасно совмещается с аналогичным выходом на vpn ресурсов по другому списку хостов в DNS FWD, которые не обходятся таким способом, но здесь не об этом.
Теперь рассмотрим настройку с получаемыми маршрутами по BGP в т.ч. для Ютуба
Допустим мы уже получаем какие-то маршруты по BGP от сервисов antifilter и дополнительно хотим получать адреса для Ютуба чтобы сразу направить их на наши контейнеры.
UI BGP подключение


В таком случае нужно ко всем вышеперечисленным настройкам создать новую таблицу маршрутизации clear_out
/routing table add disabled=no fib name=clear_out
С маршрутом в интернет для этой таблицы, который у вас есть по дефолту, у меня это выше стоящий GPON роутер 192.168.1.100:
/ip route add disabled=no distance=24 dst-address=0.0.0.0/0 gateway=192.168.1.100 pref-src="" routing-table=clear_out scope=30 suppress-hw-offload=no target-scope=10
UI таблица маршрутов


Далее в фильтрах роутинга /routing/filter нужно для Ютуба прописать наш шлюз TUN2SOCKS:
if (bgp-communities includes 65444:770) {set gw 192.168.254.2%Bridge-Docker; accept;} else {set gw 10.10.0.1%wireguard-client-vpn; accept;}
UI фильтры маршрутов

Скорее всего у большинства по bgp приходят роуты в main routing table
, а теперь после выполнения последней команды есть роуты и на шлюз контейнера tun2socks
UI BGP и Route list

routing table
main

в таком случае сам socks контейнер byedpi
выводим в отдельную таблицу маршрутизации clear_out
которая выходит прямо в интернет, чтобы не зациклить маршрутизацию адресов ютуба и всего что отправляется на шлюз контейнера tun2socks
в таблице main
, т.к. ничего не будет работать.
/ip firewall mangle add action=mark-routing chain=prerouting comment="BYEDPI-SOCKS mark route to clear_out" connection-state="" new-routing-mark=clear_out passthrough=yes src-address=192.168.254.5
UI mangle mark routing

Это правило отлично подходит для проверки работоспособности, т.к. есть счетчики на правилах. Либо же его можно заменить аналогичным другим правилом в другом разделе:
/routing rule add action=lookup comment="BYEDPI-SOCKS mark route to clear_out" disabled=no src-address=192.168.254.5/32 table=clear_out
UI routing rules

Выбирайте на вкус и цвет, есть ли какая-то разница в производительности, не знаю. Иногда лучше видеть всё в настройках mangle
, в одном месте так сказать.
-
После этой настройки наш контейнер
BYEDPI-SOCKS (192.168.254.5:1080)
перестает быть напрямую доступным из локальной сети, поэтому использовать его из браузера как socks5 прокси становится невозможным. Может кто-то знает как это решить, пишите в комментариях.
Заключение
Большинство опытных пользователей получают маршруты по BGP и просто всё отправляют на VPN, простые пользователи борятся с проблемами доступа к заблокированным ресурсам разными бесплатными VPN'ами, вторых можно понять, да и первых, у кого старые роутеры без поддержки контейнеров.
После погружения в тему для мены стало удивлением, что много сайтов начали работать без VPN, поэтому меня привлекла логичная идея локально "лечить" трафик прямо на роутере.
После настройки этих двух контейнеров я даже отказался от BGP, потому что не так много сайтов я использую которые не доступны, все они прекрасно работают по спискам DNS FWD, тестирую уже неделю и полёт отличный.
В целом меня раззадорил спортивный интерес и, конечно же, проблемы с ютубом, которые на компе решались очень просто, но хотелось красивого решения на роутере, не зря же была куплена свежая железка с поддержкой контейнеров, после знакомства с которыми пару лет назад я понял, какой потенциал будет на будущее у моего роутера.
Спасибо всем за внимание!
P.S. т.к. пишу здесь первый раз, готов к вашим замечаниям и конструктивным комментариям и благодарю за понимание))
Автор: wiktorbgu
Здравсвуйте Виктор .
Вы конечно иописали все хорошо для тех кто в этом шарит . :-)
Я так не совсем все понял ,вы можете залить видео на Рутуб ?
У меня роутер Honor Router 3 модель XD20, можно ли его настроить по вашему блогу ?
Или есть ссылка для чайников :-)
Лично я задачу решил вообще без всякого программирования. За городом я использую на ноутбуке мобильный Wi-Fi с модемом и симкой внутри, у меня там оператор Билайн. Но это не критично, оператор может быть любым. Ютуб на мобильном не замедлили и в сельской местности он грузится без проблем (ну, немного медленнее).
Привёз этот модем в город, вставил в USB своего ПК, отключил сетевой провод – и всё, Ютуб грузится отлично! Когда мне хочется посмотреть Ютуб – отключаю сеть, вставляю модем – и смотрю без помех.