1. 程式人生 > >跨主機Docker網路間歇性無法訪問的原因

跨主機Docker網路間歇性無法訪問的原因

Docker網路間歇性無法訪問的原因

       隨著訪問量增加,偶然間發現部署在docker上的某種web服務會發生間歇性的卡死,起初認為是防火牆原因,經過再三排查並沒有發現任何異常記錄。

       通過抓包發現客戶端向伺服器傳送了SYN後,服務端雖然收到了SYN,但是並沒有做任何處理,資料包被丟棄了。經過一段時間後測試又恢復正常,可以響應SYN ACK,並且正確建立了連線。服務端在測試環境中執行正常,沒有出現過類似的問題,由此可見問題依然產生在網路環境上。

       Docker釋出服務時使用了iptables的nat轉發,手動刪除對應服務的SNAT規則後發現SYN ACK響應正常,由此推斷問題出現在SNAT上,經過調查發現由於網路是基於nat轉發且經過snat後,源ip地址均會變更為公網地址,就會導致同一個地址的資料包頭部時間戳是亂序的,並不能保證線性增長,如果開啟/etc/sysctl.conf中的net.ipv4.tcp_tw_recycle後,一旦有某個客戶端斷開,服務端可能會將該源ip地址中時間戳相對較小的資料包丟棄,導致連線失敗。

      關閉net.ipv4.tcp_tw_recycle後問題解決。