OpenVPN во Docker не може да го отвори /dev/net/tun: што недостасува
TUN јазолот и мрежната способност се две одделни дозволи. Отворете ги двете, потоа прочитајте ја следната грешка под нејзините сопствени услови наместо да ја повторувате истата поправка.
Контејнерските слики можат да ги носат сите потребни OpenVPN бинарни и конфигурациски датотеки и сепак да не успеат на првиот мрежен повик. Грешката го именува /dev/net/tun бидејќи апликацијата побарала од јадрото TUN интерфејс, а контејнерот немал ни јазол на уред, ни способност да создаде еден. Тоа се две одделни дозволи, а поправката на едната ја остава другата точно таму каде што била.
Нивното разделување бара по една команда за секоја. Пораката за грешка потоа ви кажува на која граница всушност сте стоеле.
Јазолот на уредот и способноста се две врати
Јазолот на уредот е објект на датотечниот систем, па контејнерот мора да го види во сопствениот простор од имиња за монтирање. Способноста е дозвола, па процесот бара CAP_NET_ADMIN во просторот од имиња каде што ќе се создаде интерфејсот. Предавањето на уредот без способноста ви дава јазол што се отвора и ioctl што не успева. Давањето на способноста без уредот ја остава апликацијата неспособна да отвори било што, поради што двете обично се појавуваат заедно во примерите.
Поставката devices на Docker го мапира уредот на домаќинот во контејнерот, додека cap_add го прилагодува множеството способности. Bind mount на истата патека ја става датотеката во видокругот без да примени семантика за пристап до уредот.
Репродуцирајте го надвор од Compose датотеката
Пред да ја уредите услугата, проверете дали домаќинот го има уредот и дали гол контејнер може да создаде интерфејс. Командата подолу е намерно минимална, а нејзината единствена цел е да го оддели проблемот на домаќинот од проблемот на compose. Ако не успее, никаква промена во compose нема да помогне.
ls -l /dev/net/tun
docker run --rm --cap-add NET_ADMIN --device /dev/net/tun:/dev/net/tun alpine sh -c 'apk add -q iproute2 && ip tuntap add dev tun9 mode tun && ip link show tun9'
Недостаток на јазол на домаќинот значи дека модулот tun не е достапен, што е поправка од страната на домаќинот, а не на контејнерот. Јазол што постои но не може да се отвори во контејнерот укажува на пристап до уредот, а пораката ќе каже permission denied наместо no such file. Редоследот на овие две грешки е целата дијагноза. Запишете која ја видовте пред да промените знаменце.
Грешките по TUN се различни проблеми
Штом интерфејсот се појави, следната грешка има друг сопственик. Грешките при автентикација значат дека тунелот стигнал до серверот и акредитивите биле одбиени, па промените на способностите нема да помогнат. Тунел што се воспоставува додека апликациите продолжуваат да не успеваат укажува на рути, препраќање, DNS резолуција внатре во контејнерот или сопствениот мрежен распоред на контејнерот. Секоја од нив е обично мрежно прашање на кое дозволата за TUN не може да одговори. Повторувањето на првичниот тест по секоја промена спречува грешките да се слеат во еден впечаток.
Копирањето на секоја поставка од работен пример е начинот на кој минималната поправка станува нечитлива дефиниција на услуга. Префрлете ги само оние што и се потребни на оваа распоредување и запишете зошто е секоја таму.
Проверете го интерфејсот внатре во контејнерот
Проверете го интерфејсот и множеството способности од внатрешноста на контејнерот што работи, а не од домаќинот. Командите подолу го покажуваат јазолот на уредот, списокот на способности и дали воопшто може да се создаде интерфејс. Извршете ги во истиот контејнер што го извршува клиентот, и инсталирајте ги алатките ако сликата е минимална.
ls -l /dev/net/tun
capsh --print | grep -i net_admin
ip link add dev tun9 type tun && ip link show tun9
Способност присутна во bounding set но отсутна од effective set се однесува поинаку од онаа што никогаш не била доделена, и capsh ги покажува двете. Ако јазолот постои и способноста е таму додека создавањето продолжува да не успева, околината за извршување наметнува нешто друго, како seccomp профил или AppArmor политика што ја ограничува операцијата. Тоа е трета граница, документирана од околината за извршување, а не од апликацијата.
Запишете ги знаменцата на контејнерот, сликата и точната грешка од секој обид. Следниот човек што ќе ја прочита таа белешка ќе може да каже која врата била затворена без да ја повторува целата истрага.