# Маршрутизация

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

# Объект маршрутизации (RoutingObject)

RoutingObject соответствует элементу routing в конфигурационном файле.

{
  "routing": {
    "domainStrategy": "AsIs",
    "domainMatcher": "hybrid",
    "rules": [],
    "balancers": []
  }
}

domainStrategy: "AsIs" | "IPIfNonMatch" | "IPOnDemand" Стратегия разрешения доменов. В зависимости от установки используются различные стратегии.

  • "AsIs": Использовать только доменное имя для выбора маршрута. Значение по умолчанию.
  • "IPIfNonMatch": Если доменное имя не соответствует ни одному правилу, разрешить домен в IP (записи A или AAAA) и повторно сопоставить;
    • Если у домена есть несколько записей A, попробуйте сопоставить все записи A, пока одна из них не совпадет с каким-либо правилом;
    • Разрешенный IP действует только при выборе маршрута, в перенаправляемых пакетах данных по-прежнему используется оригинальное доменное имя;
  • "IPOnDemand": Если при сопоставлении встречается любое правило, основанное на IP, немедленно разрешить доменное имя в IP для сопоставления;

domainMatcher: "hybrid" | "linear" Алгоритм сопоставления доменов. В зависимости от установки используются различные алгоритмы. Этот параметр влияет на все объекты RuleObject, которые не указывают собственный алгоритм сопоставления.

  • "hybrid": Использовать новый алгоритм сопоставления доменов, который быстрее и требует меньше ресурсов. Значение по умолчанию.
  • "linear": Использовать первоначальный алгоритм сопоставления доменов.

rules: [RuleObject] Соответствует массиву, каждый элемент которого является правилом. Для каждого соединения маршрутизация будет судить по этим правилам сверху вниз, и когда оно встретит первое действующее правило, то направит это соединение к указанному outboundTag или balancerTag.

balancers: [ BalancerObject ]

Массив, каждый элемент которого является конфигурацией балансировщика нагрузки. Когда правило указывает на балансировщик, Xray выбирает один outbound через этот балансировщик для перенаправления трафика.

# Объект правил (RuleObject)

{
  "domainMatcher": "hybrid",
  "type": "field",
  "domain": ["baidu.com", "qq.com", "geosite:cn"],
  "ip": ["0.0.0.0/8", "10.0.0.0/8", "fc00::/7", "fe80::/10", "geoip:cn"],
  "port": "53,443,1000-2000",
  "sourcePort": "53,443,1000-2000",
  "network": "tcp",
  "source": ["10.0.0.1"],
  "user": ["love@xray.com"],
  "inboundTag": ["tag-vmess"],
  "protocol": ["http", "tls", "bittorrent"],
  "attrs": { ":method": "GET" },
  "outboundTag": "direct",
  "balancerTag": "balancer"
}

domainMatcher: "hybrid" | "linear" Алгоритм сопоставления доменов. Этот параметр имеет приоритет над настройкой domainMatcher в RoutingObject.

  • "hybrid": Использовать новый алгоритм сопоставления доменов, который быстрее и требует меньше ресурсов. Значение по умолчанию.
  • "linear": Использовать первоначальный алгоритм сопоставления доменов.

type: "field" В настоящее время поддерживается только опция "field".

domain: [string] Массив, каждый элемент которого соответствует сопоставлению домена. Возможные формы:

  • Простая строка: Если эта строка соответствует любой части целевого домена, то правило активируется. Например, "sina.com" совпадает с "sina.com", "sina.com.cn" и "www.sina.com", но не с "sina.cn".
  • Регулярное выражение: Начинается с "regexp:", остальная часть - регулярное выражение. Если оно соответствует целевому домену, правило активируется. Например, "regexp:\.goo.*\.com$" совпадает с "www.google.com" или "fonts.googleapis.com", но не с "google.com".
  • Поддомен (рекомендуется): Начинается с "domain:", остальная часть - домен. Если этот домен является целевым доменом или его поддоменом, правило активируется. Например, "domain:xray.com" совпадает с "www.xray.com", "xray.com", но не с "wxray.com".
  • Полное соответствие: Начинается с "full:", остальная часть - домен. Если этот домен полностью совпадает с целевым доменом, правило активируется. Например, "full:xray.com" совпадает с "xray.com", но не с "www.xray.com".
  • Предопределенный список доменов: Начинается с "geosite:", остальная часть - имя, например, geosite:google или geosite:cn. Имена и списки доменов смотрите в Предопределенных списках доменов.
  • Загрузка доменов из файла: Формат "ext:file:tag", должен начинаться с "ext:" (в нижнем регистре), за которым следует имя файла и тег. Файл должен находиться в Ресурсной директории, его формат должен быть аналогичен geosite.dat, тег должен присутствовать в файле.

ip: [string] Массив, каждый элемент которого представляет собой диапазон IP. Если один из элементов соответствует целевому IP, правило активируется. Возможные формы:

  • IP: Например, "127.0.0.1".
  • CIDR: Например, "10.0.0.0/8".
  • Предопределенный список IP: Включен в каждую установку Xray, файл называется geoip.dat. Используется, например, как "geoip:cn", должен начинаться с "geoip:" (в нижнем регистре), за которым следует двухбуквенный код страны.
    • Специальное значение: "geoip:private" включает все частные адреса, такие как 127.0.0.1.
    • Функция исключения (!): "geoip:!cn" означает результаты, не включенные в "geoip:cn".
  • Загрузка IP из файла: Формат "ext:file:tag", должен начинаться с "ext:" (в нижнем регистре), за которым следует имя файла и тег. Файл должен находиться в Ресурсной директории, его формат должен быть аналогичен geoip.dat, тег должен присутствовать в файле.

port: number | string Диапазон целевых портов, возможные формы:

  • "a-b": a и b - положительные целые числа, меньше 65536. Диапазон включает оба конца, правило активируется, если целевой порт находится в этом диапазоне.
  • a: a - положительное целое число, меньше 65536. Правило активируется, если целевой порт равен a.
  • Комбинация обоих форм, разделенная запятыми, например: "53,443,1000-2000".

sourcePort: number | string Порт источника, возможные формы:

  • "a-b": a и b - положительные целые числа, меньше 65536. Диапазон включает оба конца, правило активируется, если порт источника находится в этом диапазоне.
  • a: a - положительное целое число, меньше 65536. Правило активируется, если порт источника равен a.
  • Комбинация обоих форм, разделенная запятыми, например: "53,443,1000-2000".

network: "tcp" | "udp" | "tcp,udp" Возможные значения: "tcp", "udp", "tcp,udp". Правило активируется, если тип соединения совпадает с указанным.

source: [string] Массив, каждый элемент которого представляет собой диапазон IP для источника. Форматы включают IP, CIDR, GeoIP и загрузку IP из файла. Правило активируется, если один из элементов соответствует IP источника.

user: [string] Массив, каждый элемент которого - это электронный адрес. Правило активируется, если один из элементов совпадает с пользователем-источником.

inboundTag: [string] Массив, каждый элемент которого является идентификатором. Правило активируется, если один из элементов совпадает с тегом входящего протокола.

protocol: [ "http" | "tls" | "bittorrent" ] Массив, каждый элемент которого обозначает тип протокола. Правило активируется, если тип протокола соединения совпадает с одним из указанных.

attrs: object JSON-объект, ключи и значения которого являются строками, используемыми для определения атрибутов трафика. Если заголовки HTTP содержат все указанные ключи и значения содержат указанные подстроки, то правило считается совпавшим. Регистр ключей не учитывается. Значения могут быть представлены в виде регулярных выражений. На данный момент только HTTP-входящий прокси устанавливает этот атрибут. Примеры:

  • Для обнаружения HTTP GET: {:method": "GET"}
  • Для обнаружения HTTP Path: {:path": "/test"}
  • Для обнаружения Content Type: {"accept": "text/html"}

outboundTag: string Соответствует тегу исходящего соединения.

balancerTag: string Соответствует тегу балансировщика.

# Объект балансировщика (BalancerObject)

Конфигурация балансировщика. Когда балансировщик активен, он выбирает один из наиболее подходящих исходящих соединений для перенаправления трафика.

{
  "tag": "balancer",
  "selector": [],
  "strategy": {
    "type": "roundRobin"
  }
}

tag: string Идентификатор балансировщика, используемый для соответствия тегу балансировщика в RuleObject.

selector: [ string ] Массив строк, каждая из которых используется для сопоставления с префиксом тега исходящего соединения. Например, если есть исходящие соединения с тегами ["a", "ab", "c", "ba"], то selector: ["a"] будет соответствовать ["a", "ab"]. Если найдено несколько исходящих соединений, балансировщик выбирает одно из них случайным образом.

strategy: object Стратегия выбора исходящего соединения. "type": "roundRobin" означает последовательный выбор среди подходящих тегов исходящих соединений. Если поле strategy не указано, выбор осуществляется случайно.

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

    "routing": {
        "rules": [
            {
                "inboundTag": [
                    "in"
                ],
                "balancerTag": "round"
            }
        ],
        "balancers" : [
            {
                "selector": [
                    "out"
                ],
                "strategy": {
                    "type":"roundRobin"
                },
                "tag": "round"
            }
        ]
    }

    "inbounds": [
        {
            
            "tag": "in"
        }
    ]

    "outbounds": [
        {
            
            "tag": "out1"
        },
        {
          
            "tag": "out2"
        }
    ]

# Предопределенные списки доменов

Эти списки включены в каждую установку Xray, файл называется geosite.dat. Файл содержит наборы часто используемых доменов, которые можно использовать для маршрутизации или фильтрации DNS с помощью синтаксиса geosite:filename. Например, geosite:google представляет домены Google, включенные в файл.

Часто используемые категории доменов включают:

  • category-ads: Содержит распространенные рекламные домены.
  • category-ads-all: Включает в себя распространенные рекламные домены и домены рекламных провайдеров.
  • cn: Эквивалентно сочетанию geolocation-cn и tld-cn.
  • apple: Включает большинство доменов Apple.
  • google: Включает большинство доменов Google.
  • microsoft: Включает большинство доменов Microsoft.
  • facebook: Включает большинство доменов Facebook.
  • twitter: Включает большинство доменов Twitter.
  • telegram: Включает большинство доменов Telegram.
  • geolocation-cn: Включает распространенные домены континентального Китая.
  • geolocation-!cn: Включает распространенные домены за пределами континентального Китая и tld-!cn.
  • tld-cn: Включает домены, управляемые CNNIC, используемые в континентальном Китае, например, домены, заканчивающиеся на .cn, .中国.
  • tld-!cn: Включает домены, не используемые в континентальном Китае, например, домены, заканчивающиеся на .hk (Гонконг), .tw (Тайвань), .jp (Япония), .sg (Сингапур), .us (США), .ca (Канада) и т.д.

Полный список доменов можно найти в сообществе списков доменов [Domain list community].