MTU o MSS? Che cosa risolve davvero una modifica VPN
L’MTU limita ciò che un collegamento trasporta; l’MSS limita il carico TCP al suo interno. Regolate quello giusto e sappiate quali protocolli nessuno dei due copre.
I ping riescono, i trasferimenti grandi si bloccano e il tunnel si dichiara sano. Qualcuno abbassa l’MTU dell’interfaccia, un altro regola l’MSS e, ogni tanto, il problema sparisce per motivi che nessuno annota. I due numeri descrivono oggetti diversi, quindi modificare quello sbagliato produce una correzione che sembra fortuna. Ecco la procedura: identificate il livello, applicate la regolazione corrispondente, poi provate su una connessione nuova.
Due numeri, due oggetti
L’MTU appartiene a un collegamento o a un’interfaccia: è il pacchetto più grande che può essere consegnato senza essere spezzato. L’MSS appartiene a TCP: è la quantità più grande di carico TCP che un segmento può portare, ed esclude sia l’intestazione TCP sia quella IP. Su un normale collegamento Ethernet con IPv4, un MTU di 1500 byte dà il noto MSS di 1460 byte. Questi numeri descrivono livelli diversi e vengono scambiati con meccanismi diversi. Confonderli è facile perché entrambi si misurano in byte ed entrambi sono vicini a 1500.
Uno arriva come impostazione dell’interfaccia. L’altro arriva come opzione dentro un segmento SYN, negoziata tra estremi che non vedono mai la vostra interfaccia.
Dove finisce il sovraccarico esterno
Una VPN mette il pacchetto interno dentro un altro, e il pacchetto esterno deve stare nel percorso fisico. Le intestazioni di incapsulamento, l’intestazione IP esterna, l’intestazione di trasporto e qualsiasi etichetta di autenticazione consumano byte che il pacchetto interno non può usare. Lasciate l’interfaccia del tunnel a 1500 e il pacchetto esterno supera regolarmente ciò che il percorso può trasportare. Con il bit «non frammentare» impostato, il router lo scarta e dovrebbe restituire un errore ICMP; se quell’errore viene filtrato, il mittente non lo sa mai.
Per questo il guasto sembra selettivo. Le richieste piccole si completano e tutto ciò che riempie un segmento si blocca, perché vengono scartati solo i pacchetti grandi. Un tunnel che lascia passare un ping non è un tunnel che trasporta dati.
Regolare l’MSS, e dove si applica
La regolazione dell’MSS riscrive il valore nel segmento SYN mentre attraversa un punto scelto, facendo scegliere a entrambi gli estremi un carico più piccolo senza che nessuno sappia perché. Su Linux è un obiettivo della tabella mangle applicato da una regola esplicita, e deve colpire i pacchetti SYN nella direzione che volete. Limitatela all’interfaccia del tunnel e all’intervallo di indirizzi, perché una regola ampia cambia il comportamento del traffico che non entra mai nel tunnel.
L’effetto riguarda solo TCP. Un’applicazione UDP, una sessione QUIC e qualsiasi protocollo che costruisca i propri datagrammi restano intatti.
Diagnosticare con un percorso fisso
Tenete una variabile alla volta. Provate con un pacchetto di cui scegliete voi la dimensione, e impostate il flag «non frammentare» perché il kernel riporti il risultato invece di nasconderlo.
Annotate dove inizia il guasto: dentro il tunnel, all’interfaccia del tunnel o sul percorso fisico dopo l’incapsulamento. Poi cambiate un numero e ripetete la stessa prova, non un’altra. Le connessioni esistenti mantengono l’MSS negoziato, quindi una modifica di policy è visibile solo su una connessione nuova, ed è per questo che una pagina in cache non dimostra nulla in nessuna direzione. Se un caricamento grande inizia a funzionare, avete imparato qualcosa su quel percorso e non su ogni protocollo che lo attraversa.
Cosa non corregge ciascuna modifica
Abbassare l’MTU dell’interfaccia non altera l’MSS di una sessione già stabilita. Regolare l’MSS non aiuta un flusso UDP e non ripara un percorso in cui gli errori ICMP vengono filtrati in una sola direzione. Ogni modifica risolve una classe di problemi e lascia il resto esattamente com’era.
Annotate quale regolazione avete applicato, dove e quale prova ha mostrato la differenza, perché altrimenti l’ingegnere successivo applica entrambe e perde la capacità di dire quale contava. Se il vincolo è reale e permanente, preferite un MTU del tunnel che lo rifletta rispetto a una regolazione che lo nasconde. Se dovete regolare, lasciate la regola limitata e commentata, perché una regola mangle inspiegata diventa permanente per impostazione predefinita.