解决服务器偶尔无法建立 TCP 连接的问题

昨天遇到一个很诡异的服务器连接问题,具体症状是服务器主动连接某IP时,偶尔会失败。有时失败频率较高,有时失败频率低些,大约100次会有一次左右的失败。

具体排查与解决的过程如下:
1、确定是一个IP、端口失败还是多个都会失败,多次测试后发现连接远端多个 IP、端口都出现失败的情况。
2、确定服务器的网络连接是否通畅,在用 telnet 端口测试的同时,从多个不同服务器 ping 故障服务器,都没有丢包的情况,确认 icmp 的连接一直正常。
3、抓包进行查看与分析,使用目的 IP 过滤后,查看抓到的包都一切正常。
4、确定服务器操作系统的版本,在多台相同版本操作系统的服务器上查看,别的服务器均正常。
5、确定该机房其他的服务器正常,在该机房别的服务器上验证,发现连接一切正常,但不是同一子网。
6、使用 nc 测试连接时,一切正常,唯独 telnet 某端口等情况下导致失败。
7、更换交换机上行端口测试,故障依旧。
8、更换服务器 IP 测试,故障依旧。
9、抓所有数据包,根据时间进行分析。有问题的包提取出来,参见以下内容:

No.     Time        Source                Destination           Protocol Length Info
     78 9.291210    H3cTechn_65:96:96     Broadcast             ARP      60     Who has 118.25.76.242?  Tell 118.25.76.225
     79 9.374407    118.25.76.240         61.144.56.101         DNS      87     Standard query PTR 210.26.34.212.in-addr.arpa
     80 9.464047    61.144.56.101         118.25.76.240         DNS      87     Standard query response, No such name
     81 9.464175    118.25.76.240         212.34.26.210        TCP      74     45847 > 9090 [SYN] Seq=0 Win=5840 Len=0 MSS=1460 SACK_PERM=1 TSval=13466169 TSecr=0 WS=512
     82 9.483346    212.34.26.210        118.25.76.240         TCP      74     9090 > 45847 [SYN, ACK] Seq=0 Ack=1 Win=5792 Len=0 MSS=1460 SACK_PERM=1 TSval=2195145474 TSecr=13466169 WS=16
     83 9.483366    118.25.76.240         212.34.26.210        TCP      66     45847 > 9090 [ACK] Seq=1 Ack=1 Win=6144 Len=0 TSval=13466189 TSecr=2195145474
     84 9.501100    118.25.76.253         118.25.76.255         NBNS     92     Name query NB MICROSOF-27DBA3<20>
     85 9.673259    118.25.76.240         212.34.26.210        TCP      68     45847 > 9090 [PSH, ACK] Seq=1 Ack=1 Win=6144 Len=2 TSval=13466378 TSecr=2195145474
     86 9.692393    212.34.26.210        118.25.76.240         TCP      66     9090 > 45847 [ACK] Seq=1 Ack=3 Win=5792 Len=0 TSval=2195145683 TSecr=13466378
     87 9.698012    212.34.26.210        118.25.76.240         TCP      66     9090 > 45847 [FIN, ACK] Seq=1 Ack=3 Win=5792 Len=0 TSval=2195145689 TSecr=13466378
     88 9.698061    118.25.76.240         212.34.26.210        TCP      66     45847 > 9090 [ACK] Seq=3 Ack=2 Win=6144 Len=0 TSval=13466403 TSecr=2195145689
     89 9.698076    118.25.76.240         212.34.26.210        TCP      66     45847 > 9090 [FIN, ACK] Seq=3 Ack=2 Win=6144 Len=0 TSval=13466403 TSecr=2195145689
     90 9.717226    212.34.26.210        118.25.76.240         TCP      66     9090 > 45847 [ACK] Seq=2 Ack=4 Win=5792 Len=0 TSval=2195145708 TSecr=13466403
     91 9.968284    H3cTechn_65:96:96     Broadcast             ARP      60     Who has 118.25.76.230?  Tell 118.25.76.225
     92 10.222425   118.25.76.240         61.144.56.101         DNS      87     Standard query PTR 210.26.34.212.in-addr.arpa
     93 10.250651   118.25.76.253         118.25.76.255         NBNS     92     Name query NB MICROSOF-27DBA3<20>
     94 11.000654   118.25.76.253         118.25.76.255         NBNS     92     Name query NB MICROSOF-27DBA3<20>
     95 11.537519   H3cTechn_65:96:96     Broadcast             ARP      60     Who has 118.25.76.241?  Tell 118.25.76.225
     96 11.537696   H3cTechn_65:96:96     Broadcast             ARP      60     Who has 118.25.76.242?  Tell 118.25.76.225
     97 11.537824   H3cTechn_65:96:96     Broadcast             ARP      60     Who has 118.25.76.230?  Tell 118.25.76.225
     98 11.851480   118.25.76.253         118.25.76.255         NBNS     92     Name query NB MICROSOF-27DBA3<00>
     99 12.601255   118.25.76.253         118.25.76.255         NBNS     92     Name query NB MICROSOF-27DBA3<00>
    100 13.351214   118.25.76.253         118.25.76.255         NBNS     92     Name query NB MICROSOF-27DBA3<00>
    101 13.985279   118.25.76.240         61.144.56.101         DNS      87     Standard query PTR 210.26.34.212.in-addr.arpa
    102 14.005965   61.144.56.101         118.25.76.240         DNS      87     Standard query response, No such name
    103 14.006089   118.25.76.240         212.34.26.210        TCP      74     45848 > 9090 [SYN] Seq=0 Win=5840 Len=0 MSS=1460 SACK_PERM=1 TSval=13470711 TSecr=0 WS=512
    104 14.025307   212.34.26.210        118.25.76.240         TCP      74     9090 > 45848 [SYN, ACK] Seq=0 Ack=1 Win=5792 Len=0 MSS=1460 SACK_PERM=1 TSval=2195150017 TSecr=13470711 WS=16

注意第81及103两个包都是发起到目的的连接并成功的情况,在它们前面都各有两个 DNS 的包,但中间低92个DNS包,只有发出的包而没有返回包。问题很可能就出在这里,在更换 DNS 之后,再测试就没什么问题了,目前为止看来一切正常。

原来 DNS 是罪魁祸首,并且这种问题隐藏的很深,DNS 并非不工作,只是偶尔不返回数据而已。最终问题解决后,心情变得顺畅多了,特记录之。并且在最后依然心存一点疑问,完全 IP 的访问,跟 DNS 有什么关系?查阅资料后,才获知原来是在进行 Reverse DNS 操作,也就是 DNS 的反解析。修改 /etc/hosts.allow 文件可设置哪些 IP 及服务关闭反解析,目前我的理解是如此,但因为没去深究,就到此为止了。

发表评论

电子邮件地址不会被公开。 必填项已用*标注