You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

358 lines
22 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# Маршрутизация
Модуль маршрутизации позволяет направлять входящие данные через разные исходящие подключения в соответствии с различными правилами, что позволяет реализовать проксирование по требованию.
Например, распространенным сценарием использования является разделение трафика на внутренний и внешний.
Xray может определять трафик из разных регионов с помощью внутренних механизмов и отправлять его через разные исходящие подключения.
Более подробное описание функции маршрутизации: [Введение в маршрутизацию (routing)](../document/level-1/routing-lv1-part1.md).
## RoutingObject
`RoutingObject` соответствует полю `routing` в конфигурационном файле.
```json
{
"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](#ruleobject)\]
Массив, каждый элемент которого представляет собой правило.
Для каждого соединения маршрутизатор проверяет правила сверху вниз.
Когда встречается первое подходящее правило, соединение перенаправляется на исходящее подключение, указанное в его `outboundTag` или `balancerTag`.
::: tip
Если ни одно правило не подходит, трафик отправляется через первое исходящее подключение по умолчанию.
:::
> `balancers`: \[ [BalancerObject](#balancerobject) \]
Массив, каждый элемент которого представляет собой конфигурацию балансировщика нагрузки.
Если правило указывает на балансировщик нагрузки, Xray выбирает исходящее подключение через этот балансировщик нагрузки и перенаправляет трафик через него.
### RuleObject
```json
{
"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:` (в нижнем регистре) - префикс, за которым следует имя файла и тег.
Файл должен находиться в [каталоге ресурсов](./features/env.md#пути-к-файлам-ресурсов).
Формат файла такой же, как у `geosite.dat`.
Тег должен присутствовать в файле.
::: tip
`"ext:geoip.dat:cn"` эквивалентно `"geoip:cn"`.
:::
> `ip`: \[string\]
Массив, каждый элемент которого представляет собой диапазон IP-адресов.
Правило применяется, если один из элементов соответствует целевому IP-адресу.
Доступны следующие форматы:
- IP-адрес: например, `"127.0.0.1"`.
- [CIDR](https://ru.wikipedia.org/wiki/Бесклассовая_адресация): например, `"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:` (в нижнем регистре) - префикс, за которым следует имя файла и тег.
Файл должен находиться в [каталоге ресурсов](./features/env.md#пути-к-файлам-ресурсов).
Формат файла такой же, как у `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
Настройки балансировщика нагрузки.
Когда балансировщик нагрузки активируется, он выбирает наиболее подходящее исходящее подключение из указанных и перенаправляет трафик через него.
```json
{
"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)
#### StrategyObject
```json
{
"type": "roundRobin",
"settings": {}
}
```
> `type` : "random" | "roundRobin" | "leastPing" | "leastLoad"
- `random` (значение по умолчанию): случайный выбор из подходящих исходящих подключений.
- `roundRobin`: последовательный выбор из подходящих исходящих подключений.
- `leastPing`: выбор исходящего подключения с наименьшей задержкой на основе результатов мониторинга подключений.
Требуется настроить [observatory](./observatory.md#observatoryobject).
- `leastLoad`: выбор наиболее стабильного исходящего подключения на основе результатов мониторинга подключений.
Требуется настроить [burstObservatory](./observatory.md#burstobservatoryobject).
> `settings`: [StrategySettingsObject](#strategysettingsobject)
##### StrategySettingsObject
Это необязательный параметр. Формат настройки зависит от стратегии балансировки нагрузки.
В настоящее время этот параметр можно использовать только со стратегией `leastLoad`.
### Пример конфигурации балансировщика нагрузки
```json
"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](https://github.com/v2fly/domain-list-community).