VPN konteynerində NET_ADMIN: nəyi və harada dəyişə bilər
Bu imkan bir şəbəkə ad məkanı daxilində interfeys, marşrut və firewall dəyişikliklərinə icazə verir. Host şəbəkəsi ilə həmin ad məkanı hostun öz yığınıdır.
NET_ADMIN Linux imkanıdır ki, prosesə şəbəkə idarəetməsi aparmağa imkan verir və konteynerdə bu, prosesin işlədiyi hansı şəbəkə ad məkanında olursa olsun, məhz orada baş verir. Bu, soket açmaq üçün lisenziya deyil və cihazın ya marşrutun əvəzi deyil. Maraqlı sual heç vaxt imkanın verilib-verilməməsi deyil, dəyişikliyin hansı ad məkanına çatmasıdır.
İmkan nəyi əhatə edir
Öz ad məkanı daxilində NET_ADMIN daşıyan proses interfeysləri qaldırıb endirə, ünvanlar təyin edə, marşrutlar əlavə edib silə və firewall qaydaları yaza bilər ki, bu, capabilities(7)-nin bu imkan altında topladığı əməliyyatlar qrupudur. O, həmçinin nüvənin trafiki necə növbəyə qoyub filtrlədiyini idarə edən interfeys səviyyəli parametrləri tənzimləyə bilər. VPN klienti adətən başlanğıcda bunlardan bir neçəsini istəyir və sonra başqa heç nə istəmir. Buna görə əksər image-lər istifadə etdiklərindən daha geniş əhatə tələb edir.
Həmin ad məkanından kənar əməliyyatlar əhatə olunmur və qonşu imtiyazlar ayrıdır. Xam paketləri oxumaq və yazmaq NET_RAW-yə aiddir və tun cihazı yaratmaq həm imkanı, həm də cihaz qovşağına girişi tələb edir. Cihazı olmayan proses şəbəkə problemi kimi görünən, amma olmayan icazə xətası alır.
Təsir radiusunu ad məkanı müəyyən edir
Öz körpü şəbəkəsində olan konteyner öz loopback-inə, öz interfeyslərinə və öz marşrut cədvəlinə çatır. Orada NET_ADMIN vermək VPN klientinə hostun marşrut qərarlarına toxunmadan tunel qurmağa imkan verir ki, bu da əksər konteyner image-lərinin fərz etdiyi quruluşdur.
Həmin konteyneri host şəbəkəsinə keçirin və eyni icazə indi hostun marşrutlarını və hostun firewall-unu redaktə edir, çünki ayrı ad məkanı qalmayıb. Bir tuneli idarə etməli olan klient sonra bütün maşının trafikini yönləndirə bilər və onun sökmə skriptindəki səhv hostda heç kimin yazmadığı qaydalar qoyub gedir. İmkanın özündə heç nə dəyişmədi; kontekst dəyişdi. Buna görə eyni compose faylı iki hostda fərqli davranır.
Bir yerə birləşdirilən üç ilkin şərt
VPN konteynerlərində başlanğıc uğursuzluqları adətən üç ayrı şeydən birinə aiddir: imkan, tunel cihazı və protokol üçün nüvə dəstəyi. Üçünü birdən vermək işləyir və növbəti uğursuzluğu da aid edilə bilməz edir. Minimal compose fraqmenti imkanı verir və cihaz qovşağını açıq şəkildə ötürür:
services:
vpn:
image: example/vpn-client:latest
cap_add:
- NET_ADMIN
devices:
- /dev/net/tun
sysctls:
- net.ipv4.conf.all.src_valid_mark=1Image-in hansı sysctl-lərə ehtiyacı olduğu üçün onun öz sənədlərini oxuyun, çünki konteynerdəki sysctl əlavə imtiyaz və ya host səviyyəli parametr tələb edə bilər. Image yalnız istifadəçi məkanı rejimini dəstəklədiyi yerlərdə cihaz ümumiyyətlə lazım deyil və imkanlar siyahısı buna uyğun kiçilir.
Geniş rejimi deyil, dar əməliyyatı verin
İmtiyazlı rejim hər imkanı təhvil verir və eyni zamanda cihaz girişini genişləndirir, beləliklə üç ilkin şərtdən hansının çatışmadığını gizlədir. O, həmçinin konteynerin uğursuzluq rejimlərini host dəyişikliklərindən ayırd edilə bilməz edir. Yazmaq daha uzun olsa da, açıq siyahıya üstünlük verin.
Köksüz və istifadəçi ad məkanı yerləşdirmələri imkanın praktikada nə demək olduğunu dəyişir, çünki proses onu yalnız xəritələnmiş ad məkanı daxilində saxlaya bilər. İmkanlar siyahısını köklü nümunədən köksüz işləmə mühitinə köçürüb eyni əhatə gözləmək günorta vaxtını itirməyin adi yoludur.
Sirlər ayrı bir qərara aiddir. NET_ADMIN saxlamaq klientin hansı peer kimliyini təqdim etdiyi, hansı etimadnamələri yüklədiyi və onların necə rotasiya olunduğu barədə heç nə demir. Şəbəkə idarəetməsi etimad təmin etmir.
Dəyişikliyi yoxlayın və icazənin niyə mövcud olduğunu qeyd edin
Tuneli sazlamazdan əvvəl konteynerin həqiqətən nə aldığını təsdiqləyin. Aşağıdakı yoxlama əlavə edilmiş imkanları və şəbəkə rejimini göstərir, sonra interfeys siyahısının içəridən necə göründüyünü təqdim edir:
docker inspect --format '{{.HostConfig.CapAdd}} {{.HostConfig.NetworkMode}} {{.HostConfig.Privileged}}' vpn
docker exec vpn sh -c 'grep CapEff /proc/self/status'
docker exec vpn ip -br addr
docker exec vpn ip routeİmkan varsa və interfeys siyahısı hələ də boşdursa, klient heç nə yarada bilməmişdən əvvəl uğursuz olub və konteyner qeydləri növbəti baxılacaq yerdir. Tunel varsa, lakin trafik axmırsa, konteynerin içindəki marşrut cədvəli növbəti suala cavab verir.
Sökmə yolunu da yoxlayın, çünki firewall qaydaları yazan klient onları arxada qoya bilər. Konteyneri dayandırın və host şəbəkəsi istifadə olunursa, hostun qaydalar dəstini yenidən yoxlayın. Yalnız başlanğıcda iki saniyə lazım olan icazə, bunu izah edən qeyd olmadan compose faylında daimi tələb kimi təsvir edilməməlidir.
Hər imkanın yanında səbəbi yazın: hansı əməliyyat onu tələb edirdi və onsuz nə uğursuz olur. Bu qeyd image yeniləmələrindən sonra da qalır və nəzərdən keçirilmiş imtiyaz siyahısı ilə kopyala-yapışdır ilə böyümüş siyahı arasındakı fərqdir.