Контејнер LXD не може да отвори /dev/net/tun? Проверите унос unix-char
LXD мора да пренесе TUN уређај домаћина у контејнер пре него што VPN клијент може да га користи. Погледајте шта unix-char додаје, шта не и како то проверити.
LXD излаже знаковни уређај домаћина контејнеру додавањем чвора уређаја, а не учећи госта да га створи. Ако контејнер нема /dev/net/tun, уређај може бити на домаћину, а гост га ипак не може отворити. Унос unix-char је управљачка половина тог пута и намерно је ужи од привилегованог контејнера. Зато чвор домаћина и чвор контејнера заслужују одвојене провере.
Механизам је довољно кратак да остане на видику: LXD разрешава путању на домаћину, ствара одговарајући чвор унутар инстанце и додаје уређај у cgroup уређаја контејнера. Затим гостов процес треба сопствену дозволу и способност да чвор употреби за било шта.
Шта унос unix-char заправо мења
Уређај unix-char каже LXD-у да изложи један знаковни уређај домаћина на изабраној путањи унутар контејнера. Унос има три важна дела: ознаку уређаја коју користи управљач, путању source на домаћину и path који гост види. Само последња два описују сам уређај. Грешка у куцању у било ком од њих ствара чвор на месту које клијент никада не отвара.
На домаћину је уређај обично /dev/net/tun. Унутар контејнера можете задржати исту путању или изабрати другу, али путања мора да се поклапа са оним што VPN клијент очекује. Задржавање /dev/net/tun избегава други проблем са конфигурацијом, јер већина клијената отвара ту путању без питања.
Управљач примењује унос када се инстанца покрене или када се уређај вруће прикључи. Не копира драјвер у госта и не ствара интерфејс тунела. Чини чвор видљивим и дозвољава приступ кроз контролну групу уређаја контејнера.
Декларишите уређај на инстанци, а не унутар госта
Додајте унос из административног контекста LXD, именујући инстанцу и ознаку коју ћете касније препознати. За контејнер назван vpnbox наредба је:
lxc config device add vpnbox tun unix-char source=/dev/net/tun path=/dev/net/tun
lxc config device show vpnbox
Ознака tun локална је за конфигурацију инстанце. Није назив интерфејса и не мора да се поклапа ни са чим у госту. Ако профил већ пружа исти уређај, додавање другог уноса ствара сукоб, а не вишак, зато прво прегледајте ефективну конфигурацију.
Уређивање датотека унутар контејнера је погрешан слој. mknod у стартној скрипти може изгледати да ради на привилегованом контејнеру, а затим нестати при поновном стварању или не успети на мање привилегованом. Скупом уређаја инстанце управља управљач; нека поседује и чвор.
Ускладите власништво и режим са гостовим процесом
Унос unix-char може да постави uid, gid и mode за чвор унутар контејнера. Користите их да одговарају налогу који покреће VPN клијент, уместо да уређај отворите свим корисницима или пребаците контејнер у привилеговани режим.
Видљивост није исто што и дозвола. Чвор у власништву root-а са режимом 600 видљив је услузи која ради као непривилеговани корисник и ипак га она не може отворити. Прво проверите гостов налог, затим поставите власништво на тај налог и држите режим не ширим него што клијент захтева.
Процес такође треба способност конфигурисања интерфејса тунела, обично CAP_NET_ADMIN у мрежном простору имена контејнера. Пренос уређаја не даје ту способност, а давање способности не обезбеђује уређај; то су независни захтеви.
Знајте шта унос не даје
Видљив чвор није VPN који ради. Пакет клијента се још мора инсталирати, профил још мора бити важећи и услуга још мора да се покрене. Аутентификација, руте и DNS остају посао клијента, а неуспех тамо није доказ да је унос уређаја погрешан.
systemd може да дода још једно ограничење. Јединица са DeviceAllow или очврснутом политиком уређаја може да одбије приступ чвору који је обезбедио управљач контејнера. Проверите политику уређаја јединице када чвор постоји, али услуга пријављује грешку дозволе, и промените ту политику уместо да проширите контејнер.
Вруће прикључивање је опционо и експлицитно. Унос са required=false захтева изворну путању и може да се појави или нестане како се уређај домаћина мења. Такав животни циклус одговара хардверу који долази и одлази; за TUN уређај који VPN тражи при подизању, опциони унос може да пусти услугу да се покрене пре него што њен предуслов постоји.
Проверите видљивост, отварање и интерфејс тим редом
Прво потврдите чвор унутар предвиђеног контејнера. Путања, главни и споредни број и власништво треба да се поклапају са уређајем домаћина и уносом који сте додали. Чвор који недостаје значи да управљач није применио унос или га је применио на другу инстанцу.
lxc exec vpnbox -- ls -l /dev/net/tun
lxc exec vpnbox -- sh -c 'test -c /dev/net/tun && echo char-device-ok'
Затим потврдите да налог услуге може да га отвори. Кратак тест под тим налогом одваја проблем власништва од проблема услуге. На крају покрените клијент и потврдите да се појави интерфејс тунела; само тај трећи корак доказује цео пут, јер прва два могу проћи док су профил или способност клијента још погрешни.
Забележите инстанцу, ознаку уређаја, извор на домаћину, путању у госту и налог власника када промена буде одобрена. Тих пет вредности су оно што касније поновно стварање, миграција или промена профила мора да сачува, и много их је лакше упоредити од грешке дозволе без контекста.