我有一个巨大的pcap文件(100GB),我对少量的数据包感兴趣,我知道数字是5,000,000到5,000,020.
如何使用tcpdump读取pcap文件,按数据包编号(或范围)过滤掉数据包,然后将其写入新的pcap文件?
我正在尝试向流添加过滤器tcpdump。
我试图运行的表达式是:
tcpdump -i eth0 -U -w - host 192.168.2.29 and (port 22222 or port 22221 or port 80)
Run Code Online (Sandbox Code Playgroud)
这种特殊的格式会抛出:
bash: syntax error near unexpected token '('
Run Code Online (Sandbox Code Playgroud)
我预计这会基于THIS起作用。
以下工作不会引发错误:
a) tcpdump -i eth0 -U -w - host 192.168.2.29
b) tcpdump -i eth0 -U -w - port 22222
Run Code Online (Sandbox Code Playgroud)
我已经尝试了关联的每种排列都抛出相同的错误。
我正在开发一个高性能 TCP 服务器,当我使用 TCP 客户端泵送高流量时,我发现服务器的处理速度不够快。经过仔细检查,我发现 TCP 服务器上的“增量时间”出现峰值。而且,我看到服务器发送了一个 ACK,0.8 秒后又发送了相同 seqno 的 PSH、ACK。我在 pcap 中多次看到这种模式。专家能否评论一下为什么服务器发送 ACK 后跟 PSH,ACK,中间有延迟?
我想要一个接口出站流量的源 IP 地址列表。如何使用 libpcap 找到数据包的方向(无论是入站还是出站读取流量)?我不知道双方的子网信息。而且两边都有客户端/服务器,所以我不能依赖端口号范围来过滤流量。
为什么 libpcap 数据包头中没有有关方向的信息,或者像pcap-filterinbound中那样的过滤器选项?
对pcap文件运行file命令将打印出以下内容:
$ file pcap.pcap
pcap.pcap: tcpdump capture file (little-endian) - version 2.4 ....
Run Code Online (Sandbox Code Playgroud)
我一直在寻找一种方法来创建一个big-endian捕获文件,或者在线下载一个样本,但无济于事.
我也很困惑pcap中究竟是小端还是大端.据我所知,libpcap捕获了它在线上看到的内容.
我环顾四周寻找有关tcpdump内部结构的文档,但我什么也没找到。所以我的问题是tcpdump计算机上的侵入性如何。如何评估专用于流量分析的资源量(内存或 CPU)?
我们将 Java 应用程序和 Nginx 作为反向代理安装在同一主机上。定期地,我们会发现CLOSE_WAIT连接长时间挂起:
$ ss -n4t | head
State Recv-Q Send-Q Local Address:Port Peer Address:Port
CLOSE-WAIT 1 0 127.0.0.1:8180 127.0.0.1:36599
CLOSE-WAIT 1 0 127.0.0.1:8180 127.0.0.1:36467
CLOSE-WAIT 1 0 127.0.0.1:8180 127.0.0.1:36154
Run Code Online (Sandbox Code Playgroud)
而且数量不断增加,那么应用程序就会出现问题。互联网上说:
Your server is failing to detect client disconnects, or ignoring them, and not closing the socket.
Run Code Online (Sandbox Code Playgroud)
Nginx 说:
2020/06/28 04:59:15 [error] 65506#0: *31719640 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: 55.55.55.55, server: app.mycompany.com, request: "POST /url/url HTTP/1.0", upstream: …Run Code Online (Sandbox Code Playgroud) 我们有一个基于 libuv 和 libopenssl 的 HTTP 客户端,用于 TLS,用 C++ 编写 - 它有自己的 TCP 包装器围绕 lubuv 和 HTTP 解析器。
通常它可以正常工作,我们的服务器使用它向社交网络发出数百万个成功的 HTTPS 请求。并且单连接请求从来没有出现过问题,它以“连接:关闭”状态结束。但是,尽管很少见,对于保持活动的连接,有时会发生奇怪的 ssl 错误:
任何一个
error:04067084:rsa routines:rsa_ossl_public_decrypt:data too large for modulus
或者 error:04067072:rsa routines:rsa_ossl_public_decrypt:padding check failed
我相信这是一个非常罕见的问题,百万分之一。当从服务器接收到新数据时,从 SSL_read 返回错误。它永远不会在第一次响应时发生,通常在错误发生之前连接中有十多次请求-响应交换。
我们有使用SSL_CTX_set_keylog_callback接口捕获的此类交换和键盘日志的 tcpdump 。Wireshark 使用 keylog 作为预主密钥文件打开和解密转储,没有任何问题,并包含正常的 HTTP 响应,“200 OK”。对于我们的 HTTP 客户端,最后一个数据包会产生错误。通过检查交易所,我们没有发现任何问题或数据损坏的迹象。这个事实让我假设数据没问题,但我们的 OpenSSL 使用可能不完全正确。
模拟使用 tcpdump 数据发送完全相同响应的服务器是没有问题的。但是我需要使用客户端键盘日志中的预主密钥。我找不到任何将密钥设置为 SSL_CTX* 或 SSL* 的函数。有吗?
我还修改了 libopenssl 以使用常量键。我已经输入memcpy(s->session->master_key, overriden_secret, 48)了ssl_generate_master_secret和tls13_generate_secret。同样memcpy(s->s3->client_random, overriden_random, 32);在tls_construct_client_hello和tls_early_post_process_client_hello 中。它不起作用并在握手阶段产生一个 …
问题是:有时 tcpdump 发现 UDP 数据包的接收被推迟到下一个传入 UDP 数据包为止,尽管网络分路设备显示它通过电缆没有延迟。
场景:我在 Linux 上的 Profinet 堆栈(位于用户空间)有一个循环连接,每 4 毫秒接收和发送 Profinet 协议数据包(通过原始套接字)。大约每 30 毫秒,它还会在 UDP 套接字上的另一个线程中接收 UDP 数据包,并根据该协议立即回复它们。CPU 负载约为 10%。有时,接收到的 UDP 数据包似乎被卡在网络驱动程序中。2 秒后,下一个 UDP 数据包到来,丢失的 UDP 数据包和下一个数据包都被接收。没有丢失的数据包。
我的测量:
tcpdump -i eth0 --time-stamp-precision=nano --time-stamp-type=adapter_unsynced -w /tmp/tcpdump.pcap将 UDP 流量记录到 RAM 磁盘文件中。问题:
拓扑:“具有 Linux 和 eth0 的嵌入式设备”<---> tap-device <---> PLC。程序“tcpdump”正在嵌入式设备上运行。Tap 设备正在侦听电缆。实际的Profinet 连接是在PLC 和嵌入式设备之间。PC 连接到 Tap 设备上以记录其正在收听的内容。
Wireshark(通过 Tap 和 tcpdump):请参阅此处(tcpdump.pcap 中的数据包编号 3189)