一次服务器映射到外网无法访问的故障排查,结果很戏剧

核心提示客户的业务通过防火墙做端口映射到互联网,防火墙到业务服务器间只有一台三层交换机,在互联网上使用公网IP地址打开时显示http 502,但是在同一个局域网中的电脑可以使用业务的内网和公网IP地址正常访问业务。客户反馈这个问题有一段时间了。由于

客户的业务通过防火墙做端口映射到互联网,防火墙到业务服务器间只有一台三层交换机,在互联网上使用公网IP地址打开时显示http 502,但是在同一个局域网中的电脑可以使用业务的内网和公网IP地址正常访问业务。客户反馈这个问题有一段时间了。

由于同一个局域网的电脑可以正常访问,并且可以正常远程所以排除服务器及业务本身的问题,把查找思路放到了防火墙故障排查上,防火墙为深信服防火墙,登录到后台后在故障排除中打开直通测试,但故障依旧。

在客户端和服务器上同时抓包客户端上抓到了tcp三次握手完成后收到了服务器端发来的rst包,但是服务器端没有抓到任何包,难到是在防火墙上就拦截的数据包没有转发到服务器上吗?

过一会之后在服务器端抓包的情况下显示了以下信息:

Options [mss 1440,nop,wscale 8,nop,nop,sackOK]

难道是tcp mss的问题吗?

在网上查询了相关的问题,然后发现说是需要将tcp_tw_recycle关闭,按照方法将tcp_tw_recycle,发现502变成了302,,,终于还是有此变化了,不过还是无法正常访问。然后把关闭的这行给去掉并且sysctl -p,但后面一直都是302了,感觉不是这个参数的问题所以也就没有纠结了,反正局域网访问还是正常的。

联系深信服原厂工程师寻求帮助,厂家工程师在防火墙进出接口上都抓了包,发现进入防火墙和出防火墙的数据包一致,也就是说防火墙有将数据包转发给客户器了,但为什么在服务器上为什么没有抓到包呢?

后来发现因为客户需要在内网使用公网IP地址打开,所以打开了防火墙的双向NAT,也就是DNAT和SNAT,所有外网访问的IP地址将会转换为内网接口地址,所以之前我在服务器抓不到包是因为我在过滤源IP地址的时候写的IP地址是我客户端的公网IP地址,所以这个地址只有在防火墙上抓包的时候才能用,在服务器上抓包需要过滤的是防火墙内网接口的地址。

根据上面得到的结果重新过滤抓包,这次得到了数据包,也就是说数据包正常的到服务器了,并且服务器也回复了,这里说得有点多余,因为之前客户端上的数据包已经显示三次握手成功了,不过多看看也相当于温习下。一个个的数据包对比后发现一个问题:

从整理的表中发现客户端却收到服务器发送的一个sq为4020102890 asq为74466690的rst+ack包,但sq为74466690这个数据包在客户端和服务器均没有出现过,没有出现为何服务器端为何会去应答这个数据包呢?并且再到服务器查看后发现sq为4020102890 asq为74466690的rst+ack包在服务器端根本就没有发出过,服务器收到的sq为74466680 asq为4020102890的rst+ack包也一样,客户端没有发过这个数据包,这两个数据包从哪里来的呢?

为了防止我的过滤条件没有问题,我还特意使用其它sq验证了一下,可以查到对应的数据包,过滤条件没问题。

那这个莫名奇妙的rst包是谁发的呢?运营商发的吗?难道是???

然后我马上到防火墙上将映射到互联网的端口修改,在客户端使用浏览器访问,没想到马上就可以访问了。还真的被运营商拦截的,其它这个问题已经在很多客户那里遇到过了,虽然得到反馈的第一时间就想到会不会是这个问题,但因为之前记得客户备案的时候还让我提供了一些资料,所以就觉得不会是这个原因。最后通知客户与运营商的客户经理联系看看如何解决。

所以在排查故障的时候真的是一切皆有可能呀。

 
友情链接
鄂ICP备19019357号-22