Ошибка OpenVPN: TUN/TAP device open failed: Permission denied
- Старт OpenVPN в Linux прерывается ошибкой:
ERROR: Cannot open TUN/TAP dev /dev/net/tun: Permission denied (errno=13). - Внутри Docker-контейнера клиент выдает:
Universal TUN/TAP device open failed: No such file or directory. - Невозможность сбросить привилегии демона через
user nobody / group nogroupпосле инициализации адаптера.
1. Проверка прав и создание узла /dev/net/tun в Linux
# Проверка наличия символьного устройства
ls -la /dev/net/tun
# Если устройство отсутствует, создайте узел вручную:
mkdir -p /dev/net
mknod /dev/net/tun c 10 200
chmod 666 /dev/net/tun2. Загрузка модуля ядра tun
# Проверка загрузки драйвера
lsmod | grep tun
# Принудительная загрузка модуля ядра
modprobe tun
echo "tun" >> /etc/modules-load.d/openvpn.conf3. Конфигурация запуска внутри Docker-контейнера
Для создания интерфейсов контейнер должен обладать правами управления сетью ядра. Добавьте флаги при запуске контейнера:
docker run -d \
--cap-add=NET_ADMIN \
--device /dev/net/tun \
--name vpn-client \
my-openvpn-imageИли в docker-compose.yml:
services:
openvpn:
image: dperson/openvpn-client
cap_add:
- NET_ADMIN
devices:
- /dev/net/tun:/dev/net/tun4. Корректный сброс привилегий в server.conf
Директивы сброса прав должны сопровождаться сохранением ключей и интерфейса:
user nobody
group nogroup
persist-key
persist-tun Частые вопросы (FAQ)
Почему нельзя запускать OpenVPN постоянно под root без директив user/group?
Сброс привилегий до непривилегированного пользователя nobody минимизирует риски компрометации хоста в случае обнаружения RCE уязвимостей в сетевом стеке парсинга OpenVPN.
Что делает директива persist-tun?
Она сохраняет открытым файловый дескриптор виртуального интерфейса при перезапусках туннеля (SIGUSR1/SIGHUP), что позволяет демону под пользователем nobody переподключаться без повторного вызова /dev/net/tun.
Как исправить ошибку на VPS с OpenVZ/LXC виртуализацией?
На OpenVZ/LXC доступ к /dev/net/tun должен быть явно включен провайдером на хостовой ноде: vzctl set <CTID> --devnodes net/tun:rw --save.
Как выдать права бинарнику openvpn без sudo?
Установите Linux Capabilities: setcap cap_net_admin+ep /usr/sbin/openvpn.