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端口的訪問,我們之前真的沒有查到相應的資料,而是在問題定位后才能夠根據具體問題查到有大佬的文章描述。所以能不能要求蘋果賠我們一頓夜宵?

至此理清思路,總結如上,希望下次排查問題時能夠吸取經驗教訓。也希望能為其他遇到類似問題的小伙伴提供參考。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM