xray.router
Предоставляет константы и вспомогательные интерфейсы для скриптов маршрутизации. Параметры запроса и контекст описаны в Hook маршрутизации.
local router = require("xray.router")Указатель API
| Категория | Член API | Описание |
|---|---|---|
| Константа | router.NetworkUnknown | Неизвестная сеть |
| Константа | router.NetworkTCP | TCP |
| Константа | router.NetworkUDP | UDP |
| Константа | router.NetworkUNIX | UNIX |
| Константа | router.LocalOS | Платформа выполнения |
| Функция | router:PickOutbound(balancerTag) | Выбор исходящего подключения через балансировщик |
| Функция | router.FindProcess(ctx) | Поиск процесса локального соединения |
Константы
| Имя | Тип | Значение / Описание |
|---|---|---|
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 маршрутизации можно сравнивать с сетевыми константами:
if network == router.NetworkUDP then
return "direct", "lua-udp"
end2
3
Функции
router:PickOutbound
local outboundTag, err = router:PickOutbound(balancerTag)Выбирает исходящее подключение через указанный балансировщик.
Параметры
| Параметр | Тип | Описание / Требования |
|---|---|---|
balancerTag | string | Значение tag нужного балансировщика, настроенного в routing.balancers |
Возвращаемые значения
| Значение | Тип | Описание |
|---|---|---|
outboundTag | string или nil | При успехе — непустой tag выбранного исходящего подключения |
err | error или nil | nil означает успех |
Поведение
Нужно явно передать строку, иначе возникает исключение Lua. Пустая строка "" выполняет поиск по пустому tag.
Перед использованием результата проверьте err. Если балансировщик не существует, возвращается nil, err; если существует, но не выбрал исходящее подключение, — "", err. Когда срабатывает настроенный fallbackTag, возвращаются этот тег исходящего подключения и nil.
Пример
Ниже используется балансировщик с tag "proxy-pool", а результат передаётся согласно соглашению о возвращаемых значениях Hook маршрутизации:
local outboundTag, err = router:PickOutbound("proxy-pool")
return outboundTag, "lua-balance", err2
Полный пример приведён в руководстве по скриптам маршрутизации.
router.FindProcess
local pid, name, path, err = router.FindProcess(ctx)Находит процесс на локальной машине, связанный с текущим соединением.
Параметры
| Параметр | Тип | Описание / Требования |
|---|---|---|
ctx | routing.Context | Контекст текущего запроса, переданный Hook маршрутизации |
Возвращаемые значения
| Значение | Тип | Описание |
|---|---|---|
pid | number | ID процесса; обычно 0, если не получен |
name | string | Имя процесса; "", если не получено |
path | string | Путь к исполняемому файлу; "", если не получен |
err | error или nil | nil означает успех |
Поведение
Нужно явно передать допустимый контекст маршрутизации, иначе возникает исключение Lua. Если нет IP источника, тип сети не TCP/UDP, поиск не удался или платформа не поддерживается, возвращается ошибка.
pid, name и path никогда не равны nil, но при ошибке могут содержать частичные данные; перед использованием проверьте err. Если нет IP источника или тип сети не поддерживается, возвращается 0, "", "", err; в остальных случаях результат платформенного поиска возвращается без изменений.
Поиск использует первый IP источника и порт источника. Если есть IP назначения, также передаются первый IP назначения и порт назначения. Точный способ сопоставления определяет платформенная реализация поиска.
Возможности поиска зависят от платформы и прав доступа. Windows, Linux и macOS имеют встроенные реализации. В Android среда выполнения должна зарегистрировать реализацию поиска; даже при успехе имя или путь могут отсутствовать. iOS и другие неподдерживаемые платформы возвращают ошибку.
Пример
local pid, name, path, err = router.FindProcess(ctx)
if err == nil and name == "curl" then
return "direct", "lua-process"
end2
3
4