22 KiB
Маршрутизация
Модуль маршрутизации позволяет направлять входящие данные через разные исходящие подключения в соответствии с различными правилами, что позволяет реализовать проксирование по требованию.
Например, распространенным сценарием использования является разделение трафика на внутренний и внешний.
Xray может определять трафик из разных регионов с помощью внутренних механизмов и отправлять его через разные исходящие подключения.
Более подробное описание функции маршрутизации: Введение в маршрутизацию (routing).
RoutingObject
RoutingObject
соответствует полю routing
в конфигурационном файле.
{
"routing": {
"domainStrategy": "AsIs",
"domainMatcher": "hybrid",
"rules": [],
"balancers": []
}
}
domainStrategy
: "AsIs" | "IPIfNonMatch" | "IPOnDemand"
Стратегия разрешения доменных имен.
"AsIs"
: использовать только доменные имена для выбора маршрута.
Значение по умолчанию."IPIfNonMatch"
: если доменное имя не соответствует ни одному правилу, разрешить доменное имя в IP-адрес (запись A или AAAA) и снова выполнить сопоставление.- Если у домена есть несколько записей A, Xray попытается сопоставить все записи A, пока одна из них не совпадет с каким-либо правилом.
- Разрешенный IP-адрес используется только для выбора маршрута, в пересылаемых пакетах данных по-прежнему используется исходное доменное имя.
"IPOnDemand"
: при сопоставлении с любым правилом, основанным на IP-адресе, доменное имя немедленно разрешается в IP-адрес для сопоставления.
domainMatcher
: "hybrid" | "linear"
Алгоритм сопоставления доменных имен.
Этот параметр влияет на все RuleObject
, для которых не указан алгоритм сопоставления.
"hybrid"
: использовать новый алгоритм сопоставления доменных имен, который работает быстрее и занимает меньше памяти.
Значение по умолчанию."linear"
: использовать старый алгоритм сопоставления доменных имен.
rules
: [RuleObject]
Массив, каждый элемент которого представляет собой правило.
Для каждого соединения маршрутизатор проверяет правила сверху вниз.
Когда встречается первое подходящее правило, соединение перенаправляется на исходящее подключение, указанное в его outboundTag
или balancerTag
.
::: tip Если ни одно правило не подходит, трафик отправляется через первое исходящее подключение по умолчанию. :::
balancers
: [ BalancerObject ]
Массив, каждый элемент которого представляет собой конфигурацию балансировщика нагрузки.
Если правило указывает на балансировщик нагрузки, Xray выбирает исходящее подключение через этот балансировщик нагрузки и перенаправляет трафик через него.
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"
}
::: danger Если указано несколько атрибутов, правило применяется только в том случае, если все атрибуты совпадают. :::
domainMatcher
: "hybrid" | "linear"
Алгоритм сопоставления доменных имен.
Этот параметр имеет приоритет над параметром domainMatcher
в RoutingObject
.
"hybrid"
: использовать новый алгоритм сопоставления доменных имен, который работает быстрее и занимает меньше памяти.
Значение по умолчанию."linear"
: использовать старый алгоритм сопоставления доменных имен.
type
: "field"
В настоящее время поддерживается только значение "field"
.
::: tip В 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
.
Тег должен присутствовать в файле.
::: tip
"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"
, включает все частные IP-адреса, например127.0.0.1
. - Инверсия (!):
"geoip:!cn"
означает все IP-адреса, кроме тех, что указаны в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" ]
Массив, каждый элемент которого представляет собой протокол.
Правило применяется, если один из элементов соответствует типу протокола текущего соединения.
::: tip
Для определения типа протокола соединения необходимо включить параметр sniffing
во входящем подключении.
:::
attrs
: object
Объект JSON, где ключи и значения являются строками, используемый для проверки атрибутов трафика.
Правило применяется, если заголовки HTTP содержат все указанные ключи, а значения содержат указанные подстроки.
Ключи нечувствительны к регистру.
Значения могут быть регулярными выражениями.
В настоящее время этот атрибут устанавливается только входящим прокси HTTP.
Примеры:
- Проверка метода HTTP GET:
{":method": "GET"}
- Проверка пути HTTP:
{":path": "/test"}"
- Проверка типа содержимого:
{"accept": "text/html"}"
outboundTag
: string
Тег исходящего подключения.
balancerTag
: string
Тег балансировщика нагрузки.
::: tip
Необходимо указать либо balancerTag
, либо outboundTag
.
Если указаны оба параметра, используется outboundTag
.
:::
BalancerObject
Настройки балансировщика нагрузки.
Когда балансировщик нагрузки активируется, он выбирает наиболее подходящее исходящее подключение из указанных и перенаправляет трафик через него.
{
"tag": "balancer",
"selector": [],
"fallbackTag": "outbound",
"strategy": {}
}
tag
: string
Тег этого балансировщика нагрузки, используемый для сопоставления с balancerTag
в RuleObject
.
selector
: [ string ]
Массив строк, каждый элемент которого будет использоваться для сопоставления с префиксом тега исходящего подключения.
Например, для следующих тегов исходящих подключений: [ "a", "ab", "c", "ba" ]
, "selector": ["a"]
будет соответствовать [ "a", "ab" ]
.
Если найдено несколько совпадений, балансировщик нагрузки в настоящее время выбирает одно из них случайным образом.
fallbackTag
: string
Исходящее подключение, которое будет использоваться, если балансировщик нагрузки не сможет выбрать подходящее исходящее подключение.
strategy
: StrategyObject
StrategyObject
{
"type": "roundRobin",
"settings": {}
}
type
: "random" | "roundRobin" | "leastPing" | "leastLoad"
random
(значение по умолчанию): случайный выбор из подходящих исходящих подключений.roundRobin
: последовательный выбор из подходящих исходящих подключений.leastPing
: выбор исходящего подключения с наименьшей задержкой на основе результатов мониторинга подключений.
Требуется настроить observatory.leastLoad
: выбор наиболее стабильного исходящего подключения на основе результатов мониторинга подключений.
Требуется настроить burstObservatory.
settings
: StrategySettingsObject
StrategySettingsObject
Это необязательный параметр. Формат настройки зависит от стратегии балансировки нагрузки.
В настоящее время этот параметр можно использовать только со стратегией leastLoad
.
Пример конфигурации балансировщика нагрузки
"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
.
Этот файл содержит некоторые распространенные доменные имена.
Формат использования: geosite:filename
, например geosite:google
означает сопоставление с доменными именами, указанными в файле в разделе google
, для маршрутизации или фильтрации DNS.
Распространенные доменные имена:
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
: содержит доменные имена верхнего уровня, управляемые CNNIC и используемые в Китае, например, домены, оканчивающиеся на.cn
,.中国
.tld-!cn
: содержит доменные имена верхнего уровня, не используемые в Китае, например, домены, оканчивающиеся на.tw
(Тайвань),.jp
(Япония),.sg
(Сингапур),.us
(США),.ca
(Канада) и т.д.
Вы также можете просмотреть полный список доменов здесь: Domain list community.