部分域名无法正常弹出portal问题解析

来源:互联网 发布:徙知徐州文言文翻译 编辑:程序博客网 时间:2024/04/29 10:26

1. 问题现象

前几天线上设备出现奇怪的现象,部分终端使用UC浏览器访问部分网站无法弹出portal或弹出portal比较慢,但是其他大部分终端访问却可以正常弹出portal,真是莫名其妙,到底是怎么回事?

2. 现象分析

刚开始本地尝试复现,但是一直没有出来,线上又不好分析,一度陷入了死局。
后来想起之前有遇到过浏览器云端加速导致访问异常的情况,所以就怀疑是浏览器云端加速导致的,所以立即进行测试

a. 使用UC浏览器,开启云端加速,果然portal无法弹出或弹出很慢,关闭后正常。通过抓包发现开启时,打开网站时,浏览器会主动向某些地址发送请求,端口是8081(我们是监控80端口进行弹portal的,8081请求,如果访问的域名或IP不在白名单中直接丢弃)。

b. 开启云端加速,将浏览器主动请求的地址加入白名单中,弹出portal正常。

这应该就确定跟云端加速时,主动访问其他域名非80端口时,报文被丢弃了,所以就让测试去搜集不同浏览器云端加速的域名了。

难道真的是这个原因吗?,如果你也这么想,那我们都是too young了!

另外一个同事,一直觉得不是这么简单,所以他后来又进行了深度的测试,详细分析了portal弹出失败时的报文,果然发现真的不是那么简单!

通过分析报文发现有两种情况:1)将云端加速访问的域名加入白名单后,访问时直接可以上网,不会弹portal2)关闭云端加速时,访问某个网站时,死活不弹portal

3. 解决方案

看到这里,你应该也会纳闷,怎么回事?

第一种情况:

之前我们测试只是加了一个IP,可能这个IP就只是用来探测连接的,真正数据通信使用的是另外的IP,所以加入后可以正常弹portal(这个需要具体分析下,Mark)。当把域名加进去后,域名对应的所有IP都正常访问,当你访问某个域名时,浏览器先向云服务器请求,云服务器再向这个域名请求,然后将返回的数据,返回给浏览器。因为云服务器都放行了,这时云服务器就像代理一样,你虽然没有认证过,但是数据都是走云服务器代理出去的,所以你就可以直接上网了。

针对这种情况该怎么做呢,这个暂时还没有方案,待详细分析下浏览器云端加速原理再说吧!

第二种情况:

通过仔细分析报文,终于发现原来是请求报文分片了,并且第一片数据是在ACK报文中的!代码中没有针对ACK携带数据进行处理,因为一般都是PUSH中才会携带数据。真是涨了见识,不过也暴露了自己对网络协议这块的生疏。

这里写图片描述

这种情况就比较好解决了,只需要添加针对ACK报文的处理了,但是总不能所有的ACK都处理吧!如果ACK没有携带数据,根本就没必要处理。那怎么判断ACK中有没有数据呢?

其实很简单,暴力点,就判断ip头总长度是不是大于40,如果是,就判断ACK携带有数据,如果不是,那肯定没有携带数据。修改后,测试,完美解决,搞定!

if (1==tcph->psh|| (1==tcph->ack && iph->tot_len > 40)) //判断IP头大于40,就断定ACK中携带有数据{    int ret = -1;    struct httphdr* http=NULL;    DCINFO("Reply ack.\n");    dc_reply_ack(skb,iph,tcph);     http = kmalloc(sizeof(struct httphdr),GFP_ATOMIC);    if(!http)    {        DCERR("Malloc failed.");        return NF_ACCEPT;    }    ...}

至于第一种情况,后面详细分析下,再好好谈论下方案!

这种情况下不解决,会严重影响使用云端加速浏览器的用户体验!

0 0
原创粉丝点击