Mažos užklausos veikia, dideli atsisiuntimai stringa, ir kažkas pasiūlo MSS ribojimą. Šis pasiūlymas pakankamai dažnai teisingas, kad vertėtų jį išbandyti teisinga tvarka, ir pakankamai dažnai neteisingas, kad, pritaikius aklai, pražūtų popietė. Trys toliau pateikti patikrinimai atskiria tikrą TCP dydžio problemą nuo UDP problemos, nuo sugedusio path-MTU aptikimo ir nuo ribojimo, kuris niekada nemato rankos paspaudimo, kurį turėtų perrašyti.

Pradėkite nuo gedimo formos

Dydžio gedimas turi parašą: ryšys užmezgamas, autentifikacija ir maži atsakymai pavyksta, o tada perdavimas sustoja neribotam laikui, kai tik prireikia pilno dydžio segmento. Puslapiai, kurie įkelia tekstą, bet niekada neužbaigia paveikslėlio, yra tas pats gedimas mažesniu mastu. Jei niekas visiškai nesijungia, problema yra anksčiau kelyje ir ribojimas nepadės. Ribojimas negali pataisyti rankos paspaudimo, kuris niekada neatėjo.

Parašas egzistuoja todėl, kad rankos paspaudimas yra vieta, kurioje sutariama dėl segmento dydžio. Kiekviena pusė skelbia maksimalų segmento dydį kaip TCP parinktį, o siuntėjai gerbia kitos pusės skelbimą. Jei kelias negali pernešti tokio didelio segmento, gedimas pasireiškia vėliau, kai siuntėjas pagaliau pabando vieną.

Laikykite transportą akyse, skaitydami šį simptomą. Ribojimas yra TCP parinkties perrašymas, todėl balso ar vaizdo skambutis, kuris stringa po tuo pačiu tuneliu, nėra MSS problema ir nuo to nepagerės. Užsirašykite transportą prieš liesdami TCP parinktį.

Įkainokite kelią, tada palyginkite jį su tuneliu

Du skaičiai svarbūs ir jie dažnai painiojami. path-MTU yra didžiausias paketas, kurį kelias perneša be fragmentavimo, o IPv4 skelbiamas MSS yra ta vertė atėmus 40 baitų IP ir TCP antraščių, arba atėmus 60 IPv6 atveju. Tunelio inkapsuliavimas suvartoja dalį biudžeto dar prieš pradedant vidiniam paketui.

ping -M do -s 1400 198.51.100.20
tracepath 198.51.100.20

Ping su do-not-fragment bitu pasako, ar tokio naudingojo krovinio dydžio paketas išgyvena; keiskite dydį, kol jis nepavyks, ir empiriškai rasite kelio ribą. tracepath išvestis nurodo maršrute aptiktą MTU, o tai greičiau, kai veikia, ir mažiau patikima, kai tarpinis šuolis filtruoja zondus.

Dabar atimkite tunelio sąnaudas. Išorinis IP antraštė, UDP antraštė ir tuneliui būdinga antraštė visos išeina iš tų pačių 1500 baitų, todėl naudojamas vidinis MTU tipinėje Ethernet terpėje yra mažesnis, nei sufleruoja fizinė jungtis. Jei apskaičiuotas vidinis MTU yra mažesnis už jūsų partnerių skelbiamą, radote tikrą ribojimo kandidatą, o ne spėjimą. Jei apskaičiuota vertė jau viršija partnerių skelbimą, sustokite čia ir ieškokite kitur.

Įdėkite ribojimą ten, kur praeina rankos paspaudimas

Ribojimas veikia perrašydamas MSS parinktį SYN ir SYN-ACK paketuose, kai jie kerta šliuzą. Jei taisyklė yra sąsajoje, kurios nė viena kryptis niekada nekerta, derybos baigiasi nepakitusios ir simptomas išlieka, todėl vieta lemia rezultatą labiau nei vertė.

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

Kryptis yra kita pusė. Vienos krypties ribojimas sutaiso pusę srautų, o likusius palieka nepavykstančius taip, kad atrodo protarpiais, todėl taikykite jį abiem perduodamo srauto kryptims. Klasikinė Linux forma tunelio sąsajai yra mangle taisyklė, atitinkanti SYN paketus:

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

Atkreipkite dėmesį, ką --clamp-mss-to-pmtu iš tikrųjų daro: jis išveda vertę iš maršruto MTU, o tai ne visada tikrasis tunelio naudingojo krovinio biudžetas. Maršrutu pagrįstame tunelyje, kur vidinis maršrutas ir išorinis kelias skiriasi, ankstesniame patikrinime apskaičiuota aiški vertė yra labiau nuspėjama nei automatinė.

Patikrinkite nauju ryšiu ir palaikykite grįžtamąjį ryšį gyvą

Užmegztas ryšys išlaiko suderėtą MSS, todėl testavimas toje pačioje sesijoje nieko neįrodo. Po pakeitimo atidarykite naują ryšį ir skaitykite suderėtą vertę tiesiogiai, o ne išveskite ją iš perdavimo, kuris atsitiktinai baigiasi.

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

Pirmoji komanda praneša lizdo MSS kartu su jo perkrovos būsena, ir tai yra greičiausias patvirtinimas, kad ribojimas suveikė. Antroji patvirtina, kad taisyklė, kurią manote pridėję, yra egzistuojanti taisyklė, toje lentelėje, kur ji buvo įdėta.

Tada apsaugokite mechanizmą, kurio nesutvarkėte. path-MTU aptikimas priklauso nuo to, ar ICMP fragmentation-needed pranešimai pasiekia siuntėją, todėl ugniasienė, kuri juos meta, ir toliau laužys didelius perdavimus net ir su teisingu ribojimu. Leiskite šiuos pranešimus tunelio keliui arba pripažinkite, kad ribojimas kompensuoja jūsų pasirinktą politiką.

Galiausiai atsispirkite pagundai traktuoti ribojimą kaip derinimo rankenėlę. Jis riboja segmento dydį, o tai kainuoja pralaidumą keliuose, kuriems to niekada neprireikė. Pritaikytas po trijų patikrinimų jis yra tikslingas remontas; pritaikytas pirmiausia jis yra pakeitimas, kuris paslepia pradinį gedimą ir prideda antrą kintamąjį prie kiekvieno vėlesnio testo. Šį mainą verta daryti sąmoningai, o ne pagal nutylėjimą.

Užsirašykite išmatuotą path-MTU, atimtas tunelio sąnaudas, pridėtą taisyklę ir vėliau matytą MSS. Keturi skaičiai paverčia kitą incidentą paieška, o ne tyrimu.

Susiję straipsniai