VPN шлюзіндегі MSS шектеуі: нені түзетеді және нені түзетпейді
Шектеу TCP қол алысуларында MSS-ті қайта жазады, сонда сегменттер туннельге сыяды. Ол ешқашан UDP-ні немесе бұзылған path-MTU тексерісін түзетпейді. Үш тексеріс, ретімен.
Кішкентай сұраныстар жұмыс істейді, үлкен жүктеулер тұрып қалады, біреу MSS шектеуін ұсынады. Бұл ұсыныс дұрыс ретпен сынап көруге тұрарлықтай жиі дұрыс және соқыр қолдансаңыз жарты күнді жоғалтатындай жиі қате. Төмендегі үш тексеріс нақты TCP өлшемі мәселесін UDP мәселесінен, бұзылған path-MTU анықтаудан және қайта жазуға тиіс қол алысуды ешқашан көрмейтін шектеуден ажыратады.
Сәтсіздіктің пішінінен бастаңыз
Өлшем сәтсіздігінің қолтаңбасы бар: қосылым орнайды, аутентификация мен кішкентай жауаптар сәтті болады, содан кейін толық өлшемді сегмент қажет болғанда тасымалдау белгісіз уақытқа тоқтайды. Мәтінді жүктейтін, бірақ суретті ешқашан бітірмейтін беттер — сол сәтсіздіктің кішірек масштабы. Егер мүлдем ештеңе қосылмаса, мәселе жолдың ертерек бөлігінде және шектеу көмектеспейді. Шектеу ешқашан келмеген қол алысуды түзете алмайды.
Бұл қолтаңба сегмент өлшемі дәл қол алысуда келісілетіндіктен бар. Әр тарап максималды сегмент өлшемін TCP опциясы ретінде жариялайды, ал жіберушілер қарсы тараптың жариялауын құрметтейді. Егер жол соншалықты үлкен сегментті тасымалдай алмаса, сәтсіздік кейінірек, жіберуші ақыры біреуін байқап көргенде пайда болады.
Осы симптомды оқығанда тасымалдауды назардан шығармаңыз. Шектеу TCP опциясын қайта жазу болып табылады, сондықтан сол туннель астында тоқтаған дауыс немесе бейне қоңырау MSS мәселесі емес және одан жақсармайды. TCP опциясына қол тигізбес бұрын тасымалдауды жазып алыңыз.
Жолды бағалаңыз, содан кейін туннельмен салыстырыңыз
Екі сан маңызды және олар жиі шатастырылады. path-MTU — жолдың фрагментациясыз тасымалдайтын ең үлкен пакеті, ал IPv4 үшін жарияланған MSS — IP және TCP тақырыптарының 40 байтын шегерген сол мән, немесе IPv6 үшін 60-ты шегерген мән. Туннель инкапсуляциясы ішкі пакет басталмай тұрып-ақ бюджеттің бір бөлігін жұмсайды.
ping -M do -s 1400 198.51.100.20
tracepath 198.51.100.20
do-not-fragment битімен ping осы жүктеме мөлшеріндегі пакеттің аман қалатынын айтады; өлшемді ол сәтсіз болғанша өзгертіңіз де, жол шегін эмпирикалық түрде таптыңыз. tracepath шығысы маршрут бойымен анықталған MTU-ды хабарлайды, бұл жұмыс істегенде жылдамырақ, ал аралық хоп зондтарды сүзгенде сенімділігі төмен.
Енді туннель шығынын шегеріңіз. Сыртқы IP тақырыбы, UDP тақырыбы және туннельге тән тақырып — барлығы сол 1500 байттан шығады, сондықтан қарапайым Ethernet негізінде пайдалануға болатын ішкі MTU физикалық байланыс ұсынғаннан төмен. Есептелген ішкі MTU серіктестеріңіз жариялағаннан төмен болса, сіз болжам емес, нақты шектеу кандидатын таптыңыз. Есептелген мән серіктестер жариялауынан жоғары болса, осында тоқтап, басқа жерден іздеңіз.
Шектеуді қол алысу өтетін жерге қойыңыз
Шектеу шлюзден өткен кезде SYN және SYN-ACK пакеттеріндегі MSS опциясын қайта жазу арқылы жұмыс істейді. Егер ереже екі бағыттың ешқайсысы ешқашан кесіп өтпейтін интерфейсте тұрса, келіссөз өзгеріссіз аяқталады және симптом сақталады, сондықтан нәтижені мәннен гөрі орналасу шешеді.
| Symptom | What it points to | Next check |
|---|---|---|
| Handshake completes, large transfer stalls | Segment size larger than the path can carry | Path MTU against the tunnel's effective MTU |
| Nothing connects, small or large | Routing, firewall or keying failure | Not MSS; look at the tunnel state |
| Only UDP applications stall | Datagram size or a dropped ICMP error | Platform-specific UDP handling, not clamping |
| Fixed after reconnect, returns later | Clamp applied to one direction or one interface | Rule placement and the handshake path |
Бағыт — екінші жартысы. Бір бағытты шектеу ағындардың жартысын түзетеді және қалғанын үзіліп тұрғандай көрінетін түрде сәтсіз етеді, сондықтан оны жіберілетін трафиктің екі бағытына да қолданыңыз. Туннель интерфейсі үшін классикалық Linux пішіні — SYN пакеттеріне сәйкес келетін mangle ережесі:
iptables -t mangle -A FORWARD -o tun0 -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
--clamp-mss-to-pmtu шын мәнінде не істейтініне назар аударыңыз: ол мәнді маршруттың MTU-ынан алады, бұл әрдайым туннельдің нақты жүктеме бюджеті емес. Ішкі маршрут пен сыртқы жол ерекшеленетін маршрутқа негізделген туннельде алдыңғы тексерісте есептелген айқын мән автоматты мәннен гөрі болжамдырақ.
Жаңа қосылыммен тексеріңіз және кері байланысты тірі ұстаңыз
Орнатылған қосылым келісілген MSS-ті сақтайды, сондықтан сол сессияда тестілеу ештеңені дәлелдемейді. Өзгерістен кейін жаңа қосылым ашып, келісілген мәнді тікелей оқыңыз, кездейсоқ аяқталатын тасымалдаудан болжаудың орнына.
ss -tin dst 198.51.100.20
iptables -t mangle -S | grep TCPMSS
Бірінші команда сокеттің MSS-ін оның кептеліс күйімен бірге хабарлайды, бұл шектеудің әсер еткенін ең жылдам растау. Екіншісі қосқан деп ойлаған ереженің шынымен бар ереже екенін, ол қойылған кестеде растайды.
Содан кейін түзетпеген механизмді қорғаңыз. path-MTU анықтауы ICMP fragmentation-needed хабарламаларының жіберушіге жетуіне тәуелді, сондықтан оларды тастайтын файрвол дұрыс шектеу болса да үлкен тасымалдауларды бұза береді. Бұл хабарламаларға туннель жолы үшін рұқсат беріңіз немесе шектеу өзіңіз таңдаған саясатты өтейтінін қабылдаңыз.
Соңында шектеуді реттеу тұтқасы ретінде қарауға қарсы тұрыңыз. Ол сегмент өлшемін шектейді, бұл оған ешқашан мұқтаж болмаған жолдарда өткізу қабілетін жұмсайды. Үш тексерістен кейін қолданылса, бұл мақсатты жөндеу; бірінші қолданылса, бұл бастапқы ақауды жасыратын және әр кейінгі тестке екінші айнымалыны қосатын өзгеріс. Бұл айырбасты әдейі жасаған жөн, әдепкі бойынша емес.
Өлшеген path-MTU-ды, шегерген туннель шығынын, қосқан ережені және кейін көрген MSS-ті жазып алыңыз. Төрт сан келесі оқиғаны тергеудің орнына іздеуге айналдырады.