ssl - 使用 tcpdump 仅捕获 ssl 握手

标签 ssl networking tcp tcpdump

<分区>

我有一台服务器,许多客户端使用 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< 的每个数据包.

可以执行更多过滤,但这严格回答了您的问题。

关于ssl - 使用 tcpdump 仅捕获 ssl 握手,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65805159/

相关文章:

java - spring integration tcp客户端发送简单消息

apache - Apache2.2 代理背后的 Tomcat6 与 SSL

c# - 如何强制二进制应用程序使用 C# 工具中的 SOCKS 代理?

c# - 如何将 WEP key 转换为 ASCII 密码?

Linux:如何在给定套接字描述符的情况下获取 TCP 套接字选项?

java - 为USB端口设置套接字作为TCP双向通信

c - 从 tcp 拥塞控制 Linux 内核模块访问 TCP header

python easy_install 因所有包的 SSL 证书错误而失败

security - 我们构建的 CRM 应用程序需要什么 SSL 证书?

google-app-engine - App Engine Multi-Tenancy SSL 和计费