我该如何调试这个问题?
(我已获得完整的 tcpdump 捕获)
我有一个 TCP 服务器,许多客户端都与该服务器建立持久连接。通常,所有这些客户端都运行正常,我从未达到每个进程 1024 个默认 Linux 限制连接(打开文件)。
昨天,某人(或某物)开始行为不当,留下大量开放连接,迫使我重启服务器。您可以在以下 munin netstat 图表上看到其行为:
每次连接数达到 1000 时,我都会重启服务器。只有第四次,这种异常行为才像开始时一样神秘地停止了,没有任何明显的原因。一周前也发生过类似的事情。
所有不良连接都来自同一个(子)网络:我可以隔离它们,但也有一些有效连接来自同一个网络(所以我无法拒绝来自该网络的连接)。
到目前为止,我已经使用了 tcpdump、ethereal 和 ngrep,但我还没有找到查看已建立但不传输数据的连接的方法。
- 我应该如何查看 tcpdump(pcap)捕获以隔离行为不当的连接并研究它们?
- 您会建议什么来阻止这种情况发生?
谢谢!
答案1
在 Wireshark 中,转到统计->对话->TCP。试着查看列表,看看是否有任何异常,例如,主机的连接数异常多、传输字节数低或传输速率低。如果确实需要,您可以将数据复制到电子表格中。(您可以在服务器端使用 netstat 执行类似操作,例如,在 Linux 上,您可以运行netstat -nt | sort -n -t . -k5,5 -k6,6 -k7,7 -k8,8
以列出按客户端 IP 地址排序的连接)。
如果问题仅限于一两个客户端,您可以查看他们的流量以尝试进一步缩小问题范围。
(如果您确实在使用 Ethereal,您应该立即升级到 Wireshark。披露:我是首席开发人员。)
答案2
协议分析并不难,但很繁琐。基本过程是迭代的,上一步的结果作为下一步分析的输入。基本上,你总是将应该发生的事情与正在发生的事情进行比较,并注意异常情况。
我建议从使用简单过滤器的原始数据包捕获开始,以将捕获限制在问题子网内。根据应用层协议,我会将捕获大小限制为约 100 字节左右 - 足以获取 TCP 和较低层协议标头以及少量应用层。
一旦您知道了问题行为的示例,请将原始数据包捕获加载到您选择的协议分析器中 - tcpdump、wireshark、Netscout Sniffer 等。现在您可以开始寻找更多允许您隔离问题流量的模式。如果您可以隔离流量,那么您就可以分析它。
在评论中,mas 提出了一个很好的建议,即根据 SYN/ACK 帧进行过滤,并查看是否存在大量开放连接的 IP 地址。
然后,您可以查看来自这些 IP 地址的连接,并计算有多少处于空闲状态以及有多少正在交换实际数据。
查看正在交换的数据。应用层协议数据对您的应用程序有意义吗?计算有意义的连接数与有异常的连接数。
对于一些众所周知的问题,已经创建了可以自动执行部分工作的专家引擎。在我看来,这比 IDS 更大,它是一个专家引擎或专家引擎套件,可以自动分析数据包捕获。您可能会找到一个可以执行您需要的分析的软件包。与此同时,您可以开始分析您拥有的数据。
如果您只有 tcpdump,那么您必须使用它,但我更喜欢图形协议分析器,特别是如果具有制表或绘图功能。GUI 有助于可视化数据,并且许多方便地对数据包的各个部分进行颜色编码,以便于阅读。