MSS ограничување на VPN порта: што поправа и што не
Ограничувањето го препишува MSS во TCP ракувањата за сегментите да се сместат во тунелот. Никогаш не поправа UDP или расипана path-MTU проверка. Три проверки, по ред.
Малите барања работат, големите преземања се заглавуваат, и некој предлага ограничување на MSS. Тој предлог е доволно често точен за да вреди да се проба по правилен редослед, и доволно често неточен за да потрошите попладне ако го примените слепо. Трите проверки подолу разликуваат вистински проблем со големината на TCP од проблем со UDP, од расипано откривање на path-MTU и од ограничување што никогаш не го гледа ракувањето што треба да го препише.
Започнете со формата на дефектот
Дефектот со големината има потпис: врската се воспоставува, автентикацијата и малите одговори успеваат, а потоа преносот застанува на неодредено време штом му треба сегмент со полна големина. Страниците што вчитуваат текст, но никогаш не завршуваат слика, се истиот дефект во помал размер. Ако воопшто ништо не се поврзува, проблемот е порано на патеката и ограничувањето нема да помогне. Ограничувањето не може да го поправи ракувањето што никогаш не пристигнало.
Потписот постои затоа што ракувањето е местото каде што се договара големината на сегментот. Секоја страна објавува максимална големина на сегмент како TCP опција, а испраќачите го почитуваат објавувањето на другата страна. Ако патеката не може да носи толку голем сегмент, дефектот се појавува подоцна, кога испраќачот конечно ќе проба еден.
Држете го транспортот на видик додека го читате тој симптом. Ограничувањето е препишување на TCP опција, така што гласовен или видео повик што се заглавува под истиот тунел не е MSS проблем и нема да се подобри од тоа. Запишете го транспортот пред да допрете TCP опција.
Оценете ја патеката, потоа споредете ја со тунелот
Два броја се важни и често се мешаат. path-MTU е најголемиот пакет што патеката го пренесува без фрагментација, а објавениот MSS за IPv4 е таа вредност минус 40 бајти IP и TCP заглавија, или минус 60 за IPv6. Тунелската инкапсулација троши дел од буџетот уште пред внатрешниот пакет воопшто да започне.
ping -M do -s 1400 198.51.100.20
tracepath 198.51.100.20
Ping со do-not-fragment битот ви кажува дали пакет со таа големина на полезно оптоварување преживува; менувајте ја големината додека не пропадне и емпириски ја најдовте границата на патеката. Излезот на tracepath го известува MTU откриен по маршрутата, што е побрзо кога работи и помалку сигурно кога меѓускок ги филтрира сондите.
Сега одземете ги трошоците на тунелот. Надворешно IP заглавие, UDP заглавие и заглавие специфично за тунелот сите излегуваат од истите 1500 бајти, така што употребливиот внатрешен MTU на типична Ethernet основа е помал отколку што наведува физичката врска. Ако пресметаниот внатрешен MTU е под она што го објавуваат вашите партнери, најдовте вистински кандидат за ограничување, а не претпоставка. Ако пресметаната вредност е веќе над објавувањето на партнерите, застанете тука и барајте на друго место.
Поставете го ограничувањето каде што минува ракувањето
Ограничувањето работи со препишување на MSS опцијата во SYN и SYN-ACK пакетите додека ја преминуваат портата. Ако правилото стои на интерфејс што ниту една насока никогаш не го поминува, преговорот завршува непроменет и симптомот останува, затоа поставеноста одлучува за исходот повеќе од вредноста.
| 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 форма за тунелски интерфејс е mangle правило што одговара на SYN пакети:
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 што го видовте потоа. Четири броја го прават следниот инцидент пребарување наместо истрага.