OpenVPN cez SOCKS5: zladiť verziu, transport a DNS
Reťaz SOCKS zlyhá, keď sa verzia proxy, transport alebo cesta DNS nezhodujú. Zlaďte SOCKS5, prenášajte TCP a držte reťaz v jednom mennom priestore.
Jedna z ciest von z tejto pracovnej stanice je proxy SOCKS a OpenVPN za ním hlási uplynutie času pripojenia bez akýchkoľvek užitočných podrobností. Prehliadač na tom istom stroji funguje cez to proxy, prihlasovacie údaje sú správne a port odpovedá. Tri veci sa dosť často rozchádzajú, aby sa overili prvé: verzia SOCKS, ktorou proxy hovorí, transport, ktorý klient vybral, a miesto, kde prebieha rozlišovanie názvov. Potvrďte každú z nich, skôr než obviníte firewall.
Zlaďte verziu SOCKS pred firewallom
Community OpenVPN hovorí SOCKS5 pre socks-proxy. Nasmerujte ho na proxy, ktoré ponúka iba SOCKS4, a TCP spojenie sa otvorí, potom sa zastaví, lebo klient čaká na odpoveď na pozdrav, ktorý druhá strana nikdy neanalyzuje. Zvonku toto zastavenie vyzerá presne ako filtrovaný port, preto otázka verzie prichádza pred každým pravidlom firewallu. Jedno stiahnutie so znalosťou SOCKS to vyrieši jedným príkazom.
curl --socks5-hostname 127.0.0.1:9050 gw.lab.example
Dokončená požiadavka dokazuje dve veci naraz: proxy prijalo požiadavku SOCKS a rozlíšilo názov. Schéma URL nie je potrebná, lebo curl považuje holý host za HTTP, a to tomuto testu stačí.
To stiahnutie vylučuje aj poruchu, ktorú denník klienta skrýva. Proxy môže povoliť prehliadač a napriek tomu odmietnuť cieľ VPN, pričom odmietnutie nastane na CONNECT, pred akýmkoľvek overením VPN. OpenVPN hlási iba uplynutie času, takže vlastná odpoveď proxy je dôkaz, ktorý potrebujete.
Transport musí byť TCP na oboch stranách
SOCKS5 tu prenáša TCP tok, takže samotný tunel potrebuje proto tcp-client. Profil stále nastavený na UDP touto cestou nefunguje, lebo klient nepoužíva režim asociácie UDP tohto protokolu. Prepnutie profilu je skutočná zmena, nie formalita: vzdialená strana musí počúvať TCP na tom istom porte. Potom sa obsah stane TCP v TCP, kde sa stratený segment posiela dvakrát znova a tempo klesá, čo interaktívne relácie pociťujú oveľa viac ako veľké prenosy.
proto tcp-client
remote gw.lab.example 8443
socks-proxy 127.0.0.1 9050
Táto direktíva prijíma host proxy, voliteľný port a voliteľný súbor prihlasovacích údajov. Umiestnite ich do samotného profilu, aby sa kópia inde správala rovnako.
Zatvorte celú reťaz do jedného kontajnera
Robenie reťaze na hoste znamená prevziať jeho predvolenú trasu a nechať rozlišovač v stave, ktorý neskôr nikto nevysvetlí. Menný priestor alebo kontajner ju namiesto toho ohraničia, takže host si zachová vlastnú cestu, kým skok SOCKS a tunel žijú spolu. Vnútri nič nevstane bez tunelového zariadenia, práv na jeho konfiguráciu a dostupného proxy. Služba Compose to získa s cap_add: NET_ADMIN a bind-montovaným /dev/net/tun.
cap_add:
- NET_ADMIN
devices:
- /dev/net/tun:/dev/net/tun
Táto dvojica je užšia než spúšťanie kontajnera s plnými právami, a to je celý potrebný prístup k zariadeniu. Klient Tor alebo samostatný kontajner proxy môže dodať počúvajúceho. V oboch prípadoch ho pripnite na loopback a dostaňte sa k nemu z menného priestoru cez host, namiesto vystavovania proxy do siete.
Rozlišovanie názvov je miesto, kde izolácia zlyháva
Tunel, ktorý prenáša pakety a zároveň sa pýta rozlišovača hosta, nič neizoloval. Dve veci robia izoláciu skutočnou: menný priestor má vlastný rozlišovač a jeho dopyty idú cez proxy alebo tunel, nikdy cez fyzické rozhranie. Na test použite dva názvy: jeden, ktorý existuje len za tunelom, a jeden verejný, ktorý by mal ísť tou istou cestou.
docker compose exec vpn cat /etc/resolv.conf
docker compose exec vpn getent hosts internal.lab.example
Ak sa vzdialený názov rozlíši a verejný nie, reťaz je selektívna, nie pokazená, a rozdiel hovorí, ktorou cestou šiel každý dopyt. Ak sa oba rozlíšia z hosta, ale ani jeden vnútri kontajnera, kontajner si stále požičiava rozlišovač hosta. Zapíšte nájdený súbor rozlišovača, lebo práve to je nastavenie, ktoré treba zmeniť.
Dokážte každý skok po poriadku
Zoznam je krátky. Požiadavka SOCKS5 dostane odpoveď, tunel sa dostane k svojmu počúvajúcemu cez proxy a pakety opúšťajúce menný priestor nesú adresu, ktorú vzdialená strana očakáva. Potvrdzujte po jednom, namiesto pridávania konfigurácie. Keď klient povie „pripojené“ a nič sa nehýbe, prerušenie je takmer vždy v druhom alebo treťom fakte.
curl --socks5-hostname 127.0.0.1:9050 gw.lab.example
docker compose exec vpn ip route get 203.0.113.10
docker compose exec vpn getent hosts internal.lab.example
Zapíšte kombináciu, ktorá fungovala: verzia SOCKS, transport, rozlišovač a nastavenia menného priestoru. Riešiť túto reťaz druhýkrát z pamäti stojí viac než poznámka. Držte tie štyri fakty v tikete, nie v chate.
Reťaz, ktorá hlási „pripojené“ a nič neprepustí, zvyčajne zlyhala na skoku, ktorý ste ešte nedokázali. Vyskúšajte ten skok, skôr než pridáte ďalšiu vrstvu.