Первый запуск завершается ошибкой с сообщением об /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 показывает, что демон открыл устройство. О перенаправлении, правилах фаервола или маршрутах, которые получают клиенты, это пока ничего не говорит.

Это отдельные вопросы с отдельными доказательствами. Отсутствующее устройство — сбой предварительного условия; туннель, который существует, но ничего не несёт, — сбой политики.

Похожие статьи