给定一个.pcap
(或类似的)文件,我想选择一个 TCP 连接并转储两个应用程序数据流(一个从另一个同辈和一个二另一个对等体)分成磁盘上的两个单独的文件。
假设我有一个.pcap
文件,除其他信息外,我知道其中包含 HTTP/1.1 纯文本连接的完整 TCP 流(从 SYN 到最终的 FIN+ACK/RST)。我希望得到两个包含内容的结果文件。即一个文件包含
GET / HTTP/1.1\r\n
host: foobar.com\r\n
\r\n
另一个文件有
HTTP/1.1 200 ok\r\n
content-length: ...\r\n
... \r\n
\r\n
<html>...</html>
我希望这正是在用户空间中看到/发送的应用程序数据流量(来自read
/ write
/ send/
recv`/...)。我想要用它转储一些流量,并用它来测试我的解析器是否适用于某种网络协议。解析器应该能够读取其中一个文件并尝试解析数据流。
这样的命令行工具看起来怎么样?我不确定这是否非常有用,但我认为如果我还给出一个可以做到这一点的假想工具的使用示例,可能会更清楚地说明我正在寻找什么。让我们调用这个假想工具(这就是我正在寻找的)tcp-stream-extract
。我想用类似的东西来调用它
### imaginary usage example of the tool that I'd like to find :)
# dump from 12345 to 23456
tcp-stream-extract \
-i my-captured-packets.pcap
-s 127.0.0.1:12345 \ # source address 127.0.0.1:12345
-d 127.0.0.1:23456 \ # destination address 127.0.0.1:23456
-t '2021-01-28 09:12:00Z' \ # the TCP conn was alive at that time
-w from-port-12345-to-port-23456
# dump from 23456 to 12345
tcp-stream-extract \
-i my-captured-packets.pcap
-s 127.0.0.1:23456 \ # source address 127.0.0.1:12345
-d 127.0.0.1:12345 \ # destination address 127.0.0.1:23456
-t '2021-01-28 09:12:00Z' \ # the TCP conn was at that time
-w from-port-23456-to-port-12345
答案1
如果必须手动执行此操作,则需要删除封装协议的标头。但是,这其中有一些微妙之处,可能并不简单:
- 以太网 (L2):以太网报头(14 字节)可能包含或不包含 802.1q 标签(在 Ethertype 前面,添加 4 个字节;
0x0800
=IPv4、0x86dd
=IPv6、0x8100
=802.1q 标签),并且以太网有效负载可能跟在或不跟在 FCS(4 字节)后面。 - IP(L3):基本 IPv4 报头为 20 字节,IPv6 使用 40 字节。每个都有选项或扩展 - 请查看国际人道法IPv4 字段(5 = 无选项),或下一个标题IPv6 字段(6表示 TCP,无扩展名)。任何数据包都可能被分割成多个 L2 帧(IPv4:MF已设置或片段偏移>0;IPv6 使用扩展报头 44)。每个第一个片段都包含 L4 报头,而后续片段则不包含。
- TCP(L4):基本 TCP 段头为 20 字节,但也可能包含选项(数据偏移量>5). TCP 采用无序传送的数据包(通过序列号),因此您可能需要缓冲相当一部分数据。数据段还可能重复到达。
tcpflow
我建议使用像@AlexD 建议的适当的工具。