Контейнер с VPN для Mikrotik, претендующий на универсальность
Собирал для себя, но выглядит так, что получилось достаточно хорошо для публикации.
Основан на Xray-core, туда же добавлены бинарники wireproxy awg и byedpi.
Также geoip.dat и geosite.dat были заменены на варианты, адаптированные для РФ
Конкретно geosite.dat был взят в варианте geosite:ru-blocked, т.е. заблокированные домены + домены, доступные только из РФ.
Есть возможность собрать обрезанный geoip.dat, содержащий только списки для РФ(об этом ниже). Также оставлена возможность прямого подключения к wireproxy awg и byedpi, например через браузерный плагин(foxy proxy или аналоги) - оба бинарника биндятся на ip контейнера(по умолчанию byedpi на порт 9999, а wireproxy на 9998)
Для кого это нужно?
Для тех, кому нужен только byedpi или только амнезия, весь этот велосипед затаскивать нет никакого смысла. Проще воспользоваться решениями от тов. wiktorbgu
А вот если нужен Vless, shadowsocks и тому подобные инструменты, которые умеет xray - тогда да, тогда вам сюда.
xray vless + hev-socks5-tunnel в одном контейнере!
wiktorbgu/vless-hev-socks5-tunnel-mikrotik
Полезные контейнеры для Mikrotik
Решил собрать в одном сообщении
https://hub.docker.com/u/wiktorbgu
—————————————————————————
AmneziaWG client and server on Mikrotik container
wiktorbgu/amneziawg-mikrotik
———————————————————————
xray vless + hev-socks5-tunnel in one container!
wiktorbgu/vless-hev-socks5-tunnel-mikrotik
—————————————————————————
ByeDPI + hev-socks5-tunnel in one container! < 4Mb
wiktorbgu/byedpi-hev-socks5-tunnel:mikro
————————————————————
Mikro container hev socks tunnel! <3Mb
wiktorbgu/hev-socks5-tunnel-mikrotik
————————————————
Mikro container ByeDPI! <100kb
wiktorbgu/byedpi-mikrotik
Почему был использован xray-core, а не sing-box? Потому что именно xray-core поддерживает wireguard-inbound в качестве точек входа, что очень удобно для маршрутизации траффика. Фактически, внутри контейнера нет вообще никаких настроек маршрутизации, просто наружу торчат wireguard интерфейсы. Настройка роутера так же в связи с этим становится достаточно тривиальной и сводится к обычной конфигурации wireguard подключения. Сам контейнер при этом вообще не обязан размещаться на роутере, его вполне можно выселить на малинку, если роутеру не хватает ресурсов. Алярма! Attention! Achtung! В последней версии xray-core сломали маршрутизацию по тегам для wireguard инбаундов. Уже как будто чинят обратно, но пока самая рабочая версия - v24.10.31 (которая и была использована).
Почему был использован wireproxy awg, а не нормальный amnesia wireguard в tun режиме? Потому что лично у меня обычная сборка amnesia-wg работала криво, непредсказуемо отваливалась и по логам было совершенно непонятно, что именно с ней происходит. Wireproxy в свою очередь продемонстрировал высокую стабильность, простоту, а логов там даже слишком много. Из дополнительных плюсов - можно настроить ливнес пробы, можно вывесить наружу веб ручку с текущим статусом подключения и состоянием пробы, всё это при необходимости можно собирать wireproxy экспортером, собирать прометеем и выводить в графане. Т.е. весьма широкие возможности по настройке автоматизаций и мониторинга. В рамках данного контейнера не реализовано, кому такое надо - легко сами справятся с докой, но сам факт очень греет. Конфигурация так же проста как три рубля. Лично мне решение очень понравилось, единственный его минус - прожорливость до ОЗУ.
Зачем нужно было запихивать всё в один контейнер? В целом - особо незачем. Обе прокси (что wireproxy, что ciadpi) спокойно могут жить в отдельных контейнерах, просто вывесив порт наружу. Работать будет точно так же. Но при запихивании в один контейнер добавление общего бизибокса стоит очень дёшево, зато предоставляют более-менее адекватный шелл для отладки и позволяет сделать человеческий вывод логов и хоть какую-то автоматизацию в генерации конфигов. Опять же, решение под ключ - это удобно.
Как это настраивать?
Для начала стоит учесть, что контейнеру для нормальной работы требуется хотя бы 80-100мб свободной оперативной памяти, а по настоящему хорошо он начинает чувствовать себя при 200-250Мб. Соотв hap AC2 - в пролёте, не нужно мучать зверушку, лучше докупить к нему малинку в помощь. Пробовать запихивать на сам роутер можно начиная с hap AC3, а лучше всего на hap AX2 или AX3. Вроде бы в тестовой ветке RouterOS прикрутили возможность добавить своп, но как именно это работает - лично я не проверял. Если кто хочет проэксперементировать - велком.
Также инструкция предполагает, что на текущий момент, читателем уже прочитаны материалы по контейнерам на ROS, например статья на хабре или офф. дока, а также есть понимание, как конфигурить wireguard интерфейсы на микротах(например можно ознакомиться со статьёй про соединение двух микротов через WG), т.е. не возникает слишком удивляющих вопросов на тему “чем это таким мы тут будем заниматься?”.
Подготовка роутера.
На микроте ставим пакет с контейнерами, ребутаемся, включаем контейнеры
/system/device-mode/update container=yes
На железке после этого нужно будет нажать кнопку mode за ограниченное время, удалённо включить контейнеры не выйдет, т.к. потанцевальная дыра в безопасности. Дальше создаём VETH для нашего контейнера, создаём отдельный бридж для контейнеров, навешиваем туда ip адреса(я тут добавляю и ipv6 и ipv4 адрес. На самом деле для схемы с роутингом через WG интерфейс достаточно только v4, но у меня все контейнеры настроены единообразно, так что для общего понимания оставлю)
/interface/veth/add address=172.20.0.2/24,fd08:172:20::2/64 gateway=172.20.0.1 gateway6=fd08:172:20::1 name=xray_eth
/interface/bridge/add name=containers
/interface/bridge/port/add bridge=containers interface=xray_eth
/ip/address/add address=172.20.0.1/24 interface=containers
/ip/firewall/nat/
add action=masquerade chain=srcnat comment="from containers masq" out-interface=containers src-address=192.168.88.0/24
add action=masquerade chain=srcnat comment="from containers masq" out-interface-list=WAN src-address=172.20.0.0/24
/ipv6/address/add address=fd08:172:20::1 interface=containers
/ipv6/firewall/nat/
add action=masquerade chain=srcnat comment="from containers masq" out-interface-list=WAN src-address=fd08:172:20::/64
add action=masquerade chain=srcnat comment="to containers masq" out-interface=containers
/ipv6/firewall/filter/add action=accept chain=forward comment="Allow Containers" out-interface-list=WAN src-address=fd08:172:20::/64