Ada*_*m C 6 networking tcpdump mongodb
有时,在对副本集的运行状况进行故障排除时,我想专门过滤掉心跳数据包,跟踪它们发出的情况,以及随后的回复(或缺少回复),而没有在其他数据之间流动的所有噪音套。
不幸的是,这些数据包的结构与普通命令/查询和响应非常相似。尽管Wireshark具有解析器,可以让我接触到 MongoDB 有线协议,但我无法使用该技术在 tcpdump 中从源头过滤掉数据包。
所以,问题是——如何在 tcpdump 中过滤 MongoDB 副本集心跳?
Ada*_*m C 10
关于建立这个文件,首先我们需要确定我们的识别特征是什么,使过滤器是成功的,因此只挑选了心跳。然后,我们需要获取该标识符的十六进制表示。从出站心跳本身(本质上只是一个查询/命令)开始,它是一个管理命令,包含以下字符串:
replSetHeartBeat = 0x7265706c536574486561727446265174 (16 bytes)
Run Code Online (Sandbox Code Playgroud)
现在我们有了识别字符串,我们需要找出在 TCP 内部的位置。偏移量计算如下:
TCP 的 32 字节让您进入MongoDB 有线协议,然后:
因此总偏移量为:(32+4+4+4+4+4+11+4+4+4+1) = 76 字节
因此,您会认为需要这样的东西:
sudo tcpdump -i eth0 'tcp[76:16] = 0x7265706c536574486561727446265174'
Run Code Online (Sandbox Code Playgroud)
遗憾的是,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)'
Run Code Online (Sandbox Code Playgroud)
这涵盖了心跳的出站部分,但是回复呢?
值得庆幸的是,心跳的回复更容易匹配——我们正在寻找文档的 rs:true 部分,翻译如下,轻松地适应 4 个字节:
rs : true = 0x72730001 (4 bytes)
Run Code Online (Sandbox Code Playgroud)
以类似的方式计算偏移量(唯一真正的区别是一个 8 字节的游标 ID 而不是 11 字节的集合名称)我们得到了一个 73 字节的偏移量,这给了我们这个过滤器:
sudo tcpdump -i eth0 'tcp[73:4] = 0x72730001'
Run Code Online (Sandbox Code Playgroud)
最后,让我们把它们放在一起,并添加一些我喜欢的 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'
Run Code Online (Sandbox Code Playgroud)
(在 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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1571 次 |
| 最近记录: |