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'

Потоа потврдете дека сметката на услугата може да го отвори. Краток тест под таа сметка одвојува проблем со сопствеништво од проблем со услуга. На крајот стартувајте го клиентот и потврдете дека се појавува тунелски интерфејс; само тој трет чекор го докажува целиот пат, бидејќи првите два може да поминат додека профилот или способноста на клиентот сѐ уште се погрешни.

Запишете го примерокот, ознаката на уредбата, изворот на домаќинот, патеката во гостинот и сметката-сопственик кога промената е одобрена. Тие пет вредности се она што подоцнежното пресоздавање, миграција или промена на профил мора да го зачуваат, и многу полесно се споредуваат од грешка за дозвола без контекст.

Поврзани статии