7个版本
0.6.2 | 2024年4月25日 |
---|---|
0.6.1 | 2024年3月13日 |
0.6.0 | 2024年2月23日 |
0.5.2 | 2024年2月21日 |
#369 in 数据库接口
475KB
3K SLoC
MAPI代理
Mapiproxy是一个工具,通过充当客户端和服务器之间的代理来检查MonetDB的网络流量。
MonetDB的网络协议称为MAPI,因此得名。
代理可以同时使用TCP套接字、Unix域套接字或两者。TCP和Unix套接字之间的MAPI协议略有不同,代理在代理两者之间时会自动调整。
此外,Mapiproxy提供了读取PCAP文件的实验性支持:捕获的网络流量文件,通常由tcpdump和Wireshark等工具生成。但是,此功能仍处于早期阶段,在实际情况中可能无法完全正常工作。
用法
以下是Mapiproxy用法的摘要
Usage: mapiproxy [OPTIONS] LISTEN_ADDR FORWARD_ADDR
mapiproxy [OPTIONS] --pcap PCAP_FILE
LISTEN_ADDR and FORWARD_ADDR:
PORT, for example, 50000
HOST:PORT, for example, localhost:50000 or 127.0.0.1:50000
/path/to/unixsock, for example, /tmp/.s.monetdb.50000
Options:
-o, --output=FILE Write output to this file
-m, --messages Dump whole messages
-b, --blocks Dump individual blocks
-r, --raw Dump bytes as they come in
-B, --binary Force dumping as binary
--color=WHEN Colorize output (Options: 'always', 'auto', 'never')
--help Display this help message
--version Show version information
Experimental options:
--pcap=FILE Read network capture data from FILE (use '-' for stdin)
安装
源代码可在GitHub上找到。
GitHub仓库的发布页面上有适用于x86-64 Linux、MacOS和Windows的预构建的二进制文件。
Mapiproxy是用Rust编写的。如果您想从源代码构建并且尚未安装Rust编译器,请访问rustup.rs。
安装Rust后,只需执行cargo install mapiproxy
。这将下载源代码,编译并安装它。或者,从GitHub克隆存储库并使用cargo build --release
进行构建。
输出模式
Mapiproxy提供三种输出模式,对应于MAPI协议的层。简而言之,MAPI通信由一系列消息组成。每个消息作为一个或多个块发送。每个块前面都有一个两字节的块标题。
Mapiproxy的输出由单行信息消息和显示捕获数据的多行帧混合组成。例如,在单行消息中
‣ #10 UPSTREAM client stopped sending
我们看到一个连接ID,一个方向标记(UPSTREAM表示客户端到服务器,DOWNSTREAM表示服务器到客户端)和一个信息消息。
帧以十六进制转储的形式显示数据,如下所示,
┌ #10 UPSTREAM binary, message, 13 bytes
│ 73 73 65 6c 65 63 74 20 34 32 0a 3b 0a __ __ __ sselect·42↵;↵
└
或者它们以文本形式显示,如下所示
┌ #10 UPSTREAM text, message, 13 bytes
│sselect 42↵
│;↵
└
Mapiproxy通常更喜欢文本输出而不是二进制,但在以下任一条件为真时将渲染帧为二进制
-
数据不是有效的UTF-8编码文本
-
数据包含除换行符和制表符之外的控制字符
-
Mapiproxy正在以
--raw
模式运行 -
使用
-B
或--binary
标志强制输出二进制数据
当Mapiproxy处于--messages
模式时,它会收集整个消息的所有字节,并作为一个单独的帧打印出来,跳过块头。在--blocks
模式中,它收集整个块并按帧打印一个块,也没有块头。
由于上述规则,在--blocks
模式下可能会出现多字节字符跨越块边界的情况。在这种情况下,两个块都被视为不是有效的UTF-8编码文本,因此即使消息中的其他块仍然作为文本渲染,它们也会以二进制形式显示。
在--raw
模式下,所有字节都按接收到的顺序打印,包括块头。这意味着一个打印的块可能包含多个块的多个部分,甚至多个消息的部分。相反,一个块或消息通常分散在多个接收到的字节数据块中。
--raw
模式是唯一一种包含块头的输出模式。它们用尖括号'⟨'和'⟩'标记。例如
┌ #20 DOWNSTREAM 42 bytes
│⟨51 00⟩5e 6d 61 70 69 3a 6d 65 72 6f 76 69 6e 67 Q░^mapi:meroving
│ 69 61 6e 3a 2f 2f 70 72 6f 78 79 3f 64 61 74 61 ian://proxy?data
│ 62 61 73 65 3d 64 65 6d 6f 0a __ __ __ __ __ __ base=demo↵
└
特殊字符和颜色转义
Mapiproxy输出包含一些非ASCII的Unicode字符。目前无法禁用。虽然这在Linux和MacOS上通常不是问题,但Windows平台上的用户可能会遇到问题。请分享您的经验。
这是Mapiproxy使用的非ASCII字符列表
字符 | 含义 | 当 |
---|---|---|
‣, ┌, └, │ | 帧边界 | 总是 |
↵, → | 换行符和制表符 | 总是 |
⟨, ⟩ | 块头标记 | 原始模式 |
·, ░, ▒ | 空格,空字符,任何不可打印的字节 | 仅hexdump |
在写入终端或明确启用--color=always
时,Mapiproxy使用VT-100/ANSI颜色转义序列以提高可读性,尤其是在十六进制转储中。可以通过传递标志--color=never
来禁用此行为。
依赖关系
~9–18MB
~244K SLoC