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.

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: содержит доменные имена верхнего уровня, не используемые в Китае, например, домены, оканчивающиеся на .hk (Гонконг), .tw (Тайвань), .jp (Япония), .sg (Сингапур), .us (США), .ca (Канада) и т.д.

Вы также можете просмотреть полный список доменов здесь: Domain list community.