openvpn: Cannot open TUN/TAP dev /dev/net/tun
Туннель создаётся через специальное устройство. Отказ его открыть означает одно из трёх: модуль ядра не загружен, устройства нет в окружении контейнера, или доступ к устройствам обрезан параметрами изоляции самой службы. Разбор быстрый, потому что проверки независимы.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Модуль ядра не загружен
Без модуля устройства туннеля не существует. На минимальных сборках и в виртуальных машинах он может отсутствовать.
-
Устройства нет в контейнере
Контейнеры не получают устройства хоста по умолчанию. Служба видит отсутствие файла устройства.
-
Доступ к устройствам обрезан изоляцией службы
Параметры ограничения устройств и приватного каталога устройств прячут файл устройства от процессов службы.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Есть ли файл устройства туннеля.
test -c /dev/net/tun && echo устройство есть || echo устройства нетСообщения службы о попытке открыть устройство.
journalctl -u "openvpn*" -n 30 --no-pagerНе обрезан ли доступ к устройствам изоляцией.
systemctl show "openvpn*" -p PrivateDevices -p DeviceAllow 2>/dev/nullРешение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- Без модуля устройства туннеля не существует. На минимальных сборках и в виртуальных машинах он может отсутствовать.
- Как проверить
-
Посмотрите модуль и устройство.
lsmod | grep -w tun; test -c /dev/net/tun && echo устройство есть || echo устройства нет
- Как исправить
-
Загрузите модуль и закрепите загрузку при старте системы через каталог загрузки модулей.
sudo modprobe tun && echo tun | sudo tee /etc/modules-load.d/tun.conf
- Почему происходит
- Контейнеры не получают устройства хоста по умолчанию. Служба видит отсутствие файла устройства.
- Как проверить
-
Определите окружение и наличие устройства.
systemd-detect-virt --container; ls -l /dev/net/ 2>/dev/null
- Как исправить
- Пробросьте устройство туннеля в контейнер и выдайте нужную возможность работы с сетью. Без этого туннель внутри контейнера не поднять.
- Почему происходит
- Параметры ограничения устройств и приватного каталога устройств прячут файл устройства от процессов службы.
- Как проверить
-
Посмотрите параметры изоляции.
systemctl show openvpn-server@server -p PrivateDevices -p DeviceAllow -p CapabilityBoundingSet 2>/dev/null
- Как исправить
-
Разрешите устройство туннеля в списке устройств службы и отключите приватный каталог устройств для неё.
[Service] PrivateDevices=no DeviceAllow=/dev/net/tun rw
Пример вывода
Модуль ядра не загружен. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
openvpn[4700]: ERROR: Cannot open TUN/TAP dev /dev/net/tun: No such file or directory (errno=2)
openvpn[4700]: Exiting due to fatal error
systemd[1]: openvpn-server@server.service: Main process exited, code=exited, status=1/FAILURE
Связанные ошибки
- No such file or directory в журнале службы Служба не находит файл или каталог. Разбор: путь, момент запуска, изоляция unit-файла, символические ссылки, приватный /tmp.
- status=226/NAMESPACE в systemd Код 226/NAMESPACE: не удалось настроить пространства имён монтирования, UTS или IPC. Частая причина — путь в ReadOnlyPaths= или ProtectHome=.
- WireGuard: туннель поднят, но обмена нет Интерфейс есть, рукопожатие не проходит: неверные ключи, недоступный порт, несовпадение разрешённых адресов.
- Protocol not supported при создании сокета Ошибка 93: семейство или протокол не поддержаны. Разбор для IPv6, ограничений изоляции и контейнеров.
- status=225/NETWORK в systemd Код 225/NETWORK: не удалось создать сетевое пространство имён для службы при PrivateNetwork=yes или NetworkNamespacePath=.
- status=232/ADDRESS_FAMILIES в systemd Код 232/ADDRESS_FAMILIES: не удалось применить ограничение семейств адресов из RestrictAddressFamilies=.
- Служба IPsec запускается, а туннели не поднимаются Процесс работает, соединений нет: закрыты служебные порты, не совпадают параметры или нет прав на ключи.
- Туннель поднимается, но перестаёт работать через несколько минут Соединение через преобразование адресов рвётся при простое: без периодических пакетов запись в таблице узла исчезает.
Источники
- Руководство OpenVPN
-
systemd.exec(5)
Параметры доступа к устройствам: DeviceAllow= и PrivateDevices=. -
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Воспроизведено выгрузкой модуля туннеля и приватным каталогом устройств.