规则 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 |
Connect | L3/L4 | TCP 连接建立时 | IP/Port/Protocol/TransparentMode |
RequestHeaders | L7 | HTTP 请求头解析后 | Url/Host/Path/Method/RequestHeader |
RequestBody | L7 | 请求体就绪后 | 同上 + 请求体内容 |
ResponseHeaders | L7 | HTTP 响应头接收后 | StatusCode/ResponseHeader |
ResponseBody | L7 | 响应体就绪后 | 同上 + ResponseBody |
WebSocketMessage | L7 | 每条 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/"}} |
Method | HTTP 方法 | {"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"}} |
WebSocketMessage | WS 消息内容 | {"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 | 立即丢弃连接 | 所有 |
Abort | RST 重置连接 | 所有 |
Delay | 延迟模拟 (ms) | 所有 |
Throttle | 带宽限速 (kbps) | 所有 |
Inspect | 暂停流等待人工检查(需 Tauri UI,CLI 模式为 no-op) | 所有 |
Tag | 打标签(后续规则/脚本可用) | 所有 |
SetVariable | 设置变量(跨规则传递) | 所有 |
RateLimit | 基于 key 的限速 | 所有 |
L3/L4 网络层
RedirectIp | 重定向目标 IP | Connect |
ForwardPort | 修改目标端口 | Connect |
SetTtl | 设置 IP TTL | Connect |
L7 HTTP — 终端动作(终止代理)
MockResponse | 返回模拟 HTTP 响应 | Request/Response |
MapLocal | 返回本地文件内容 | Request/Response |
MapRemote | 转发到不同后端 | RequestHeaders |
Redirect | HTTP 重定向 | 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