Чому OpenVPN гальмує?

Час від часу, мені зустрічаються теми на форумах, в яких люди з'єднують кілька офісів з використанням OpenVPN і одержують низьку швидкість, сильно нижче швидкості каналу. У когось це може бути 20 Мбіт/з при каналі в 100 Мбіт/с з обох сторін, а хто-то ледве отримує і 400 Кбіт/с на 2 Мбіт/с ADSL/3G і високим пінгом. Найчастіше, таким людям радять збільшити MTU на VPN-інтерфейсі до надзвичайно великих значень, начебто 48000, або ж погратися з параметром mssfix. Частково це допомагає, але швидкість всередині VPN все ще дуже далека від канальної. Іноді все звалюють на те, що OpenVPN — userspace-рішення, і це його нормальна швидкість, з огляду на всякі шифрування і HMAC'в. Абсурд!

Трохи історіїНа дворі липень 2004 року. Типова швидкість домашнього інтернету в розвинених країнах становить 256 Кбіт/с-1 Мбіт/с, у менш розвинених — 56 Кбіт/с. Ядро Linux 2.6.7 вийшло не так давно, а 2.6.8, в якому TCP Window Scale включений за замовчуванням, вийде тільки через місяць. Проект OpenVPN розвивається вже 3 роки як, до релізу готується версія 2.0.
Один з розробників додає код, який встановлює буфер прийому і відправки сокета за замовчуванням в 64 КБ, ймовірно, щоб хоч якось уніфікувати розмір буфера між платформами і не залежати від системних налаштувань. Проте, в Windows щось поламали, і зазначення розміру буферів у сокета призводить до дивних проблем з MTU на всіх адаптерах в системі. Зрештою, в реліз OpenVPN 2.0-beta8 потрапляє наступний код:
#ifndef WIN32
o->rcvbuf = 65536;
o->sndbuf = 65536;
#endif


Трохи технічної інформаціїЯкщо ви користувалися OpenVPN, ви знаєте, що він може працювати як через UDP і TCP. Якщо TCP-сокеті встановити якесь маленьке значення буфера, в нашому випадку-64 КБ, то алгоритм налаштування TCP-вікна просто не зможе вийти за це значення.
Що ж це значить? Припустимо, ви підключаєтеся до сервера в США з Росії через OpenVPN зі стандартними значеннями буферів сокета. У вас широкий канал, скажімо, 50 Мбіт/с, але в силу відстані, пінг становить 100 мс. Як ви думаєте, якої максимальної швидкості ви зможете домогтися? 5.12 Мбіт/с. Вам потрібен буфер розміром як мінімум 640 КБ, щоб завантажити ваш 50 Мбитный канал.
OpenVPN через UDP буде працювати трохи швидше із-за власної реалізації пересилання пакетів, але теж далеко не ідеально.

Що робити?Як ви могли вже здогадатися, даний розмір буфера все ще застосовується в останньому релізі OpenVPN. Як виправити ситуацію? Найбільш коректний варіант — заборонити OpenVPN змінювати розмір буферів у сокета.
Потрібно додати наступні рядки як сервера, так і в клієнтський конфігураційні файли:
sndbuf 0
rcvbuf 0

Якщо ж з якоїсь причини немає можливості поміняти конфігураційні файли клієнта, слід віддавати досить великі розміри буферів з сервера:
sndbuf 0
rcvbuf 0
push "sndbuf 393216"
push "rcvbuf 393216"


Але у мене Windows!Якщо у вас і OpenVPN-сервер працює на Windows-машині, і всі клієнти підключаються тільки під Windows, то вітаю — вам нічого міняти не потрібно, у вас і так все має працювати швидко.

Уповільнений баг на багтрекері OpenVPN

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.