在一台服务器上,我目前遇到了奇怪的应用程序行为,似乎都与网络问题有关。
问题示例:
- 应用程序 A 检测到与服务器 B 的连接丢失,但服务器 B 仍认为该连接已打开
- 应用程序A 对服务器C 执行 soap webservice 调用,服务器C 从未收到 soap 请求,但应用程序A 没有发生超时或错误。
您将如何调查此类问题?关于第一个问题,我知道应该始终打开 3 个指向 serverB 的连接,因此我只需设置一个监控,执行如下操作:
netstat | grep IP_serverB
这种方法可以检测连接何时丢失,但我想调查这些连接丢失的原因。你会怎么做?
您需要安装哪些工具?
我知道我们的一个合作伙伴似乎监控通过其服务器的所有流量,并能够为我们提供数据包跟踪文件(.pcap 文件)。
您将如何设置它?它有助于调查问题吗?
答案1
很可能 pcaps 是由 tcpdump 创建的,我强烈推荐它。它帮助我解决网络问题的次数数不胜数。因此,我将在每台服务器上设置 tcpdump,并根据需要将捕获限制在服务器 A、B 或 C 上:
tcpdump -i any -v "host <ip of server>" -s0 -w output.pcap
请注意,使用主机参数意味着将捕获该主机的流量(无论是传入还是传出)。
另外,请注意 output.pcap 可能不会出现在您认为应该出现的位置。(在上面的示例中为当前目录)这是因为某些版本的 tcpdump 会在运行前进行 chroot。如果您找不到预期的文件,请检查 /var/lib/tcpdump
运行 tcpdump,直到您满意地捕获了每种情况的示例。如果您愿意,可以通过添加其他条件来进一步限制数据包捕获,例如
host <ip of server> and port 80
一旦您有了 pcap 文件,您就可以将其加载到 wireshark 中,并希望找出问题所在。
答案2
如果您正在建立隧道连接或在途中某处使用 NAT,则可能会出现此类问题,NAT 可以正常工作,但无法正确执行 NAT 反向操作。路由也可能是一个问题。
最简单的开始方式是检查所有 3 台机器上的路由。你可以这样做:netstat -rn
我不知道您的具体设置,但您应该使用适当的接口和网关,同时注意网络掩码。
然后,看一下 NAT 表:
iptables -L -n -t nat
有时防火墙可能是个问题,因此也值得检查以下内容:
iptables -L -n
您尚未指定使用的协议 (UDP/TCP),因此我假设使用 TCP。TCP 连接可以处于几种状态。您可以让 Cacti 以图形方式为您监控这些状态,请查看 Cacti 论坛上的设置方法:http://forums.cacti.net/viewtopic.php?f=12&t=12787
除此之外,您还可以添加 ip_conntrack 模块(modprobe nf_conntrack)或将其编译到内核中(比较难,但您的默认 Linux 内核可能已经支持它)。使用以下命令进行检查:
cat /proc/net/ip_conntrack
您将看到一个连接列表及其状态。您可以使用 grep 过滤掉您不需要的内容,或者只查找您感兴趣的内容。您可以让它每分钟运行一次(从 crontab)并将连接状态转储到文件中,如下所示:
grep IP_serverB /proc/net/ip_conntrack > `date +%Y%m%d_%H:%M`
这会将与 IP_serverB 的所有连接放入当前目录中名为 20131003_23:11 的文件中。
这样,您就可以看到两台机器上发生的情况(或者,如果您让它在 3 台机器上运行,则可以看到 3 台机器上发生的情况)。Wikipedia 有一张很好的图表,说明了每个 TCP 状态:http://upload.wikimedia.org/wikipedia/commons/thumb/a/a2/Tcp_state_diagram_fixed.svg/796px-Tcp_state_diagram_fixed.svg.png
您还可以设置 tcpdump 来记录与给定机器的 TCP 连接,方式如下:
tcpdump -i <network_interface> host <IP> and ip proto \\tcp and port <port> -l > tcpdump_logfile &
或者,如果您想实时查看它并同时将其记录到文件中,请执行以下操作:
tcpdump -i <network_interface> host <IP> and ip proto \\tcp and port <port> -l | tee tcpdump_logfile
使用额外的 -v(vv) 参数可以增加详细程度。Tcpdump 将记录 TCP 连接的所有详细信息(不包括数据本身)。这还可以帮助您诊断线路上发生的情况。
如果您想要真正看到 TCP 数据包中的数据,Ettercap/wireshark/tshark 可能是您的好帮手。