Контейнер бейнелері қажетті барлық OpenVPN бинарлық және конфигурациялық файлдарын алып жүре алады және бәрібір бірінші желілік шақыруда сәтсіздікке ұшырайды. Қате /dev/net/tun атын атайды, өйткені қолданба ядродан TUN интерфейсін сұрады, ал контейнерде құрылғы түйіні де, оны жасау мүмкіндігі де болмады. Бұл екі бөлек рұқсат, ал біреуін түзету екіншісін дәл қалған жерінде қалдырады.

Оларды бөлу үшін әрқайсысына бір команда керек. Келесі қате хабарламасы сізге шын мәнінде қай шекарада тұрғаныңызды айтады.

Құрылғы түйіні мен мүмкіндік — екі есік

Құрылғы түйіні — файлдық жүйенің нысаны, сондықтан контейнер оны өзінің mount аттар кеңістігінде көруі керек. Мүмкіндік — рұқсат, сондықтан процеске интерфейс жасалатын аттар кеңістігінде CAP_NET_ADMIN қажет. Құрылғыны мүмкіндіксіз беру сізге ашылатын түйін мен сәтсіздікке ұшырайтын ioctl береді. Мүмкіндікті құрылғысыз беру қолданбаны ештеңе аша алмайтын күйде қалдырады, сондықтан мысалдарда екеуі әдетте бірге көрінеді.

Docker-дің devices параметрі хост құрылғысын контейнерге салып көрсетеді, ал 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 модулінің қолжетімсіздігін білдіреді, бұл контейнердің емес, хост жағының түзетуі. Түйін бар болса да контейнер ішінде ашылмаса, ол құрылғыға қатынасты көрсетеді, ал хабарлама no such file емес, permission denied дейді. Осы екі сәтсіздіктің реті — бүкіл диагноз. Кез келген флагты өзгертудің алдында қайсысын көргеніңізді жазып қойыңыз.

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 саясаты. Бұл қолданба емес, орындау ортасы құжаттайтын үшінші шекара.

Контейнер флагтарын, бейнені және әр әрекеттің нақты қатесін жазып қойыңыз. Ол жазбаны келесі оқыған адам бүкіл тергеуді қайталамай-ақ қай есік жабық болғанын айта алады.

Қатысты мақалалар