Wéi een eenzegt Programm duerch VPN schéckt, ouni de ganze Rechner
Keen onverwalteten Desktop bitt en VPN-Schalter pro Prozess. Wielt d’Schicht, déi den Traffic auswielt: e gebonnene Socket, eng UID-Regel, e Firewall-Profil oder en SOCKS-Sprong.
De VPN-Client verbënnt sech, de Browser funktionéiert, an deen eenzegen Kommando, deen dir wierklech wichtege ass, geet nach ëmmer iwwer deng Heemverbindung eraus. Oder et geschitt de Géigendeel: den Tunnel hëlt de Standardwee an de lokale Fichierserver verschwënnt vum Desktop. Ech sinn deem bei engem Build-Agent begéint, deen en internen Artefaktspigel erreeche sollt, während de Rescht vum Host am Büro-LAN blouf, an de Client huet genee zwou Méiglechkeete gebueden: de ganzen Traffic oder näischt. D’Ufro ass a béid Richtungen déi selwecht, dëst Programm an net de ganze Rechner, an déi meescht Cliente hunn dofir keng Këscht, well d’Routentabell ni wousst wat e Programm ass.
Firwat d’Routentabell däi Programm net gesäit
Wann e Prozess e Paket schéckt, sicht de Stack d’Ziladress an der Routentabell. Weder den Numm vun der ausféierbarer Datei nach de Port komme mat an déi Sich. Domainnimm schloe aus demselwe Grond feel: en Tunnel bréngt Traffic op eng Adress, an zu deem Moment wou en Numm sech an eng Adress opléist, ass d’Routing deen eenzegen Hebel, deen de Kernel nach huet. Dofir heescht „VPN just fir dës Säit“ um Enn e Proxy, an „VPN just fir dëst Programm“ ee vun enger klenger Rei vu Mechanismen.
| Mechanism | What selects | Covers | On tunnel drop |
|---|---|---|---|
| Socket bind | source address | a client you control | connections fail |
| UID rule (Linux) | owning user | every process of one account | connections fail |
| Firewall profile (Windows) | adapter profile | one program | fails closed |
| Network namespace | namespace membership | everything started inside | connections fail |
| SOCKS hop | app proxy setting | one app or one browser profile | connections fail |
Keen vun dëse ass eng Route pro Prozess. Jidderee verréckelt d’Entscheedung op eng Schicht, déi d’Programm, de Benotzer oder d’Konfiguratioun vun der App selwer gesäit.
En eenzelt Ziel ass nach ëmmer eng Route, keng Programmregel. Op macOS ass dat üblech Rezept d’Häckchen bei „All Traffic iwwer VPN schécken“ ewechzehuelen an eng Host-Route derbäizesetzen: sudo route add -host internal-tuner.example -interface ppp0, déi nach eng Kéier mat sudo route delete -host internal-tuner.example -interface ppp0 ewechgeholl gëtt. Liest fir d’éischt den Numm vum Interface aus ifconfig, well ppp0 just en Beispill ass. Jokerzeeche funktionéieren an enger Host-Route net, dofir brauch e Service, deen mat méi Nimm schwätzt, ee Andrag pro Numm, an d’Regel deckt all Prozess um Rechner of, net deen, deen s du am Kapp hat.
Bonn de Socket un d’Adress vum Tunnel
Wann s de de Client kontrolléiers, ass d’Bannen dee bëllegsten Auswieler. E Socket, deen un d’lokal Adress vum Tunnel gebonnen ass, geet duerch deen Interface eraus soulaang et do eng Route zum Zil gëtt, an alles anescht um Rechner behält säin normale Wee. D’Feinheet ass, datt d’Bannen d’Quelladress wielt, während d’Routentabell nach ëmmer den Ausgang wielt. D’Bannen eleng verréckelt keen Traffic, deen eng Route an den Tunnel huet, an dat ass de Feeler hannert deene meeschte Meldungen „ech hunn et gebonnen an et geet nach ëmmer déi falsch Säit eraus“.
import socket
s = socket.socket()
s.bind(("10.8.0.2", 0))
s.connect(("build.internal.example", 443))Instrumenter op méi héijem Niveau bidden déi selwecht Iddi: curl --interface 10.8.0.2, CURLOPT_INTERFACE a PHP an den source_address-Argument an den HTTP-Cliente vu Python. D’Adress muss zum Tunnel gehéieren, an en Tippfeeler hei schléit als gewéinleche Verbindungsfeeler feel, net als Routingbeschwéier. D’Bannen un en Apparatennumm amplaz vun enger Adress ass eng Linux-Privileg an iwwerdréit sech net op Windows oder macOS, dofir ginn portabel Skripten d’Adress weider.
Linux: gläich de Besëtzer of, net den Numm vum Programm
De Kernel kann de Besëtzer vun engem Socket ofgläichen, dofir gëtt en eegene Kont den Auswieler. Setz den Tunnel an seng eegen Routentabell a schéck just den Traffic vun deem Kont dohinner:
ip rule add uidrange 1001-1001 lookup 100
ip route add default dev tun0 table 100Dëst funktionéiert just, wann den Tunnel net schonn de Standardwee ass. Start de Client mat --route-nopull, oder filter d’gedréckt Ëmleitung mat --pull-filter ignore "redirect-gateway" op OpenVPN 2.4 a méi nei, an da setz den Tabellandrag selwer derbäi. Soss ginn et béid Standardweer an dee mat der niddereger Prioritéit gewënnt. D’bewosst Versioun dovu besteet doran, den Standardweg op den Tunnel-Gateway ze riichten, oder dat aus engem Trennungsskript ze maachen: et hält den Traffic vum Internet ewech, wann den Tunnel fält, awer dat ass e Kill Switch, keen Auswieler, an et bleift bis een et ewechhëlt.
Déi méi staark Versioun ass en Netzwierk-Namensraum. Erstell en, laf de Client dobannen a start d’App mat ip netns exec. Näischt baussent dem Namensraum gesäit den Interface vum Tunnel, dofir kann d’App net zoufälleg op d’Host-Route zréckfalen. De Präis ass real: den Namensraum brauch e veth-Puer fir d’physescht Netzwierk z’erreechen an eng eege Resolver-Datei, well de Mount-Namensraum d’Opléisungsastellunge vum Host net deelt.
Zwou Feelermodalitéite erkläre déi meeschte Lechen. D’Nimmopliesung geschitt nach ëmmer am Resolver vum Host, dofir geet d’Ufro baussent den Tunnel, och wann d’TCP-Verbindung dobannen erageet. An IPv6 brauch seng eege ip -6 rule, well eng v4-Regel se net deckt.
Windows a macOS: begrenz d’Firewall oder iwwergib e Proxy
Windows huet och keen Auswieler pro App, awer seng Firewall-Regele kënnen op e Profil begrenzt ginn, an en VPN-Adapter kann als „ëffentlech“ ageklasséiert ginn, während de Heem-LAN „privat“ bleift. Erstell Ausgangsblockregelen fir d’Programm an de Profiler „privat“ an „Domain“, loss „ëffentlech“ op, an d’App erreecht d’Netzwierk just iwwer den Tunnel. Setz fir d’éischt d’Netzwierkkategorie vun der Verbindung, a bestätegt dann, datt d’Regel am Iwwerwaachungspanneau vun der Firewall entsprach huet. Et ass eng Blockad, keng Route: se schléit zouen feel, wann den Tunnel fält, an se kann eng App net stoppen, déi d’Firewall ignoréiert.
macOS follegt der selwechter Logik mat aneren Instrumenter. En SOCKS-Lauschterer, deen iwwer SSH erreecht gëtt, ass déi mannst invasiv Optioun, well ssh -D 1080 user@host ee lokale Port mécht a just Appen, déi dofir konfiguréiert sinn, dee Wee huelen. Eng pf-Regel kann e Programm no Benotzer oder Grupp blockéieren, awer se kann den Tunnel nach ëmmer net just fir dat Programm auswielen. Tunnelblick kann iwwerhaapt net no Domain filteren, well Route mat Adressen schaffen; OpenConnect-Benotzer gräifen zu vpn-slice, wann de Server eng ze breet Präfixlëscht dréckt.
Zwéi Ëmweeër decken of, wat d’Instrumenter vun der Plattform iwwersinn. Browser-Erweiderungen, déi de Proxy pro Domain wiesselen, sinn déi praktesch Äntwert op „just dës Säit“, well se op der App-Schicht schaffen, wou Nimm nach existéieren; se decken een Browser of an sonst näischt. Déi gro Method ass, de Client vum Hiersteller an enger virtueller Maschinn lafen ze loossen, sou datt de Gaascht d’Routenännerung besëtzt, während den Host säi Wee behält, um Präis vun zwee Netzwierkstapelen, déi misse gewaart ginn.
En SOCKS-Sprong fir Instrumenter ouni Bannoptioun
Déi meescht Appen kënnen op en HTTP- oder SOCKS-Proxy geriicht ginn, och wann se näischt iwwer Interface wëssen. En SSH-Client liwwert een ouni Ännerung op der Serversäit:
ssh -N -D 127.0.0.1:9999 [email protected]Alles, wat dofir konfiguréiert ass, dee Port ze benotzen, geet um Bastion eraus, während de Rescht vum Desktop seng normal Verbindung behält. Eng lokal Instanz vun 3proxy, déi un d’Adress vum Tunnel gebonnen ass, mécht dat selwecht fir een Port ouni SSH, an stunnel deckt een eenzegen TLS-verpakte Port of. D’Grenze si praktesch: e Proxy dréit just Protokoller, déi wëssen wéi se en benotzen, UDP brauch eng SOCKS5-UDP-Associatioun, déi d’„SOCKS5“-Astellung vu ville Cliente net aktivéiert, an DNS muss vum Proxy opgeléist ginn (socks5h a curl), soss leckt den Numm an den lokale Resolver.
Hal den Lauschterer um Loopback, ausser eng aner Maschinn brauch en.
Iwwerpréif de Wee mat engem Mitschnëtt, net mat enger Statusmeldung
D’Statusfënstere vun Appen beschreiwen d’Astellung, net de Paket. Maach Mitschnëtt op béide Interface a vergläich:
tcpdump -i any -n port 443
ss -tnp | grep 443Wann d’Verbindung um physeschen Interface erschéngt an et keen entspriechende Andrag um Tunnel gëtt, ass den Auswieler net a Kraaft, egal wat de Client meldt. Kontrolléier IPv6 an de Resolver getrennt, a kontrolléier ob et en zweete Wee gëtt, zum Beispill en Hëllefsprozess oder e geierften Systemproxy.
Dann wielt d’Grenz, déi zu der Ufuerderung passt: e Proxy duet fir eng Säit, eng UID-Regel duet fir ee Kont, e Firewall-Profil duet, wann d’Verbindung misst zouen feelen, an en Namensraum ass déi eenzeg Optioun, déi den Tunnel virun allem dobaussen verstoppt.