As peticións pequenas funcionan, as descargas grandes colgan e alguén suxire MSS clamping. Esa suxestión acerta con suficiente frecuencia como para merecer unha proba na orde correcta, e falla coa suficiente como para facerlle perder unha tarde se a aplica ás cegas. As tres comprobacións de abaixo separan un problema real de tamaño TCP dun problema de UDP, dun descubrimento path-MTU roto e dun clamp que nunca ve o handshake que debería reescribir.

Empece pola forma do fallo

Un fallo de tamaño ten sinatura: a conexión establécese, a autenticación e as respostas pequenas teñen éxito, e despois unha transferencia atáscase indefinidamente en canto necesita un segmento de tamaño completo. As páxinas que cargan texto pero nunca rematan unha imaxe son o mesmo fallo a menor escala. Se non se conecta nada de nada, o problema está antes na ruta e o clamping non axudará. Un clamp non pode reparar un handshake que nunca chegou.

A sinatura existe porque o handshake é onde se acorda o tamaño do segmento. Cada lado anuncia un tamaño máximo de segmento como opción TCP, e os emisores respectan o anuncio do par. Se a ruta non pode transportar un segmento tan grande, o fallo aparece máis tarde, cando o emisor por fin o tenta.

Manteña o transporte á vista mentres le ese síntoma. O clamping é unha reescritura dunha opción TCP, así que unha chamada de voz ou vídeo que se atasca baixo o mesmo túnel non é un problema de MSS e non mellorará por iso. Anote o transporte antes de tocar unha opción TCP.

Ponlle prezo á ruta e compáraa co túnel

Dous números importan e a miúdo confúndense. A path-MTU é o paquete máis grande que a ruta transportará sen fragmentación, e o MSS anunciado para IPv4 é ese valor menos os 40 bytes de cabeceiras IP e TCP, ou menos 60 para IPv6. A encapsulación do túnel consome parte do orzamento antes de que o paquete interior sequera comece.

ping -M do -s 1400 198.51.100.20
tracepath 198.51.100.20

O ping co bit do-not-fragment dille se sobrevive un paquete dese tamaño de carga útil; axuste o tamaño ata que falle e terá atopado o límite da ruta empiricamente. A saída de tracepath informa do MTU descuberto ao longo da ruta, que é máis rápido cando funciona e menos fiable cando un salto intermedio filtra as sondas.

Agora reste a sobrecarga do túnel. Unha cabeceira IP exterior, unha cabeceira UDP e unha cabeceira específica do túnel saen todas dos mesmos 1500 bytes, así que o MTU interior utilizable nunha base Ethernet típica é máis baixo do que suxire a ligazón física. Se o MTU interior calculado é inferior ao que anuncian os seus pares, atopou un candidato real a clamp e non unha conxectura. Se o valor calculado xa está por riba do que anuncian os pares, detéñase aquí e busque noutro sitio.

Coloque o clamp onde pasa o handshake

Un clamp funciona reescribindo a opción MSS nos paquetes SYN e SYN-ACK mentres cruzan a pasarela. Se a regra se asenta nunha interface que ningunha das dúas direccións atravesa nunca, a negociación complétase sen cambios e o síntoma persiste, por iso a colocación decide o resultado máis que o valor.

SymptomWhat it points toNext check
Handshake completes, large transfer stallsSegment size larger than the path can carryPath MTU against the tunnel's effective MTU
Nothing connects, small or largeRouting, firewall or keying failureNot MSS; look at the tunnel state
Only UDP applications stallDatagram size or a dropped ICMP errorPlatform-specific UDP handling, not clamping
Fixed after reconnect, returns laterClamp applied to one direction or one interfaceRule placement and the handshake path

A dirección é a outra metade. Aplicar clamp nunha soa dirección arranxa a metade dos fluxos e deixa o resto fallando dunha forma que parece intermitente, así que aplíqueo ás dúas direccións do tráfico reenviado. A forma clásica en Linux para unha interface de túnel é unha regra mangle que coincide con paquetes SYN:

iptables -t mangle -A FORWARD -o tun0 -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu

Fíxese no que --clamp-mss-to-pmtu fai en realidade: deriva o valor do MTU da ruta, que non sempre é o orzamento real de carga útil do túnel. Nun túnel baseado en ruta onde a ruta interior e a ruta exterior difiren, un valor explícito calculado na comprobación anterior é máis predicible ca un automático.

Verifique cunha conexión nova e manteña viva a retroalimentación

Unha conexión establecida conserva o MSS que negociou, así que probar na mesma sesión non demostra nada. Abra unha conexión nova tras o cambio e lea o valor negociado directamente en lugar de inferilo dunha transferencia que remata por casualidade.

ss -tin dst 198.51.100.20
iptables -t mangle -S | grep TCPMSS

O primeiro comando informa do MSS do socket xunto co seu estado de conxestión, que é a confirmación máis rápida de que o clamp surtiu efecto. O segundo confirma que a regra que cre engadiu é a regra que existe, na táboa onde se colocou.

Despois protexa o mecanismo que non arranxou. O descubrimento path-MTU depende de que as mensaxes ICMP fragmentation-needed cheguen ao emisor, así que unha devasa que as descarte seguirá rompendo transferencias grandes mesmo cun clamp correcto. Permita esas mensaxes para a ruta do túnel, ou acepte que o clamping compensa unha política que vostede elixiu.

Por último, resista a tentación de tratar o clamp como un mando de axuste. Restrinxe o tamaño do segmento, o que custa rendemento en rutas que nunca o necesitaron. Aplicado tras as tres comprobacións é unha reparación dirixida; aplicado primeiro é un cambio que agocha o fallo orixinal e engade unha segunda variable a cada proba posterior. Ese intercambio merece facerse a propósito, non por defecto.

Anote a path-MTU que mediu, a sobrecarga do túnel que restou, a regra que engadiu e o MSS que viu despois. Catro números converten o seguinte incidente nunha consulta en lugar dunha investigación.

Artigos relacionados