我正在尝试在 DEFCON 数据包上使用 tcpdump。
这是我正在使用的命令:
tcpdump -qns 0 -X -r ulogd.eth0.pcap
这是我得到的输出:
10:39:12.356410 IP 192.168.103.2.3101 > 192.168.102.2.80: tcp 0
0x0000: 4500 0028 0557 4000 7f06 a823 c0a8 6702 E..(.W@....#..g.
0x0010: c0a8 6602 0c1d 0050 2463 0fbe 8854 e419 ..f....P$c...T..
0x0020: 5010 4296 71ec 0000 P.B.q...
10:39:27.223199 IP 192.168.103.2.3101 > 192.168.102.2.80: tcp 52
0x0000: 4500 005c 055e 4000 7f06 a7e8 c0a8 6702 E..\.^@.......g.
0x0010: c0a8 6602 0c1d 0050 2463 0fbe 8854 e419 ..f....P$c...T..
0x0020: 5018 4296 0d82 0000 4745 5420 2f2f …Run Code Online (Sandbox Code Playgroud) 我的 Web 应用程序中存在无法重现的错误。所有日志看起来都不错,或者至少我看不到任何异常。但它发生了。所以我想我可以记录所有进出我的网站的流量,等待错误发生,然后在我的测试环境中以某种方式重播。它确实发生了!所以我有这样捕获的数据:
tcpdump -s 1514 -X tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0) -Z root -C 20 -W 1000 -w capture.cap
Run Code Online (Sandbox Code Playgroud)
我不知道我能用它做什么。我有一台运行相同版本的 Web 应用程序的虚拟机,我想重放其中记录的数据。我应该如何处理这个问题?
[编辑]
我尝试按照此示例使用tcpreplay执行此操作,但我的 Web 服务器没有记录任何流量。
我的测试机 (Fedora 8) 在 VMWare Player 中运行。假设机器的 IP 是 192.168.41.128 并且它有一个网络接口:eth0(环回除外)-示例中的步骤 #2 和 #3 在我的情况下应该如何?我应该在同一台机器上还是在另一台机器上运行它?
通过我无法理解的 TCP 通道发送数据时出现延迟。该链路为 1Gb 链路,端到端延迟约为 40 毫秒。在我当前的设置中,延迟(一条消息从发送者用户空间到接收者用户空间的时间)可以达到 100 毫秒。
发送方套接字配置了 TCP_NODELAY 选项。发送缓冲区 (SO_SNDBUF) 配置为 8MB。接收缓冲区 (SO_RCVBUF) 也配置为 8MB。Tcp 窗口缩放被激活。
update-1:我使用 zeromq 3.1.1 中间件来承载数据。套接字配置,包括 TCP_NODELAY 标志由中间件执行。一些选项是可以访问的,比如 rx 和 tx 发出缓冲区大小,但不是 TCP_NODELAY。据我了解,TCP_NODELAY 被激活以确保数据尽可能发送。同时,实际的套接字发送和发送消息的决定在两个单独的线程中执行。如果在要发送批处理中的第一条消息时有几条消息可用,则完成正确的批处理。
我使用 tcpdump 进行了捕获,从中提取了以下帧。在初始 TCP 握手之后,发送方 (172.17.152.124) 开始发送数据。接收方的初始窗口大小为 5840 字节,发送方为 5792 字节。
我的问题是发送方发送了两个帧(#6 和 #7)然后停止,等待接收方返回 ack。就我所见,未达到接收器的窗口大小,传输不应停止(384 字节未完成,初始接收窗口大小为 5840 字节)。我开始认为我没有正确理解 TCP 是什么。有人可以帮忙澄清一下吗?
update-2:我的数据负载由一个幻数和一个时间戳组成。我通过将有效负载的时间戳与 tcpdump 放置的时间戳进行比较来隔离延迟的数据包。帧#9 的有效载荷 ts 非常接近帧#6 和#7 中的一个,并且明显小于帧#8 中接收到的ack 的时间戳。
update-1:帧#9 没有立即发送的事实可以用 TCP 通道的慢启动来解释。事实上,一旦连接运行了几分钟,问题也会出现,所以慢启动似乎不是一般的解释。
20:53:26.017415 IP 172.17.60.9.39943 > 172.17.152.124.56001:标志 [S],seq 2473022771,win 5840,选项 [mss 142219,e,800,142200,800,800,800 确认长度
20:53:26.017423 …
由于这个问题,我将在 MySQL 服务器后端嗅探一些数据包,看看会发生什么:
# tcpdump -vv -s0 -c 100 -i bond0 tcp port 3306 and host 192.168.3.87 -w /home/quanta/3.87_aborted.pcap
如您所见,我将 snaplen 设置为 0,但仍然收到消息“捕获期间数据包大小受限”:
MySQL Protocol
Packet Length: 579
Packet Number: 96
text: 336
text: 1004352
text: 147619
text: 336
[Packet size limited during capture: MySQL truncated]
Run Code Online (Sandbox Code Playgroud)
我的界面上的卸载设置:
# ethtool -k bond0
Offload parameters for bond0:
Cannot get device rx csum settings: Operation not supported
rx-checksumming: off
tx-checksumming: on
scatter-gather: on
tcp segmentation offload: on
udp fragmentation …Run Code Online (Sandbox Code Playgroud) 我正在使用“tcpdump”来捕获流量,并且我想通过 HTTP 方法进行过滤。当我有 IPv4 数据包时,我使用:tcpdump -s 0 -A 'tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x47455420'过滤 HTTP GET 数据包。
不幸的是,该tcp[]过滤器不适用于 IPv6 数据包。根据文档
针对传输层标头的算术表达式(例如 )
tcp[0]不适用于 IPv6 数据包。
因此,我正在寻找另一种方法来使用 tcpdump 仅过滤 IPv6 流量的 HTTP 方法。
我尝试寻找解决方案,但似乎它们包含 grep 的用法,这不适合我的需求,因为我想将所有过滤后的流量直接输出到 pcap 文件
在名称服务器上捕获:
21:54:35.391126 IP resolver.7538 > server.domain: 57385% [1au] A? www.domain.de. (42)
Run Code Online (Sandbox Code Playgroud)
57385% 中的百分号是什么意思?据我所知 57385 是客户端序列号,加号表示设置了 RD 位。
第二个问题:ARCOUNT 在查询中做了什么?据我了解 tcpdump 手册页 [1au] 意味着 tcpdump 将此视为协议异常 - 就像我一样。我在很多查询中都看到了这一点。
我用 tcpdump 捕获了这个数据包,但我不确定如何使用 --hex-string 参数来匹配数据包。有人可以告诉我怎么做吗?
11:18:26.614537 IP (tos 0x0, ttl 17, id 19245, offset 0, flags [DF], proto UDP (17), length 37)
x.x.187.207.1234 > x.x.152.202.6543: [no cksum] UDP, length 9
0x0000: f46d 0425 b202 000a b853 22cc 0800 4500 .m.%.....S"...E.
0x0010: 0025 4b2d 4000 1111 0442 5ebe bbcf 6701 .%K-@....B^...g.
0x0020: 98ca 697d 6989 0011 0000 ffff ffff 5630 ..i}i.........V0
0x0030: 3230 3300 0000 0000 0000 0000 203.........
Run Code Online (Sandbox Code Playgroud) 我试图找出一种方法来检测连接到我服务器上端口 80 的每个 IP 的往返时间。有什么好的方法可以做到这一点?
有很多连接,ping每个ip是不切实际的。我在想,以某种方式测量服务器发送 syn/ack 数据包和服务器收到它的 ack 之间的时间差。
有没有办法便宜地记录这个?也许使用一些神奇的 tcpdump 过滤器?
此练习的目标是汇总数据并计算是否存在任何路由效率低下的情况。假设一个地区的一个 ISP 可能路由不正确,等等。
FWIW 网络服务器是 nginx。
据我了解,对于 IPv4,我需要捕获
对于 IPv6 我需要
我想用 tcpdump 或 wireshark 捕获与 DHCP 相关的流量以供以后分析。
尽管我想让过滤器尽可能具体以获得一个小的捕获文件,但我不想错过一些重要的数据包,比如用于验证 IP 地址尚未被占用的数据包。
我错过了什么吗?