Linux CLI · интеграция · Qeli 0.8.1

Внешний TUN через dev_attach

Режим для Keenetic OpkgTun и других контроллеров, которые сами создают интерфейс, назначают адрес, устанавливают маршруты и управляют его жизненным циклом.

Главное правило

Qeli передаёт пакеты, внешний контроллер владеет интерфейсом

С dev_attach=true Linux-клиент открывает уже существующий именованный TUN/TAP и подключает его к зашифрованному каналу. Обычная автоматическая настройка L3 и маршрутов в этом режиме не запускается.

ОперацияQeliВнешний владелец
Создать и удалить интерфейс
MTU, link up, адрес и префикс
Маршруты, full/split policy, NAT/firewall
Шифрование и передача пакетов
Сообщить выданный сервером IPv4Читает файл
Qeli не исправит незавершённую настройку владельца. Подключение может быть успешно, но трафика не будет, пока внешний менеджер не назначит адрес/префикс и не установит нужные маршруты.
client.conf

Минимальная конфигурация Linux-клиента

/etc/qeli/client.conf · [qeli]
dev = ext0
device_type = tun
dev_attach = true
gateway = false
dns = off

dev должен точно совпасть с именем созданного интерфейса; device_type — с его типом TUN/TAP. dns=off рекомендуется, если внешний менеджер владеет также DNS-политикой.

пример подготовки владельцем до запуска Qeli
sudo ip tuntap add dev ext0 mode tun user qeli
sudo ip link set dev ext0 mtu 1200 up
Не путайте с QELI_PLATFORM_TUN_FD. dev_attach — пользовательский режим Linux CLI для существующего интерфейса по имени. Platform TUN FD — внутренний контракт transport-core с мобильными/платформенными адаптерами и не является ключом client.conf.
Порядок запуска

Интерфейс должен существовать раньше клиента Qeli

#ИсполнительДействие
1Внешний владелецСоздаёт ext0, задаёт тип и MTU, поднимает link
2QeliПодключается к серверу и открывает существующий интерфейс через TUNSETIFF
3QeliПосле аутентификации атомарно записывает выданный IPv4 в QELI_TUNIP_FILE
4Внешний владелецЧитает IP, применяет известный ему префикс, маршруты и firewall
5Внешний владелецПосле остановки Qeli сам удаляет интерфейс и свою сетевую политику
Интерфейса ещё нет? Клиент сообщает, что ждёт владельца, и reconnect-loop повторяет попытку. Поэтому systemd-зависимости всё равно полезны, но краткая гонка запуска не требует ручного рестарта.

Qeli заимствует file descriptor: при штатной остановке он закрывает его, но не удаляет интерфейс, адреса или маршруты внешнего владельца.

QELI_TUNIP_FILE

Передача назначенного адреса контроллеру

Путь задаётся переменной окружения процесса Qeli, а не ключом INI. После AUTH файл содержит только IPv4-адрес без длины префикса. Префикс внешний контроллер должен знать из согласованной серверной конфигурации.

systemd · Environment
Environment=QELI_TUNIP_FILE=/run/qeli/ext0.ip
логика внешнего hook после появления файла
TUN_IP=$(cat /run/qeli/ext0.ip)
TUN_PREFIX=24  # должно совпадать с префиксом tunnel pool на сервере
sudo ip addr replace "$TUN_IP/$TUN_PREFIX" dev ext0
Не копируйте /24 вслепую. Это только пример переменной владельца. QELI_TUNIP_FILE не содержит маску, поэтому контроллер обязан получить фактический префикс из своей конфигурации.
Keenetic · OpkgTun

Штатный сценарий интеграции в релизе

На Keenetic интерфейс создаёт ndm, init-скрипт запускает Qeli и экспортирует путь к файлу адреса, а hook wan.d применяет L3 и маршруты. Конфигурация клиента остаётся split-tunnel, потому что политикой управляет роутер.

release/keenetic/opkgtun/client.conf.example
dev = opkgtun0
dev_attach = true
gateway = false
dns = off
release/keenetic/opkgtun/S99qeli
export QELI_TUNIP_FILE="$OPKGTUN_TUNIP"
По симптому

Частые ошибки dev_attach

СимптомЧто проверить
«interface … does not exist yet»Порядок запуска и точное имя dev; reconnect повторит attach
Permission denied на /dev/net/tunПользователя, CAP_NET_ADMIN и права устройства
Attach завершается ошибкойТип TUN/TAP, совместимость владельца и multi-queue/занятый интерфейс
could not write tun IPКаталог существует и доступен процессу Qeli, путь не read-only
Подключено, но трафика нетАдрес с правильным префиксом, link up, маршруты, forwarding и firewall владельца
Qeli меняет DNSУстановить dns=off, если DNS должен контролироваться извне
ip -details link show dev ext0тип, состояние и MTU интерфейса
ip address show dev ext0адрес и фактический префикс
ip route showмаршруты, созданные внешним владельцем
journalctl -u qeli-client -bожидайте Attached …; L3 left to its owner
Граница доверия

Владелец TUN видит пакеты до шифрования

Внешний менеджер контролирует интерфейс и имеет доступ к необработанным IP-пакетам до их передачи в Qeli. Запускайте его с минимальными правами и защищайте файл назначенного адреса. Qeli использует CLOEXEC-дубликаты, чтобы не передавать TUN descriptor дочерним hooks, но это не ограничивает самого владельца интерфейса.

Первоисточники

Код и готовая интеграция v0.8.1