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 数据库接口

MPL-2.0 许可证

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