Маршрутизация трафика MikroTik через Xray TUN в 3x-ui по WireGuard на Debian 12

При построении частных сетей часто возникает задача подключить маршрутизатор MikroTik к серверу с панелью 3x-ui по WireGuard и направить трафик через Xray.

Например, на MikroTik могут использоваться списки IP-адресов или доменов ресурсов, недоступных в вашем регионе или через вашего провайдера. Вместо организации VPN на каждом устройстве удобнее настроить домашнюю или офисную сеть таким образом, чтобы необходимый трафик автоматически направлялся в туннель.

В данной статье рассмотрим рабочую конфигурацию, в которой:

  • на VPS установлен Debian 12 и панель 3x-ui;
  • Xray использует TUN-интерфейс для перехвата трафика;
  • MikroTik подключается к серверу по WireGuard;
  • весь трафик, поступающий от MikroTik через WireGuard, автоматически перенаправляется в Xray TUN;
  • Xray может отправлять трафик как напрямую в интернет, так и через вышестоящий сервер;
  • собственный трафик сервера продолжает использовать стандартный маршрут провайдера.

Для тестирования использовался VPS от RUVDS


Схема работы

                    Локальная сеть
                           │
                           ▼
                       MikroTik
                           │
                           │ WireGuard
                           ▼
                    VPS + 3x-ui
                       Debian 12
                           │
                           ▼
                        Xray TUN
                         (xray0)
                           │
              ┌────────────┴────────────┐
              │                         │
              ▼                         ▼
      Direct Outbound          Proxy Outbound
       (прямой выход)       (вышестоящий сервер)
              │                         │
              ▼                         ▼
         Интернет                Сервер в другой
                                     стране
                                          │
                                          ▼
                                     Интернет

В этой схеме MikroTik выступает в роли клиента WireGuard.

Маршрутизатор принимает решение, какой трафик необходимо направить через VPN. Это может быть:

  • весь интернет-трафик;
  • только определённые IP-адреса;
  • отдельные сервисы;
  • списки ресурсов, сформированные по ASN;
  • списки ресурсов, сформированные по географическому признаку.

После попадания пакетов в туннель WireGuard они поступают на сервер с 3x-ui, где Linux перенаправляет их в TUN-интерфейс Xray.

Далее Xray выполняет обработку трафика и в зависимости от правил маршрутизации может:

  • отправить трафик напрямую в интернет через Direct Outbound;
  • отправить трафик через вышестоящий сервер, расположенный в другой стране;
  • использовать различные outbound-подключения для разных типов трафика.

Одним из преимуществ использования 3x-ui является возможность гибко управлять исходящими подключениями (Outbound). Это позволяет строить сложные многоуровневые схемы маршрутизации без изменения конфигурации MikroTik.


Почему не удалось использовать встроенный WireGuard в 3x-ui

Изначально задача казалась достаточно простой. В панели 3x-ui присутствует встроенный inbound WireGuard, который, согласно документации, должен позволять принимать трафик от клиентов и передавать его в систему маршрутизации Xray.

Поэтому первым вариантом решения было использование штатного WireGuard inbound непосредственно внутри Xray без установки отдельного WireGuard-сервера в Linux.

Однако на практике данный вариант так и не удалось заставить работать стабильно.

В ходе тестирования наблюдалась следующая картина:

  • WireGuard-клиент успешно устанавливал соединение;
  • обмен служебным трафиком происходил корректно;
  • интерфейс создавался без ошибок;
  • трафик клиентов не проходил через Xray должным образом;
  • маршрутизация работала нестабильно или отсутствовала полностью.

Было потрачено значительное время на анализ документации Xray, 3x-ui и различных примеров конфигураций из открытых источников.

Также предпринимались попытки найти решение при помощи различных ИИ-ассистентов и специализированных технических сообществ.

К сожалению, найти рабочую конфигурацию, которая позволила бы использовать встроенный WireGuard inbound в сочетании с требуемой схемой маршрутизации через Xray, не удалось. Соединение устанавливалось, но логи были заполнены ошибками, а трафик корректно не маршрутизировался.

В результате было принято решение отказаться от встроенного WireGuard в Xray и использовать классический WireGuard Linux.

Такой подход имеет несколько преимуществ:

  • WireGuard работает непосредственно в ядре Linux;
  • проще выполнять диагностику через стандартные инструменты Linux;
  • можно использовать Policy Based Routing;
  • отсутствует зависимость от внутренней логики Xray.

После перехода на классический WireGuard задача была решена через отдельную таблицу маршрутизации Linux и перенаправление трафика в интерфейс xray0.

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


Настройка сервера 3x-ui

Для реализации схемы понадобится VPS с Debian 12 и установленной панелью 3x-ui.

В нашем примере используются следующие параметры:

ПараметрЗначение
WireGuard сервер10.10.10.1/24
MikroTik10.10.10.2/24
Локальная сеть MikroTik192.168.88.0/24
Интерфейс Xray TUNxray0
Таблица маршрутизации100

Предполагается, что WireGuard уже настроен и MikroTik успешно подключается к серверу.


Настройка TUN в 3x-ui

В панели 3x-ui необходимо создать входящий интерфейс TUN.

Основные параметры:

{
  "tag": "tun-in",
  "type": "tun",
  "interface_name": "xray0",
  "inet4_address": "172.19.0.1/30",
  "auto_route": false,
  "strict_route": false,
  "stack": "system"
}

Ключевым параметром является:

"auto_route": false

В этом случае Xray не будет изменять системную таблицу маршрутизации. Управление маршрутами полностью остаётся на стороне Linux.

Такой подход позволяет избежать конфликтов с сетевой конфигурацией сервера и сохранить доступ к VPS даже при ошибках в настройке TUN.


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

Полная рабочая конфигурация WireGuard сервера выглядит следующим образом:

[Interface]
Address = 10.10.10.1/24
ListenPort = 51820
PrivateKey = SERVER_PRIVATE_KEY

PostUp = sysctl -w net.ipv4.ip_forward=1
PostUp = ip addr add 172.19.0.1/30 dev xray0 2>/dev/null || true
PostUp = ip link set xray0 up 2>/dev/null || true
PostUp = ip rule add from 10.10.10.0/24 table 100 priority 100
PostUp = ip route add default dev xray0 table 100

PostDown = ip rule del from 10.10.10.0/24 table 100 priority 100
PostDown = ip route del default dev xray0 table 100

[Peer]
PublicKey = MIKROTIK_PUBLIC_KEY
AllowedIPs = 10.10.10.2/32,192.168.88.0/24
PersistentKeepalive = 20

Где:

  • SERVER_PRIVATE_KEY — приватный ключ сервера;
  • MIKROTIK_PUBLIC_KEY — публичный ключ MikroTik;
  • 10.10.10.1 — адрес WireGuard сервера;
  • 10.10.10.2 — адрес интерфейса WireGuard на MikroTik;
  • 192.168.88.0/24 — локальная сеть за MikroTik.

Если используется другой диапазон локальной сети, его необходимо заменить на соответствующий вашей конфигурации.

После запуска WireGuard создаётся отдельная таблица маршрутизации, через которую весь трафик от MikroTik отправляется в интерфейс xray0.

Важно понимать, что основной маршрут сервера не изменяется.

Трафик Debian продолжает идти через шлюз провайдера, а в Xray попадает только трафик, поступающий через WireGuard.

Проверить состояние туннеля можно командой:

wg show

При успешном подключении MikroTik в выводе будет отображаться peer, время последнего handshake и объём переданного трафика.


Проверка Policy Based Routing

Проверяем наличие правила:

ip rule

Ожидаемый результат:

100: from 10.10.10.0/24 lookup 100

Проверяем содержимое таблицы:

ip route show table 100

Результат должен быть следующим:

default dev xray0

Это означает, что любой пакет, пришедший от MikroTik по WireGuard, будет автоматически перенаправлен в Xray.


Настройка MikroTik

Создаём интерфейс WireGuard:

/interface wireguard
add name=wg-xray

Назначаем адрес:

/ip address
add address=10.10.10.2/24 interface=wg-xray

Добавляем peer сервера:

/interface wireguard peers
add interface=wg-xray \
public-key="SERVER_PUBLIC_KEY" \
endpoint-address=SERVER_IP \
endpoint-port=51820 \
allowed-address=0.0.0.0/0 \
persistent-keepalive=20s

После настройки WireGuard MikroTik может самостоятельно определять, какой трафик необходимо направлять через туннель. Разумеется это работает на основе Address-list

Например:

  • ChatGPT;
  • YouTube;
  • Instagram;
  • отдельные ASN;
  • отдельные страны;
  • любые заранее подготовленные списки IP-адресов.

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


Особенность перезапуска Xray

Во время тестирования была обнаружена особенность работы TUN-интерфейса.

После перезапуска Xray интерфейс xray0 пересоздаётся, а маршрутизация WireGuard может перестать работать до повторной инициализации правил.

Для автоматического восстановления был использован вызов:

ExecStartPost=/bin/systemctl restart wg-quick@wg0

Команду можно выполнить вручную введя:

systemctl restart wg-quick@wg0

После запуска Xray WireGuard автоматически перезапускается и заново создаёт необходимые правила маршрутизации.

Такое решение показало стабильную работу после многочисленных тестов и перезагрузок сервера.


Проверка работы

На сервере можно убедиться, что пакеты поступают от MikroTik:

tcpdump -i wg0

Затем проверяем интерфейс Xray:

tcpdump -i xray0

Если настройка выполнена корректно, пакеты будут одновременно видны на обоих интерфейсах.

Это означает, что Linux успешно перенаправляет трафик WireGuard в TUN-интерфейс Xray.

Также полезно контролировать состояние туннеля командой:

wg show

Преимущества решения

Полученная схема обладает рядом преимуществ:

  • не требуется устанавливать VPN-клиент на каждое устройство;
  • вся логика маршрутизации сосредоточена на MikroTik;
  • 3x-ui и Xray используются как шлюз для трафика, поступающего от MikroTik;
  • локальный трафик сервера не затрагивается;
  • легко масштабируется на несколько офисов, филиалов или домашних площадок;
  • позволяет использовать сложные правила маршрутизации на основе списков IP-адресов, ASN и географических диапазонов;
  • поддерживает одновременную работу нескольких outbound-подключений и гибкую маршрутизацию между ними.

Фактически получается полноценный шлюз селективной маршрутизации, в котором MikroTik принимает решение, какой трафик необходимо отправить через VPN, а Xray обеспечивает его дальнейшую обработку и доставку.

При этом нет необходимости настраивать каждое устройство в офисе или квартире отдельно — вся логика сосредоточена на маршрутизаторе.


Заключение

Несмотря на наличие встроенного WireGuard в 3x-ui, в данном сценарии наиболее стабильным решением оказалось использование классического WireGuard Linux в сочетании с Xray TUN и отдельной таблицей маршрутизации Linux.

Такой подход позволяет получить полностью управляемый шлюз для MikroTik, поддерживающий сложные сценарии маршрутизации, работу с географическими списками IP-адресов, ASN, а также возможность выбора между прямым выходом в интернет и маршрутизацией через вышестоящие серверы.

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

Запись опубликована в рубрике Linux, Mikrotik. Добавьте в закладки постоянную ссылку.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *