#
Маршрутизация
Модуль функций маршрутизации может отправлять входящие данные по различным правилам через разные исходящие соединения. Обычное использование включает в себя разделение трафика внутри и за пределами страны. 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.
Если не совпадает ни с одним правилом, трафик по умолчанию отправляется первым outbound.
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".
В Xray-core v1.8.7 или более новых версиях эту строку можно опустить.
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, тег должен присутствовать в файле.
"ext:geoip.dat:cn" эквивалентно "geoip:cn"
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" ]
Массив, каждый элемент которого обозначает тип протокола. Правило активируется, если тип протокола соединения совпадает с одним из указанных.
Для активации правила по типу протокола необходимо включить опцию sniffing в настройках входящего прокси.
attrs: object
JSON-объект, ключи и значения которого являются строками, используемыми для определения атрибутов трафика. Если заголовки HTTP содержат все указанные ключи и значения содержат указанные подстроки, то правило считается совпавшим. Регистр ключей не учитывается. Значения могут быть представлены в виде регулярных выражений.
На данный момент только HTTP-входящий прокси устанавливает этот атрибут.
Примеры:
- Для обнаружения HTTP GET:
{:method": "GET"} - Для обнаружения HTTP Path:
{:path": "/test"} - Для обнаружения Content Type:
{"accept": "text/html"}
outboundTag: string
Соответствует тегу исходящего соединения.
balancerTag: string
Соответствует тегу балансировщика.
balancerTag и outboundTag должны быть выбраны один из двух. Если указаны оба, используется outboundTag.
#
Объект балансировщика (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].