Appearance
Appearance
本页按“为什么需要 MATE、如何从帧提取 PDU、如何把 PDU 组成 Gop、如何把 Gop 组成 Gog、如何用 Transform 改写属性”的顺序解释 MATE 的工作方式。
| 需求 | 应读章节 | 注意点 |
|---|---|---|
| 从零理解 MATE 的对象模型 | 简介、属性值对、AVP 列表 | AVP/AVPL 是后续 PDU、Gop、Gog 的共同基础。 |
| 写一个可用的 MATE 配置 | MATE 分析、MATE 的 PDU、将 Pdu 分组到一起(Gop) | PDU 负责提取,Gop 负责关联,Gog 负责跨组聚合。 |
| 解释输出树为什么这样显示 | MATE 的 PDU 树、Gop 的树、Gog 的树 | 树结构来自配置和匹配结果,不是原始报文天然存在的结构。 |
| 处理多条件、标记、方向、NAT 场景 | AVPL 转换 | Transform 用于改写或补充 AVPL,不是显示过滤器。 |
| 顺序 | 章节 | 目的 |
|---|---|---|
| 1 | 简介、属性值对、AVP 列表 | 建立术语基础。 |
| 2 | MATE 的 PDU | 理解字段提取、创建条件、PDU 树。 |
| 3 | 将 Pdu 分组到一起(Gop) | 理解会话或事务级聚合。 |
| 4 | 将 Gop 分组到一起(Gog) | 理解跨 Gop 的关联。 |
| 5 | AVPL 转换 | 处理更复杂的属性改写和标记场景。 |
MATE 会基于帧中包含的信息创建一棵可过滤的树,这些信息与从其他帧获得的信息共享某种关系。这些关系的建立方式在配置文件中描述。配置文件会告诉 MATE 什么构成一个 PDU,以及如何将它与其他 PDU 关联起来。
MATE 会分析每一帧,从该帧的“protocol”树中提取相关信息。提取出的信息包含在 MATE PDU 中;这些 PDU 包含一个从树中取得的相关属性列表。从现在起,我将使用术语“PDU”来指代由 MATE 创建、包含从帧中提取的相关信息的对象;我将使用“frame”来指代由预先分析该帧的各种 dissector 提取出的“原始”信息。
对于每个 PDU,MATE 会检查它是否属于一个现有的“Group of PDUs”(Gop)。如果属于,MATE 会将该 PDU 分配给该 Gop,并把任何新的相关属性移动到 Gop 的属性列表中。PDU 如何以及何时属于 Gop,同样在配置文件中描述。
每当一个 Gop 被分配了新的 PDU,MATE 都会检查它是否符合条件,从而使其属于一个“Group of Groups”(Gog)。当然,使一个 Gop 属于某个 Gog 的条件也来自配置文件。
一旦 MATE 完成对帧的分析,它就能够基于 PDU、它们所属的 Gop,以及自然地,前者所属的任何 Gog,为每一帧创建一棵“protocol”树。
如何告诉 MATE 提取什么、如何分组,以及随后如何关联这些组,是通过 AVP 和 AVPL 完成的。
MATE 中的信息包含在 Attribute/Value Pair(AVP)中。AVP 由两个字符串组成:名称和值。AVP 会在配置中使用,在那里它们还带有一个运算符。可以使用这些运算符通过多种方式将 AVP 相互匹配。
AVP 会被分组为 AVP List(AVPL)。PDU、Gop 和 Gog 各自都有一个 AVPL。它们的 AVPL 会以多种方式与来自配置文件的其他 AVPL 进行匹配。
MATE 会被指示如何从帧中提取 AVP,以创建带有 AVPL 的 PDU。它也会被指示如何将该 AVPL 与其他类似 PDU 的 AVPL 匹配,从而将它们关联起来。在 MATE 中,PDU 之间的关系就是 Gop,它同样有一个 AVPL。MATE 会用其他 AVPL 来配置,以便对 Gop 的 AVPL 进行操作,从而把 Gop 关联成 Gog。
要理解 MATE 的工作方式,充分理解 AVP 和 AVPL 的工作方式是基础。
MATE 用来关联不同帧的信息包含在 Attribute/Value Pair(AVP)中。AVP 由两个字符串组成——名称和值。当 AVP 用于配置时,还会定义一个运算符。可以使用这些运算符通过多种方式将 AVP 相互匹配。
avp_name="avp's value" another_name= "1234 is the value"名称是一个字符串,用于指代一种 AVP 的“类别”。除非两个 AVP 的名称完全相同,否则它们不会匹配。
你不应在名称中使用大写字符,也不应使用以 . 或 _ 开头的名称。大写名称保留给配置参数使用(我们将它们称为关键字);没有什么会禁止你也将大写字符串用于其他用途,但那很可能会造成混淆。在本文档、参考手册、示例和基础库中,我会避免把大写单词用于关键字以外的任何内容。以 . 开头的名称也会非常容易造成混淆,因为在旧语法中,AVPL 转换使用以 . 开头的名称来表示它们属于替换 AVPL。
值是一个字符串,它要么在配置中设置(对于配置 AVP),要么由 wireshark 在从帧树中提取有意义字段时设置。从字段中提取出的值使用与过滤器字符串中相同的表示形式,只是不使用引号。
名称只能包含字母数字字符、_ 和 .。名称以一个运算符结束。
即使值是数字,也会被当作字符串处理。如果值中包含任何空格,则值必须放在引号 "" 中。
ip_addr=10.10.10.11, tcp_port=1234, binary_data=01:23:45:67:89:ab:cd:ef, parameter12=0x23aa, parameter_with_spaces="this value has spaces"两个具有相同名称的 AVP 可能如何匹配,是由运算符描述的。请记住,除非两个 AVP 的名称完全相同,否则它们不会匹配。在 MATE 中,匹配操作总是在从帧中提取的 AVP(称为数据 AVP)与配置中的 AVP 之间进行。
当前定义的 MATE AVP 匹配运算符包括:
Equal= 如果给定字符串与数据 AVP 的值字符串完全匹配,则匹配
Not Equal! 只有在给定值字符串不等于数据 AVP 的值字符串时才匹配
One Of{} 如果列出的可能字符串之一等于数据 AVP 的值字符串,则匹配
Starts With^ 如果给定字符串匹配数据 AVP 值字符串的开头字符,则匹配
Ends With$ 如果给定字符串匹配数据 AVP 值字符串的末尾字符,则匹配
Contains~ 如果给定字符串匹配数据 AVP 值字符串的任意子串,则匹配
Lower Than< 如果数据 AVP 的值字符串在语义上小于给定字符串,则匹配
Higher Than> 如果数据 AVP 的值字符串在语义上大于给定字符串,则匹配
Exists?(可以省略 ?)只要存在给定名称的数据 AVP,就会匹配
AVPL 是一组不同的 AVP,可以与其他 AVPL 进行匹配。每个 PDU、Gop 和 Gog 都有一个 AVPL,其中包含与其相关的信息。MATE 用来分组 Pdu 和 Gop 的规则就是 AVPL 操作。
在一个给定的 AVPL 中,永远不会有两个完全相同的 AVP。不过,只要值不同,一个 AVPL 中可以有多个名称相同的 AVP。
一些 AVPL 示例:
( addr=10.20.30.40, addr=192.168.0.1, tcp_port=21, tcp_port=32534, user_cmd=PORT, data_port=12344, data_addr=192.168.0.1 ) ( addr=10.20.30.40, addr=192.168.0.1, channel_id=22:23, message_type=Setup, calling_number=1244556673 ) ( addr=10.20.30.40, addr=192.168.0.1, ses_id=01:23:45:67:89:ab:cd:ef ) ( user_id=pippo, calling_number=1244556673, assigned_ip=10.23.22.123 )在 MATE 中有两种类型的 AVPL:
数据 AVPL 可以用多种方式与操作 AVPL 进行操作:
Loose Match:如果每个 AVPL 中至少有一个 AVP 相互匹配,则匹配。如果匹配,它将返回一个 AVPL,其中包含操作数 AVPL 中与运算符 AVP 匹配的所有 AVP。
“Every” Match:如果运算符 AVPL 中没有任何 AVP 无法匹配操作数 AVPL 中存在的 AVP,则匹配,即使并非运算符的所有 AVP 都有匹配项。如果匹配,它将返回一个 AVPL,其中包含操作数 AVPL 中与运算符 AVPL 中某个 AVP 匹配的所有 AVP。
Strict Match:当且仅当运算符的每一个 AVP 在操作数 AVPL 中至少有一个匹配项时才匹配。如果匹配,它将返回一个 AVPL,其中包含操作数中匹配到的 AVP。
还有一个 Merge 操作,它在 AVPL 之间执行,其中所有不存在于操作数 AVPL 但存在于操作数中的 AVP 都会被添加到操作数 AVPL 中。
除此之外还有 Transformations——由一个匹配 AVPL 和一个要合并的 AVPL 组成。
MATE 对一帧的分析分为三个阶段执行:
在第一阶段,MATE 尝试从帧的协议树中提取一个 MATE Pdu。如果 MATE 的配置中有一个 Pdu 声明,其 Proto 包含在该帧中,MATE 就会创建一个 Pdu。
在第二阶段,如果已经从帧中提取出一个 Pdu,MATE 会尝试通过匹配 Gop 声明给出的 key criteria,将它与其他 Pdu 分组到一个 Gop(Group of Pdus)中。如果还没有具有该 Pdu key criteria 的 Gop,MATE 会在它匹配 Gop 声明中给出的 Start criterium 时,尝试为它创建一个新的 Gop。
在第三阶段,如果该 Pdu 有一个 Gop,MATE 会尝试使用 Gog 声明的 Member criteria 给出的条件,将这个 Gop 与其他 Gop 分组到一个 Gog(Group of Groups)中。
提取和匹配逻辑来自 MATE 的配置;MATE 的配置文件由 mate.config 首选项声明。默认情况下,它是一个空字符串,这表示:不配置 MATE。
配置文件告诉 MATE 在帧中查找什么;如何将其制成 PDU;PDU 将如何与其他类似 PDU 关联成 Gop;以及 Gop 如何关联成 Gog。
MATE 配置文件是一组声明列表。声明有 4 种类型:Transform、Pdu、Gop 和 Gog。
MATE 会查看每一帧的树,以判断是否有可提取的有用数据;如果有,它会创建一个或多个包含有用信息的 PDU 对象。
MATE 分析的第一部分是“PDU 提取”;有多种“Actions”用于指示 MATE 应当从当前帧的树中提取什么到 MATE 的 PDU 中。
MATE 会为帧中存在的每个不同的 Proto 类型 proto 字段创建一个 Pdu。MATE 会从该字段的树中取得 Mate/Reference 声明中定义的那些字段,这些字段在帧中的初始偏移位于当前 Proto 的边界以及给定 Transport 和 Payload 语句的边界之内。
Pdu dns_pdu Proto dns Transport ip { Extract addr From ip.addr; Extract dns_id From dns.id; Extract dns_resp From dns.flags.response;};MATE 会为帧中存在的每个不同的 Proto 类型 proto 字段创建一个 Pdu。MATE 会从该字段的树中取得 Pdu AVPL 中定义的那些字段,这些字段在帧中的初始偏移位于当前 Proto 的边界以及各个已分配 Transport 的边界之内。
一旦 MATE 找到了一个 Proto 字段,可以从帧中为其创建 Pdu,它就会在帧中向后查找相应的 Transport 字段。之后,对于其值所声明字段的每一个实例,它会创建以 AVPL 其余部分中给出的各项命名的 AVP。
有时我们需要来自多个 Transport 协议的信息。在这种情况下,MATE 会在给定栈中向后检查帧,以查找各个 Transport 协议。MATE 对帧中的每个“protocol”只会选择最近的 transport 边界。
这样,对于帧中出现的每个 Proto,我们都会得到所有与其相对 transport 匹配的 Pdu。
Pdu isup_pdu Proto isup Transport mtp3/ip { Extract m3pc From mtp3.dpc; Extract m3pc From mtp3.opc; Extract cic From isup.cic; Extract addr From ip.addr; Extract isup_msg From isup.message_type;};这允许为 Pdu 分配正确的 Transport,避免重复的 transport protocol 条目(例如在 ip over ip 隧道场景中)。
Pdu ftp_pdu Proto ftp Transport tcp/ip { Extract addr From ip.addr; Extract port From tcp.port; Extract ftp_cmd From ftp.command;};除了必需的 Transport 之外,还有一个可选的 Payload 语句,它的工作方式与 Transport 非常相似,但指的是 Proto 范围之后的元素。它在某些情况下很有用:payload 协议可能不会出现在 Pdu 中,但该 Pdu 仍属于同一类别。
Pdu mmse_over_http_pdu Proto http Transport tcp/ip { Payload mmse; Extract addr From ip.addr; Extract port From tcp.port; Extract method From http.request.method; Extract content From http.content_type; Extract http_rq From http.request; Extract resp From http.response.code; Extract host From http.host; Extract trx From mmse.transaction_id; Extract msg_type From mmse.message_type; Extract notify_status From mmse.status; Extract send_status From mmse.response_status;};可能存在一些情况,我们不希望 MATE 创建 PDU,除非其某些提取属性满足或不满足某些条件。为此,我们使用 Pdu 声明中的 Criteria 语句。
Pdu isup_pdu Proto isup Transport mtp3/ip { ... // MATE will create isup_pdu PDUs only when there is not a point code '1234' Criteria Reject Strict (m3pc=1234);};Pdu ftp_pdu Proto ftp Transport tcp/ip { ... // MATE will create ftp_pdu PDUs only when they go to port 21 of our ftp_server Criteria Accept Strict (addr=10.10.10.10, port=21);};Criteria 语句会给出一个动作(Accept 或 Reject)、一种匹配模式(Strict、Loose 或 Every)以及一个 AVPL,用于与当前提取出的 AVPL 进行匹配。
一旦字段被提取到 Pdu 的 AVPL 中,MATE 就会对其应用任何已声明的转换。转换如何应用以及如何工作将在后文描述。不过,有必要知道的是,一旦 Pdu 的 AVPL 被创建,它就可以在分析之前被转换。这样我们就可以整理数据,以简化分析。
每个成功创建的 Pdu 都会向帧解析中添加一棵 MATE 树。如果该 Pdu 未关联到任何 Gop,则该 Pdu 的树只包含 Pdu 的信息;如果它被分配给某个 Gop,则该树还会包含 Gop 项;Gog 层级同样如此。
mate dns_pdu:1 dns_pdu: 1 dns_pdu time: 3.750000 dns_pdu Attributes dns_resp: 0 dns_id: 36012 addr: 10.194.4.11 addr: 10.194.24.35Pdu 的树包含一些可过滤字段
mate.dns_pdu 将包含“dns_pdu”Pdu 的编号
mate.dns_pdu.RelativeTime 将包含自捕获开始以来经过的时间,单位为秒
该树还会包含 Pdu 的各种属性,这些属性都将是字符串(在过滤器中应作为 "10.0.0.1" 使用,而不是作为 10.0.0.1)
一旦 MATE 创建了 Pdu,它就进入 Pdu 分析阶段。在 PDU 分析阶段,MATE 会尝试将相同类型的 Pdu 分组为 Groups of Pdus(也就是 Gop),并将一些 AVP 从 Pdu 的 AVPL 复制到 Gop 的 AVPL。
给定一个 Pdu,MATE 首先会检查配置中是否有针对该 Pdu 类型的任何 Gop 声明。如果有,它会使用其 Match AVPL 与该 Pdu 的 AVPL 进行匹配;如果它们不匹配,分析阶段就结束。如果匹配,则该 AVPL 是 Gop 的候选 key,它将用于在 Gop 索引中搜索应将当前 PDU 分配给哪个 Gop。如果不存在这样的 Gop,并且该 Pdu 不匹配针对该 Pdu 类型的 Gop 声明中的 Start 条件,则该 Pdu 将保持未分配状态,并且只完成分析阶段。
Gop ftp_ses On ftp_pdu Match (addr, addr, port, port);Gop dns_req On dns_pdu Match (addr, addr, dns_id);Gop isup_leg On isup_pdu Match (m3pc, m3pc, cic);如果存在匹配,候选 key 将用于搜索 Gop 索引,以查看是否已经有一个 Gop 以相同方式匹配该 Gop 的 key。如果 Gop 集合中存在这样的匹配,并且该 PDU 不匹配其类型的 Start AVPL,则该 PDU 将被分配给匹配的 Gop。如果它是 Start 匹配,MATE 将检查该 Gop 是否已经停止。如果该 Gop 已经停止,则会创建一个新的 Gop,并在 Gop 索引中替换旧的 Gop。
Gop ftp_ses On ftp_pdu Match (addr, addr, port, port) { Start (ftp_cmd=USER);};Gop dns_req On dns_pdu Match (addr, addr, dns_id) { Start (dns_resp=0);};Gop isup_leg On isup_pdu Match (m3pc, m3pc, cic) { Start (isup_msg=1);};如果没有为 Gop 给出 Start,则其 AVPL 匹配现有 Gog key 的 Pdu 将作为一个 Gop 的开始。
一旦我们知道某个 Gop 存在且该 Pdu 已被分配给它,MATE 会把所有与 key 匹配的属性,以及 Pdu 的 AVPL 中与 Extra AVPL 匹配的任何 AVP,复制到 Gop 的 AVPL 中。
Gop ftp_ses On ftp_pdu Match (addr, addr, port, port) { Start (ftp_cmd=USER); Extra (pasv_prt, pasv_addr);};Gop isup_leg On isup_pdu Match (m3pc, m3pc, cic) { Start (isup_msg=1); Extra (calling, called);};一旦 Pdu 被分配给 Gop,MATE 就会检查该 Pdu 是否匹配 Stop;如果匹配,MATE 会将该 Gop 标记为已停止。即使已经停止,一个 Gop 仍可能被分配新的、匹配其 key 的 Pdu,除非这样的 Pdu 匹配 Start。如果匹配 Start,MATE 将转而创建一个以该 Pdu 开始的新 Gop。
Gop ftp_ses On ftp_pdu Match (addr, addr, port, port) { Start (ftp_cmd=USER); Stop (ftp_cmd=QUIT); // The response to the QUIT command will be assigned to the same Gop Extra (pasv_prt, pasv_addr);};Gop dns_req On dns_pdu Match (addr, addr, dns_id) { Start (dns_resp=0); Stop (dns_resp=1);};Gop isup_leg On isup_pdu Match (m3pc, m3pc, cic) { Start (isup_msg=1); // IAM Stop (isup_msg=16); // RLC Extra (calling, called);};如果没有为给定 Gop 声明 Stop criterium,则该 Gop 会在创建后立即停止。不过,与任何其他 Gop 一样,匹配该 Gop key 的 Pdu 仍会被分配给该 Gop,除非它们匹配某个 Start 条件;在这种情况下,会使用相同 key 创建一个新的 Gop。
对于每个包含属于某个 Gop 的 Pdu 的帧,MATE 都会为该 Gop 创建一棵树。
下面的示例表示由 dns_pdu 和 dns_req 示例创建的树。
...mate dns_pdu:6->dns_req:1 dns_pdu: 6 dns_pdu time: 2.103063 dns_pdu time since begining of Gop: 2.103063 dns_req: 1 dns_req Attributes dns_id: 36012 addr: 10.194.4.11 addr: 10.194.24.35 dns_req Times dns_req start time: 0.000000 dns_req hold time: 2.103063 dns_req duration: 2.103063 dns_req number of PDUs: 2 Start PDU: in frame 1 Stop PDU: in frame 6 (2.103063 : 2.103063) dns_pdu Attributes dns_resp: 1 dns_id: 36012 addr: 10.194.4.11 addr: 10.194.24.35除了 pdu 的树之外,这棵树还包含关于属于该 Gop 的 Pdu 之间关系的信息。这样我们就有:
mate.dns_req,其中包含这个 dns_req Gop 的 id。它会出现在属于 dns_req Gop 的帧中。
mate.dns_req.dns_id 和 mate.dns_req.addr,表示复制到 Gop 中的属性值。
Gop 的计时器
mate.dns_req.StartTime 从捕获开始到 Gop 开始所经过的时间(秒)。
mate.dns_req.Time 分配给该 Gop 的 start Pdu 与 stop Pdu 之间经过的时间(仅当已为该 Gop 声明 Stop 条件且匹配的 Pdu 已到达时创建)。
mate.dns_req.Duration start Pdu 与分配给该 Gop 的最后一个 Pdu 之间经过的时间。
mate.dns_req.NumOfPdus 属于该 Gop 的 Pdu 数量
请注意,Gop 有两个“计时器”:
Time,仅为已 Stopped 的 Gop 定义,表示 Start 和 Stop Pdu 之间经过的时间。
Duration,为每个 Gop 定义,无论其状态如何,表示其 Start Pdu 与分配给该 Gop 的最后一个 Pdu 之间经过的时间。
因此:
我们可以使用 mate.xxx.Time 过滤属于已 Stopped 的 Gop 的 Pdu
我们可以使用 mate.xxx && mate.xxx.Time 过滤属于未停止 Gop 的 Pdu
我们可以使用 mate.xxx.Duration 过滤属于已停止 Gop 的 Pdu
我们可以使用 mate.xxx.Time > 0.5 过滤属于完成耗时大于(或小于)0.5s 的 Gop 的 Pdu(你也可以尝试将这些用作着色过滤器,以找出响应时间从何时开始增长)
当 Gop 被创建,或每当其 AVPL 发生变化时,Gop 都会被(重新)分析,以检查它们是否匹配一个现有的 group of groups(Gog),或者是否可以创建一个新的 Gog。Gop 分析分为两个阶段。在第一阶段,会检查尚未分配的 Gop,以验证它是否属于一个已经存在的 Gog,或是否可以创建一个新的 Gog。第二阶段最终会检查该 Gog,并在 Gogs 索引中注册其 key。
作者有若干理由认为此功能需要重新实现,因此在不久的将来,其实现方式可能会发生深层变化。本节文档反映的是截至 wireshark 0.10.9 的 mate 版本;在未来版本中这将发生变化。
配置 Gog 时,我们首先要告诉 MATE 它存在。
Gog web_use { ...};然后我们必须告诉 MATE 在候选 Gop 中查找什么来进行匹配。
Gog web_use { Member http_ses (host); Member dns_req (host);};大多数情况下,除了用于匹配的属性之外,其他属性也会很有意义。为了从 Gop 向 Gog 复制其他有意义的属性,我们可以像对 Gop 那样使用 Extra。
Gog web_use { ... Extra (cookie);};mate http_pdu:4->http_req:2->http_use:1 http_pdu: 4 http_pdu time: 1.309847 http_pdu time since begining of Gop: 0.218930 http_req: 2 ... (the gop's tree for http_req: 2) .. http_use: 1 http_use Attributes host: www.example.com http_use Times http_use start time: 0.000000 http_use duration: 1.309847 number of GOPs: 3 dns_req: 1 ... (the gop's tree for dns_req: 1) .. http_req: 1 ... (the gop's tree for http_req: 1) .. http_req of current frame: 2我们可以过滤:
mate.http_use.Duration Gog 第一帧与分配给它的最后一帧之间经过的时间。
传递给 Gog 的属性
Transform 是一系列 Match 规则,可选地通过额外的 AVPL 对匹配结果进行修改。这样的修改可以是 Insert(merge)或 Replace。Transform 可用作辅助工具,在某项的 AVPL 被进一步处理之前对其进行操作。它们在若干场景中会非常有用。
AVPL Transformations 的声明方式如下:
Transform name { Match [Strict|Every|Loose] match_avpl [Insert|Replace] modify_avpl ; ... };名称是 AVPL transformation 的句柄。之后调用该 transform 时会使用它来引用该转换。
Match 声明会指示 MATE 针对数据 AVPL 匹配什么、如何匹配,以及如果匹配成功,应如何修改数据 AVPL。每当它们被调用时,都会按照它们在配置文件中出现的顺序执行。
可选的匹配模式限定符(Strict、Every 或 Loose)用于选择上文解释的匹配模式;Strict 是默认值,可以省略。
可选的修改模式限定符会指示 MATE 应如何使用 modify AVPL:
默认值 Insert(可以省略)会使 modify_avpl 被合并到现有数据 AVPL 中,
Replace 会使数据 AVPL 中所有匹配的 AVP 被 modify_avpl 替换。
modify_avpl 可以为空;这在某些情况下对 Insert 和 Replace 修改模式都很有用。
示例:
Transform insert_name_and { Match Strict (host=10.10.10.10, port=2345) Insert (name=JohnDoe);};如果数据 AVPL 包含 host=10.10.10.10 和 port=2345,则向其中添加 name=JohnDoe
Transform insert_name_or { Match Loose (host=10.10.10.10, port=2345) Insert (name=JohnDoe);};如果数据 AVPL 包含 host=10.10.10.10 或 port=2345,则向其中添加 name=JohnDoe
Transform replace_ip_address { Match (host=10.10.10.10) Replace (host=192.168.10.10);};将原始的 host=10.10.10.10 替换为 host=192.168.10.10
Transform add_ip_address { Match (host=10.10.10.10) (host=192.168.10.10);};向 AVPL 添加(插入)host=192.168.10.10,同时也保留其中原有的 host=10.10.10.10
Transform replace_may_be_surprising { Match Loose (a=aaaa, b=bbbb) Replace (c=cccc, d=dddd); };会得到以下结果:
用法
声明之后,可以将 Transform 添加到 PDU、Gop 或 Gog 的声明中。这通过向声明中添加 Transform name_list 语句来完成:
Pdu my_proto_pdu Proto my_proto Transport ip { Extract addr From ip.addr; ... Transform my_pdu_transform[, other_pdu_transform[, yet_another_pdu_transform]];};可以使用 Transform 语句,为每个 Item(Pdu、Gop 或 Gog)给出一个此前已声明的 Transform 列表。
每当某个 item 的 AVPL 发生变化时,它都会与给定给该 item 的列表中的所有 Transform 进行操作。列表中的 Transform 从左到右应用。
在每个 Transform 内部,该 item 的 AVPL 会从最上面的 Transform Match 子句开始,与这些子句进行操作,直到全部尝试完毕,或直到其中一个成功。
MATE 的 Transform 可用于许多不同用途,例如:
使用 Transform,我们可以为一个 Gop 添加多个 start 或 stop 条件。
Transform start_cond { Match (attr1=aaa,attr2=bbb) (msg_type=start); Match (attr3=www,attr2=bbb) (msg_type=start); Match (attr5^a) (msg_type=stop); Match (attr6$z) (msg_type=stop);};Pdu pdu ... { ... Transform start_cond;}Gop gop ... { Start (msg_type=start); Stop (msg_type=stop); ...}Transform marks { Match (addr=10.10.10.10, user=john) (john_at_host); Match (addr=10.10.10.10, user=tom) (tom_at_host);}...Gop my_gop ... { ... Transform marks;}之后,我们可以使用显示过滤器 mate.gop.john_at_host 或 mate.gop.tom_at_host
Transform direction_as_text { Match (src=192.168.0.2, dst=192.168.0.3) Replace (direction=from_2_to_3); Match (src=192.168.0.3, dst=192.168.0.2) Replace (direction=from_3_to_2);};Pdu my_pdu Proto my_proto Transport tcp/ip { Extract src From ip.src; Extract dst From ip.dst; Extract addr From ip.addr; Extract port From tcp.port; Extract start From tcp.flags.syn; Extract stop From tcp.flags.fin; Extract stop From tcp.flags.rst; Transform direction_as_text;}Gop my_gop On my_pdu Match (addr,addr,port,port) { ... Extra (direction);}NAT 可能会在跟踪时造成问题,但我们可以通过 Transform 将 NATed IP address 和路由器的 Ethernet address 转换为非 NAT 地址,从而轻松绕过这一问题:
Transform denat { Match (addr=192.168.0.5, ether=01:02:03:04:05:06) Replace (addr=123.45.67.89); Match (addr=192.168.0.6, ether=01:02:03:04:05:06) Replace (addr=123.45.67.90); Match (addr=192.168.0.7, ether=01:02:03:04:05:06) Replace (addr=123.45.67.91);}Pdu my_pdu Proto my_proto transport tcp/ip/eth { Extract ether From eth.addr; Extract addr From ip.addr; Extract port From tcp.port; Transform denat;}MATE 最初由 Luis Ontanon 编写,他是一名 Telecomunications systems troubleshooter,目的是在巨大的捕获文件中仅使用主叫号码过滤出单个呼叫的数据包,从而节省时间。后来,他利用节省下来的时间,使其足够灵活,可以用于他直接参与的协议之外的其他协议。
Imported from https://wiki.wireshark.org/Mate/Manual on 2020-08-11 23:16:34 UTC








