Представьте: всё работало как часы, а после банальной перезагрузки оборудования контейнер с VPN-клиентом Gluetun отказывается стартовать, выдавая зловещее ERROR checking TUN device
. Знакомо? На Synology NAS с DSM6 это классическая история – модуль ядра tun «забывает» загрузиться автоматически. Давайте разберёмся, как вернуть всё на круги своя и предотвратить повторение проблемы.
Почему /dev/net/tun исчезает после перезагрузки
В Docker-контейнерах доступ к сетевым устройствам вроде TUN/TAP требует двух условий:
- Физическое присутствие файла устройства
/dev/net/tun
(да, это специальный файл, а не обычный каталог) - Загруженный модуль ядра
tun.ko
– именно он отвечает за эмуляцию сетевых туннелей
На DSM7 это настраивается автоматически, но в DSM6 (который всё ещё используется на старых устройствах Synology) модуль не сохраняется между перезагрузками. Причём ручное создание через mknod
– лишь половина дела. Без загруженного модуля устройство остаётся «пустышкой», о чём и кричит ошибка
open /dev/net/tun: no such device
Пошаговая настройка TUN для Docker на Synology
Шаг 1: Очистка артефактов
Сначала удалите ранее созданные вручную файлы – они могут мешать:
rm -rf /dev/net
(Не переживайте: после перезагрузки система всё равно «затрёт» эти изменения, так что сейчас важно начать с чистого листа).
Шаг 2: Принудительная загрузка модуля
Выполните команду, которая активирует TUN-модуль:
insmod /lib/modules/tun.ko
Проверьте успешность:
lsmod | grep tun
# Вывод должен содержать строку с "tun"
Шаг 3: Автоматизация навсегда
Чтобы модуль загружался при каждой перезагрузке NAS, создайте скрипт в папке автозапуска:
vi /usr/local/etc/rc.d/tun.sh
Вставьте в него:
#!/bin/sh
case "$1" in
start)
insmod /lib/modules/tun.ko
;;
stop)
rmmod tun
;;
esac
exit 0
Сохраните файл и дайте ему права на выполнение:
chmod +x /usr/local/etc/rc.d/tun.sh
Совет: Если вы не уверены в работе с vi, используйте nano через SSH – он проще для новичков (но предварительно установите его через Entware).
Проверка работы
После перезагрузки NAS выполните:
docker-compose up -d gluetun
Если всё сделано верно, контейнер запустится без ошибок. Для перестраховки загляните в логи:
docker logs gluetun
Ищите строки типа VPN gateway IP:
– это признак успешного подключения.
Кстати, а почему не сработал флаг privileged: true
? Всё просто: он даёт доступ ко всем устройствам, но не загружает отсутствующие модули ядра. Вот такой нюанс Docker-безопасности!
Если проблема осталась
- Убедитесь, что скрипт
tun.sh
имеет права 755 (выполнитьls -l /usr/local/etc/rc.d/
) - Проверьте, нет ли опечаток в регионе сервера (
SERVER_REGIONS="Netherlands"
) – иногда провайдеры VPN меняют названия локаций - Обновите образ Gluetun:
docker-compose pull
И помните: DSM6 уже считается устаревшим – если есть возможность, планируйте переход на DSM7 (но предварительно проверьте список поддерживаемого оборудования Synology).