OpenVPN низька продуктивність. Чи є у мене проблеми з MTU? Звалиться всередині


13

У мене проблеми з тунелем OpenVPN, який не досягає швидкості лінії. Шлюз - це віртуальний сервер Debian Jessy, розміщений в OVH. Клієнт - це мій домашній сервер freebsd 10.2 (Intel I3 Ivy Bridge) або мій RaspberryPI2. Я відключив шифрування та автентифікацію. У мене симметричне FTTH-з'єднання 100 Мбіт / с, але тунель досягає швидкості лише 20-40 Мбіт / с. Пряме підключення (без тунелю) завжди дає очікувані 100 мбіт / с. Я перевірив продуктивність за допомогою iperf3. Я спершу спробував зі своїм домашнім сервером freebsd. Я спробував усі рекомендовані параметри щодо mssfix, фрагменту тощо. Нічого не допомогло.

Тоді я подумав, може, це моя машина freebsd. Тож я встановив свіжий розспіванний Джессі на мій RPI2 і зробив ще кілька в глибинному тестуванні:

Перш за все, я видалив усі налаштування MTU з конфігурацій OpenVPN і дозволив шляху MTU обробляти речі (сподіваємось). Оскільки у мене немає брандмауера на обох машинах, він повинен працювати. Це мої конфігурації vpn:

server 10.8.0.0 255.255.255.0
port 1194
proto udp
dev tun
sndbuf 0
rcvbuf 0

user nobody
group nogroup
persist-key
persist-tun
ifconfig-pool-persist ipp.txt
keepalive 10 120
push "redirect-gateway def1"
status openvpn-status.log
verb 3

ca /etc/openvpn/easy-rsa/keys/ca.crt
cert /etc/openvpn/easy-rsa/keys/vpn.theissen.io.crt
key /etc/openvpn/easy-rsa/keys/vpn.theissen.io.key
dh /etc/openvpn/easy-rsa/keys/dh4096.pem
tls-auth /etc/openvpn/easy-rsa/keys/ta.key 0
cipher none
auth none
comp-lzo no



client
proto udp
dev tun12
remote xxx.io 1194
resolv-retry infinite
sndbuf 0
rcvbuf 0

nobind
user nobody
group nogroup
persist-key
persist-tun
verb 3

pkcs12 /etc/openvpn/vpn.theissen.io/alex.p12
tls-auth /etc/openvpn/vpn.theissen.io/ta.key 1
ns-cert-type server
cipher none
auth none
comp-lzo no

Перш за все тест без тунелю, щоб показати, що з'єднання з сервером дійсно майже 100 Мбіт / с:

iperf3 -c vpn.theissen.io
Connecting to host vpn.theissen.io, port 5201
[  4] local 192.168.1.253 port 34512 connected to 149.202.58.183 port 5201
[ ID] Interval           Transfer     Bandwidth       Retr  Cwnd
[  4]   0.00-1.00   sec  10.8 MBytes  90.5 Mbits/sec    0    335 KBytes       
[  4]   1.00-2.00   sec  11.4 MBytes  95.7 Mbits/sec    0    335 KBytes       
[  4]   2.00-3.00   sec  11.1 MBytes  93.0 Mbits/sec    0    352 KBytes       
[  4]   3.00-4.00   sec  11.2 MBytes  94.0 Mbits/sec    0    369 KBytes       
[  4]   4.00-5.00   sec  11.5 MBytes  95.9 Mbits/sec    0    390 KBytes       
[  4]   5.00-6.00   sec  11.0 MBytes  92.5 Mbits/sec    0    390 KBytes       
[  4]   6.00-7.00   sec  11.4 MBytes  95.2 Mbits/sec    0    390 KBytes       
[  4]   7.00-8.00   sec  11.2 MBytes  94.3 Mbits/sec    0    390 KBytes       
[  4]   8.00-9.00   sec  11.1 MBytes  93.3 Mbits/sec    0    390 KBytes       
[  4]   9.00-10.00  sec  11.3 MBytes  95.1 Mbits/sec    0    390 KBytes       
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bandwidth       Retr
[  4]   0.00-10.00  sec   112 MBytes  93.9 Mbits/sec    0             sender
[  4]   0.00-10.00  sec   112 MBytes  93.5 Mbits/sec                  receiver

iperf Done.

Пакети цього з'єднання я скидав з tcpdump на сервер. Ви можете завантажити їх тут (вам потрібно витягнути, щоб відкрити їх за допомогою дроту ): dumpraw.cap.xz

Ось так виглядає дамп "ОК". Максимальний розмір кадру, який я помітив, - 1514. Звалище iperf3 без тунелю

Тепер я провів випробування над тунелем:

iperf3 -c 10.8.0.1
Connecting to host 10.8.0.1, port 5201
[  4] local 10.8.0.14 port 36388 connected to 10.8.0.1 port 5201
[ ID] Interval           Transfer     Bandwidth       Retr  Cwnd
[  4]   0.00-1.00   sec  5.96 MBytes  50.0 Mbits/sec  127    133 KBytes       
[  4]   1.00-2.00   sec  5.19 MBytes  43.5 Mbits/sec    6    120 KBytes       
[  4]   2.00-3.00   sec  5.80 MBytes  48.7 Mbits/sec    0    151 KBytes       
[  4]   3.00-4.00   sec  4.27 MBytes  35.9 Mbits/sec   23   96.5 KBytes       
[  4]   4.00-5.00   sec  4.89 MBytes  41.0 Mbits/sec    0    129 KBytes       
[  4]   5.00-6.00   sec  6.11 MBytes  51.2 Mbits/sec   26    111 KBytes       
[  4]   6.00-7.00   sec  5.50 MBytes  46.1 Mbits/sec    0    143 KBytes       
[  4]   7.00-8.00   sec  5.25 MBytes  44.1 Mbits/sec   15    126 KBytes       
[  4]   8.00-9.00   sec  5.80 MBytes  48.7 Mbits/sec    0    158 KBytes       
[  4]   9.00-10.00  sec  3.97 MBytes  33.3 Mbits/sec   22    105 KBytes       
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bandwidth       Retr
[  4]   0.00-10.00  sec  52.7 MBytes  44.2 Mbits/sec  219             sender
[  4]   0.00-10.00  sec  52.3 MBytes  43.8 Mbits/sec                  receiver

iperf Done.

Уопс. Не так вже й приємно. Тим більше цей стовпчик "Retr" виглядає не так добре. Я припускав, що це ретрансляція tcp, і тоді має бути щось на смітнику. Ми побачимо, що це не так: /. ЦП тут не є вузьким місцем, оскільки я деактивував шифрування та автентифікацію. CPU становить 20% на сервері та 50% на PI під час тесту.

Ось так виглядає трафік OpenVPN тесту: OpenVPN трафік на фізичному інтерфейсі

Для мене це виглядає нормально. Але я не знаю, що шукати. Будь ласка, подивіться на звалище з проводками : dump_physical.cap.xz

Трафік на інтерфейсі тунелю також мені добре виглядає. Схоже, він правильно зменшив розмір кадру (до 1444, як здається): iperf3 трафік на інтерфейсі тунелю

Ось дамп: dump_tunnel.cap.xz

Для мене це виглядає все добре, але я дійсно не маю уявлення, що саме шукати. Я дійсно все випробував за допомогою налаштувань OpenVPN. Можливо, хтось може мені сказати, якщо трафік виглядає нормально.

Що я очікую як відповідь

Принаймні пояснення того, що тут відбувається, і чому воно, здається, не залежить від програмного забезпечення VPN, яке я використовую. Все, що я знайшов в Інтернеті, стосувався проблем MTU, але це слід легко виправити, зменшивши тунельний MTU або інші параметри OpenVPN. Для мене це мало змінюється. Переглядаючи дамп, ви бачите, що він зменшує розмір сегмента tcp і пакети не фрагментовані. Має бути щось інше. Мені дуже подобається знати, що .

Оновлення

Я тестував це за допомогою сильного швану і навіть з розм'якшувачем. Це насправді та сама проблема (порівнянна швидкість, відсутність вузького процесора). Я дуже спантеличений, у чому тут проблема. Я також спробував інший шлюз (RaspberryPi2 на друзі 100/100 домашнє з'єднання).

Оновлення 2

Я помітив, що iperf3 повідомляє tcp retransmite (retr), але на дамп немає повторень (Wireshark повинен їх виділити). Що відбувається?

Я навіть спробував OpenVPN в моїй локальній мережі (RaspberryPi2 до FreebsdServer). Навіть там у мене є багато ретрансляцій (в локальній мережі ?!):

Connecting to host 192.168.222.11, port 5201
[  4] local 192.168.222.10 port 46196 connected to 192.168.222.11 port 5201
[ ID] Interval           Transfer     Bandwidth       Retr  Cwnd
[  4]   0.00-1.00   sec  9.19 MBytes  77.0 Mbits/sec    8    141 KBytes       
[  4]   1.00-2.00   sec  8.71 MBytes  73.1 Mbits/sec    3    130 KBytes       
[  4]   2.00-3.00   sec  8.59 MBytes  72.0 Mbits/sec    3    120 KBytes       
[  4]   3.00-4.00   sec  8.65 MBytes  72.5 Mbits/sec    4    108 KBytes       
[  4]   4.00-5.00   sec  8.65 MBytes  72.5 Mbits/sec    4   95.6 KBytes       
[  4]   5.00-6.00   sec  8.52 MBytes  71.5 Mbits/sec    2   80.5 KBytes       
[  4]   6.00-7.00   sec  8.83 MBytes  74.1 Mbits/sec    0    141 KBytes       
[  4]   7.00-8.00   sec  8.59 MBytes  72.0 Mbits/sec    7    106 KBytes       
[  4]   8.00-9.00   sec  8.71 MBytes  73.1 Mbits/sec    3   94.2 KBytes       
[  4]   9.00-10.00  sec  8.59 MBytes  72.0 Mbits/sec    3   79.2 KBytes       
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bandwidth       Retr
[  4]   0.00-10.00  sec  87.0 MBytes  73.0 Mbits/sec   37             sender
[  4]   0.00-10.00  sec  86.8 MBytes  72.8 Mbits/sec                  receiver

У зворотному режимі у мене справді дивне вікно заторів (wtf?):

Accepted connection from 192.168.222.10, port 46197
[  5] local 192.168.222.11 port 5201 connected to 192.168.222.10 port 46198
[ ID] Interval           Transfer     Bandwidth       Retr  Cwnd
[  5]   0.00-1.00   sec  8.90 MBytes  74.7 Mbits/sec    3   1.48 GBytes       
[  5]   1.00-2.00   sec  8.45 MBytes  70.9 Mbits/sec    2   1.59 GBytes       
[  5]   2.00-3.00   sec  8.66 MBytes  72.7 Mbits/sec  518    214 MBytes       
[  5]   3.00-4.00   sec  7.96 MBytes  66.8 Mbits/sec   37    703 MBytes       
[  5]   4.00-5.00   sec  8.09 MBytes  67.9 Mbits/sec    0    719 MBytes       
[  5]   5.00-6.00   sec  8.04 MBytes  67.5 Mbits/sec    0    734 MBytes       
[  5]   6.00-7.00   sec  8.07 MBytes  67.7 Mbits/sec    1    703 MBytes       
[  5]   7.00-8.00   sec  8.07 MBytes  67.7 Mbits/sec    1    703 MBytes       
[  5]   8.00-9.00   sec  7.99 MBytes  67.1 Mbits/sec    2    693 MBytes       
[  5]   9.00-10.00  sec  8.06 MBytes  67.6 Mbits/sec    1    693 MBytes       
[  5]  10.00-10.09  sec   684 KBytes  64.5 Mbits/sec    0    695 MBytes       
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bandwidth       Retr
[  5]   0.00-10.09  sec  83.0 MBytes  69.0 Mbits/sec  565             sender
[  5]   0.00-10.09  sec  0.00 Bytes  0.00 bits/sec                  receiver

Оновлення 3

Використання iperf з udp призводить до тимчасового блокування цього порту (вони надсилають мені електронне повідомлення про атаку) та великої втрати пакету:

-----------------------------------------------------------
Server listening on 1194
-----------------------------------------------------------
Accepted connection from 185.22.143.160, port 15906
[  5] local 149.202.58.183 port 1194 connected to 185.22.143.160 port 4355
[ ID] Interval           Transfer     Bandwidth       Jitter    Lost/Total Datagrams
[  5]   0.00-1.00   sec  2.89 MBytes  24.2 Mbits/sec  0.727 ms  1017/1387 (73%)  
iperf3: OUT OF ORDER - incoming packet = 1409 and received packet = 1470 AND SP = 5
iperf3: OUT OF ORDER - incoming packet = 1410 and received packet = 1471 AND SP = 5
iperf3: OUT OF ORDER - incoming packet = 1411 and received packet = 1472 AND SP = 5
iperf3: OUT OF ORDER - incoming packet = 1445 and received packet = 1473 AND SP = 5
iperf3: OUT OF ORDER - incoming packet = 1463 and received packet = 1473 AND SP = 5
[  5]   1.00-2.00   sec  3.29 MBytes  27.6 Mbits/sec  0.716 ms  1110/1526 (73%)  
[  5]   2.00-3.00   sec  3.30 MBytes  27.7 Mbits/sec  0.732 ms  1103/1526 (72%)  
[  5]   3.00-4.00   sec  3.27 MBytes  27.4 Mbits/sec  0.717 ms  1108/1526 (73%)  
[  5]   4.00-5.00   sec  1.56 MBytes  13.1 Mbits/sec  0.837 ms  546/746 (73%)  
[  5]   5.00-6.00   sec  0.00 Bytes  0.00 bits/sec  0.837 ms  0/0 (-nan%)  
[  5]   6.00-7.00   sec  0.00 Bytes  0.00 bits/sec  0.837 ms  0/0 (-nan%)  
[  5]   7.00-8.00   sec  0.00 Bytes  0.00 bits/sec  0.837 ms  0/0 (-nan%)  
[  5]   8.00-9.00   sec  0.00 Bytes  0.00 bits/sec  0.837 ms  0/0 (-nan%)  
[  5]   9.00-10.00  sec  0.00 Bytes  0.00 bits/sec  0.837 ms  0/0 (-nan%)  
[  5]  10.00-10.06  sec  0.00 Bytes  0.00 bits/sec  0.837 ms  0/0 (-nan%)  
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bandwidth       Jitter    Lost/Total Datagrams
[  5]   0.00-10.06  sec   118 MBytes  98.5 Mbits/sec  0.837 ms  4884/6711 (73%)  
[SUM]  0.0-10.1 sec  4884 datagrams received out-of-order

1
Якщо ви ще цього не зробили, я можу, ви можете спробувати: tun-mtu 9000 fragment 0 mssfix 0(параметри потрібно додати в трьох різних рядках)
Diamant

Я вже тестую це. Але я знову перевірив. Що сталося, це те, що він починається з тією ж швидкістю, але потім з'єднання зупиняються. Що до речі завжди відбувається, коли я відключаю фрагментацію пакету OpenVPN. Цей посібник community.openvpn.net/openvpn/wiki/Gigabit_Networks змушує вас думати, що ОС повинна працювати з цим, але очевидно, що це не так.
Олександр Теасен

Ух ти. Я бачу таку саму поведінку на своїх VPN, і у мене є надійний апарат на обох кінцях і повільніше підключення до Інтернету. Я буду розслідувати далі; якщо я знайду щось конкретне, опублікую тут.
Харальд

1
Якщо я переключу тест на UDP (iperf3 -u -b 25m), я отримую повну швидкість як всередині, так і зовні тунелю openvpn. Я підтвердив, що при використанні TCP немає фрагментації - openvpn правильно повідомляє про невеликий MSS, мої пакети tcp всередині тунелю - це 1354 байти, а пакети UDP надходять нефрагментовано. Я бачу те саме явище, що і ви - значення CWND всередині тунелю приблизно наполовину менше, ніж вони знаходяться за межами тунелю, і пропускна здатність також наполовину, але мені не вдається пояснити, чому . Захоплююче.
Харальд

1
Гаразд, вибачте за те, що створили помилкову надію. Намагаючись усунути цілу купу змінних, я встановлюю OpenVPN з тими ж параметрами конфігурації, що працює в моїй локальній локальній мережі. Поза тунелем, 750 Мбіт / с. Всередині тунелю, 117 Мбіт / с. Але - openvpn споживає 100% одного ядра процесора на обох кінцевих точках. Тоді я перемістив домашню кінцеву точку свого інтернет-тунелю на «справжній» сервер і побачив очікувані 25 Мбіт / с через мій тунель. OpenVPN на обох кінцевих точках витрачав близько 20% процесора. Короткий короткий опис - у моєму випадку проблема полягає в тому, що моя кінцева точка тунелю на домашній стороні пов'язана з процесором. Вибачте!
Харальд

Відповіді:


2

Для початку ваш «нормальний» запуск зовнішньої тунелі iperf повинен бути UDP / 1194 як потік, з яким у вас є проблема, а не TCP / 5201. Спробуйте спочатку з -b 100M, але пам’ятайте, що це дозволить створити дейтаграми максимального розміру, що не є репрезентативним для вашого трафіку VPN (розмір дейтаграми має бути випадковим чином). Налаштуйте параметр -l для розміру дейтаграми та перевірте результати. Якщо результати не хороші (я б сказав> втрати на 15 або 20%), ви можете підозрювати перевантажений інтернет-роутер, який скидає ваші (ймовірно, відзначені найкращі зусилля) пакети.

Крім того, може бути цікаво дізнатися, яку ефективність ви отримаєте, якщо переключити тунель VPN або на порт UDP класу EF (я б сказав, 5061 через RTP, але не дуже впевнений, що всі інтернет-маршрутизатори правильно налаштували QoS) або будь-який TCP-порт.

Для мене немає нічого поганого у ваших налаштуваннях, і ваша діагностика не показує нічого дивного. Також спробуйте іншу версію OpenVPN або іншого програмного забезпечення VPN.


Зробив це. Подивіться на оновлення3. Чекаючи, коли ов розблокує порт, щоб провести подальші тести.
Олександр Теасен

Aww, вибачте, не бачив останнього оновлення. Під час очікування OVH спробуйте встановити VPN через TCP; які результати? Також про вашу другу редагування та повторну передачу з * BSD на PI; Ви грали з серверними буферами iperf? Це 8 кб за замовчуванням, не знаю, як створено стек на ARM та Linux, але я збільшую це може допомогти.
30gd4n

Я мав на увазі, що я додав це після того, як ти мені сказав :). Результати над tcp гірші. Tcp 443 не має значення. Найцікавіше, що коли я використовую цей github.com/sivel/speedtest-cli для тестування, він повідомляє про 95 м вниз та 75 м вище. Я більше довіряю iperf, але це дійсно залежить від типу трафіку, так здається. Playstation4 також займає більше часу для завантаження ігор або патчів над тунелем. Коли я буду вдома, я буду робити тунель безпосередньо між двома Rbps, які знаходяться в різних місцях, але використовую той самий isp. Я робив це раніше і результати, де майже однакові. Але я намагаюся робити подальші тести.
Олександр Теасен
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.