Мрежови пространства от имена в Linux за VPN: какво не изолират
Пространството от имена мести интерфейси, маршрути и сокети, но не файлове или акаунти. Ето какво покрива VPN в собствен netns и къде трафикът все още изтича.
Стартирайте VPN в собственото му пространство от имена, пуснете едно приложение там и трафикът все още излиза по маршрута на хоста. Нищо не е счупено: пространството от имена управлява само процесите, които влизат в него, а изтичането дойде от процес, който никога не е влизал. Интерфейсите, адресите, маршрутите, правилата на защитната стена и сокетите са това, което пространството притежава. Файловете, акаунтите и вече работещите услуги не са и именно оттам идват повечето изненади.
Какво притежава пространството и къде се ражда сокетът
Преместете интерфейс в пространство от имена и хостът го губи; изградете тунел вътре и хостът не може да го види. Това е механизмът зад VPN, ограничен до пространство от имена: устройството и маршрутите към него живеят в контекст, до който достигат само избраните процеси. Хостът запазва маршрута си по подразбиране, така че всичко отвън остава незасегнато.
Контекстът на създаване е също толкова важен, колкото текущото местоположение при WireGuard: UDP сокетът се обвързва в пространството от имена, където е създаден интерфейсът, дори след като устройството се премести другаде. Коя таблица за маршрутизация следват криптираните пакети, зависи от това място на раждане. Когато сокетът остане в контекст без маршрут до партньора, интерфейсът прави справка и ръкостискането никога не излиза. Проверете мястото му на раждане, после текущото му местоположение.
Какво пространството от имена не изолира
Нищо тук не разделя файлови системи, акаунти или тайни, и нито една от тези граници не се появява, защото сте създали пространство от имена. Конфигурацията на резолвера е файл, така че процес вътре все още може да прочете настройка, сочеща към резолвера на хоста, и да изпрати заявката си по маршрута, който това предполага. Приложение, което предава заявката на вече работещ брокер или системна услуга, включва процес в съвсем различен контекст. И двете са заявки, за които границата никога не е била предвидена да отговаря.
Решението е файл за всяко пространство от имена в /etc/netns/<name>/resolv.conf или bind mount на подготвен файл, насочен към резолвер, достъпен отвътре. Редактирането на /etc/resolv.conf на хоста не променя нищо, което пространството вижда.
Поставянето на процесите е управлението
Изолацията, която получавате, е точно изолацията на процесите, които стартирате вътре. Шел, стартиран през помощника exec на пространството, и всичко, което той породи, остава вътре; настолно приложение, стартирано от сесията на хоста, не. Създайте контекста, преместете устройството, после докажете двете страни:
ip netns add vpn1
ip link set wg0 netns vpn1
ip netns exec vpn1 wg show
wg show
Прочетете първия wg show отвътре в пространството и втория от хоста и очаквайте само един от тях да изброи партньора. Ако и двата го правят, устройството никога не се е местило; ако нито един, то е отишло другаде. Когато стартерът е мениджър на услуги, файлът на модула е това, което трябва да се редактира, не прекият път на работния плот. Модул без настройката за пространство от имена стартира демона в контекста на хоста и тихо отменя дизайна.
Тествайте от контекста на приложението
Изпълнете проверката със същия двоичен файл и същия потребител, които приложението използва, вътре в пространството. Включете DNS и двете семейства адреси, защото маршрут IPv6, за който не сте се сетили, е често срещан изход. Проверка от вашия собствен шел доказва само, че вашият шел е изолиран.
След това изпълнете идентичната проверка на хоста и потвърдете, че отговорите се различават: адрес на тунела и желан изход вътре, маршрут на хоста и офисен изход отвън, и резолверът по име. Назовавайте пространствата според внедряването, а не според протокола, за да не обърка скрипт за почистване две от тях.
Препращане, политика при отказ и почистване
За шлюз включете препращането съзнателно и решете какво трябва да стане, когато тунелът падне. Пространството не блокира маршрутите, които инсталирате вътре, така че резервен маршрут към хоста ще бъде използван, ако създадете такъв. Това е политическо решение и трябва да бъде записано, преди прекъсване да го тества.
Запишете имената на пространствата, интерфейсите и кой притежава конфигурацията, за да премахва почистването само създаденото от внедряването. Нулирането на мрежата на хоста по време на връщане назад превръща почистването в прекъсване. network_namespaces(7) е кратка страница и си заслужава да се прочете, преди да проектирате този път.