Ugniježđeni VPN tuneli: zašto unutrašnji zastaje na velikim paketima
Svaki tunel troši dio proračuna paketa putanje prije nego sljedeći počne. Zbrojite zaglavlja i unutrašnja sesija pada na velikim paketima.
DNS se razrješava, SSH sesija ostaje aktivna, a zatim se veliki prijenos zaglavi dok ping na isti host još uvijek odgovara. Ta podjela upućuje na veličinu paketa, a ne na pokvaren tunel. Ugniježđeni tuneli to postižu pri veličinama koje nijedan tunel sam ne bi dosegnuo. Unutrašnja sesija je u redu; samo joj se predaju paketi koji više ne stanu.
Kamo MTU putanje zapravo odlazi
Svaka enkapsulacija troši bajtove prije nego sljedeći sloj dobije red. Ethernet putanja nudi 1500 bajtova vanjskom paketu, a vanjski tunel uzima svoj dio prije nego se bilo što unutra može adresirati. Jedna nagađana vrijednost zaglavlja bit će pogrešna točno za onoliko koliko je važno.
Navedite slojeve po redu: pristupna putanja, vanjski transport, vanjski tunel, unutrašnji transport, unutrašnji tunel, aplikacija. Svako zaglavlje brojite jednom i držite UDP odvojeno od vlastitog zaglavlja tunela i njegove oznake.
Dva WireGuard sloja, brojana jednom
Uzmite IPv4 pristupnu putanju s jednim WireGuard tunelom unutar drugoga. Vanjski sloj košta 20 bajtova IPv4, 8 za UDP i 32 za WireGuard zaglavlje podataka plus njegovu oznaku provjere. Unutar toga unutrašnjem tunelu treba vlastito 20-bajtno IPv4 zaglavlje i 8-bajtno UDP zaglavlje prije njegovih drugih 32 bajta WireGuard troška. Ono što ostane drži IPv4 zaglavlje, TCP zaglavlje i podatke. Vanjska IPv6 putanja košta 40 umjesto 20 i ostavlja 1320.
| Layer | Bytes |
|---|---|
| Path MTU | 1500 |
| Outer IPv4 header | 20 |
| Outer UDP header | 8 |
| Outer WireGuard header and tag | 32 |
| Inner transport IPv4 header | 20 |
| Inner UDP header | 8 |
| Inner WireGuard header and tag | 32 |
| Innermost IPv4 header | 20 |
| TCP header | 20 |
| Payload that fits | 1340 |
Aritmetika završava na 1340 bajtova. Jedan sloj po istim pravilima ostavlja 1400 za TCP korisni teret, što je 1500 minus 20, 8, 32, 20 i 20, a razlika od 60 bajtova točno je unutrašnja enkapsulacija koju dodaje drugi tunel.
Primijenite 1400 na ugniježđenu putanju i unutrašnji tunel je 60 bajtova kratak, nevidljivo dok paket ne postane dovoljno velik da ih zatreba. Podmetanje i vlastita opcija fragmentacije protokola ponovno pomiču brojke, zato vjerujte tablici.
MTU, MSS i fragmentacija djeluju na različitim mjestima
MTU sučelja ograničava što će sučelje emitirati, dok TCP MSS stezanje mijenja što je TCP partner voljan poslati. Stezanje popravlja TCP sesije i ne čini ništa za veliki UDP datagram, tako popravak izgleda uspješan za jednu aplikaciju i tiho promaši sljedeću. Vlastita opcija fragmentacije protokola treća je poluga sa svojim neuspjesima. MTU sučelja uobičajen je prvi potez i najgrublji.
Premošteni i rutirani tuneli nose različite okvire, pa se brojke iz drugog postavljanja rijetko prenose. Otkrivanje MTU putanje, opisano u RFC 8201, pomaže samo dok su ICMP poruke o kojima ovisi propuštene.
Pronalaženje sloja kojem nedostaje
Provjerite svaki tunel zasebno prije ugniježđivanja, ako zahtjevi dopuštaju usporedbu. Sonda fiksne veličine to rješava: ping -M do -s 1472 -c 3 10.8.0.1 šalje pun IPv4 paket od 1500 bajtova unutar tog sloja. Dodajte drugi sloj i ponovite istu sondu, da svaki neuspjeh pripada poznatoj promjeni.
Kada se prijenos zaglavi, mijenjajte jedan dokumentirani parametar odjednom i bilježite veličinu na kojoj pada. Provjerite i povratnu putanju, jer ugniježđena rekurzija ruta može oponašati problem veličine paketa dovoljno blizu da košta cijelo poslijepodne. Filtriran ICMP odgovor može sakriti pravu granicu, zato je sonda važnija od zaključivanja.
Zapišite proračun tamo gdje će ga sljedeća osoba naći
Tablica s jednim retkom po sloju nadživi pravilo po sjećanju. Držite je uz dijagram tunela da nitko ne ponavlja aritmetiku pod pritiskom.
Više tunela znači više ovisnosti, pa plan vraćanja unatrag zaslužuje mjesto uz proračun. Ako se brojke još ne slažu, izmjerite putanju umjesto da ponovno nagađate. Cilj je brojka koju možete braniti, ne zapamtiti.