如何使用 tcpdump 捕获 TCP 连接第一个数据包的内容

如何使用 tcpdump 捕获 TCP 连接第一个数据包的内容

我的任务是在网络级别监控和调试 SOAP Web 服务。我可以使用它tcpdump在端口 80 上捕获来自客户的全部流量,但我无法将每个请求的捕获限制为仅捕获第一个收到的应用层数据包(在本例中是最重要的数据包,它带有 HTTP 请求标头和 SOAP XML 文档的开头)。我想知道tcpdump使用哪个交换机(或其他 Linux 命令的组合)来获取每个 TCP 连接的第一个数据包,并丢弃同一连接收到的其余数据包。

如果可能的话,将第一个响应数据包(也可能是唯一一个,因为在这个应用程序中,响应 XML 文档很小)从服务器发送到客户,也很好。

目前我tcpdump -i any -A 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'tcpdump手册页运行示例,因此我没有得到 TCP 握手数据包。

-c交换机的问题tcpdump在于捕获数据包后退出,而我需要它保持运行并继续显示新连接的相同信息。理想情况下,我需要类似于tailing apache 访问日志文件的东西,以及请求和响应的第一个有意义的块。

答案1

因此,您的请求实际上比标题所暗示的要窄 - 您专门在寻找 HTTP 请求。

我为此使用 ngrep,它结合了 tcpdump 和 grep 类型的功能。例如:

sudo ngrep -d eth0 '^(GET|POST) ' port 80

这将为您提供文本输出。如果您愿意,可以使用 -w 选项将匹配的数据包写入 tcpdump 格式的文件中。

使用如上所述的 -d 来指定接口,因为 -i 像 grep 中一样用于不区分大小写。

以上还将包括您可能不想要的传出请求等。根据需要附加 tcpdump 类型选项。

如果您正在调试对特定 URL 的请求,您可能希望使用它来使正则表达式更加具体。例如

sudo ngrep '^(GET|POST) /my/soap/interface .*Host: myhost.example.com' 'dst port 80 and dst host myhost.example.com'

在请求被拆分成多个数据包且第二个数据包中包含 Host 标头的特殊情况下,上述方法可能无法捕获某些请求。大多数情况下这无关紧要,但您始终可以使用 tcpdump 捕获超出需要的请求,使用 chaosreader 将其拆分成文件,然后开始 grep 这些文件。

答案2

您可能不只是想要第一个数据包 - TCP 会话的第一个数据包是首先设置会话的三次握手。但是,tcpdump确实有-c标志,允许您捕获定义数量的数据包。

答案3

将捕获的内容转储到文件(-w选项)。

您可以使用 after 对其进行分析wireshark,它具有强大的过滤引擎。您将可以访问所需的所有信息:标头、SOAP 负载等...

相关内容