我有一台服务器,许多客户端使用 SSL 连接到该服务器。最近我在服务器日志中观察到 SSL 握手错误(例如 SSL MAC 错误)。错误本身并不重要,但我想看看为什么有些客户端能够连接而其他客户端失败,并且还需要确定哪些客户端失败。
为了调试这个问题,我想捕获服务器上发生的所有 SSL 握手,因为我不知道有问题的客户端何时连接,所以我不想在发生这种情况之前捕获所有流量。我只想捕获所有 SSL 握手,然后使用 Wireshark 对其进行分析。假设我只能访问 tcpdump 而没有其他用于捕获的工具。
我不知道你所说的握手到底是什么,但我建议这个命令可能会捕获你想要的 95% 以上的内容:
tcpdump -ni eth0 "tcp port 443 and (tcp[((tcp[12] & 0xf0) >> 2)] = 0x16)"
现在它做了什么:
- eth0:是我的网络接口(interface),需要的话可以改
- tcp port 443:我想这是你的服务器监听的端口,如果你需要改变它
- tcp[((tcp[12] & 0xf0) >> 2)] = 0x16:有点棘手,让我们在下面详细说明
tcp[12]
表示抓取tcp数据包的第13个字节,对应前半部分为offset,后半部分为reserved。
偏移量乘以 4 得到 TCP header 的字节数,这意味着 ((tcp[12] & 0xf0) >> 2)
提供 TCP header 的大小。
TLS 数据包的第一个字节定义了内容类型。值 22(十六进制为 0x16)已被定义为“握手”内容。
因此,tcp[((tcp[12] & 0xf0) >> 2)] = 0x16
捕获 TCP header 后第一个字节设置为 0x16< 的每个数据包
.
可以执行更多过滤,但这严格回答了您的问题。