在路由器R1上有兩條外網,WAN1和WAN2。
R1上做了域名分流功能,全局網址分到WAN1,指定域名分到WAN2(優先級更高)。
癥狀是用戶反饋部分網頁無法打開。
于是各種檢查嘗試......? 2天過去了......
最終結論是:即使SYN請求通過R1的Wan1發出,服務器響應的目標IP(wan1的公網地址)可能被BGP策略判定為“通過wan2更優”,導致響應包從wan2進入用戶網絡。
?
分析過程:
對TCP三次握手的影響:路徑不對稱導致連接失敗
TCP協議要求連接路徑??雙向一致??(對稱性),否則會破壞傳輸層的可靠性機制。以下是具體沖突點:
??1.TCP序列號(Sequence Number)校驗失敗?? ??
請求階段??:客戶端通過wan1發送SYN包(序列號Seq=X),服務器記錄此序列號。 ??
響應階段??:若SYN-ACK通過wan2返回,客戶端預期確認號為Ack=X+1,但wan2轉發的包可能因路徑延遲或修改導致序列號不匹配。 ??
結果??:客戶端丟棄SYN-ACK包,重傳SYN請求(Wireshark顯示TCP Retransmission) 。 ??
2.NAT會話表失效
路由器在轉發SYN請求時執行??SNAT??(源地址轉換),將客戶端內網IP替換為R1的公網IP,并記錄會話表。
當SYN-ACK從wan2進入時,路由器發現此包不匹配R1的會話表條目,可能丟棄或錯誤轉發。
3.實際現象??
Chrome開發者工具顯示ERR_CONNECTION_RESET或超時。
TCP狀態機因路徑不一致進入死鎖(客戶端等待SYN-ACK,服務器等待ACK確認)
?
NAT會話表失效??
路由器在轉發SYN請求時執行??SNAT??(源地址轉換),將客戶端內網IP替換為wan1的公網IP,并記錄會話表。 當SYN-ACK從wan2進入時,路由器發現此包不匹配wan1的會話表條目,可能丟棄或錯誤轉發 。 ??實際現象?? Chrome開發者工具顯示ERR_CONNECTION_RESET或超時。 TCP狀態機因路徑不一致進入死鎖(客戶端等待SYN-ACK,服務器等待ACK確認)
?
以下是BGP的逐包獨立選路特性,?? BGP路由器對每個數據包的轉發決策是獨立的,基于以下優先級順序 :
??本地優先級??:若wan2所在路徑的優先級更高(如運營商策略優化),則優先選擇;
AS路徑長度(AS Path)??:若通過wan2的路徑經過的AS數量更少(如AS Path更短),則優選;???
MED值(多出口鑒別器)??:若wan2所在入口的MED值更小(如成本更低),則流量被導向wan2;
??其他規則??:如權重(Weight)、下一跳IGP開銷等。
ps:路由器R1的兩個wan口分別對應兩個不同的公網ip,請問運營商的設備是如何知道這兩個ip就插在同一臺設備上的?
答:運營商設備會記錄R1的AS號,這個號是唯一的,所以兩個ip對應as號一樣,它就知道是同一臺設備,所以會選對最短路。