358 lines
		
	
	
		
			22 KiB
		
	
	
	
		
			Markdown
		
	
	
			
		
		
	
	
			358 lines
		
	
	
		
			22 KiB
		
	
	
	
		
			Markdown
		
	
	
# Маршрутизация
 | 
						||
 | 
						||
Модуль маршрутизации позволяет направлять входящие данные через разные исходящие подключения в соответствии с различными правилами, что позволяет реализовать проксирование по требованию.
 | 
						||
 | 
						||
Например, распространенным сценарием использования является разделение трафика на внутренний и внешний.  
 | 
						||
Xray может определять трафик из разных регионов с помощью внутренних механизмов и отправлять его через разные исходящие подключения.
 | 
						||
 | 
						||
Более подробное описание функции маршрутизации: [Введение в маршрутизацию (routing)](https://xtls.github.io/ru/document/level-1/routing-lv1-part1.html).
 | 
						||
 | 
						||
## 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`.
 | 
						||
- `tld-cn`: содержит доменные имена верхнего уровня, управляемые CNNIC и используемые в Китае, например, домены, оканчивающиеся на `.cn`, `.中国`.
 | 
						||
- `tld-!cn`: содержит доменные имена верхнего уровня, не используемые в Китае, например, домены, оканчивающиеся на `.hk` (Гонконг), `.tw` (Тайвань), `.jp` (Япония), `.sg` (Сингапур), `.us` (США), `.ca` (Канада) и т.д.
 | 
						||
 | 
						||
Вы также можете просмотреть полный список доменов здесь: [Domain list community](https://github.com/v2fly/domain-list-community).
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 |