Перанос фіксаванага 1,500-байтавага ўнутранага пакета праз VPN
Фіксаваны 1,500-байтавы ўнутраны пакет не змесціцца ў 1,500-байтавы знешні шлях. Вымерайце накладныя выдаткі, затым выберыце большы MTU базавай сеткі або падтрыманую фрагментацыю.
У вас ёсць патрабаванне, якое нельга пагнуць: далёкі бок павінен атрымаць той самы 1,500-байтавы IP-пакет, які адпраўляе адпраўшчык, разам з загалоўкамі. Тунель не можа змясціць гэты пакет разам са сваёй структурай унутры другога 1,500-байтавага IP-пакета, таму нешта ў праекце павінна саступіць. Парадак ніжэй — той, які я выкарыстоўваю ў акне зменаў: запісаць бюджэт байтаў, даказаць, што базавая сетка рэальна можа пранесці, затым выбраць роўна адзін механізм пераносу і пацвердзіць унутраны пакет на далёкім баку.
Запішыце бюджэт байтаў перад рэдагаваннем профілю
Інкапсуляцыя дадае байты на некалькіх узроўнях, і агульная колькасць — гэта ўласцівасць вашага профілю, а не канстанта, якую можна знайсці ў даведніку. Сямейства адрасоў, выбар шыфра, пратакол транспарту і любая опцыя сціскання або фарміравання змяняюць лік, таму адніманне, скапіяванае з іншага разгортвання, нічога не варта як бюджэт. Пачніце з унутранага патрабавання, дадайце вымераныя накладныя выдаткі на пакет вашай канфігурацыі і запішыце атрыманы знешні памер у заяўку на змену да таго, як хто-небудзь адрэдагуе файл.
Праект вызначаюць два лікі: найбольшы знешні пакет, які шлях праносіць без фрагментацыі, і дадатковыя байты, патрэбныя вашай інкапсуляцыі. Калі першы меншы за другі плюс 1,500, адзін з іх павінен змяніцца. Тады выбар вузкі, а не творчы, таму я запісваю абодва лікі перад абмеркаваннем варыянтаў. Нішто на ўзроўні тунеля не сціскае гэтыя байты, і ні адзін лік MTU не прыбірае дадзенае вам патрабаванне.
Праверце базавую сетку ping-амі з забаронай фрагментацыі
Вымярайце шлях, а не давярайце MTU інтэрфейса, бо найменшае звяно на знешнім шляху — галоўнае. У Linux -M do усталёўвае біт забароны фрагментацыі, а -s прымае карысную нагрузку ICMP, таму кадр на 1,500 байтаў адказвае пры 1,472 байтах нагрузкі пасля аднімання 20-байтавага загалоўка IP і 8-байтавага загалоўка ICMP. Павялічвайце нагрузку, пакуль праверка не праваліцца, затым пяройдзіце да джамба-памеру, каб убачыць, ці шлях наогул яго праносіць.
ping -M do -s 1472 -c 2 198.51.100.10 ping -M do -s 8972 -c 2 198.51.100.10 tracepath -n 198.51.100.10
Шлях, які праходзіць 1,472 і правальваецца на 8,972, не можа пранесці 1,500-байтавы ўнутраны пакет з накладнымі выдаткамі ў адным знешнім пакеце. Гэта адказ, патрэбны вам да адкрыцця канфігурацыі VPN. Ён таксама вызначае, які з двух наступных раздзелаў да вас адносіцца, таму трымайце два вынікі праверкі побач з заяўкай. Здагадка тут каштуе акна абслугоўвання, бо тунель, які паведамляе, што ён працуе, нічога не кажа пра найбольшы пакет, які шлях прыме.
Павялічвайце MTU шляху толькі там, дзе згодны кожны хоп
Джамба-кадры — гэта ўласцівасць ад канца да канца, а не налада, якую вы ўключаеце на двух канцавых пунктах, якімі выпадкова кіруеце. Кожны камутатар, маршрутызатар і пункт перадачы правайдэра на знешнім шляху павінны пагадзіцца на большы памер, і адно-адзінае звяно на 1,500 байтаў моўчкі адкіне пакет, які вы толькі што павялічылі. Падняцце толькі лакальнага інтэрфейса — класічная палавінчатая змена, ад якой тунель выглядае зламаным, пакуль базавая сетка ціха губляе пакеты.
ip link set dev eth1 mtu 9000 ip link show dev eth1 ping -M do -s 8972 -c 2 198.51.100.10
Змяніце інтэрфейс, потым паўторна праверце той жа шлях, перш чым мяняць што-небудзь яшчэ. Калі праверка ўсё яшчэ правальваецца, адкаціце камандай ip link set dev eth1 mtu 1500 і пераходзьце да фрагментацыі, а не спрачайцеся з правайдэрам пра звяно, якім вы не валодаеце.
Выкарыстоўвайце фрагментацыю тунеля, калі базавая сетка не можа вырасці
Падтрыманы механізм фрагментацыі ніжэй за ўнутраны пакет дазваляе некалькім знешнім пакетам несці адзін унутраны пакет, і далёкі канец тунеля збірае іх зноў, перш чым перадаць арыгінал вышэй. Опцыя фрагментацыі UDP у Community OpenVPN — адно з рэалізацый гэтай ідэі, і гэта не тое ж самае, што звычайная IP-фрагментацыя знешняга пакета. Абодва бакі павінны запускаць версію, якая падтрымлівае фармат, і шлях даных павінен быць тым, пра які вы думаеце: кліенты OpenVPN 3 і паскораныя ў ядры каналы даных маюць розныя абмежаванні, таму профіль, які працуе на адным кліенце, можа не працаваць на іншым.
openvpn --config client.ovpn --tun-mtu 1500 --fragment 1400 --verb 4
Звычайная знешняя фрагментацыя — другі варыянт, і ён слабейшы. Маршрутызатары IPv6 наогул не фрагментуюць перададзены пакет, таму занадта вялікі знешні пакет проста гіне, і адпраўшчык даведваецца пра гэта, толькі калі адпаведнае паведамленне ICMPv6 выжыве на шляху. Фрагменты таксама запрашаюць фільтраванне і ўзмацненне страт, таму я разглядаю гэта як запасны варыянт, а не як план.
Знешні носьбіт на аснове патоку абыходзіць пытанне памеру, сегментуючы ўласны байтавы паток, і адноўлены ўнутраны пакет можа заставацца 1,500 байтаў. Гэта рашэнне аб транспарце з уласным коштам, уключаючы вядомыя паводзіны TCP унутры TCP, таму рабіце гэта свядома, а не як пабочны эфект спрэчкі пра MTU.
Пацвердзіце, што ўнутраны пакет прыходзіць нязменным
Праверка — гэта не паспяховы рукапацісканне. Захапіце трафік на інтэрфейсе тунеля з абодвух бакоў і параўнайце памер і змест пакета, які рэальна адправіла праграма, з тым, што атрымаў далёкі бок.
ip link show dev tun0 ping -M do -s 1472 -c 2 10.8.0.1 tcpdump -ni tun0 -c 5 'icmp and greater 1000'
Калі захоп паказвае поўнапамерны ўнутраны пакет на далёкім баку, выбар пераносу працуе, і застаецца толькі яго запісаць. Калі ён не паказвае нічога, пакуль тунель паведамляе, што працуе, знешні пакет адкідваецца недзе паміж канцавымі пунктамі, і гэта вяртае вас да праверкі, а не да налад шыфра.
Запішыце ў заяўку тры рэчы, перш чым яе закрыць: вымераны знешні бюджэт, выбраны механізм і каманду, якая даказала, што ўнутраны пакет выжыў. Наступнаму чалавеку, які дакранецца да гэтага тунеля, спатрэбяцца ўсе тры, і ні адзін з іх не аднавіць з аднаго файла канфігурацыі.