故障:一台服务器开放tcp 80端口,一些客户端能正常访问,还有一些客户端不能访问,但通过telnet ip 80,却能打开端口。
故障分析:服务器外边防火墙原因?服务器原因?客户端浏览器原因?客户端防火墙原因?
在服务器上tcpdump抓包,使用命令:tcpdump host 192.168.0.123 -A and port 80 -i eth2
抓包结果如下:
[root@system ~]# tcpdump host 172.16.0.23 -A and port 80 -i eth1
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth1, link-type EN10MB (Ethernet), capture size 96 bytes
16:58:46.734731 IP 172.16.0.23.1120 > 192.168.101.253.http: S 96697639:96697639(0) win 65535 <mss 1460>
E..,
.@.x...D.
;
        ..e..`.P..}'....`....)........
16:58:46.799835 IP 192.168.101.253.http > 172.16.0.23.1120: S 1625956342:1625956342(0) ack 96697640 win 5840 <mss 1460>
E..,..@.@..i..e.D.
;
        .P.``.....}(`....h......
16:58:49.933302 IP 192.168.101.253.http > 172.16.0.23.1120: S 1625956342:1625956342(0) ack 96697640 win 5840 <mss 1460>
E..,..@.@..i..e.D.
;
        .P.``.....}(`....h......
16:58:55.932385 IP 192.168.101.253.http > 172.16.0.23.1120: S 1625956342:1625956342(0) ack 96697640 win 5840 <mss 1460>
E..,..@.@..i..e.D.
;
        .P.``.....}(`....h......
16:59:07.930560 IP 192.168.101.253.http > 172.16.0.23.1120: S 1625956342:1625956342(0) ack 96697640 win 5840 <mss 1460>
E..,..@.@..i..e.D.
;
        .P.``.....}(`....h......
16:59:32.126894 IP 192.168.101.253.http > 172.16.0.23.1120: S 1625956342:1625956342(0) ack 96697640 win 5840 <mss 1460>
E..,..@.@..i..e.D.
;
        .P.``.....}(`....h......
17:00:20.319557 IP 192.168.101.253.http > 172.16.0.23.1120: S 1625956342:1625956342(0) ack 96697640 win 5840 <mss 1460>
E..,..@.@..i..e.D.
;
        .P.``.....}(`....h......
抓包分析:
16:58:46.734731 客户端172.16.0.23主动访问192.168.101.253的80端口。此为tcp三次握手的第一阶段,syn发送
16:58:46.799835一直到17:00:20.319557 服务器端一直都在发送syn,并ack客户端过来的syn,此为三次握手的第二阶段,被动发送syn,并进行ack
但一直未收到客户端的最后一阶段的ack。
而客户端能通过telnet 192.168.101.253 80,则证明,客户端已能接受到服务器三次握手的第二阶段,并发送了最后一个ack,进入establishe阶段,并显示为端口打开。
而服务器没有收到,服务器端不会认为三次握手结束啦,所以一直发送syn,直到超时。
证明在客户端有防火墙之类把ack给屏蔽住了。
解决策略:由于整个网络当时有两个网络合并而成,有些路由器配置有问题。后来听说修改了一下链路上的路由器,问题解决了。
疑问:路由器上有什么限制,能允许tcp的syn通过,但阻止ack通过呢?
分析可能有错误之处,请高手指点。