Всем привет! Это моя первая статья на хабре, которая точно кому-то пригодится в данное время. Здесь я расскажу как ускорить ютуб и разблокировать доступ к некоторым заблокированным ресурсам прямо на роутере 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.1\flash\docker\tun2socks\entrypoint.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
в таком случае сам 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. т.к. пишу здесь первый раз, готов к вашим замечаниям и конструктивным комментариям и благодарю за понимание))
Комментарии (24)
Geraklll
26.08.2024 11:00+1Спасибо за статью! Подскажите пожалуйста, я правильно понимаю, что после этой настройки, ютуб будет работать на всех устройствах в домашней сети? в том числе и на смарт тв?
Euganis
26.08.2024 11:00Там смысл в том, что используются скрипты anti dpi. Сайты и Ютуб при этом будут работать, да. Но возможны такие штуки, как не отображение некоторых сайтов, страниц, капч.
Тогда этот режим придется отключать, или вручную писать конфиги для нужных сайтов.
Karlson_rwa
26.08.2024 11:00+1Спасибо, надо попробовать.
А можете написать (дополнить) инструкцию, как развернуть докер-образ в оперативке самого роутера, чтобы ничего внешнего вообще не использовать, а образ сам бы всегда разворачивался при ребуте? На канале микротика в ютубе есть коротенькое руководство, но я не настоящий сварщик :)
Dife
26.08.2024 11:00+1Развернуть докер-образ в оперативке нельзя - это просто изолированная файловая система, внутри которой запускается какой то процесс (приложение, утилита и т.д.), вот он то уже и существует в ОП.
То, что создается в файловой системе роутера или внешнего хранилища и есть файловая система образа, которую тоже надо где то хранить, когда контейнер запущен.
В принципе используемые образы довольно немного весят и могут вполне обойтись внутренним хранилищем роутера, если оно позволяет, это к слову об использовании чего то внешнего, а для запуска контейнеров при перезапуске роутеров, там есть отдельный чек-бокс для их запуска в параметрах контейнера - "Start on Boot"Karlson_rwa
26.08.2024 11:00Т.е. это не подходящая инструкция https://www.youtube.com/watch?v=KO9wbarVPOk ?
Везде пишут, что контейнеры лучше запускать в отдельной памяти, у которой нет проблем с количеством циклов перезаписи. Это не так что ли? Я хочу разобраться, как сделать правильно, чтобы и контейнер с обходом dpi можно было использовать и роутер при этом нормально жил. У меня только он постоянно в сеть воткнут, другие устройства периодически выключаются.
Radiohead72
26.08.2024 11:00А какая концепция этого решения?
Каким собственно образом обходится блокировка? Я не очень попимаю...
Как работает обход через ВПН все прекрасно понимают.
А тут как? Что куда и как "ходит"?
nApoBo3
26.08.2024 11:00+6Блокировку youtube по ip они делать пока не решаются, поскольку это подсети google, на них очень много чего потребительского завязано. Заблокировать youtube и не поломать при этом android, gmail и кучу ещё всего отдельное искусство, если это вообще возможно. По этому производится анализ пакетов по косвенным признакам на специально оборудовании и пакеты похожие на видео поток режутся. Данный софт маскирует пакеты таким образом, чтобы простых характерных сигнатур у них не было.
Euganis
26.08.2024 11:00Скрипт анти DPI и socks тунель. DPI - метод который используется провайдерами для блокировки нехороших сайтов, на аппаратном уровне.
Этот режим работы преобразует стандартные пакеты, делая невозможным для провайдера понять какой сайт требуется открыть - упрощенно говоря.
Dife
26.08.2024 11:00+3Опередил меня :-D
Буквально несколько дней назад реализовал аналогичную схему, только для xray клиента (Да, кто не догадался, так можно цеплять и новомодный VPN) - пока полет нормальный, по ресурсам тоже все ок.
Суть в том, что пошерстив интернет понял, что на микротик о данных реализациях информации толком нет и есть лишь общие упоминания на паре форумах об аналогичной схеме с двумя контейнерами, поэтому я и решился написать гайд, но ты оказался быстрее)
Спасибо тебе! Уверен, что многие многие пользователи микротиков страдали от того, как им создать аналогичные схемы господ с OpenWRT.
NickSin
26.08.2024 11:00Спасибо за статью.
А есть какой-то более простой способ на микротике spoof по DPI делать ? Оно бы и на более старых версиях RouterOS работало.
FFR_666
26.08.2024 11:00+1К сожалению мой роутер не подходит по характеристикам, но прочитал с удовольствием и уже знаю на что обращать внимание при обновлении роутера! P.S. Очень приятный и понятный слог !
Alexsey
26.08.2024 11:00+1Я все же остановился на варианте установки пометок роутинга на нужные пакеты по address list/tls host и отправке их на отдельный гейт для дальнейшей обработки. Раньше у меня таким гейтом просто выступал VPN интерфейс, но после того как вайргард отвалился с неделю назад поднял у себя на домашнем сервере виртуалку с openwrt и sing-box, но никто не мешает просто любой другой роутер с openwrt воткнуть.
Такой вариант работает с любым микротиком который вытягивает установку меток на пакетах и позволяет апгрейдить методы обхода без головной боли что микротик чего-то не умеет. Минус в том что чаще всего нужно выключать hardware offloading и fast track так что некоторые модели на MIPS могут начать захлебываться.
Kroligoff
26.08.2024 11:00+1Можешь написать статью ? У меня микротик без usb , но есть старый роутер с openwrt
Alexsey
26.08.2024 11:00На статью времени нет, но есть ссылки на основе которых можно плюс-минус понять что делать.
OpenWRT воткнуть WAN и любым LAN портом в одну сеть с микротом (возможно можно обойтись одним сетевым интерфейсом, у меня виртуалка поэтому я просто два сетевых интерфейса поднял для простоты) и указать WAN порту и LAN бриджу статические адреса в той же подсети что и вся остальная сеть микрота. У openwrt не забываем выключить раздачу DHCP.
Далее https://kiberlis.ru/mikrotik-wireguard-client/ (пункты 2.1, 2.3-2.5. Пропустить DHCP, в masquerade вместо out interface использовать routing mark, в ip->routing гейтвеем указать место wireguard1 айпишник LAN бриджа openwrt)
Далее поднимаем VLESS на VPS: https://habr.com/ru/articles/735536/
Настраиваем openwrt: https://habr.com/ru/articles/756178/. Есть нюанс - надо так же залезть в /etc/config/sing-box и прописать там следующее иначе не поднимется:
config sing-box 'main' option enabled '1' option user 'root' option conffile '/etc/sing-box/config.json' option workdir '/usr/share/sing-box' # list ifaces 'wan' # list ifaces 'wan6'
Для простоты настройки sing-box можно скачать nekoray, в него вгрузить конфиг из 3x-ui, настроить по желанию и экспортнуть конфиг для sing-box.
c46fd3da
26.08.2024 11:00Тоже использую подобную связку, но немного в другом контексте. Кстати в качестве TUN2SOCK КМК интереснее выглядит вот это https://github.com/heiher/hev-socks5-tunnel решение.
seitz
26.08.2024 11:00+3Мда, если бы у меня дома был такой микротик, я бы может и не женился бы никогда...
anbsmb
26.08.2024 11:00Спасибо!
Дополните, пожалуйста, статью. После создания Rule в Routing Filters для BGP подключения, в самом подключении на вкладке Filter, необходимо выбрать это самое правило, иначе в Route List в качестве Gateway будет оставаться адрес Remote Address BGP.
UI
wiktorbgu Автор
26.08.2024 11:00Добавил скриншот и комментариев к нему, а в целом здесь не про само подключение BGP.
Klochko
26.08.2024 11:00Классная статья!
Однако как это все поведет себя с IPTV? У меня после экспериментов с подобной конфигурацией IPTV закончилось. Не смарт не открывал видео, не обычный тв с приставкой от провайдера. Ютубчик ожил, но все остальное потухло.
NZakh61
Спасибо за статью.
Сильно ли сажает трафик на микторе с таким конфигом и как нагрузка вырастает на чипсет?
wiktorbgu Автор
Вообще не заметил нагрузки, скорость не падает.
Скрытый текст