Два VPN на адной машыне Linux: праверце кожны асобна, не змешваючы вынікі
Дзве зялёныя іконкі — гэта не параўнанне. Змесціце кожны тунель у сваю прастору імёнаў, спачатку запішыце чаканае, і дакажыце шлях, перш чым давяраць выніку.
Дзве зялёныя іконкі злучэння выглядаюць як параўнанне, але звычайна гэта выпадковасць. Калі тэставы запыт мог скарыстацца любым з двух тунеляў, вынік апісвае ў лепшым выпадку адзін з іх, а ў горшым — ніводнага. Дайце кожнаму назіранню сеткавы кантэкст, прызначэнне і чаканы вынік, запісаныя да запуску тэста. На самастойна кіраванай машыне Linux іменаваныя сеткавыя прасторы імёнаў — самы танны спосаб купіць гэтае раздзяленне.
Дзве зялёныя лямпы — гэта не параўнанне
Прастора імёнаў раздзяляе табліцы маршрутызацыі, інтэрфейсы і стан сеткавага стэка, таму запыт, пачаты ўнутры адной, не можа ціха пазычыць тунель другой. Чаго яна не раздзяляе, дык гэта працэсар, фізічны ўваходны канал і служба развязання імёнаў на хасце. Менавіта ў гэтым апошнім прамежку большасць такіх тэстаў правальваецца незаўважна. Пошук, які выходзіць з прасторы імёнаў і пытаецца ў развязальніка хасцёра, вяртае адказ, які не мае дачынення да тунеля пад тэстам.
Гэтая працэдура мяркуе дзве ўжо падрыхтаваныя і ўхваленыя тэставыя прасторы імёнаў з працоўным знешнім злучэннем і падтрымліванымі кліентамі. Яна нічога не стварае, нікога не рэгіструе і не замяняе ніякай канфігурацыі. Асобныя віртуальныя машыны застаюцца сумленным выбарам, калі кліенту патрэбна поўная сесія працоўнага стала або ён адмаўляецца працаваць па-за ёй.
Зафіксуйце чаканае да першага запуску
Вызначце для кожнага кантэксту, як выглядае поспех: развязальнік, імя службы, чаканы адрас і паводзіны, патрабаваныя пры падзенні тунеля. Трымайце гэтыя запланаваныя значэнні ў сваёй калоне, бо запіс, які змешвае план і назіранне, — гэта фікцыя з адзнакай часу. Спіс ніжэй — гэта форма, патрэбная запісу, і кожны радок павінен быць запоўнены да першага злучэння.
| Tunnel | Owner | Client interface inside the namespace | Proof command | Required on disconnect |
|---|---|---|---|---|
| vpn-a | the identity that owns profile A, recorded by name | its own tun device, never the host's | ip -n vpn-a -4 route get 10.55.10.20 | traffic stops; no host-side fallback |
| vpn-b | a separate owner, even when both run on one box | its own tun device in its own namespace | ip -n vpn-b -4 route get 10.55.20.20 | verified separately, never inferred from A |
Праводка развязальніка патрабуе асобнага радка ў гэтым запісе, бо гэта поле, якое хутчэй за ўсё схлусіць. Файлы, прывязаныя да прасторы імёнаў, такія як /etc/netns/vpn-a/resolv.conf паказваюцца па звыклых шляхах, калі каманда выконваецца ўнутры прасторы імёнаў, як даведнік iproute2 па прасторах імёнаў апісвае, але канфігурацыя пераключэння службы імёнаў і любы лакальны развязальнік, які яна запускае, могуць усё яшчэ пацягнуць пошук назад на хасцёр.
Адзін тунель за раз, другі адключаны
Падключыце A праз яго існуючага ўладальніка, пакуль B застаецца выключаным, затым праверце палітыку, маршруты і выбраны шлях з адміністрацыйнага кантэксту. Тры з камандаў ніжэй чытаюць стан; толькі апошняя звяртаецца да службы імёнаў, і ніводная з іх не адпраўляе запыт прыкладання.
sudo ip -n vpn-a -4 rule show
sudo ip -n vpn-a -4 route show table all
sudo ip -n vpn-a -4 route get 10.55.10.20
sudo ip netns exec vpn-a getent ahostsv4 svc-a.lab.internalПошук маршруту адказвае на гіпатэтычнае пытанне пра прызначэнне, таму ён не можа паказаць, што служба прымае трафік. Трымайце гэтыя два тыпы доказаў у асобных калонах, бо здаровы маршрут побач з адхіленым злучэннем — рэальны і звычайны вынік. Затым адпраўце адзін бясшкодны дазволены запыт сапраўдным прыкладаннем, запушчаным у кантэксце A пад яго звычайным непрывілеяваным карыстальнікам, з нязменнай праверкай сертыфіката і аўтэнтыфікацыяй прыкладання, і запішыце вынік разам з адрасам крыніцы, які назірала служба. Адключыце A праз яго ўладальніка і паўтарыце ўсю базавую лінію для B, адзначаючы любое змяненне канфігурацыі, інакш дзве базавыя лініі перастануць быць параўнальнымі.
Абодва ўключаныя, затым па адным
Устойлівы стан — гэта лёгкая частка. Калі абодва тунелі падключаныя, паўтарыце пошук і запыт прыкладання для кожнага кантэксту, затым абарвіце адзін тунель і праверце другі. Перападключыцеся ў зваротным парадку, калі само пытанне ў парадку злучэння.
sudo ip netns exec vpn-a tcpdump -ni any port 443 -c 5
sudo ip netns exec vpn-b getent ahostsv4 svc-b.lab.internal
sudo ip -n vpn-b -4 route get 10.55.20.20Перахоп вырашае спрэчкі, якія не можа вырашыць вынік прыкладання: ён паказвае, ці запыт выйшаў праз чаканы інтэрфейс, ці праз нешта цалкам іншае. Для кожнага пераходу запішыце дзеянне ўладальніка, адзнаку часу, вынік маршруту, вынік імені і вынік прыкладання. Затым праверце патрабаванне бяспечнай адмовы ўнутры закранутай прасторы імёнаў, бо ізаляцыя — не выключальнік. Прастора імёнаў трымае два тунелі асобна; яна не перашкаджае ніводнаму з іх несці трафік, калі яго профіль кажа, што трафік павінен спыніцца.
Што гэты запіс можа сцвярджаць, а што не
Паспяховы прагон даказвае гэтыя назіранні для гэтай канфігурацыі, на гэтым хасце, у той час. Ён нічога не кажа пра двух кліентаў, якія дзеляць адну табліцу маршрутызацыі працоўнага стала, і нічога пра прапускную здольнасць, пакуль абодва тунелі нясуць нагрузку. Гэта асобныя пытанні з асобнымі тэстамі, і параўнанне настолькі добрае, наколькі добры кантэкст, далучаны да кожнага радка.
Трымайце правалы ў запісе побач з поспехамі, пазначаючы, які тунель тады быў уключаны. Чыстая старонка, якая хавае стан на момант вымярэння, горш за непрыгожую, якая яго паказвае. Робіць запіс прыдатным для паўторнага выкарыстання кантэкст, а не бал.
Два тунелі на адной машыне можна параўнаць сумленна, але толькі ў столькіх кантэкстах, колькімі вы сапраўды кіравалі. Усё звыш гэтага — жаданне з зялёнай іконкай побач.