Чаму VPN завісае на вялікіх перадачах, але не на малых
Малыя запыты атрымліваюць адказ, а вялікія перадачы завісаюць. Параўнайце мяжу інтэрфейса, мяжу шляху і абвешчаную нагрузку TCP, перш чым капіраваць фіксаваны MTU.
Старонка загружаецца, ping праходзіць, а капіраванне файла застае ў адным і тым жа месцы кожны раз. Гэтая заканамернасць паказвае на памер пакета, а не на прапускную здольнасць ці ўліковыя даныя. Інкапсуляцыя дадае байты да кожнага пакета, таму карысная нагрузка, якая змяшчалася на зыходным шляху, можа перавысіць мяжу пасля перадачы праз тунель. У гэтых размовах тры розныя лікі называюць MTU, і іх блытаніна вядзе да налады, якая выпраўляе адну праграму і ламае іншую.
Тры лікі, якія людзі называюць MTU
MTU інтэрфейса — гэта наладжаная мяжа для пакета на гэтым канале. MTU шляху — найменшая мяжа ўздоўж маршруту, яна выяўляецца, а не наладжваецца. TCP MSS — гэта памер карыснай нагрузкі, якую партнёр абвяшчае як здольную прыняць, і ён вытворны ад двух іншых, а не асобная фізічная мяжа.
Тунель мае ўнутраны і знешні выгляд. Знешні пакет нясе інкапсуляваны пакет плюс тыя загалоўкі, якія патрэбны пратаколу, таму даступны ўнутраны памер меншы за тое, што дазваляе знешні шлях. Шлях да сервера VPN таксама адрозніваецца ад шляху сервера да пункта прызначэння.
Выяўленне MTU шляху дазваляе адпраўніку даведацца працоўны памер, але залежыць ад таго, ці прыйдзе зваротная сувязь. Калі прамежкавая прылада фільтруе адпаведныя паведамленні ICMP, адпраўнік працягвае перадаваць пакеты, якія ніколі не завяршаюцца, і гэта класічная чорная дзірка. Сімптом адметны, калі яго ведаеш: рукапоціск праходзіць, першая поўная нагрузка знікае, а злучэнне ўрэшце скідваецца або завісае. Нішто ў журнале праграмы не выглядае як праблема сеткі.
Праверце шлях нагрузкай, якой вы кіруеце
Проба — гэта доказ пра адзін маршрут і адзін памер, а не рэкамендаваная налада. Выкарыстайце хост, які адказвае, і змяняйце толькі памер нагрузкі.
ping -M do -s 1372 -c 2 203.0.113.20 ping -4 -f -l 1372 vpn.example
Першая каманда адпраўляе пробу Linux з адключанай фрагментацыяй і нагрузкай 1372 байты, а другая робіць тое ж у Windows, дзе нагрузка задаецца праз -l. Адказ азначае, што гэты памер прайшоў шлях. Паведамленне пра неабходнасць фрагментацыі інфарматыўнае, а тайм-аўт двухсэнсоўны, бо хост або прамежкавая прылада могуць проста адкінуць ICMP.
Зніжайце памер некалькімі крокамі, а не бінарным пошукам да байта. Вы высвятляеце, ці існуе столак памеру, а не публікуеце лік для кожнай сеткі. Лік, які вы знойдзеце, дзейнічае для гэтага шляху, гэтага пратаколу і гэтага сямейства адрасоў.
IPv4 і IPv6 фрагментуюцца па-рознаму, таму вынік пробы аднаго сямейства нічога не кажа пра другое. Праверце тое сямейства, якое праграма фактычна выкарыстоўвае.
Абмежаванне MSS дапамагае толькі TCP
У TCP эфектыўная нагрузка ўзгадняецца падчас рукапоціску, і маршрутызатар на шляху можа перапісаць гэта значэнне ўніз, каб абодва канцы адпраўлялі драбнейшыя сегменты. Менавіта гэта робіць абмежаванне MSS, і яно працуе, не кранаючы кліент зусім.
iptables -t mangle -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu ip link show tun0
Першае правіла абмяжоўвае абвешчаны MSS да MTU шляху для перададзеных TCP рукапоціскаў, а другое паказвае ўласны MTU інтэрфейса тунеля, каб параўнаць яго з тым, што дазваляе шлях. Абмежаванне — найменш інвазіўнае выпраўленне для TCP-праграмы, якая завісае пасля рукапоціску.
Для UDP яно не робіць нічога. Кліент голасу ці гульні, які адпраўляе вялікія дэйтаграмы, цалкам праігнаруе наладу MSS, бо тут няма рукапоціску, які можна перапісаць. Калі збойная праграма працуе праз UDP, глядзіце замест гэтага на ўласныя опцыі памеру пакета ў кліенце. Два пратаколы збайваюць па-рознаму і рамантуюцца рознымі сродкамі, таму пратакол належыць у першы сказ заяўкі.
OpenVPN прапануе опцыі tun-mtu, mssfix і налады, звязаныя з фрагментацыяй, і іх паводзіны залежаць ад версіі і ад таго, ці канал даных AEAD. Чытайце дапаможнік для версіі, якая выкарыстоўваецца, і змяняйце па адной опцыі за раз.
Змяніце адну падтрымліваную наладу і паўтарыце абодва запускі
Захавайце зыходны профіль, змяніце адно падтрымліванае значэнне і паўтарыце і малы запыт, які працаваў, і вялікую перадачу, якая збайла. Калі змяняецца толькі вялікая, вы гналіся за памерам. Калі змяняюцца абедзве, нешта іншае зрушылася разам з ёй.
Меншае значэнне можа паменшыць сімптом, дадаючы накладныя выдаткі, таму найменшы магчымы лік не з'яўляецца мэтай. Мэта — памер, які шлях надзейна нясе з найменшымі стратамі. Запішыце значэнне, шлях і версію кліента ў заяўку, бо той жа лік, ужыты ў іншым месцы, — здагадка.
Калі той жа профіль працуе з іншай даверанай сеткі, пакіньце гэтую розніцу ў дыягназе, а не абвяшчайце кліент выпраўленым. Зменная, якая змянілася, — гэта шлях, і менавіта шлях вымерала проба.