Կոնտեյների պատկերները կարող են կրել իրենց անհրաժեշտ բոլոր OpenVPN երկուական և կոնֆիգուրացիոն ֆայլերը և այնուամենայնիվ ձախողվել առաջին ցանցային կանչի ժամանակ։ Սխալը նշում է /dev/net/tun-ը, որովհետև հավելվածը միջուկից TUN ինտերֆեյս խնդրեց, իսկ կոնտեյները չուներ ոչ սարքի հանգույց, ոչ էլ այն ստեղծելու ունակություն։ Դրանք երկու առանձին թույլտվություններ են, և մեկը շտկելը մյուսը թողնում է ճիշտ այնտեղ, որտեղ էր։

Դրանք առանձնացնելու համար յուրաքանչյուրի համար մեկ հրաման է պետք։ Հաջորդ սխալի հաղորդագրությունը ձեզ ասում է, թե իրականում որ սահմանին էիք կանգնած։

Սարքի հանգույցը և ունակությունը երկու դուռ են

Սարքի հանգույցը ֆայլային համակարգի օբյեկտ է, ուստի կոնտեյները պետք է այն տեսնի իր սեփական մոնտաժի անվանատարածքում։ Ունակությունը թույլտվություն է, ուստի գործընթացին անհրաժեշտ է 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 մոդուլը հասանելի չէ, ինչը հյուրընկալողի կողմի ուղղում է, ոչ թե կոնտեյների։ Գոյություն ունեցող, բայց կոնտեյների ներսում չբացվող հանգույցը մատնանշում է սարքի հասանելիությանը, և հաղորդագրությունը կասի 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 քաղաքականություն, որը սահմանափակում է գործողությունը։ Դա երրորդ սահմանն է, որը փաստաթղթավորում է գործարկման միջավայրը, ոչ թե հավելվածը։

Գրեք կոնտեյների դրոշակները, պատկերը և յուրաքանչյուր փորձի ճշգրիտ սխալը։ Հաջորդ մարդը, ով կկարդա այդ նշումը, կկարողանա ասել, թե որ դուռն էր փակ, առանց ամբողջ հետաքննությունը կրկնելու։

Առնչվող հոդվածներ