AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 521965
Accepted
Adam C
Adam C
Asked: 2013-07-10 08:00:36 +0800 CST2013-07-10 08:00:36 +0800 CST 2013-07-10 08:00:36 +0800 CST

如何使用 tcpdump 过滤 MongoDB 副本集心跳?

  • 772

有时,在对副本集的健康状况进行故障排除时,我想专门过滤掉心跳数据包,跟踪它们发出的信息,以及随后的回复(或缺少回复),而没有其他数据之间流动的所有噪音套。

不幸的是,这些数据包的结构与普通命令/查询和响应的结构非常相似。尽管Wireshark有解析器,可以让我接触到 MongoDB 有线协议,但我不能使用 tcpdump 的这种技术从源头过滤掉数据包。

那么,问题来了——如何过滤 tcpdump 中的 MongoDB 副本集心跳?

networking
  • 1 1 个回答
  • 1674 Views

1 个回答

  • Voted
  1. Best Answer
    Adam C
    2013-07-10T08:00:36+08:002013-07-10T08:00:36+08:00

    在此文档的基础上,首先我们需要确定我们的识别特征是什么,以便过滤器成功并且只挑选出心跳。然后,我们需要获取该标识符的十六进制表示。从出站心跳本身(本质上只是一个查询/命令)开始,它是一个管理命令,包含以下字符串:

    replSetHeartBeat = 0x7265706c536574486561727446265174 (16 bytes)
    

    现在我们有了识别字符串,我们需要弄清楚在 TCP 内部的位置。偏移量计算如下:

    TCP 的 32 个字节让您使用MongoDB 有线协议,然后:

    • 4 个字节 - 消息长度
    • 4 个字节 - 请求 ID
    • 4 个字节 - 响应
    • 4 个字节 - 操作码
    • 4 个字节 - 标志
    • 11 个字节 - 集合名称(在这种情况下始终相同,但通常可能会有所不同)
    • 4 个字节 - numtoskip
    • 4 个字节 - numtoreturn
    • 4 个字节 - 文档长度
    • 1 字节 - 类型

    因此总偏移量为: (32+4+4+4+4+4+11+4+4+4+1) = 76 字节

    因此,您会认为需要这样的东西:

    sudo tcpdump -i eth0 'tcp[76:16] = 0x7265706c536574486561727446265174'
    

    遗憾的是,tcpdump 一次最多只能匹配 4 个字节,因此您实际上需要将其分解为 4 x 4 字节块并使用逻辑 AND 来组合匹配项:

    sudo tcpdump -i eth0 '(tcp[76:4] = 0x7265706c) and (tcp[80:4] = 0x53657448) and (tcp[84:4] = 0x65617274) and (tcp[88:4] = 0x62656174)'
    

    这涵盖了心跳的出站部分,但是回复呢?

    值得庆幸的是,心跳上的回复更容易匹配——我们正在寻找文档的 rs:true 部分,它的翻译如下,很容易适应 4 个字节:

    rs : true = 0x72730001 (4 bytes)
    

    以类似的方式计算偏移量(唯一真正的区别是 8 字节的游标 ID 而不是 11 字节的集合名称)我们得到 73 字节的偏移量,这就得到了这个过滤器:

    sudo tcpdump -i eth0 'tcp[73:4] = 0x72730001'
    

    最后,让我们把它们放在一起,并添加一些我喜欢的 tcpdump 选项。最后我们得到这个命令:

    sudo tcpdump -Xs0 -nnpi eth0 -w heartbeats.pcap '((tcp[76:4] = 0x7265706c) and (tcp[80:4] = 0x53657448) and (tcp[84:4] = 0x65617274) and (tcp[88:4] = 0x62656174)) or tcp[73:4] = 0x72730001'
    

    (在 Mac OS X 和 Linux 上使用 MongoDB 2.4.4 成功测试)

    当然,这也可以应用得更普遍,你只需要制定出合适的匹配标准、偏移量和字节匹配即可。

    作为参考,您可以使用相同的标准,但语法略有不同,以在 Wireshark 中测试这种类型的过滤。上述标准的等效 Wireshark 过滤器是:

    tcp[76:16]==72:65:70:6c:53:65:74:48:65:61:72:74:62:65:61:74
    tcp[73:4]==72:73:00:01
    
    • 10

相关问题

  • 谁能指出我的 802.11n 范围扩展器?

  • 我怎样才能得到一个网站的IP地址?

  • 在一个 LAN 中使用两台 DHCP 服务器

  • 如何在 Linux 下监控每个进程的网络 I/O 使用情况?

  • 为本地网络中的名称解析添加自定义 dns 条目

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve