Абмежаванне 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 з бітам «не фрагментаваць» паведамляе, ці выжыве пакет такога памеру карыснай нагрузкі; змяняйце памер, пакуль ён не праваліцца, і вы эмпірычна знойдзеце мяжу шляху. Вывад 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, які ўбачылі пасля. Чатыры лікі робяць наступны інцыдэнт пошукам, а не расследаваннем.