Tunel sa pripája z domácej linky a zasekne sa v hotelovej alebo kancelárskej sieti, a presun servera na port 443 nič nezmenil. Ten výsledok je dosť častý na to, aby mal tvar: port bol tá ľahká časť a zvyšok rozhodnutia patrí všetkému, čo sedí medzi klientom a serverom. Väčšinu prípadov rozhodnú dve otázky a ani jedna nie je o šifrách. Prijíma sieť TLS podanie ruky na tú adresu a udržiava klient trasu k svojmu vlastnému obalu, kým je tunel hore?

Podanie ruky prezradí viac než číslo

Natívny VPN poslucháč na TCP 443 hovorí svojím protokolom od prvého paketu. ClientHello má pole verzie, náhodnú hodnotu a zoznam rozšírení a zariadenie, ktoré prečíta niekoľko stoviek bajtov, rozdiel rozpozná bez toho, aby čokoľvek dešifrovalo. Čísla portov sa dajú uspokojiť lacno a tvar protokolu je to, čo filter skutočne kontroluje. Pravidlá sa zvyčajne píšu aj podľa protokolov, takže politika, ktorá prehliada TLS, o UDP nehovorí nič.

Transparentná proxy, ktorá trvá na platnej TLS relácii, spojenie počas nastavovania zahodí, často po tom, čo TCP podanie ruky skončí. Ten detail je dôležitý neskôr, pretože znamená, že klientsky log sa zastaví po vytvorení socketu.

Obalenie toku vytvára dve miesta zlyhania

TLS obal, ako je stunnel, obnoví očakávaný tvar: klient sa pripojí k miestnemu poslucháčovi, obal otvorí skutočnú TLS reláciu k serveru na 443 a druhý obal na serveri odovzdá dešifrované bajty VPN démonovi. Vonkajšia relácia teraz vyzerá ako akékoľvek iné HTTPS spojenie. VPN démon na serveri by mal počúvať len na loopbacku, pretože nič mimo obalu sa k nemu nemusí dostať.

Pre ten návrh sa musia zísť tri oddelené veci. Profil klienta mieri na miestneho poslucháča, serverový certifikát zodpovedá menu, ktoré klient overuje, a presmerovanie na strane servera cieli na port, ktorý démon naozaj používa. Pomýlite sa v ktorejkoľvek z nich a spojenie zomrie skôr, než sa dostane k VPN vrstve. Nesúlad certifikátu sa potom prejaví ako chyba obalu, nie ako chyba VPN, a preto sa oba logy oplatí čítať vedľa seba.

Trasa k obalu je pasca

Hneď ako tunel naskočí, predvolená trasa mieri doň a vonkajšia TLS relácia potrebuje cestu, ktorá nevojde do tunela, ktorý nesie. Bežný VPN klient chráni adresu, na ktorú volá; obalený klient volá svoj vlastný loopback, takže cieľová adresa obalu je pre tú ochranu neviditeľná.

sudo ip route add 198.51.100.20 via 192.168.0.1
sudo openvpn --config client.ovpn
sudo ip route del 198.51.100.20

Presné adresy doplníte sami a trasa musí existovať celý život spojenia, nie len pri štarte. Malý obalový skript, ktorý trasu pridá pred klientom a po ňom ju odoberie, je spoľahlivejší než zapamätaný príkaz.

Na Androide je ekvivalentom tej výnimky nastavenie pre každú aplikáciu: vylúčte obalovú aplikáciu z tunela, aby jej vlastná prevádzka odchádzala cez mobilné spojenie. Bez vylúčenia sa obal smeruje do tunela, ktorý sa snaží postaviť, a slučka opätovného pripojenia vyzerá ako problém servera.

Prečítajte si časy, kým čokoľvek zmeníte

Relácia, ktorá zomrie po rovnakom intervale zakaždým, je podpis politiky, nie kryptografické zlyhanie, a dlhodobé limity toku dávajú presne taký vzorec. Spojenie, ktoré sa resetuje hneď po podaní ruky, naznačuje proxy, ktorému sa nepáčila reťaz certifikátov.

Porovnajte vydavateľa certifikátu bežnej HTTPS stránky z oboch sietí. Ak sa vydavateľ v obmedzenej sieti líši, niečo ukončuje TLS v strede a žiadny obal to odpočúvanie neprežije bez zmeny. To isté porovnanie vám povie, či blok mieri na meno vášho servera alebo na každú TLS reláciu na tej adrese.

Zapíšte pozorované správanie: ako dlho relácia vydržala, či sa socket otvoril, či obal zalogoval podanie ruky. Každý z tých údajov zužuje ďalší test.

Testujte jednu premennú naraz

Najprv skontrolujte UDP, pretože niektoré siete ho zahadzujú úplne a zlyhanie UDP o 443 nehovorí nič. Potom skúste TCP 443 bez obalu, potom obal na 443. Čítajte klientsky log v každom kroku a zastavte sa, hneď ako sa správanie zmení.

Meňte jeden prvok na pokus. Nový port, nový obal a nová šifra v jednom behu vás nechajú bez odpovede, ktorý z troch bol dôležitý.

Súvisiace články