我们在连接远程 FTP 站点时遇到了一些问题(连接时随机出现超时),虽然我们倾向于认为问题出在远程 FTP 服务器上(一个线索是我们只在这个特定的服务器上遇到问题,其他服务器都运行正常),但我们试图确保问题不是来自我们这边。
我在我们的代理服务器(Debian 6.0)的 kern.log 中偶然发现了以下条目:
proxy kernel: [ 4421.346444] deny-forward IN=eth0 OUT=eth1 SRC=xxx.xxx.xxx.xxx DST=yyy.yyy.yyy.yyy LEN=40 TOS=0x00 PREC=0x00 TTL=62 ID=59026 PROTO=TCP SPT=32116 DPT=21 WINDOW=8192 RES=0x00 ACK PSH FIN URGP=0
iptables -L 给出链式转发的以下输出(为清楚起见已缩短):
Chain FORWARD (policy DROP)
target prot opt source destination
TCPMSS tcp -- 0.0.0.0/0 0.0.0.0/0 tcp flags:0x06/0x02 TCPMSS clamp to PMTU
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:53 flags:0x17/0x02
ACCEPT udp -- 0.0.0.0/0 0.0.0.0/0 state NEW udp dpt:53
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:53 flags:0x17/0x02
ACCEPT udp -- 0.0.0.0/0 0.0.0.0/0 state NEW udp dpt:53
ACCEPT tcp -- xxx.xxx.xxx.xxx 0.0.0.0/0 state NEW tcp dpt:21 flags:0x17/0x02
LOG all -- 0.0.0.0/0 0.0.0.0/0 LOG flags 0 level 4 prefix `deny-forward '
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable
这些丢包是否与所述问题有关这里? 这些可能是导致远程服务器连接有时失败的原因吗?
答案1
是的,丢包可能是连接有时失败的原因。由于问题只出在那台服务器上,我很确定问题不在你这边。你可以做一些简单的测试来查看是否有任何数据包丢失,例如 ping 几个小时,看看它是否报告数据包丢失,也可以 ping 另一台或两台服务器来比较结果(有更好的方法来测试数据包丢失,但我发现 ping 是一种快速简便的测试方法,如果发现问题,你可以从那里继续)。
至于导致数据包丢失的原因,谁也说不准。可能是路由器坏了、防火墙过热、以太网端口坏了、或者电缆坏了,等等……我遇到过防火墙使用过度,偶尔会过热、不稳定、连接中断、总体反应迟钝的情况。
您可能需要运行 tcpdump 来嗅探您这边和远程服务器之间的 ftp 流量。它应该能让您很好地了解正在发生的事情。特别是如果您让它更详细,即:
tcpdump -w example.dump -i any -nnvvXSs 65535 tcp port XXX
这将记录整个数据包。然后使用 tcpdump 或其他工具进行分析,并将其通过管道传输到 grep、less 等
tcpdump -nnvvXSs 65535 -r example.dump
您可以专门搜索诸如 tcp-rst 之类的内容,如下所示:
tcpdump -nnvvXSs 65535 -r example.dump 'tcp[tcpflags] & tcp-rst != 0 and tcp[tcpflags] & tcp-ack != 0' and tcp port XXX