Klienti VPN lidhet, shfletuesi funksionon, dhe komanda e vetme që ju intereson vërtet vazhdon të dalë përmes lidhjes tuaj shtëpiake. Ose ndodh e kundërta: tuneli merr rrugën e parazgjedhur dhe serveri lokal i skedarëve zhduket nga desktopi. Këtë e hasa me një agjent ndërtimi që duhej të arrinte një pasqyrë të brendshme artefaktesh, ndërsa pjesa tjetër e hostit qëndronte në LAN-in e zyrës, dhe klienti ofronte saktësisht dy zgjedhje, gjithë trafikun ose asgjë. Kërkesa është e njëjtë në të dy drejtimet, ky program dhe jo gjithë kompjuteri, dhe shumica e klientëve nuk kanë një kuti kontrolli për të, sepse tabela e rrugëzimit nuk e ka ditur kurrë çfarë është një program.

Pse tabela e rrugëzimit nuk e sheh programin tuaj

Kur një proces dërgon një paketë, stack-u kërkon adresën e destinacionit në tabelën e rrugëzimit. As emri i ekzekutuesit as porti nuk hyjnë në atë kërkim. Emrat e domeneve dështojnë për të njëjtën arsye: një tunel e çon trafikun te një adresë, dhe kur një emër zgjidhet në një adresë, rrugëzimi është e vetmja levë që kernel-i ka ende. Kjo është arsyeja pse "VPN vetëm për këtë sajt" përfundon duke nënkuptuar një proxy, dhe "VPN vetëm për këtë program" përfundon duke nënkuptuar një nga një grup i vogël mekanizmash.

MekanizmiÇfarë përzgjedhMbulonKur tuneli bie
Lidhja e socket-itadresa burimorenjë klient që ju kontrollonilidhjet dështojnë
Rregull UID (Linux)përdoruesi pronarçdo proces i një llogarielidhjet dështojnë
Profil firewalls (Windows)profili i përshtatësitnjë programdështon i mbyllur
Hapësirë emrash rrjetianëtarësimi në hapësirën e emravegjithçka që niset brendalidhjet dështojnë
Hop SOCKScilësimi i proxy-t të aplikacionitnjë aplikacion ose një profil shfletuesilidhjet dështojnë

Asnjëra prej tyre nuk është rrugë për proces. Secila e zhvendos vendimin në një shtresë që e sheh programin, përdoruesin ose konfigurimin e vetë aplikacionit.

Një destinacion i vetëm është ende rrugë, jo rregull për programin. Në macOS receta e zakonshme është të hiqet shenja te "Dërgo gjithë trafikun përmes VPN" dhe të shtohet një rrugë hosti: sudo route add -host internal-tuner.example -interface ppp0, e hequr përsëri me sudo route delete -host internal-tuner.example -interface ppp0. Lexo emrin e ndërfaqes nga ifconfig së pari, pasi ppp0 është vetëm një shembull. Karakteret e gjera nuk funksionojnë në një rrugë hosti, kështu që një shërbim që flet me disa emra ka nevojë për një zë për çdo emër, dhe rregulli mbulon çdo proces në makinë, jo atë që kishit në mendje.

Lidh socket-in me adresën e tunelit

Kur e kontrolloni klientin, lidhja është përzgjedhësi më i lirë. Një socket i lidhur me adresën lokale të tunelit del përmes asaj ndërfaqe për sa kohë ekziston një rrugë për destinacionin atje, dhe gjithçka tjetër në makinë mban rrugën normale. Hollësia është se lidhja zgjedh adresën burimore, ndërsa tabela e rrugëzimit vazhdon të zgjedhë daljen. Lidhja e vetme nuk e zhvendos në tunel trafikun që nuk ka rrugë, dhe ky është gabimi pas shumicës së raporteve "e lidha dhe prapë del në rrugën e gabuar".

import socket
s = socket.socket()
s.bind(("10.8.0.2", 0))
s.connect(("build.internal.example", 443))

Mjetet e nivelit më të lartë ekspozojnë të njëjtën ide: curl --interface 10.8.0.2, CURLOPT_INTERFACE në PHP dhe argumenti source_address në klientët HTTP të Python. Adresa duhet t'i përkasë tunelit, dhe një gabim shtypi këtu dështon si një gabim i zakonshëm lidhjeje, jo si ankesë rrugëzimi. Lidhja me një emër pajisjeje në vend të një adrese është privilegj i Linux-it dhe nuk kalon në Windows ose macOS, prandaj skriptet e transportueshme kalojnë adresën.

Linux: përputh pronarin, jo emrin e programit

Kernel-i mund të përputhë përdoruesin pronar të një socket-i, kështu që një llogari e dedikuar bëhet përzgjedhësi. Vendos tunelin në tabelën e vet të rrugëzimit dhe dërgo atje vetëm trafikun e asaj llogarie:

ip rule add uidrange 1001-1001 lookup 100
ip route add default dev tun0 table 100

Kjo funksionon vetëm nëse tuneli nuk është tashmë rruga e parazgjedhur. Nis klientin me --route-nopull, ose filtro ridrejtimin e imponuar me --pull-filter ignore "redirect-gateway" në OpenVPN 2.4 dhe më vonë, pastaj shto vetë zërin në tabelë. Përndryshe ekzistojnë të dyja rrugët e parazgjedhura dhe fiton ajo me prioritet më të ulët. Versioni i qëllimshëm i kësaj është të drejtosh rrugën e parazgjedhur te gateway-i i tunelit, ose ta bësh nga një skript shkëputjeje: e mban trafikun jashtë internetit kur tuneli bie, por ky është një çelës ndalimi, jo një përzgjedhës, dhe qëndron derisa dikush ta heqë.

Versioni më i fortë është një hapësirë emrash rrjeti. Krijoje, ekzekuto klientin brenda dhe nis aplikacionin me ip netns exec. Asgjë jashtë hapësirës së emrave nuk e sheh ndërfaqen e tunelit, kështu që aplikacioni nuk mund të kthehet aksidentalisht në rrugën e hostit. Kostoja është reale: hapësira e emrave ka nevojë për një çift veth për të arritur rrjetin fizik dhe skedarin e vet të rezolutorit, sepse hapësira e emrave e montimit nuk i ndan cilësimet e zgjidhjes së hostit.

Dy mënyra dështimi shpjegojnë shumicën e rrjedhjeve. Zgjidhja e emrave vazhdon të ndodhë në rezolutorin e hostit, kështu që kërkesa del jashtë tunelit edhe kur lidhja TCP shkon brenda. Dhe IPv6 ka nevojë për ip -6 rule të vetin, sepse një rregull v4 nuk e mbulon.

Windows dhe macOS: kufizo firewall-in ose dorëzo një proxy

As Windows nuk ka përzgjedhës rrugë për aplikacion, por rregullat e firewall-it mund të kufizohen në një profil, dhe një përshtatës VPN mund të klasifikohet si Publik ndërsa LAN-i shtëpiak mbetet Privat. Krijo rregulla bllokimi dalës për programin në profilet Privat dhe Domen, lërë Publikun hapur, dhe aplikacioni mund ta arrijë rrjetin vetëm përmes tunelit. Vendos së pari kategorinë e rrjetit të lidhjes, pastaj konfirmo në panelin e monitorimit të firewall-it që rregulli u përputh. Është bllokim, jo rrugë: dështon i mbyllur kur tuneli bie dhe nuk mund të ndalojë një aplikacion që e injoron firewall-in.

macOS ndjek të njëjtën logjikë me mjete të tjera. Një dëgjues SOCKS i arritur përmes SSH është opsioni më pak invaziv, pasi ssh -D 1080 user@host krijon një portë lokale dhe vetëm aplikacionet e konfiguruara ta përdorin marrin atë rrugë. Një rregull pf mund të bllokojë një program sipas përdoruesit ose grupit, por prapë nuk mund të zgjedhë tunelin vetëm për atë program. Tunnelblick nuk mund të filtrojë fare sipas domenit, sepse rrugët punojnë me adresa; përdoruesit e OpenConnect mbështeten te vpn-slice kur serveri dërgon një listë prefiksesh shumë të gjerë.

Dy zgjidhje anashkaluese mbulojnë atë që mjetet e platformës nuk e arrijnë. Zgjerimet e shfletuesit që ndryshojnë proxy-n sipas domenit janë përgjigjja praktike për "vetëm ky sajt", sepse veprojnë në shtresën e aplikacionit ku emrat ekzistojnë ende; mbulojnë një shfletues dhe asgjë tjetër. Mënyra e trashë është të ekzekutosh klientin e furnizuesit brenda një makine virtuale, kështu që mysafiri zotëron ndryshimin e rrugës ndërsa hosti mban rrugën e vet, me koston e dy stack-eve rrjeti për t'u mirëmbajtur.

Një hop SOCKS për mjete pa mundësi lidhjeje

Shumica e aplikacioneve mund të drejtohen te një proxy HTTP ose SOCKS edhe kur nuk dinë asgjë për ndërfaqet. Një klient SSH siguron një të tillë pa asnjë ndryshim në anën e serverit:

ssh -N -D 127.0.0.1:9999 [email protected]

Çdo gjë e konfiguruar të përdorë atë portë del te bastioni ndërsa pjesa tjetër e desktopit mban lidhjen normale. Një instancë lokale 3proxy e lidhur me adresën e tunelit bën të njëjtën gjë për një portë pa SSH, dhe stunnel mbulon një portë të vetme të mbështjellë me TLS. Kufizimet janë praktike: një proxy mbart vetëm protokollet që dinë ta përdorin, UDP kërkon shoqërimin UDP të SOCKS5 që cilësimi "SOCKS5" i shumë klientëve nuk e aktivizon, dhe DNS duhet të zgjidhet nga proxy (socks5h në curl) ose emri rrjedh te rezolutori lokal.

Mbaje dëgjuesin në loopback nëse nuk e ka nevojë një makinë tjetër.

Verifiko rrugën me një kapje, jo me një mesazh statusi

Dritaret e statusit të aplikacionit përshkruajnë cilësimin, jo paketën. Kap trafikun në të dyja ndërfaqet dhe krahaso:

tcpdump -i any -n port 443
ss -tnp | grep 443

Nëse lidhja shfaqet në ndërfaqen fizike pa një zë përkatës në tunel, përzgjedhësi nuk është në fuqi, pavarësisht çfarë raporton klienti. Kontrollo IPv6 dhe rezolutorin veçmas, dhe kërko një rrugë të dytë si një proces ndihmës ose një proxy sistemi të trashëguar.

Pastaj zgjidh kufirin që përputhet me kërkesën: një proxy mjafton për një sajt, një rregull UID mjafton për një llogari, një profil firewalls mjafton kur lidhja duhet të dështojë e mbyllur, dhe një hapësirë emrash është opsioni i vetëm që e fsheh tunelin nga gjithçka jashtë tij.

Artikuj të ngjashëm