规则 API 参考

规则引擎是 RelayCore 的核心流量控制机制。每条规则由 筛选条件 (Filter) + 执行动作 (Action) + 执行阶段 (Stage) 三要素组成,按优先级顺序在代理流水线中执行。

规则结构

{
  "id": "rule-001",           // 唯一标识
  "name": "Block Tracking",   // 可读名称
  "active": true,             // 是否启用
  "stage": "RequestHeaders",  // 执行阶段
  "priority": 100,            // 优先级(越高越先执行,默认 0)
  "termination": "Continue",  // 后续规则处理方式
  "filter": { ... },          // 匹配条件
  "actions": [ ... ],         // 动作列表(有顺序)
  "constraints": {            // 性能限制(可选)
    "timeout_ms": 5000
  }
}

执行阶段 (Stage)

阶段决定规则何时被评估。同一阶段内按 priority 降序执行:

阶段层级触发时机可用 Filter
ConnectL3/L4TCP 连接建立时IP/Port/Protocol/TransparentMode
RequestHeadersL7HTTP 请求头解析后Url/Host/Path/Method/RequestHeader
RequestBodyL7请求体就绪后同上 + 请求体内容
ResponseHeadersL7HTTP 响应头接收后StatusCode/ResponseHeader
ResponseBodyL7响应体就绪后同上 + ResponseBody
WebSocketMessageL7每条 WS 帧到达WebSocketMessage

筛选条件 (Filter)

Filter 决定规则是否生效。支持逐字段匹配和逻辑组合:

全局

Filter说明示例
All匹配所有流量{"type": "All"}

L3/L4(Connect 阶段)

SrcIp源 IP(支持 CIDR)"192.168.1.0/24"
DstPort目标端口443
Protocol传输协议"TCP"
TransparentMode是否透明代理模式true

L7(HTTP/WS 阶段)

Url完整 URL 匹配{"type": "Url", "config": {"mode": "Contains", "value": "/api/"}}
Host域名匹配{"type": "Host", "config": {"mode": "Exact", "value": "api.example.com"}}
Path路径匹配{"type": "Path", "config": {"mode": "Prefix", "value": "/v2/"}}
MethodHTTP 方法{"type": "Method", "config": {"mode": "Exact", "value": "POST"}}
RequestHeader请求头(名称+值){"type": "RequestHeader", "config": {"name": "Authorization", "value": {"mode": "Contains", "value": "Bearer"}}}
ResponseHeader响应头(名称+值){"type": "ResponseHeader", "config": {"name": "Content-Type", "value": {"mode": "Contains", "value": "json"}}}
StatusCode响应状态码{"type": "StatusCode", "config": 404}
ResponseBody响应体内容{"type": "ResponseBody", "config": {"mode": "Contains", "value": "error"}}
WebSocketMessageWS 消息内容{"type": "WebSocketMessage", "config": {"mode": "Contains", "value": "ping"}}

逻辑组合

And所有子 filter 同时满足{"type": "And", "config": [urlFilter, hostFilter]}
Or任意子 filter 满足(1.0 起与匹配语义一致){"type": "Or", "config": [filter404, filter500]}
Not取反{"type": "Not", "config": filter}

字符串匹配器 (StringMatcher)

大部分 L7 filter 接受 StringMatcher 作为匹配模式:

模式说明示例
Exact精确匹配{"mode": "Exact", "value": "/api/users"}
Contains包含匹配{"mode": "Contains", "value": "tracking"}
Prefix前缀匹配{"mode": "Prefix", "value": "/api/"}
Suffix后缀匹配{"mode": "Suffix", "value": ".js"}
Regex正则表达式{"mode": "Regex", "value": "/api/[a-z]+/\d+"}
Glob通配符匹配{"mode": "Glob", "value": "*.example.com/*"}

执行动作 (Action)

Action 定义匹配后做什么。一条规则可包含多个 Action,按顺序执行。

通用控制

Action说明阶段
Drop立即丢弃连接所有
AbortRST 重置连接所有
Delay延迟模拟 (ms)所有
Throttle带宽限速 (kbps)所有
Inspect暂停流等待人工检查(需 Tauri UI,CLI 模式为 no-op)所有
Tag打标签(后续规则/脚本可用)所有
SetVariable设置变量(跨规则传递)所有
RateLimit基于 key 的限速所有

L3/L4 网络层

RedirectIp重定向目标 IPConnect
ForwardPort修改目标端口Connect
SetTtl设置 IP TTLConnect

L7 HTTP — 终端动作(终止代理)

MockResponse返回模拟 HTTP 响应Request/Response
MapLocal返回本地文件内容Request/Response
MapRemote转发到不同后端RequestHeaders
RedirectHTTP 重定向Request/Response

L7 HTTP — 修改动作

AddRequestHeader添加请求头(允许重复)
UpdateRequestHeader更新请求头(支持 add_if_missing)
DeleteRequestHeader删除请求头
AddResponseHeader添加响应头
UpdateResponseHeader更新响应头
DeleteResponseHeader删除响应头
SetRequestMethod修改 HTTP 方法
SetRequestUrl修改请求 URL
SetRequestBody替换请求体
SetResponseStatus修改响应状态码
SetResponseBody替换响应体

L7 HTTP — 转换动作

TransformRequestBody正则/JsonPath 变形请求体
TransformResponseBody正则/JsonPath 变形响应体

WebSocket

MockWebSocketMessage替换 WS 消息
DropWebSocketMessage丢弃 WS 消息

Body 数据源 (BodySource)

用于 SetRequestBody、SetResponseBody、MockResponse 等需要内容体的动作:

{"type": "Text",   "value": "{\"status\":\"ok\"}"}
{"type": "File",   "value": "/path/to/mock.json"}
{"type": "Base64", "value": "eyJzdGF0dXMiOiJvayJ9"}

Body 转换 (BodyTransform)

// 正则替换
{"type": "RegexReplace", "config": {"pattern": "http://", "replacement": "https://"}}

// JsonPath 设置
{"type": "JsonPathSet", "config": {"path": "$.data.secret", "value": "***"}}

// JsonPath 删除
{"type": "JsonPathDelete", "config": {"path": "$.debug"}}

Mustache 变量替换

Action 的字符串字段支持 Mustache 模板语法,在运行时替换为实际值:

变量替换为
{{host}}请求目标主机名
{{request.path}}请求 URL 路径
{{request.url}}完整请求 URL
{{request.method}}HTTP 方法
{{ip}} / {{client_ip}}客户端 IP
{{previous}}该字段在动作执行前的原值
{{variable.xxx}}SetVariable 设置的变量值
{{timestamp}}Unix 毫秒时间戳
// 示例:MapRemote 使用 Mustache
{
  "type": "MapRemote",
  "config": {
    "url": "https://backend-{{host}}/v2{{request.path}}",
    "preserve_host": false
  }
}

// 示例:UpdateRequestHeader 使用 {{previous}}
{
  "type": "UpdateRequestHeader",
  "config": {
    "name": "X-Custom",
    "value": "{{previous}}; extra-value",
    "add_if_missing": true
  }
}

规则终止 (Termination)

行为
Continue继续执行同阶段后续规则(默认)
Stop停止同阶段后续规则,类似 mitmproxy 的 stop=True

Stop 只影响同一阶段。例如 RequestHeaders 阶段的 Stop 不会阻止 ResponseHeaders 阶段的规则。

RateLimit 详解

{
  "type": "RateLimit",
  "config": {
    "key": "{{ip}}:{{request.path}}",   // 按 IP+路径 组合限速
    "limit": 100,                         // 窗口内最多 100 请求
    "window_ms": 60000                    // 60 秒窗口
  }
}

支持 Mustache 模板作为 key。key 为 "ip" 时等同于 "{{client_ip}}"

WebSocket 方向

{"type": "MockWebSocketMessage", "config": {
  "direction": "Incoming",     // 或 "Outgoing"
  "message": "replaced message"
}}

管理规则

# 列出当前活跃规则(GET 返回规则数组)
curl http://127.0.0.1:8082/api/v1/rules

# CLI 查看活跃规则
relay-core-cli rules list

# PUT 添加/更新规则
curl -X PUT http://127.0.0.1:8082/api/v1/rules \
  -H "Content-Type: application/json" \
  -d '{"id":"r1","name":"log-api","active":true,"stage":"RequestHeaders",
       "priority":10,"termination":"Continue",
       "filter":{"type":"Url","config":{"mode":"Contains","value":"/api/"}},
       "actions":[{"type":"AddRequestHeader","config":{"name":"X-Logged","value":"true"}}]}'

# MCP tool
mcp: relay-core set_rule --rule rule.json