DevOps

Настройка xray с двумя IP: маршрутизация трафика через нужный адрес

Полное руководство по настройке xray с двумя публичными IP-адресами. Реализация перенаправления трафика через нужный IP с помощью sendThrough и политик маршрутизации Linux.

Как настроить перенаправление трафика на Xray сервере с двумя публичными IP-адресами?

Имеется VPS с двумя публичными IP-адресами (например, IP-A и IP-B), на котором работает сервер Xray, принимающий входящие подключения на IP-A. Требуется настроить систему так, чтобы весь исходящий трафик от пользователей Xray проходил через IP-B.

Подскажите, как правильно реализовать такую конфигурацию для Xray, учитывая, что аналогичная настройка с OpenVPN успешно работает через iptables.

Настройка перенаправления трафика на Xray сервере с двумя публичными IP-адресами может быть реализована с помощью параметра sendThrough в конфигурации исходящих подключений или с помощью политик маршрутизации Linux. Основной подход заключается в указании нужного IP-адреса для исходящих соединений непосредственно в настройках Xray, что позволяет избежать сложных манипуляций с iptables.

Содержание

Основной метод с использованием sendThrough

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

Параметр sendThrough принимает IP-адрес или CIDR-блок IPv6. Когда указан IP-адрес, Xray для всех исходящих соединений будет использовать именно этот адрес. В случае с IPv6 можно указать диапазон адресов (например, 114:514:1919:810::/64), и Xray будет выбирать случайный IP из указанного блока.

Согласно официальной документации Xray, этот параметр эффективен, когда хост имеет несколько IP-адресов, и по умолчанию значение равно 0.0.0.0. Это означает, что без явного указания Xray будет использовать системный IP по умолчанию.

Альтернативный метод с политиками маршрутизации

Если требуется более сложная маршрутизация или нужно разделить трафик по разным правилам, можно использовать политику маршрутизации Linux (policy routing). Этот метод позволяет создавать отдельные таблицы маршрутизации для разных типов трафика и назначать их на основе различных критериев.

Как отмечено в статье Scott’s Weblog, на Linux (Ubuntu 12.04+ и большинстве дистрибутивов) для такой задачи удобно использовать policy routing. Этот подход особенно полезен, когда нужно не просто перенаправить весь трафик через другой IP, а разделить трафик по разным правилам (например, внутренний трафик через IP-A, внешний через IP-B).

Реализация конфигурации Xray

Для реализации перенаправления трафика через IP-B с помощью метода sendThrough потребуется модифицировать конфигурацию Xray, добавив параметр sendThrough в настройки исходящих подключений:

json
{
  "outbounds": [
    {
      "protocol": "freedom",
      "settings": {},
      "tag": "direct",
      "sockopt": {
        "sendThrough": "IP-B"
      }
    },
    {
      "protocol": "freedom",
      "settings": {},
      "tag": "via_ip_b",
      "sockopt": {
        "sendThrough": "IP-B"
      }
    }
  ]
}

В этом примере создаются два исходящих подключения: direct и via_ip_b. Оба используют протокол freedom (прямой выход), но подключение via_ip_b явно указывает использовать IP-B для исходящих соединений.

Для маршрутизации трафика через эти подключения необходимо настроить модуль routing. Как показано в документации по routing Xray, модуль routing может отправлять входящие данные через разные исходящие подключения в соответствии с различными правилами.

Пример конфигурации routing:

json
{
  "routing": {
    "rules": [
      {
        "type": "field",
        "outboundTag": "via_ip_b",
        "network": "tcp,udp"
      }
    ]
  }
}

Эта конфигурация направляет весь TCP и UDP трафик через исходящее подключение via_ip_b, которое использует IP-B для исходящих соединений.

Настройка таблиц маршрутизации Linux

Если предпочитается использовать политику маршрутизации Linux, потребуется выполнить следующие шаги:

  1. Создать отдельные таблицы маршрутизации для каждого IP-адреса:
bash
# Добавляем таблицу для IP-B
echo "200 ip_b_table" >> /etc/iproute2/rt_tables

# Добавляем маршрут для IP-B в новую таблицу
ip route add default via <шлюз_B> dev <интерфейс_B> table ip_b_table

# Привязываем IP-B к новой таблице
ip rule add from IP-B table ip_b_table
  1. Для Xray можно использовать параметр mark для пометки трафика, который затем будет маршрутизироваться через соответствующую таблицу. Как указано в обсуждении на GitHub, в конфиге config.json можно определить два outbound с разными mark:
json
{
  "protocol": "freedom",
  "settings": {},
  "tag": "direct",
  "sockopt": {
    "mark": 1
  }
},
{
  "protocol": "freedom", 
  "settings": {},
  "tag": "via_ip_b",
  "sockopt": {
    "mark": 2
  }
}
  1. Настроить iptables для перенаправления трафика с определенным mark в нужную таблицу:
bash
# Маркируем трафик от Xray с помощью connmark
iptables -t mangle -A PREROUTING -j CONNMARK --restore-mark
iptables -t mangle -A PREROUTING -m mark ! --mark 0 -j ACCEPT

# Помечаем трафик для соответствующей таблицы маршрутизации
iptables -t mangle -A PREROUTING -j MARK --set-mark 2
iptables -t mangle -A PREROUTING -j CONNMARK --save-mark 2
  1. Обновляем правила маршрутизации:
bash
# Правило для трафика с mark=2 (через IP-B)
ip rule add fwmark 2 table ip_b_table
ip route flush cache

Тестирование и отладка

После настройки конфигурации необходимо проверить работу перенаправления трафика:

  1. Проверка исходящих подключений:
bash
# Подключение к Xray и проверка исходящего IP
curl ipinfo.io
  1. Просмотр таблиц маршрутизации:
bash
# Просмотр активных таблиц маршрутизации
ip route list table all
  1. Мониторинг маркировки пакетов:
bash
# Просмотр маркировки пакетов
iptables -t mangle -L -v -n
  1. Проверка соединений:
bash
# Просмотр активных соединений с пометками
conntrack -L

При возникновении проблем стоит проверить:

  • Правильность указания IP-адресов в конфигурации Xray
  • Наличие маршрутов к шлюзам для обоих IP-адресов
  • Правильность настройки iptables и правил маршрутизации
  • Отсутствие конфликтов между различными методами перенаправления трафика

Сравнение методов

Метод Преимущества Недостатки Рекомендуемые сценарии использования
sendThrough Простота настройки, минимальные системные изменения, высокая производительность Ограниченная гибкость, подходит только для перенаправления всего трафика Простые сценарии, когда весь трафик должен идти через один IP
Policy routing Гибкость, возможность сложной маршрутизации, разделение трафика по разным правилам Сложность настройки, требует глубоких знаний Linux networking Сложные сценарии с разделением трафика по разным правилам

Как показывает опыт настройки Xray, метод sendThrough является предпочтительным для большинства случаев, так как он проще в реализации и не требует глубоких знаний системной маршрутизации Linux.

Заключение

Настройка перенаправления трафика на Xray сервере с двумя публичными IP-адресами может быть реализована несколькими способами. Основной подход с использованием параметра sendThrough в конфигурации исходящих подключений является наиболее простым и эффективным решением для перенаправления всего трафика через конкретный IP-адрес. Для более сложных сценариев с разделением трафика по разным правилам можно использовать политику маршрутизации Linux.

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

Источники

  1. Outbound Proxies | Project X - Official documentation
  2. Routing | Project X - Official documentation
  3. Routing rules for xray not working with domain regexp or indicated directly - XTLS Xray-core | Discussion | GitHub
  4. A Quick Introduction to Linux Policy Routing - Scott’s Weblog
  5. debian - Two interfaces, two addresses, two gateways? - Unix & Linux Stack Exchange
Авторы
Проверено модерацией
Модерация