Packet Tap 定义
Packet Tap 定义文件是 wireshark/ 目录下的 YAML 文件,每个文件描述一个数据包探针。文件 ID 的推导规则与脚本相同:去掉扩展名,将 / 替换为 .。
完整示例
id: example.packet.trace
direction:
- send
- receive
matcher:
type: packet-name
value: PacketPlayOutChat
tracking: true
parse: true
intercept: false
rewrite:
type: field-set
field: b
value: monoceros
route:
type: script
value: debug.packet.trace
字段说明
| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
id | String | 从文件路径推导 | Tap 的唯一标识 |
direction | String / List | 无 | 监听方向:send(服务端发往客户端)、receive(客户端发往服务端),可以是单个值或列表 |
matcher | Object | 无 | 数据包匹配器,决定哪些数据包会被此 Tap 捕获 |
filters | List | 空 | 过滤器列表,对匹配到的数据包做进一步筛选 |
tracking | Boolean | false | 是否启用会话级追踪记录,开启后会在玩家会话中记录匹配的数据包信息 |
parse | Boolean | false | 是否解析数据包内容。开启后可以在脚本中读取数据包字段 |
intercept | Boolean | false | 是否允许拦截(取消)数据包。需要全局 allow-intercept: true 才会生效 |
rewrite | Object | 无 | 数据包重写规则。需要全局 allow-rewrite: true 才会生效 |
route | Object | 无 | 路由目标,将匹配的数据包转发到脚本、动作或处理器 |
direction
监听方向可以写成单个值或列表:
# 只监听发送
direction: send
# 同时监听收发
direction:
- send
- receive
matcher
匹配器决定哪些数据包会被 Tap 捕获,由 type 和 value 两个字段组成:
matcher:
type: packet-name
value: PacketPlayOutChat
filters
过滤器是一个列表,每个过滤器同样由 type 和 value 组成。只有通过所有过滤器的数据包才会继续处理:
filters:
- type: packet-name
value: PacketPlayOutChat
rewrite
重写规则定义了如何修改数据包内容。type 决定重写方式,其余字段根据类型不同而变化:
rewrite:
type: field-set
field: b
value: monoceros
注意
重写是双重门控的 —— Tap 定义中配置了 rewrite 还不够,config.yml 中的 wireshark.allow-rewrite 也必须设为 true,重写才会实际执行。
route
路由目标决定匹配的数据包被转发到哪里处理:
# 路由到脚本
route:
type: script
value: debug.packet.trace
# 路由到动作
route:
type: action
value: my.action.id
安全机制
拦截和重写都采用双重门控设计,两个开关必须同时开启才会生效:
| 功能 | Tap 定义字段 | 全局配置字段 |
|---|---|---|
| 拦截 | intercept: true | wireshark.allow-intercept: true |
| 重写 | rewrite: { ... } | wireshark.allow-rewrite: true |
这样设计是为了防止误操作 —— 即使某个 Tap 文件中写了拦截或重写配置,只要全局开关没开,就不会产生任何影响。