Обична Linux апликација користи VPN без додиривања TUN-а
Демон поседује TUN уређај и тунел; апликације само отварају сокете. Држите привилегију подешавања и мрежни приступ као одвојене границе.
Прегледач који користи успостављени Linux VPN не отвара /dev/net/tun. Он отвара сокет, а језгро одлучује кроз које интерфејс излазе пакети тог сокета. Процес који је створио тунел обавља други посао од процеса чији саобраћај преноси. Држање тих двеју улога одвојеним одговара на већину питања о дозволама пре него што се поставе.
Пратите један пакет од сокета до тунела
Обична апликација позива connect или send, а језгро тражи руту до одредишта. Ако изабрана рута показује на интерфејс тунела, пакет се ставља у ред на уређају који чита VPN демон. Демон га шифрује и шаље напоље кроз физички интерфејс. Свака стрелица у том опису место је на којем се може одговорити на питање о дозволи.
Ништа на том путу не захтева да апликација познаје уређај. Демон држи дескриптор датотеке и обавља операције интерфејса, док апликација види само уобичајени мрежни API.
Нацртајте две половине једном и питања о дозволама постаће лакше сместити. Горња половина је свет апликација, а доња припада демону.
Одлучите коме је потребан уређај, а коме не
Стварање TUN интерфејса или придруживање њему захтева приступ уређају и уз то способност да се конфигурише, зато подржана VPN услуга почиње са овлашћењем мрежне администрације или користи привилегованог помоћника. Тај захтев припада демону. Не говори ништа о прегледачу, клијенту базе података или алату за пренос датотека. Услуга којој треба та способност треба је за свој корак подешавања, а не за своје клијенте.
Када су рута и политика на месту, обичан процес користи добијени пут кроз своје уобичајене позиве сокета. Не треба му чвор уређаја и не треба му root.
Промена дозвола уређаја није начин да се апликацији да приступ одредишту. Само премешта границу уређаја негде другде.
Проверите у ком именском простору апликација стварно ради
Контејнер или други мрежни именски простор даје својим процесима одвојен скуп интерфејса и табелу рута. Тунел на хосту не појављује се тамо аутоматски и никаква промена дозвола уређаја то не мења. Апликација ће једноставно усмеравати кроз оно што тај именски простор пружа. Зато контејнерска слика не може случајно да наследи тунел хоста.
Проверите са ip netns list и ip -n NAME route, или прегледом везе именског простора процеса. Одговор је обично видљив у једној наредби.
Двојици корисника на истом хосту политика такође може дати различите путеве. То је мрежна одлука, а не доказ о власништву уређаја.
Одвојите способности од мрежне политике
Неким алатима треба више од сокета. Снимање пакета тражи сирови сокет, а промена рута тражи административно овлашћење. То су одвојене операције са одвојеним дозволама, и давање једне не треба читати као општи услов за коришћење VPN-а.
Програм који сам имплементира тунел је трећи случај. Он заиста отвара TUN јер преузима улогу демона, зато му требају његове привилегије.
Именујте операцију пре него што именујете привилегију. Њих двоје обично је лакше раздвојити него што изгледа.
Проверите поделу са два налога
Повежите тунел као услугу, затим покрените апликацију као обичног корисника и потврдите да долази до приватног ресурса. Проверите ip route get за одредиште из shell-а тог корисника да видите који је интерфејс изабран. Ако је рута исправна, а веза ипак не успева, проблем је политика, а не привилегија.
Резултујући дизајн је најмања привилегија са изричитом границом: једна компонента поседује подешавање и ресурсе тунела, радна оптерећења задржавају своје уобичајене налоге, а мрежна политика одлучује шта сме да прође. Покретање свега као root руши те улоге без икаквог објашњења.