OpenVPN на VPS: нет устройства /dev/net/tun, которое можно открыть
Конфигурация обычно в порядке: гость просто не видит устройство tun. Отличите виртуальную машину от контейнера с общим ядром, а затем исправьте слой, которому принадлежит ядро.
Первый запуск завершается ошибкой с сообщением об /dev/net/tun или устройстве TUN/TAP, которое не удаётся открыть. Сертификаты ещё не прочитаны, поэтому в профиле виноватых нет. Демон просит у ядра объект, которого у этого гостя нет.
Этот объект — символьное устройство, которое предоставляет модуль tun. Сможете ли вы его создать, зависит от того, кому принадлежит ядро.
Что демон просит у ядра
OpenVPN открывает /dev/net/tun и просит у драйвера интерфейс. Драйвер — это модуль tun, а узел устройства — дескриптор, через который пространство пользователя обращается к нему. Если модуль не загружен, узел может отсутствовать или открытие может не удаться. Ни одно из состояний не исправляется правкой server.conf.
Сначала читайте эту ошибку как вопрос о платформе. Ошибка конфигурации появляется после открытия устройства, а не до него.
Виртуальная машина или гость с общим ядром
На KVM, Xen или другой полноценной виртуальной машине ядро под вашим контролем. Вы можете загружать модули и создавать узел. На OpenVZ, Virtuozzo или в контейнере в стиле LXC гость делит ядро хоста, поэтому root внутри не может загрузить модуль, который хост не загрузил.
Поэтому у одной и той же ошибки два совершенно разных владельца. В первом случае вы можете исправить её изнутри инстанса. Во втором вы просите хост или провайдера что-то открыть.
Прежде чем решать, какой это случай, выполните ls -l /dev/net/tun, lsmod | grep tun и ip -brief link show.
На виртуальной машине загружайте модуль при старте
На виртуальной машине modprobe tun обычно создаёт узел устройства. Убедитесь, что он появился, а затем сделайте загрузку постоянной через конфигурацию модулей дистрибутива, а не полагайтесь на команду, введённую один раз. Узел, исчезающий после перезагрузки, в следующем месяце станет тем же тикетом.
Проверьте также, что в загруженном вами ядре этот модуль вообще есть. Урезанное ядро от вендора может его не содержать.
Если узел есть, но открытие по-прежнему не удаётся, следующие подозреваемые — права доступа и номера major/minor устройства. Это локальные исправления, а не запросы провайдеру.
В контейнере устройство принадлежит хосту
В контейнере устройство и возможность — два отдельных требования. Среда выполнения должна пропустить /dev/net/tun, а контейнеру нужна сетевая возможность, чтобы создать интерфейс. Rootless-среда, которая не даёт ни того, ни другого, будет выдавать ту же ошибку открытия, как бы ни был написан профиль. Многие хосты OpenVZ предлагают переключатель TUN/TAP в панели клиента, и его включение вместе с перезапуском часто и есть всё решение.
Задайте провайдеру два точных вопроса: загружен ли модуль tun на хосте и доступно ли устройство внутри этого инстанса? Расплывчатый тикет получает расплывчатый ответ.
Почему пересборка модуля редко помогает
Сборка модуля внутри гостя редко помогает. Компиляции нужна конфигурация именно работающего ядра, а /proc/config.gz необязателен и часто отсутствует на минимальных образах. Даже работающий модуль нельзя вставить в ядро, которым контейнер не владеет.
Когда устройство появится, перезапустите службу и подтвердите интерфейс, прежде чем проверять трафик. Вид tun0 показывает, что демон открыл устройство. О перенаправлении, правилах фаервола или маршрутах, которые получают клиенты, это пока ничего не говорит.
Это отдельные вопросы с отдельными доказательствами. Отсутствующее устройство — сбой предварительного условия; туннель, который существует, но ничего не несёт, — сбой политики.