Вкладені тунелі VPN: чому внутрішній застрягає на великих пакетах
Кожен тунель витрачає частину бюджету пакетів шляху, перш ніж почнеться наступний. Складіть заголовки, і внутрішній сеанс зривається на великих пакетах.
DNS розпізнається, сеанс SSH тримається, а потім велике завантаження завмирає, хоча ping до того самого хоста все ще відповідає. Цей поділ указує на розмір пакета, а не на зламаний тунель. Вкладені тунелі доходять до цього за розмірів, яких жоден тунель окремо не досяг би. Внутрішній сеанс у порядку; йому просто передають пакети, які більше не вміщаються.
Куди насправді зникає MTU шляху
Кожна інкапсуляція витрачає байти, перш ніж наступний рівень отримає свою чергу. Шлях Ethernet пропонує зовнішньому пакету 1500 байтів, а зовнішній тунель забирає свою частку, перш ніж щось усередині може бути адресоване. Одне вгадане значення накладних витрат буде хибним рівно на ту величину, яка має значення.
Перелічіть рівні по порядку: шлях доступу, зовнішній транспорт, зовнішній тунель, внутрішній транспорт, внутрішній тунель, застосунок. Рахуйте кожен заголовок один раз, а UDP тримайте окремо від власного заголовка та мітки тунелю.
Два рівні WireGuard, пораховані один раз
Візьміть шлях доступу IPv4 з одним тунелем WireGuard усередині іншого. Зовнішній рівень коштує 20 байтів IPv4, 8 UDP і 32 для заголовка даних WireGuard разом з його міткою автентифікації. Усередині цього внутрішньому тунелю потрібен власний 20-байтовий заголовок IPv4 і 8-байтовий заголовок UDP перед його другими 32 байтами накладних витрат WireGuard. Те, що залишається, вміщає заголовок IPv4, заголовок TCP і дані. Зовнішній шлях IPv6 коштує 40 замість 20 і залишає 1320.
| Layer | Bytes |
|---|---|
| Path MTU | 1500 |
| Outer IPv4 header | 20 |
| Outer UDP header | 8 |
| Outer WireGuard header and tag | 32 |
| Inner transport IPv4 header | 20 |
| Inner UDP header | 8 |
| Inner WireGuard header and tag | 32 |
| Innermost IPv4 header | 20 |
| TCP header | 20 |
| Payload that fits | 1340 |
Арифметика сходиться на 1340 байтах. Один рівень за тими самими правилами залишає 1400 для корисного навантаження TCP, тобто 1500 мінус 20, 8, 32, 20 і 20, а різниця в 60 байтів — це саме та внутрішня інкапсуляція, яку додає другий тунель.
Застосуйте 1400 до вкладеного шляху, і внутрішньому тунелю забракне 60 байтів, непомітно, доки пакет не стане достатньо великим, щоб вони знадобилися. Доповнення та власна опція фрагментації протоколу знову зсувають цифри, тож довіряйте таблиці.
MTU, MSS і фрагментація діють у різних місцях
MTU інтерфейсу обмежує те, що інтерфейс відправить, а стискання MSS у TCP змінює те, що партнер TCP готовий надіслати. Стискання виправляє сеанси TCP і нічого не робить для великої дейтаграми UDP, тому виправлення виглядає успішним для одного застосунку й тихо промахується повз наступний. Власна опція фрагментації протоколу — третій важіль із власними збоями. MTU інтерфейсу — звичний перший крок і найгрубіший.
Мостові та маршрутизовані тунелі несуть різні кадри, тому цифри з іншого розгортання рідко переносяться. Виявлення MTU шляху, описане в RFC 8201, допомагає лише доки повідомлення ICMP, від яких воно залежить, пропускаються.
Знайти рівень, якому бракує
Перевірте кожен тунель окремо, перш ніж вкладати їх, якщо вимоги дозволяють порівняння. Зонд фіксованого розміру це вирішує: ping -M do -s 1472 -c 3 10.8.0.1 надсилає повний пакет IPv4 на 1500 байтів усередині цього рівня. Додайте другий рівень і повторіть той самий зонд, щоб кожен збій належав відомій зміні.
Коли передавання застрягає, змінюйте один задокументований параметр за раз і записуйте розмір, на якому воно зривається. Перевірте й зворотний шлях, бо вкладена рекурсія маршрутів може досить точно імітувати проблему розміру пакета, щоб коштувати цілого дня. Відфільтрована відповідь ICMP може приховати справжню межу, тож зонд важливіший за міркування.
Запишіть бюджет там, де його знайде наступна людина
Таблиця з одним рядком на рівень переживає правило великого пальця. Тримайте її поруч зі схемою тунелю, щоб ніхто не перераховував арифметику під тиском.
Більше тунелів означає більше залежностей, тож план відкату заслуговує на місце поруч із бюджетом. Якщо цифри досі не сходяться, виміряйте шлях, а не вгадуйте знову. Мета — число, яке ви можете захистити, а не запам'ятати.