Траблшутинг низкой скорости OpenVPN: параметры sndbuf, rcvbuf и txqueuelen
- Скорость передачи данных внутри туннеля OpenVPN не превышает 20–30 Мбит/с на гигабитном интернет-канале.
- Аномальный рост задержек при передаче объемных файлов (Bufferbloat).
- Предупреждения в логах сервера/клиента:
TUN/TAP TX queue is fullилиSocket buffer overflow. - Высокая утилизация одного потока CPU из-за устаревших алгоритмов сжатия (LZO/LZ4) или шифра CBC.
1. Анализ узких мест производительности OpenVPN
OpenVPN работает в пространстве пользователя (User Space) через виртуальный интерфейс /dev/net/tun. По умолчанию старые версии используют неоптимальные фиксированные буферы сокетов ОС (64 КБ), что при высоком RTT (задержке сети) жестко ограничивает пропускную способность согласно формуле BDP (Bandwidth-Delay Product).
2. Тонкая настройка конфигурации сервера OpenVPN (/etc/openvpn/server.conf)
# Переход на скоростной протокол UDP
proto udp4
port 1194
dev tun0
# 1. Отключение ручного ограничения буферов (передача управления ядру Linux)
sndbuf 0
rcvbuf 0
push "sndbuf 0"
push "rcvbuf 0"
# 2. Использование современного быстрого шифра AES-GCM (аппаратный AES-NI)
cipher AES-128-GCM
ncp-ciphers AES-128-GCM:AES-256-GCM
# 3. Полное отключение сжатия (защита от атак VORACLE и снижение нагрузки CPU)
compress
push "compress"
# 4. Оптимизация MTU туннеля
tun-mtu 1500
mssfix 1420
# 5. Многопоточный режим аутентификации
fast-io3. Тюнинг сетевого стека хоста Linux
Добавьте параметры в /etc/sysctl.d/99-openvpn-speed.conf:
# Увеличение лимитов автотюнинга TCP/UDP буферов
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.core.rmem_default = 1048576
net.core.wmem_default = 1048576
# Алгоритм BBR
net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbrsysctl --system4. Оптимизация очереди драйвера TUN
# Увеличение длины очереди tun адаптера до 2000 пакетов
ip link set dev tun0 txqueuelen 20005. Тестирование пропускной способности утилитой iperf3
# На стороне сервера OpenVPN:
iperf3 -s
# На стороне клиента внутри туннеля:
iperf3 -c 10.8.0.1 -P 4 -t 30 Частые вопросы (FAQ)
Почему параметры 'sndbuf 0' и 'rcvbuf 0' увеличивают скорость?
Значение '0' указывает OpenVPN не переопределять системные настройки сокетов фиксированными значениями, позволяя ядру Linux динамически увеличивать буфер TCP/UDP (автотюнинг) до максимума rmem_max.
Почему OpenVPN на TCP работает намного медленнее, чем на UDP?
Инкапсуляция TCP внутри TCP приводит к проблеме 'TCP Meltdown': при малейшей потере пакета оба уровня (внешний и внутренний) одновременно запускают повторную передачу и механизмы контроля перегрузки, вызывая коллапс скорости.
Что делает директива fast-io?
Она оптимизирует операции записи в сокет UDP на стороне сервера, уменьшая количество системных вызовов ядра, но работает только при работе по протоколу UDP без режима TAP.
Помогает ли DCO (Data Channel Offload) в OpenVPN 2.6+?
Да, OpenVPN DCO (драйвер ovpn-dco) переносит обработку шифрования полезной нагрузки прямо в ядро Linux, устраняя переключения контекста и поднимая скорость в 2–4 раза.