AmneziaWG+MikroTik
Find a file
2026-02-24 23:03:01 +03:00
Builds arm fix 2026-02-24 22:52:05 +03:00
Containers nftables fix 2026-02-24 23:03:01 +03:00
Demonstration Small update Readme 2026-02-22 20:51:42 +03:00
README.md Update README.md 2026-02-24 22:56:35 +03:00

💥 AmneziaWG + MikroTik 💥

img

💫 Аналог XRay Vless Reality + MikroTik

В данном репозитории рассматривается работа MikroTik RouterOS V7.21.3+ с проектом Amnezia WG. В процессе настройки, относительно вашего оборудования, следует выбрать вариант реализации с контейнером внутри RouterOS (Вариант №1) или без контейнера (Вариант №2). Второй вариант подойдёт к любому домашнему роутеру который хоть немного умеет работать с аналогичными в MikroTik адрес-листами или имеет расширенный функционал по маршрутизации.

Контейнеры поддерживают файл конфигурации для AmneziaWG 1.5 и 2.0 Используйте в конфиге awg0.conf параметры I1-I5 при необходимости. Подробнее о версии 1.5 и 2.0 тут.

Предполагается что вы уже настроили серверную часть AmneziaWG на удалённом VPS/VDS и например, с помощью приложения на смартфоне или ПК протестировали отдельную конфигурацию для клиента. Подготовили новый конфиг из приложения через "Поделиться VPN" => "Формат подключения" => "Оригинальный (нативный) формат AmneziaWG".

🏫 Внимание! Инструкция среднего уровня сложности. Перед применением настроек вам необходимо иметь опыт в настройке MikroTik уровня сертификации MTCNA.

В репозитории присутствует инструкция с готовыми контейнерами и шаблоны для самостоятельной сборки в каталоге "Containers". В конфигурации шаблонов предусмотрена маршрутизация IPv6. Контейнеры делятся на три архитектуры ARM, ARM64 и x86.



Преднастройка RouterOS

⚠️ Отключите FastTrack в RouterOS.

Создадим отдельную таблицу маршрутизации:

/routing table 
add disabled=no fib name=r_to_vpn

Добавим address-list "to_vpn" что бы находившиеся в нём IP адреса и подсети заворачивать в пока ещё не созданный туннель

/ip firewall address-list
add address=8.8.4.4 list=to_vpn

Добавим address-list "RFC1918" что бы не потерять доступ до RouterOS при дальнейшей настройке

/ip firewall address-list
add address=10.0.0.0/8 list=RFC1918
add address=172.16.0.0/12 list=RFC1918
add address=192.168.0.0/16 list=RFC1918

Добавим правила в mangle для address-list "RFC1918" и переместим его в самый верх правил.

⚠️ Что бы правило применилось успешно, у вас уже должен быть Interface list "WAN" с внесёнными в него интерфейсами (кабель от провайдера). В конфигурации поумолчанию MikroTik добавляет его сам. Если их нет, тогда нужно создать лист в разделе Winbox interface => list

/interface/list/add name=WAN
/interface/list/member/add list=WAN interface=ether1

/ip firewall mangle
add action=accept chain=prerouting dst-address-list=RFC1918 in-interface-list=!WAN

Добавим правило транзитного трафика в mangle для address-list "to_vpn"

/ip firewall mangle
add action=mark-connection chain=prerouting connection-mark=no-mark dst-address-list=to_vpn in-interface-list=!WAN \
    new-connection-mark=to-vpn-conn passthrough=yes

Добавим правило для транзитного трафика отправляющее искать маршрут до узла назначения через таблицу маршрутизации "r_to_vpn", созданную на первом шаге

/ip firewall mangle
add action=mark-routing chain=prerouting connection-mark=to-vpn-conn in-interface-list=!WAN new-routing-mark=r_to_vpn \
    passthrough=yes

Маршрут по умолчанию в созданную таблицу маршрутизации "r_to_vpn" добавим чуть позже.

Два выше обозначенных правила будут работать только для трафика, проходящего через маршрутизатор. Если вы хотите заворачивать трафик, генерируемый самим роутером (например команда ping 8.8.4.4 c роутера для проверки туннеля в контейнере), тогда добавляем ещё два правила (не обязательно). Они должны находиться по порядку, следуя за выше обозначенными правилами.

/ip firewall mangle
add action=mark-connection chain=output connection-mark=no-mark \
    dst-address-list=to_vpn new-connection-mark=to-vpn-conn-local \
    passthrough=yes
add action=mark-routing chain=output connection-mark=to-vpn-conn-local \
    new-routing-mark=r_to_vpn passthrough=yes

Вариант №1. RouterOS с контейнером

Данный пункт настройки подходит только для устройств с архитектурой ARM, ARM64 или x86. Перед запуском контейнера в RouteOS убедитесь что у вас включены контейнеры. С полным списком поддерживаемых устройств можно ознакомится тут.

⚠️ Предполагается что на устройстве (или если есть USB порт с флешкой) имеется +- 40 Мбайт свободного места для разворачивания контейнера внутри RouterOS. Сам контейнер весит не более 25 Мбайт. Если места не хватает, его можно временно расширить за счёт оперативной памяти. После перезагрузки RouterOS, всё что находится в RAM, стирается.

Включение функции контейнеров в RouterOS

Основная инструкция по включению функции контейнеров находится ТУТ или ТУТ

Порядок действий выглядит так:

  • Обновляемся до последней версии RouterOS
  • Скачиваем дополнительный пакет из расширений "all packages" на официальном сайте
  • Устанавливаем пакет
  • Включаем функцию контейнеров

Готовые контейнеры

Где взять контейнер?

Выбираем один из трёх вариантов:

  1. Скачать готовый контейнер в формате "tar" из текущего репозитория каталога "Builds"
  2. Cкачать готовый образ под выбранную архитектуру из Docker Hub
  3. Cобрать самому из текущего репозитория каталога "Containers"

Выбрав вариант с готовым образом 1 или 2 переходим сразу к настройке.

Для самостоятельной сборки следует установить подсистему Docker buildx, "make" и "go".

В текущем примере будем собирать на Windows:

  1. Скачиваем Docker Desktop и устанавливаем
  2. Скачиваем нужный раздел для сборки из каталога "Containers" под вашу архитектуру RouterOS.
  3. Открываем CMD и переходим в раздел (cd <путь до каталога>)
  4. Запускаем Docker с ярлыка на рабочем столе (окно приложения должно просто работать в фоне при сборке) и через cmd собираем контейнер под выбранную архитектуру RouterOS
  • ARMv7 (arm/v7) — спецификация 7-го поколения оборудования ARM, которое поддерживает только архитектуру AArch32.
  • ARMv8 (arm64/v8) — спецификация 8-го поколения оборудования ARM, которое поддерживает архитектуры AArch32 и AArch64.
  • AMD64 (amd64) — это 64-битный процессор, который добавляет возможности 64-битных вычислений к архитектуре x86

Для ARMv7 (arm)

docker buildx build --build-arg ARCHITECTURE=arm --no-cache --platform linux/arm/v7 --output=type=docker --tag docker-awg-arm:latest . 

Для ARMv8 (arm64)

docker buildx build --build-arg ARCHITECTURE=arm64 --no-cache --platform linux/arm64/v8  --output=type=docker --tag docker-awg-arm64:latest . 

Для amd64

docker buildx build --build-arg ARCHITECTURE=amd64 --no-cache --platform linux/amd64 --output=type=docker --tag docker-awg-amd64:latest .

Иногда процесс создания образа может подвиснуть из-за плохого соединения с интернетом. Следует повторно запустить сборку. После окончания сборки, необходимо выгрузить контейнер на RouterOS

Настройка контейнера в RouterOS

В текущем примере на устройстве MikroTik флешки нет. Хранить будем всё в корне. Если у вас есть USB порт и флешка, лучше размещать контейнер на ней. Можно комбинировать память,развернув "tmp" каталог (создадим его чуть ниже) в расшаренный диск за счёт оперативной памяти, а сам контейнер разворачивать в постоянной памяти.

Пример использования RAM в качестве временного хранилища размером 100 Мегабайт (не обязательно)

/disk
add slot=ram tmpfs-max-size=100M type=tmpfs

Если контейнер не запускается на флешке. Например, вы хотите разместить контейнер в каталоге /usb1/docker/awg. Не создавайте заранее каталог awg на USB-флеш-накопителе. При создании контейнера добавьте в команду распаковки параметр "root-dir=usb1/docker/awg", в этом случае контейнер распакуется самостоятельно, создав каталог /usb1/docker/awg и запустится без проблем.

В RouterOS выполняем:

  1. Создадим интерфейс для контейнера
/interface veth
add address=172.18.20.2/30 gateway=172.18.20.1 gateway6="" name=docker-awg-veth
  1. Добавим правило в mangle для изменения mss для трафика, уходящего в контейнер. Поместите его после правила с RFC1918 (его мы создали ранее).
/ip firewall mangle
add action=change-mss chain=forward new-mss=1360 out-interface=docker-awg-veth passthrough=yes protocol=tcp tcp-flags=syn tcp-mss=1420-65535
  1. Назначим на созданный интерфейс IP адрес. IP 172.18.20.2 возьмёт себе контейнер, а 172.18.20.1 будет адрес RouterOS.
/ip address
add interface=docker-awg-veth address=172.18.20.1/30
  1. В таблице маршрутизации "r_to_vpn" создадим маршрут по умолчанию ведущий на контейнер
/ip route
add distance=1 dst-address=0.0.0.0/0 gateway=172.18.20.2 routing-table=r_to_vpn
  1. Включаем masquerade для всего трафика, уходящего в контейнер.
/ip firewall nat
add action=masquerade chain=srcnat out-interface=docker-awg-veth
  1. Создадим каталог в корне "wg"
/file add type=directory name=wg

Отредактируем файл подключения клиента к серверу AWG. В примере это файл awg0.conf (назовите его также), текстовую конфигурацию для которого, сформировало приложение AmneziaVPN. (Копируем настройки Amnezia WireGuard из приложения в виде текста и вставляем в файл awg0.conf).

Добавьте два нижеследующих параметра выше параметра [Peer] в котором 123.123.123.123/32 ваш реальный IP адрес из поля Endpoint:

PreUp = ip route add 123.123.123.123/32 via 172.18.20.1 dev docker-awg-veth
PostDown = ip route del 123.123.123.123/32 via 172.18.20.1 dev docker-awg-veth

В качестве разрешённых сетей нужно прописать (IPv4 обязательно. IPv6 по желанию):

AllowedIPs = 0.0.0.0/1, 128.0.0.0/1, ::/1, 8000::/1

В параметре Endpoint следует указать реальный IP адрес в место доменного имени и порт:

Endpoint = 123.123.123.123:45687

Должно получиться примерно так:

img

Поместите сформированный файл конфигурации awg0.conf в каталог "wg" на RouterOS используя Winbox или WinSCP.

  1. Создадим каталог в корне "tmp". Для временных файлов контейнера.
/file add type=directory name=tmp
  1. Создадим запись "mounts" для проброса файла конфигурации клиента AWG в контейнер
/container mounts
add dst=/etc/amnezia/amneziawg list=awg_conf src=/wg
  1. Сконфигурируем временный каталог и url для скачивания контейнера
/container config set tmpdir=tmp

/container/config/set registry-url=https://registry-1.docker.io tmpdir=/tmp
  1. Теперь создадим(распакуем) сам контейнер (не создавайте заранее каталог для параметра "root-dir")

⚠️ Если вы выбрали вариант с готовым контейнером в формате "tar" из текущего каталога "Builds", вам следуем загрузить архив контейнера, выбранный под вашу архитектуру, во внутреннее хранилище RouterOS, в каталог "tmp". Сделать это можно с помощью стандартных функций Winbox или WinSCP.

  • Для ARMv7 (arm) из текущего каталога "Builds"
/container add hostname=amnezia interface=docker-awg-veth mountlists=awg_conf root-dir=/amnezia logging=yes start-on-boot=yes file=tmp/awg-mikrotik-arm.tar
  • Для ARMv8 (arm64) из текущего каталога "Builds"
/container add hostname=amnezia interface=docker-awg-veth mountlists=awg_conf root-dir=/amnezia logging=yes start-on-boot=yes file=tmp/awg-mikrotik-arm64.tar
  • Для amd64 из текущего каталога "Builds"
/container add hostname=amnezia interface=docker-awg-veth mountlists=awg_conf root-dir=/amnezia logging=yes start-on-boot=yes file=tmp/awg-mikrotik-amd64.tar

⚠️ Если вы выбрали вариант готового образа из Docker Hub, в вышеописанных командах следует изменить окончание с file=tmp/awg-mikrotik-*****.tar на remote-image=catesin/awg-mikrotik-*****:latest где -***** название архитектуры.

Подождите немного пока контейнер распакуется до конца. В итоге у вас должна получиться похожая картина, в которой есть распакованный контейнер и файл конфигурации AWG.

Должно получиться примерно так

img

  1. Запускаем контейнер через WinBox в разделе меню "container" и проверяем что туннель у нас поднялся. В логах MikroTik вы увидите характерные сообщения о запуске контейнера.

В окне терминала можно подключиться к консоли самого контейнера

/container/print
/container/shell 0
  1. Проверка! Убедитесь что у вас появился поднятый интерфейс awg0, выполнив в консоли контейнера
ip a

img

Если интерфейс появился, можно сделать трассировку до любого IP узла в интернете прямо здесь, в консоли самого контейнера и убедиться, что сетевой пакет ушёл в туннель AWG. Если на первом хопе вы увидели адрес 172.18.20.1 значит донастройка файла конфигурации awg0.confпроизведена неверно. Нужно вернуться в пункт №6.

Первый хоп должен принадлежать нашему VPS на удалённой стороне. В примере это IP 10.8.1.0.

img

🔥🔥🔥 Поздравляю! Настройка завершена. Можно проверить доступность IP 8.8.4.4 из списка "to_vpn" (этот адрес мы добавили ранее).

Заключение

Что мы получили в итоге? Маршрутизацию трафика до контейнера AmneziaWG на стороне сервера VPS. RouterOS отправляет помеченные соединения из списка "to_vpn" в контейнер=>контейнер заворачивает трафик в туннель AWG=>Контейнер AWG на стороне VPS сервера получая пакет, отправляет его дальше в интернет.

PS. В контейнере есть "cat" для быстрого просмотра содержимого файлов, "top" для ознакомления с запущенными процессами.


Вариант №2. RouterOS без контейнера

Не известно введут ли разработчики MikroTik возможность нативной интеграции с AmneziaVPN. Вполне вероятно, что этого может не произойти. Если вам не повезло и ваш MikroTik не поддерживает контейнеры, не расстраивайтесь. Есть вполне рабочее решение, подходящее большинству роутеров (не только MikroTik). Нам нужен дополнительный мини ПК с одним сетевым портом и возможностью установить на него Debian Linux. Идея заключается в единоразовой настройке Debian с помощью экрана монитора с клавиатурой и последующее удалённое управление без необходимости подключения периферийных устройств.

Установка Debian Linux

Предполагается, что вы сможете самостоятельно установить Debian на мини ПК через GUI с редактированием некоторых значений в процессе установки, подключением кабеля ethernet к локальной сети вашего роутера. В настройках BIOS мини ПК желательно сделать автозапуск системы при появлении питания. Установка Debian Linux потребуется в самой минимальной конфигурации

img

На этапе выбора программного обеспечения устанавливаем Xfce (более стабилен при подключении через RDP), SSH сервер и стандартные системные утилиты.

img

Дальнейшие действия можно сделать подключившись через SSH к мини ПК.

Дадим root доступ для нашего пользователя (у вас он может быть другим)

su -
sudo usermod -aG sudo root-home

P.S. По вкусу можно установить apt install mc htop -y

Установка xrdp

Для удалённого управления клиентом AmneziaVPN нам понадобится RDP

apt-get update
apt-get install xrdp -y
systemctl enable xrdp
systemctl start xrdp

Включение маршрутизации в Linux

Маршрутизация нам необходима, так-как нужно передавать пакеты от роутера через Debian в туннель клиента AmneziaVPN. Фактически наш Debian будет ещё одним роутером.

Открываем файл

nano /etc/sysctl.conf

Ищем строку net.ipv4.ip_forward=, и приводим к виду net.ipv4.ip_forward=1. Снимаем комментарий. Сохраняем файл и перезагружаемся. Проверяем результат выполнив

sysctl net.ipv4.ip_forward

Должен получиться вывод net.ipv4.ip_forward = 1

Установка клиента AmneziaVPN

Подключаемся через RDP к мини ПК и устанавливаем AmneziaVPN, заранее переместив скачанный "AmneziaVPN_Linux_Installer.bin" в Debian. Переходим в каталог с файлом.

В текущем примере файл лежит в каталоге /opt/amneziavpn

Открываем терминал внутри RDP сессии и выполняем

cd /opt/amneziavpn
sudo chmod u+x AmneziaVPN_Linux_Installer.bin
sudo apt-get install libxcb-icccm4 libfontconfig1 libxcb-glx0 libx11-xcb1 libxcb-image0 libxcb-keysyms1 libxcb-randr0 libxcb-render-util0 libxcb-shape0 libxcb-sync1 libxcb-xfixes0 libxcb-xinerama0 libxcb-xkb1 libxkbcommon-x11-0 libgl1 -y
./AmneziaVPN_Linux_Installer.bin

После появления окна приложения AmneziaVPN делаем стандартную процедуру установки. В результате вы должны получить установленное приложение

img

Вставляем сформированный конфиг AmneziaWireGuard или OpenVPN в приложение. Включаем автозапуск при входе пользователя и автоподключение.

img

Настройка IPtables

Весь трафик, отправляемый в туннель, нужно провести через правило NAT MASQUERADE иначе удаённый сервер не будет знать куда отправлять трафик в обратную сторону.

Установим IPtables. На все сообщения в процессе установки отвечаем "ДА"

sudo apt install iptables-persistent iptables -y

Теперь нам нужно определиться с названием интерфейса, который создаст клиент AmneziaVPN. В текущем примере мы будем подключаться через протокол AWG. При использовании OpenVPN имя интерфейса может быть другим. Подключаемся к VPN и смотрим название интерфейса в выводе ip a

img

Включаем MASQUERADE для данного интерфейса и сохраняемся, что бы после перезагрузки правила не удалились.

iptables -t nat -A POSTROUTING -o amn0 -j MASQUERADE
iptables-save
iptables-save > /etc/iptables/rules.v4
ip6tables-save > /etc/iptables/rules.v6

Перезагружаемся и смотрим результат

iptables -t nat -L -n -v

В цепочке "Chain POSTROUTING" должно присутствовать наше правило:

img

Автовход xfce

Для того чтобы включить автоматический вход в систему на debian, необходимо отредактировать файл /etc/gdm3/daemon.conf. Авторизуемся и входим под root su - Можно воспользоваться текстовым редактором nano :

sudo nano /etc/lightdm/lightdm.conf 

Ищем следующие строки, скорее всего они будут у Вас закомментированы

[Seat:*]
#autologin-user=

Приводим строку к виду. У вас пользователь может быть другим.

autologin-user=root-home

Перезагружаемся и смотрим результат. У нас срабатывает автологон, автозапуск клиента AmneziaVPN и автоподключение к VPN.

Но есть один момент. После автологона пользователя вы не сможете подключиться в ту же сессию RDP. Это особенность Linux. Повторное подключение может потребоваться, когда нужна перенастройка клиента AmneziaVPN.

Для сброса сессии подключаемся через SSH (без прав root) под пользователем, запускающим клиент AmneziaVPN и выполняем logout в Xfce. В нашем случае это пользователь root-home.

xfce4-session-logout --logout

После можно спокойно подключаться через RDP.

Настройка роутера

Теперь нам остаётся завернуть нужный трафик на IP адрес Debian в локальной сети.

Для MikroTik. В таблице маршрутизации "r_to_vpn" создадим маршрут по умолчанию ведущий на Debian и правило MASQUERADE для локальных сетей

/ip route
add distance=1 dst-address=0.0.0.0/0 gateway=<ip адрес Debian в локальной сети> routing-table=r_to_vpn

/ip firewall nat
add action=masquerade chain=srcnat routing-mark=r_to_vpn

Теперь можно проверить трассировку до 8.8.4.4 Трафик должен уходить на Debian. IP адреса назначения, которые MikroTik завернёт в VPN, будут отправляться на Debian, а он в свою очередь завернёт трафик в туннель, который поднимет клиентское приложение AmneziaVPN.

Donate 💖