題 如何修復SSH發送分片報文


我的ISP有時會丟棄IP碎片。這體現在SSH中:我可以正常登錄並運行輸出短字符串的命令,但運行“ps fax”之類的操作會導致鏈接鎖定。

PMTU是1500.因此,似乎SSH正在嘗試傳輸大於此的數據包,然後這些數據包將被分段並因此丟失。我不能輕易減少遠程MTU,我不願意這樣做,因為MTU是正確的(1500)。

這裡發生了什麼?我認為TCP將其MSS設置為正確的值以避免碎片。我怎麼得到碎片?

編輯: 遠程機器是Centos 6.4。通過“有時”,我的意思是ISP的網絡中斷的日子很糟糕,它確實只會丟棄片段。嗅探鏈接的兩端,我看到數據包和來自大ping的片段離開了我的系統,但只有“主”數據包到達目標。

問題表現在上面,並且在登錄RDP會話時也是黑屏。問題現在已解決,所以在再次發生之前我不能再進行任何測試了。

在另一個系統上進行更多測試表明SSH設置了DF位。所以現在我真的不明白髮生了什麼。

我無法測試Fragmentation是否需要ICMP消息(它們不應該),因為網絡接受的數據包最大為以太網(1500),因此我自己的路由器會發出所需的frag消息。

我向ISP投訴,但是他們試圖說服我這是設計的,他們的網絡永遠不會允許ping“ping -s 5000”。當然不是這樣。特別是他們修好了。


5
2017-08-22 17:01


起源


你用的是什麼操作系統?像我這樣的某種Unix,但請註明。 - terdon
可能值得獲得一個小成功轉移和大轉移失敗的pcap,看看有什麼不同。 - MaQleod
TCP協議不會通過重新發送數據包來補償丟棄的數據包嗎?此外,“支離破碎”與“丟失”無關。如果你的ISP正在丟棄數據包,那麼一個大數據包就像一個小數據包片段一樣丟失。我不知道出了什麼問題,但你可能正在咆哮錯誤的樹。你試過跑嗎? ssh 在完全調試模式? ssh -vvv <host> - Darth Android
@DarthAndroid - 它會的。如果我是作者,我會使用代理或VPN來減少ISP正在進行的過濾。如果ISP確實將口袋減少到可以減少問題的程度,我也會向服務提供商投訴。 - Ramhound
丟棄的數據包是ISP在某種程度上允許所有線路的東西。在ISP甚至考慮調查之前,大多數resi線路最多可以丟失6%。業務線通常不應高於3%。不幸的是,一些應用程序足夠敏感,甚至在這些級別丟棄數據包,它可能會導致嚴重的問題。 - MaQleod


答案:


在這種情況下,我忽略了SSH和RDP會話正在通過IPSEC VPN這一事實。 PMTU處或附近的大型SSH數據包導致IPSEC數據包大於MTU,因此會碎片化。這些片段丟失,會話掛起。

我認為會話最終會超時並恢復,但人類會更快地超時。


1
2017-08-23 13:26