Запусціце 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 знутры прасторы імёнаў, а другі — з хоста, і чакайце, што толькі адзін з іх пакажа партнёра. Калі абодва паказваюць, прылада не перамяшчалася; калі ніводзін — яна пайшла ў іншае месца. Калі запускальнікам з'яўляецца менеджэр службаў, рэдагаваць трэба unit-файл, а не ярлык на працоўным стале. Unit без налады прасторы імёнаў запускае дэман у кантэксце хоста і ціха адмяняе задуму.

Тэстуйце з кантэксту праграмы

Выканайце праверку тым жа бінарнікам і ад імя таго ж карыстальніка, што і праграма, унутры прасторы імёнаў. Уключыце DNS і абедзве сямействы адрасоў, бо маршрут IPv6, пра які вы не думалі, — звычайны шлях вонкі. Праверка з вашага ўласнага шэла даказвае толькі тое, што ваш шэл ізаляваны.

Затым выканайце ідэнтычную праверку на хосце і пераканайцеся, што адказы розныя: адрас тунэля і меркаваны выхад унутры, маршрут хоста і офісны выхад звонку, і рэзалвер па імені. Называйце прасторы імёнаў паводле разгортвання, а не пратакола, каб скрыпт ачысткі не блытаў дзве з іх.

Перадача, палітыка збояў і ачыстка

Для шлюза ўключыце перадачу свядома і вырашыце, што павінна адбыцца, калі тунэль абрынецца. Прастора імёнаў не блакуе маршруты, якія вы ўсталёўваеце ўнутры, таму рэзервовы маршрут да хоста будзе выкарыстаны, калі вы яго створыце. Гэта палітычнае рашэнне, і яго трэба запісаць, перш чым збой праверыць яго.

Запішыце назвы прастор імёнаў, інтэрфейсы і тое, хто валодае канфігурацыяй, каб ачыстка выдаляла толькі створанае разгортваннем. Скід сеткі хоста падчас адкату ператварае ачыстку ў збой. network_namespaces(7) — кароткая старонка, і яе варта прачытаць, перш чым праектаваць гэты шлях.

Падобныя артыкулы