Un browser care folosește un VPN Linux deja stabilit nu deschide /dev/net/tun. Deschide un socket, iar nucleul decide prin ce interfață ies pachetele acelui socket. Procesul care a creat tunelul face o altă muncă decât procesul al cărui trafic îl transportă. Păstrarea acestor două roluri separate răspunde la majoritatea întrebărilor despre permisiuni înainte ca ele să fie puse.

Urmărește un pachet de la socket la tunel

O aplicație obișnuită apelează connect sau send, iar nucleul caută o rută către destinație. Dacă ruta aleasă indică interfața tunelului, pachetul este pus în coadă la dispozitivul pe care îl citește daemonul VPN. Daemonul îl criptează și îl trimite afară prin interfața fizică. Fiecare săgeată din acea descriere este un loc unde se poate răspunde la o întrebare despre permisiuni.

Nimic de pe acea cale nu cere ca aplicația să cunoască dispozitivul. Daemonul ține descriptorul de fișier și efectuează operațiile de interfață, în timp ce aplicația vede doar un API de rețea normal.

Desenează cele două jumătăți o dată, și întrebările despre permisiuni devin mai ușor de plasat. Jumătatea superioară este lumea aplicațiilor, iar cea inferioară aparține daemonului.

Decide cine are nevoie de dispozitiv și cine nu

Crearea sau atașarea la o interfață TUN necesită acces la dispozitiv plus capacitatea de a o configura, de aceea un serviciu VPN acceptat începe cu autoritate de administrare a rețelei sau folosește un ajutor privilegiat. Această cerință aparține daemonului. Nu spune nimic despre browser, clientul de baze de date sau instrumentul de transfer de fișiere. Un serviciu care are nevoie de capacitate o are nevoie pentru propriul pas de configurare, nu pentru clienții săi.

Odată ce ruta și politica sunt la locul lor, un proces obișnuit folosește calea rezultată prin apelurile sale obișnuite de socket. Nu are nevoie de nodul dispozitivului și nu are nevoie de root.

Schimbarea permisiunilor dispozitivului nu este o modalitate de a acorda unei aplicații acces la destinație. Doar mută granița dispozitivului în altă parte.

Verifică spațiul de nume în care rulează de fapt aplicația

Un container, sau un al doilea spațiu de nume de rețea, oferă proceselor sale un set de interfețe și un tabel de rutare separate. Un tunel pe gazdă nu apare acolo automat, și nicio modificare a permisiunilor dispozitivului nu schimbă asta. Aplicația va ruta pur și simplu prin ceea ce oferă acel spațiu de nume. De aceea o imagine de container nu poate moșteni un tunel al gazdei din greșeală.

Verifică cu ip netns list și ip -n NAME route, sau inspectând legătura spațiului de nume al procesului. Răspunsul este de obicei vizibil într-o singură comandă.

Doi utilizatori pe aceeași gazdă pot primi și căi diferite prin politică. Este o decizie de rețea, nu o dovadă despre proprietatea dispozitivului.

Separă capacitățile de politica de rețea

Unele instrumente au nevoie de mai mult decât un socket. Capturarea pachetelor are nevoie de un socket brut, iar schimbarea rutelor are nevoie de autoritate administrativă. Sunt operații separate cu permisiuni separate, iar acordarea uneia nu trebuie citită ca o cerință generală pentru folosirea VPN-ului.

Un program care își implementează propriul tunel este un al treilea caz. Deschide într-adevăr TUN pentru că preia rolul daemonului, de aceea are nevoie de privilegiile acestuia.

Numește operația înainte de a numi privilegiul. De obicei, cele două sunt mai ușor de separat decât par.

Verifică separarea cu două conturi

Conectează tunelul ca serviciu, apoi rulează aplicația ca utilizator obișnuit și confirmă că ajunge la resursa privată. Verifică ip route get pentru destinație din shellul acelui utilizator pentru a vedea ce interfață a fost aleasă. Dacă ruta este corectă și conexiunea tot eșuează, problema este politica, nu privilegiul.

Designul care rezultă este privilegiul minim cu o graniță explicită: o componentă deține configurarea și resursele tunelului, sarcinile de lucru își păstrează conturile normale, iar politica de rețea decide ce poate trece. Rularea tuturor ca root prăbușește acele roluri fără să explice nimic.

Articole similare