VPN klijent se poveže, preglednik radi, a jedina naredba koja vas doista zanima i dalje izlazi kroz vašu kućnu vezu. Ili se dogodi suprotno: tunel preuzme zadanu rutu i lokalni poslužitelj datoteka nestane s radne površine. To sam doživio s agentom za izgradnju koji je morao dosegnuti interno zrcalo artefakata dok je ostatak hosta ostao u uredskom LAN-u, a klijent je nudio točno dvije mogućnosti, sav promet ili ništa. Zahtjev je u oba smjera isti, ovaj program, a ne cijelo računalo, i većina klijenata za njega nema potvrdni okvir, jer tablica usmjeravanja nikada nije znala što je program.

Zašto tablica usmjeravanja ne vidi vaš program

Kada proces pošalje paket, stog traži odredišnu adresu u tablici usmjeravanja. Ni ime izvršne datoteke ni port ne ulaze u to traženje. Nazivi domena padaju iz istog razloga: tunel prenosi promet na adresu, a kad se naziv razriješi u adresu, usmjeravanje je jedina poluga koju jezgra još ima. Zato "VPN samo za ovo web-mjesto" na kraju znači proxy, a "VPN samo za ovaj program" znači jedan od malog skupa mehanizama.

MehanizamŠto odabirePokrivaKad tunel padne
Vezanje socketaizvorna adresaklijent koji kontrolirateveze ne uspijevaju
UID pravilo (Linux)vlasnički korisniksvaki proces jednog računaveze ne uspijevaju
Profil vatrozida (Windows)profil adapterajedan programpada u zatvorenom stanju
Mrežni prostor imenačlanstvo u prostoru imenasve što se pokrene unutraveze ne uspijevaju
SOCKS skokpostavka proxyja u aplikacijijedna aplikacija ili jedan profil preglednikaveze ne uspijevaju

Nijedno od toga nije ruta po procesu. Svako premješta odluku u sloj koji vidi program, korisnika ili vlastitu konfiguraciju aplikacije.

Jedno odredište i dalje je ruta, a ne pravilo za program. Na macOS-u je uobičajen recept isključiti "Pošalji sav promet preko VPN-a" i dodati rutu do hosta: sudo route add -host internal-tuner.example -interface ppp0, koja se zatim uklanja s sudo route delete -host internal-tuner.example -interface ppp0. Najprije pročitajte ime sučelja iz ifconfig, jer je ppp0 samo primjer. Zamjenski znakovi ne rade u ruti do hosta, pa usluga koja razgovara s više naziva treba jedan zapis po nazivu, a pravilo pokriva svaki proces na stroju, ne onaj koji ste imali na umu.

Vežite socket na adresu tunela

Kada kontrolirate klijent, vezanje je najjeftiniji odabirač. Socket vezan na lokalnu adresu tunela izlazi kroz to sučelje dokle god tamo postoji ruta do odredišta, a sve ostalo na stroju zadržava svoj uobičajeni put. Suptilnost je u tome da vezanje odabire izvornu adresu dok izlaz i dalje odabire tablica usmjeravanja. Samo vezanje ne premješta u tunel promet koji nema rutu, i to je pogreška za većinom izvještaja "vezao sam ga, a ipak izlazi pogrešnim putem".

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

Alati više razine nude istu ideju: curl --interface 10.8.0.2, CURLOPT_INTERFACE u PHP-u i argument source_address u HTTP klijentima za Python. Adresa mora pripadati tunelu, a tipfeler se ovdje pokazuje kao obična pogreška veze, ne kao pritužba na usmjeravanje. Vezanje na ime uređaja umjesto na adresu privilegij je Linuxa i ne prenosi se na Windows ili macOS, zato prijenosne skripte prosljeđuju adresu.

Linux: sparite vlasnika, a ne ime programa

Jezgra može usporediti vlasničkog korisnika socketa, pa namjenski račun postaje odabirač. Smjestite tunel u vlastitu tablicu usmjeravanja i tamo šaljite samo promet tog računa:

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

To radi samo ako tunel već nije zadana ruta. Pokrenite klijent s --route-nopull ili filtrirajte nametnuto preusmjeravanje pomoću --pull-filter ignore "redirect-gateway" na OpenVPN 2.4 i novijem, pa sami dodajte zapis u tablicu. Inače postoje obje zadane rute i pobjeđuje ona nižeg prioriteta. Namjerna inačica toga je usmjeriti zadanu rutu na gateway tunela ili to učiniti iz skripte za odspajanje: drži promet izvan interneta kad tunel padne, ali to je prekidač za nužni prekid, ne odabirač, i ostaje dok ga netko ne ukloni.

Jača inačica je mrežni prostor imena. Stvorite ga, pokrenite klijent unutra i pokrenite aplikaciju s ip netns exec. Ništa izvan prostora imena ne vidi sučelje tunela, pa aplikacija ne može slučajno pasti natrag na rutu hosta. Cijena je stvarna: prostor imena treba veth par za dosezanje fizičke mreže i vlastitu datoteku resolvera, jer prostor imena montiranja ne dijeli postavke razrješavanja hosta.

Dva načina kvara objašnjavaju većinu procurivanja. Razrješavanje naziva i dalje se odvija u resolveru hosta, pa upit izlazi izvan tunela čak i kad TCP veza ide unutra. A IPv6 treba svoje ip -6 rule, jer ga pravilo v4 ne pokriva.

Windows i macOS: ograničite vatrozid ili predajte proxy

Ni Windows nema odabirač rute po aplikaciji, ali pravila vatrozida mogu se ograničiti na profil, a VPN adapter može se klasificirati kao javni dok kućni LAN ostaje privatan. Stvorite pravila blokiranja odlaznog prometa za program na profilima Privatno i Domena, ostavite Javno otvoreno, i aplikacija može dosegnuti mrežu samo kroz tunel. Najprije postavite mrežnu kategoriju veze, zatim u nadzornoj ploči vatrozida potvrdite da je pravilo pogodilo. To je blokada, ne ruta: pada u zatvorenom stanju kad tunel padne i ne može zaustaviti aplikaciju koja ignorira vatrozid.

macOS slijedi istu logiku s drugim alatima. SOCKS slušač dosegnut preko SSH-a najmanje je invazivna opcija, jer ssh -D 1080 user@host stvara jedan lokalni port i tim putem idu samo aplikacije konfigurirane da ga koriste. Pravilo pf može blokirati program po korisniku ili grupi, ali još uvijek ne može odabrati tunel samo za taj program. Tunnelblick uopće ne može filtrirati po domeni, jer rute rade s adresama; korisnici OpenConnecta posežu za vpn-slice kad poslužitelj pošalje preširok popis prefiksa.

Dvije zaobilaznice pokrivaju ono što alati platforme promašuju. Proširenja preglednika koja mijenjaju proxy po domeni praktičan su odgovor za "samo ovo web-mjesto", jer djeluju na aplikacijskom sloju gdje nazivi još postoje; pokrivaju jedan preglednik i ništa drugo. Gruba je opcija pokrenuti klijent dobavljača u virtualnom stroju, tako da gost posjeduje promjenu rute dok host zadržava svoj put, uz cijenu dva mrežna stoga za održavanje.

SOCKS skok za alate bez mogućnosti vezanja

Većina aplikacija može se usmjeriti na HTTP ili SOCKS proxy čak i kad o sučeljima ne znaju ništa. SSH klijent pruža ga bez promjene na strani poslužitelja:

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

Sve što je konfigurirano da koristi taj port izlazi na bastionu dok ostatak radne površine zadržava uobičajenu vezu. Lokalna instanca 3proxy vezana na adresu tunela čini isto za jedan port bez SSH-a, a stunnel pokriva jedan port umotan u TLS. Ograničenja su praktična: proxy prenosi samo protokole koji ga znaju koristiti, UDP treba SOCKS5 UDP pridruživanje koje postavka "SOCKS5" mnogih klijenata ne omogućuje, a DNS mora razriješiti proxy (socks5h u curl-u) ili naziv procuri do lokalnog resolvera.

Držite slušač na loopbacku osim ako ga treba drugi stroj.

Provjerite put snimanjem prometa, a ne statusnom porukom

Statusni prozori aplikacije opisuju postavku, ne paket. Snimite promet na oba sučelja i usporedite:

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

Ako se veza pojavi na fizičkom sučelju bez odgovarajućeg zapisa na tunelu, odabirač ne djeluje, što god klijent izvještavao. Provjerite odvojeno IPv6 i resolver te potražite drugi put, poput pomoćnog procesa ili naslijeđenog sistemskog proxyja.

Zatim odaberite granicu koja odgovara zahtjevu: proxy je dovoljan za jedno web-mjesto, UID pravilo za jedan račun, profil vatrozida kad veza mora pasti u zatvorenom stanju, a prostor imena jedina je opcija koja skriva tunel od svega izvan njega.

Povezani članci