SOCKS5-proxy for OpenVPN: TCP-tunnel eller proxy for appene?
En proxy videresender en strøm, ikke et datagram. Sammenlign en TCP-tunnel bak socks-proxy med en redsocks-omdirigering, og se hvor hvert design svikter først.
Nettverk som bare tillater utgående trafikk via en proxy, er der en fungerende profil plutselig dør. Proxyadressen er den minst interessante variabelen i den feilen. Alt avgjøres av formen på trafikken proxyen skal videresende, fordi disse proxyene sender en bytestrøm, og en UDP-tunnel er ikke det. Det etterlater to arkitekturer, og de bryter sammen på forskjellige steder.
Én begrensning avgjør designet
SOCKS5 spesifiserer riktignok en UDP-tilknytningsmodus. Proxy-støtten i OpenVPN-klienten er likevel bygget rundt strømmer: socks-proxy er dokumentert for TCP-profiler, og en HTTP CONNECT-proxy har ingen vei for datagrammer i det hele tatt. Én linje dokumentasjon avgjør arkitekturen før du rører en konfigurasjonsfil.
Spørsmålet er derfor ikke hvilken proxy du skal velge. Det er om tunnelen blir en strøm, eller forblir et datagram og lar noe annet ta seg av proxyingen.
Alternativ A: gjør tunnelen til en strøm
Dette krever en server med en TCP-lytter og en klientprofil som navngir proxyen. Begge deler er nødvendige, og serversiden er den folk glemmer:
proto tcp-client
remote vpn.example.net 443
socks-proxy 127.0.0.1 1080Bytt ut den siste linjen med http-proxy proxy.internal 8080 når proxyen snakker HTTP, og legg til en påloggingsfil hvis den krever det. Proxyen må være villig til å utføre CONNECT til VPN-porten din, og serveren må svare på TCP; en lytter som bare er UDP, ignorerer forsøket. Å velge 443 er et praktisk trekk, fordi mange restriktive nettverk tillater det og lite annet.
Prisen er TCP stablet på TCP. Ett tapt ytre segment stopper hver indre strøm som deler den forbindelsen, så gjenoppretting som vanligvis ville vært uavhengig, blir delt. Oppsettet tar også lengre tid, og en ustabil ytre vei blir en ustabil tunnel i stedet for en treg.
Alternativ B: la tunnelen være i fred
Når tunnelen må bli på UDP, er ikke tunnelen stedet der du konfigurerer noe. I stedet omdirigeres utgående TCP fra applikasjoner til en lokal SOCKS-lytter, og applikasjonene får aldri vite at en proxy finnes. På Linux er det vanligvis redsocks pluss en NAT REDIRECT-regel i nat-tabellen.
Igjen bare TCP. En HTTP-bare-proxy som privoxy kan ikke videresende vilkårlige protokoller, og dette designet legger heller ikke til datagramstøtte for applikasjonene.
Å fortelle hver applikasjon om proxyen direkte er vanligvis bedre der programvaren støtter det. Det er lettere å revidere, og det svikter et sted du faktisk kan se.
Hvor hvert alternativ svikter
Alternativ A svikter når serveren mangler en TCP-lytter, når proxyen avviser CONNECT-målet, eller når den ytre strømmen strupes under det tunnelen trenger. De to første etterlater en oppføring i proxy-loggen; det tredje etterlater en forbindelse som etableres og deretter føles feil. Les den loggen før du redigerer profilen, fordi den skiller et tillatelsesproblem fra et kapasitetsproblem. En fullført CONNECT flytter undersøkelsen inn i tunnelen.
Alternativ B svikter for alt som trenger datagrammer, for protokoller proxyen ikke forstår, og stille på verter der omdirigeringsregelen finnes, men rutingen sender trafikken forbi den.
Ingen av alternativene endrer enhetskravet. Pakker trenger fortsatt en TUN- eller TAP-node før kjernen vil rute dem, så prosessen trenger fortsatt tillatelse på /dev/net/tun. En innpakning endrer hva som skjer etter at noden er åpen, ikke om du trenger en.
Bevis hvilken vei du bygde
Se på sockets i stedet for skuffikonet. VPN-prosessen skal holde en etablert forbindelse til proxyadressen, og proxyen skal ha logget målet den ble bedt om å nå:
ss -tnp | grep openvpnNå deretter ut etter et mål som bare tunnelen kan betjene, og et navn som bare tunnelens resolver kan svare på. En fullført proxyforbindelse med en død tunnel betyr vanligvis at den andre enden aldri tilbød transporten som er navngitt i profilen din.
Noter transporten og proxyen som godtar, på et varig sted. Når samme profil svikter på et annet nettverk, utelukker eller bekrefter notatet proxyen i løpet av sekunder.