mirror of
https://github.com/XTLS/Xray-docs-next.git
synced 2026-10-12 09:18:19 +03:00
120 lines
9.0 KiB
Markdown
120 lines
9.0 KiB
Markdown
# xray.router
|
|
|
|
Предоставляет константы и вспомогательные интерфейсы для [скриптов маршрутизации](../guide/routing.md). Параметры запроса и контекст описаны в [Hook маршрутизации](./hook-routing.md).
|
|
|
|
```lua
|
|
local router = require("xray.router")
|
|
```
|
|
|
|
## Указатель API
|
|
|
|
| Категория | Член API | Описание |
|
|
| --------- | ---------------------------------------------------------- | ------------------------------------------------ |
|
|
| Константа | [`router.NetworkUnknown`](#константы) | Неизвестная сеть |
|
|
| Константа | [`router.NetworkTCP`](#константы) | TCP |
|
|
| Константа | [`router.NetworkUDP`](#константы) | UDP |
|
|
| Константа | [`router.NetworkUNIX`](#константы) | UNIX |
|
|
| Константа | [`router.LocalOS`](#константы) | Платформа выполнения |
|
|
| Функция | [`router:PickOutbound(balancerTag)`](#router-pickoutbound) | Выбор исходящего подключения через балансировщик |
|
|
| Функция | [`router.FindProcess(ctx)`](#router-findprocess) | Поиск процесса локального соединения |
|
|
|
|
## Константы
|
|
|
|
| Имя | Тип | Значение / Описание |
|
|
| ----------------------- | -------- | ---------------------------------------------------------------------------- |
|
|
| `router.NetworkUnknown` | `number` | `0`, неизвестная сеть |
|
|
| `router.NetworkTCP` | `number` | `2`, TCP |
|
|
| `router.NetworkUDP` | `number` | `3`, UDP |
|
|
| `router.NetworkUNIX` | `number` | `4`, UNIX |
|
|
| `router.LocalOS` | `string` | Текущая платформа выполнения, например `"windows"`, `"linux"` или `"darwin"` |
|
|
|
|
Параметр `network` из [Hook маршрутизации](./hook-routing.md#handleroute) можно сравнивать с сетевыми константами:
|
|
|
|
```lua
|
|
if network == router.NetworkUDP then
|
|
return "direct", "lua-udp"
|
|
end
|
|
```
|
|
|
|
## Функции
|
|
|
|
### router:PickOutbound
|
|
|
|
```lua
|
|
local outboundTag, err = router:PickOutbound(balancerTag)
|
|
```
|
|
|
|
Выбирает исходящее подключение через указанный балансировщик.
|
|
|
|
**Параметры**
|
|
|
|
| Параметр | Тип | Описание / Требования |
|
|
| ------------- | -------- | ---------------------------------------------------------------------------------------------------------------------- |
|
|
| `balancerTag` | `string` | Значение `tag` нужного балансировщика, настроенного в [`routing.balancers`](../../../config/routing.md#balancerobject) |
|
|
|
|
**Возвращаемые значения**
|
|
|
|
| Значение | Тип | Описание |
|
|
| ------------- | ------------------------------------------ | ------------------------------------------------------------- |
|
|
| `outboundTag` | `string` или `nil` | При успехе — непустой `tag` выбранного исходящего подключения |
|
|
| `err` | [`error`](./data-types.md#error) или `nil` | `nil` означает успех |
|
|
|
|
**Поведение**
|
|
|
|
Нужно явно передать строку, иначе возникает исключение Lua. Пустая строка `""` выполняет поиск по пустому `tag`.
|
|
|
|
Перед использованием результата проверьте `err`. Если балансировщик не существует, возвращается `nil, err`; если существует, но не выбрал исходящее подключение, — `"", err`. Когда срабатывает настроенный `fallbackTag`, возвращаются этот тег исходящего подключения и `nil`.
|
|
|
|
**Пример**
|
|
|
|
Ниже используется балансировщик с `tag` `"proxy-pool"`, а результат передаётся согласно [соглашению о возвращаемых значениях Hook маршрутизации](./hook-routing.md#возвращаемые-значения):
|
|
|
|
```lua
|
|
local outboundTag, err = router:PickOutbound("proxy-pool")
|
|
return outboundTag, "lua-balance", err
|
|
```
|
|
|
|
Полный пример приведён в [руководстве по скриптам маршрутизации](../guide/routing.md#связь-с-конфигурациеи-маршрутизации).
|
|
|
|
### router.FindProcess
|
|
|
|
```lua
|
|
local pid, name, path, err = router.FindProcess(ctx)
|
|
```
|
|
|
|
Находит процесс на локальной машине, связанный с текущим соединением.
|
|
|
|
**Параметры**
|
|
|
|
| Параметр | Тип | Описание / Требования |
|
|
| -------- | ------------------------------------------------------ | -------------------------------------------------------- |
|
|
| `ctx` | [`routing.Context`](./hook-routing.md#routing-context) | Контекст текущего запроса, переданный Hook маршрутизации |
|
|
|
|
**Возвращаемые значения**
|
|
|
|
| Значение | Тип | Описание |
|
|
| -------- | ------------------------------------------ | ------------------------------------------------ |
|
|
| `pid` | `number` | ID процесса; обычно `0`, если не получен |
|
|
| `name` | `string` | Имя процесса; `""`, если не получено |
|
|
| `path` | `string` | Путь к исполняемому файлу; `""`, если не получен |
|
|
| `err` | [`error`](./data-types.md#error) или `nil` | `nil` означает успех |
|
|
|
|
**Поведение**
|
|
|
|
Нужно явно передать допустимый контекст маршрутизации, иначе возникает исключение Lua. Если нет IP источника, тип сети не TCP/UDP, поиск не удался или платформа не поддерживается, возвращается ошибка.
|
|
|
|
`pid`, `name` и `path` никогда не равны `nil`, но при ошибке могут содержать частичные данные; перед использованием проверьте `err`. Если нет IP источника или тип сети не поддерживается, возвращается `0, "", "", err`; в остальных случаях результат платформенного поиска возвращается без изменений.
|
|
|
|
Поиск использует первый IP источника и порт источника. Если есть IP назначения, также передаются первый IP назначения и порт назначения. Точный способ сопоставления определяет платформенная реализация поиска.
|
|
|
|
Возможности поиска зависят от платформы и прав доступа. Windows, Linux и macOS имеют встроенные реализации. В Android среда выполнения должна зарегистрировать реализацию поиска; даже при успехе имя или путь могут отсутствовать. iOS и другие неподдерживаемые платформы возвращают ошибку.
|
|
|
|
**Пример**
|
|
|
|
```lua
|
|
local pid, name, path, err = router.FindProcess(ctx)
|
|
if err == nil and name == "curl" then
|
|
return "direct", "lua-process"
|
|
end
|
|
```
|