IOS15屏蔽10080端口导致访问失败问题

 

 

问题概述及解决:

iphone 在升级ios15后,浏览器不能访问端口10080的网站服务,如APP对应的后台服务端口为10080则同样会导致访问失败。

解决办法:

将服务端口改为10080之外的未被屏蔽的端口。如服务在外层的负载均衡或再外层的防火墙(或路由)有对应的外网映射端口,则只需要将相应外网映射的端口改为10080端口之外的未被屏蔽的端口。

 

问题发现及排查过程

问题发现:

2021年11月26日,周五,晚。开发及测试小伙伴分别通过我司北京UAT环境和昆明UAT环境对新版本APP进行测试,在各安卓系统,测试过程顺利。而在IOS环境下,IOS14版本基础上APP访问昆明UAT环境及北京UAT环境均正常,但IOS15版本基础上APP访问北京UAT环境正常,而访问昆明UAT环境失败。

访问北京UAT环境服务是http://40.10.1.33:8088/xxx_app/user/list

访问昆明UAT环境服务是http://60.13.XX.118:10080/xxx_app/user/list

问题排查:

11月27日,周六—11月29日,周一。

针对上述情况,小伙伴们排查定位问题,总结出如下情况:

1)、IOS15版本基础上,APP请求昆明UAT环境的首页没有问题,后续请求接口失败。

2)、iPhone 手机端的抓包软件http catcher 没有抓到后续请求的包。

3)、昆明UAT环境已经重装、重启系统,未能解决问题。

4)、昆明UAT环境换过公网地址,未能解决问题。

5)、北京UAT环境也加了公网地址,北京环境仍能正常访问,不是这个问题。

11月29日,周二。

     第一次尝试:

我让小伙伴在IOS15基础的APP上,通过外网访问昆明UAT环境,我在出口路由器上抓包;

通过内网访问北京UAT环境,我在服务器上抓包。

以对比包的不同之处。

经对比发现,访问昆明UAT环境时,网络拥塞标记的ECN字段被标注,且出现多次丢包。

 

 

此时判断,可能是因为昆明的网络设备丢包引起的相应问题。

经过百度,查到大佬如下文章《一个诡异的TCP连接正常但数据传输失败的问题定位以及解决思路》

文章链接:https://www.pianshen.com/article/3206755844/

于是让昆明的小伙伴,通过 echo 0 > /proc/sys/net/ipv4/tcp_ecn  命令关闭了服务器的tcp_ecn。

但事实证明,不是这个问题,于是第一次尝试失败。

第二次尝试:

但如上失败,仍不能排除昆明老旧网络设备不支持ECN的问题。

于是请开发小伙伴们打包了昆明UAT内网IP对应的APP包,由昆明小伙伴在昆明的内网环境中尝试访问。结果仍就访问失败。

经过与昆明小伙伴的沟通,即便在昆明内网环境中数据仍旧会过一些老旧的网络设备,所以还是不能排除ECN的问题。

但昆明的小伙伴再次反馈强调,在手机上通过抓包APP http catcher 只抓到了首页的请求,后续请求都没有抓到。

于是我回看了之前在北京出口路由器上抓到的包,确实只有首页的请求,没有后续请求。

 

至此,第二次尝试也宣告失败。

注意:总结上述两次尝试,其实对比条件都不严谨,不能够明确的控制单一的变量,比如抓包北京是在内网环境中抓的,包都没有太多的过网络设备,而访问昆明UAT环境抓的包却要过很多网络设备,还要过互联网,而这可能正是包中ECN被标记的原因。昆明内网环境访问也不能排除老旧网络设备是否不支持ECN标记。

第三次尝试

我在机房继续在路由器上抓包,发现IOS15版本上的APP访问昆明UAT环境,三次握手成功建立后(此时已完成了首页的缓存,APP不需要再调首页接口获取首页数据,如果没有首页数据的情况下,则可以通过抓包看到首页的请求过程),无论如何点击登录等按钮,都没有后续的请求数据,31-32秒的时间,链接便正常断开。也就是说,IOS15版本上的APP确实没有把登录等请求数据发送出去。但是访问北京环境的时候,IOS15版本上的APP确实访问成功,也就是登录等请求确实发送出去了。于是我再三与开发的小伙伴确认,APP是一样的,开发的小伙伴们也一再强调确实是一样的。

至此,真的是有些丈二和尚摸不着头脑了。

就在一筹莫展的时候,突然想到,IOS15版本上的APP访问昆明UAT环境,没有把相应的登录等请求发送出去,那会不会不是APP本身没有把请求发送出去,而是手机把相应的请求直接拦截丢掉了呢?

基于以上猜想,结合上午昆明的小伙伴小艾同学在群里发的一张nginx 500报错的截图,我尝试通过手机浏览器直接访问http://60.13.XX.118:10080/xxx_app这个路径。结果发现如下情况:

1)、ios14版本的手机,能够获取到服务器返货的500报错,参考如下图:

 

2)、ios15版本手机则直接是about;blank

3)、北京UAT环境也改为10080端口后,ios15版本手机则也变为about;blank,ios14版本手机则能够获取到服务器的500报错

至此,可以推断,是IOS15系统将10080端口的访问拦截丢弃了。

后来小伙伴又查到大佬如下文章,请参见文中的第八条,文章链接附上如下:https://www.cnblogs.com/narutoblog/p/15123066.html?ivk_sa=1024320u

 

在昆明UAT环境将10080端口改为其它端口后,终于可以成功访问。至此,问题排查结束并解决。

 

总结

现在我们回过头来对本次问题的排查过程进行总结,发现,我们在排查这个问题的时候出现的几个错误,导致排查时间冗长,排查困难。

1)、其实在最开始对比环境的时候,就能够很容易发现北京UAT环境和昆明UAT环境的端口明显不同。但因为当时我们没有像现在一样把问题明确到纸面上来,没有把环境差异明确的标记出来,进行逐一的分析,对比和测试,排查的过程偏感性,才导致了排查过程的混乱和遗漏。

2)、我们在排查对比问题实验的过程中没有做好变量的控制,出现变量不可控,或同时变更了多个变量的情况,从而不能够准确的定位问题。

3)、我们获取信息的渠道很窄,或许确实苹果官方并没有说明他们封掉了对10080端口的访问,我们之前真的没有查到相应的资料,而是在问题定位后才能够根据具体问题查到有大佬的文章描述。所以能不能要求苹果赔我们一顿夜宵?

至此理清思路,总结如上,希望下次排查问题时能够吸取经验教训。也希望能为其他遇到类似问题的小伙伴提供参考。

posted @ 2021-12-04 17:05  Tangsj  阅读(1057)  评论(0编辑  收藏  举报