xray.router
提供路由脚本使用的常量和辅助接口。请求参数与上下文见路由 Hook。
lua
local router = require("xray.router")1
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" |
可将路由 Hook 的 network 参数与网络常量比较:
lua
if network == router.NetworkUDP then
return "direct", "lua-udp"
end1
2
3
2
3
函数
router:PickOutbound
lua
local outboundTag, err = router:PickOutbound(balancerTag)1
通过指定的负载均衡器选择出站。
参数
| 参数 | 类型 | 说明 / 要求 |
|---|---|---|
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 的返回值约定传递结果:
lua
local outboundTag, err = router:PickOutbound("proxy-pool")
return outboundTag, "lua-balance", err1
2
2
完整示例见路由脚本指南。
router.FindProcess
lua
local pid, name, path, err = router.FindProcess(ctx)1
查找本机上与当前连接对应的进程。
参数
| 参数 | 类型 | 说明 / 要求 |
|---|---|---|
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 和其他不支持的平台返回错误。
示例
lua
local pid, name, path, err = router.FindProcess(ctx)
if err == nil and name == "curl" then
return "direct", "lua-process"
end1
2
3
4
2
3
4