8.5 KiB
路由 Hook
核心在选择出站时调用 routing.script 中的全局函数 HandleRoute。配置接入和完整示例见路由脚本指南。
API 索引
| 分类 | 成员 | 说明 |
|---|---|---|
| Hook | HandleRoute(...) |
为请求选择出站 |
| 对象 | routing.Context |
当前请求的路由上下文 |
| 方法 | ctx:GetSourceIPs() |
取得来源 IP |
| 方法 | ctx:GetTargetIPs() |
取得目标 IP |
| 方法 | ctx:GetLocalIPs() |
取得本地 IP |
| 方法 | ctx:GetAttributes() |
取得请求属性 |
Hook 接口
HandleRoute(...)
function HandleRoute(ctx, inboundTag, sourcePort, targetPort,
localPort, targetDomain, network, protocol, user,
vlessRoute, skipDNSResolve)
return outboundTag, ruleTag, err
end
为当前请求选择出站,并可返回规则名称或错误。
参数
核心始终按上述顺序传入全部 11 个参数,均非 nil。函数定义可省略不使用的末尾形参,这不会改变核心传入的值。
| 参数 | 类型 | 说明 | 空值与缺省值 |
|---|---|---|---|
ctx |
routing.Context |
当前请求上下文 | 始终是有效的 userdata |
inboundTag |
string |
入站标识 | 入站未设置 tag 或没有入站信息时为 "" |
sourcePort |
number |
来源端口,0 .. 65535 |
没有有效来源地址时为 0 |
targetPort |
number |
目标端口,0 .. 65535 |
没有有效目标地址时为 0 |
localPort |
number |
入站连接的本地端口,0 .. 65535 |
没有有效本地地址时为 0 |
targetDomain |
string |
优先取生效的嗅探域名,否则取连接目标中的域名,统一转为小写 | 目标为 IP 且无生效的嗅探域名,或缺少目标信息时为 "" |
network |
number |
网络类型,与 router.NetworkTCP 等常量比较 |
没有出站信息或网络类型未知时为 NetworkUnknown(0) |
protocol |
string |
嗅探得到的协议 | 没有嗅探协议信息时为 "" |
user |
string |
用户 email | 没有入站、用户信息或未设置 email 时为 "" |
vlessRoute |
number |
VLESS UUID 第 7、8 字节组成的路由值,0 .. 65535 |
没有该信息时为 0,值本身也可能为 0 |
skipDNSResolve |
boolean |
为 true 时必须跳过 DNS 查询,避免回环 |
没有该标记或附加请求信息时为 false |
返回值
| 返回值 | 类型 | 说明 |
|---|---|---|
outboundTag |
string 或 nil |
出站标识;nil 或 "" 表示未选中 |
ruleTag |
string 或 nil |
可选的规则名称;nil、省略或 "" 表示无名称 |
err |
error、string 或 nil |
仅 nil 表示无错误 |
行为约定
核心依次校验 err、outboundTag、ruleTag,遇到错误即停止;err 非 nil 时忽略前两项,未选中出站时忽略 ruleTag。
成功时可省略末尾的 ruleTag 和 err,例如 return "direct"。错误必须放在第三个位置,例如 return nil, nil, "路由失败";return nil, "路由失败" 不会报告错误。
| 脚本结果 | 核心处理 |
|---|---|
校验通过且 outboundTag 非空 |
使用对应出站,标识不存在则关闭连接 |
| 未选中出站 | 使用默认出站 |
| 返回错误、返回值类型错误或执行异常 | 记录错误并尝试默认出站 |
默认出站是配置中的第一个出站;没有可用默认出站时关闭连接。若要阻断流量应显式返回已配置的 blackhole 出站 tag 而不是利用此特性返回不存在的标识。
关联对象
routing.Context
routing.Context 表示当前请求的路由上下文,在 HandleRoute 中通过参数 ctx 访问。
| 属性 | 说明 |
|---|---|
| Go 底层类型 | features/routing 中的 routing.Context 接口 |
| Lua 表现 | userdata |
| 取得方式 | 核心传入的 HandleRoute 第一个参数 |
下列方法均无额外参数。IP 及 slice 操作统一见数据类型。
GetSourceIPs
local ips = ctx:GetSourceIPs()
取得请求的来源 IP。
参数
无额外参数。
返回值
| 返回值 | 类型 | 说明 |
|---|---|---|
ips |
[]net.IP 或 nil |
对应地址的 IP 列表 |
行为约定
没有入站、来源地址无效或来源地址不是 IP 时返回 nil。
GetTargetIPs
local ips = ctx:GetTargetIPs()
取得请求的目标 IP。
参数
无额外参数。
返回值
| 返回值 | 类型 | 说明 |
|---|---|---|
ips |
[]net.IP 或 nil |
对应地址的 IP 列表 |
行为约定
没有出站、目标地址无效或目标地址是域名时返回 nil。
GetLocalIPs
local ips = ctx:GetLocalIPs()
取得入站连接的本地 IP。
参数
无额外参数。
返回值
| 返回值 | 类型 | 说明 |
|---|---|---|
ips |
[]net.IP 或 nil |
对应地址的 IP 列表 |
行为约定
没有入站、本地地址无效或本地地址不是 IP 时返回 nil。
GetAttributes
local attributes = ctx:GetAttributes()
取得当前请求的属性。
参数
无额外参数。
返回值
| 返回值 | 类型 | 说明 |
|---|---|---|
attributes |
map[string]string |
始终返回 userdata,不为 nil |
行为约定
使用 attributes[key] 读取属性,key 必须为字符串。已存在的键返回字符串(可能为 ""),不存在的键返回 nil。
属性的含义和用途见路由配置中的 attrs 字段。
示例
local attributes = ctx:GetAttributes()
if attributes[":method"] == "GET" then
return "direct", "lua-get"
end