Ena od poti ven s te delovne postaje je proxy SOCKS in OpenVPN za njim poroča o poteku časa povezave brez kakršnih koli koristnih podrobnosti. Brskalnik na istem stroju deluje prek tega proxyja, poverilnice so pravilne in vrata odgovarjajo. Tri stvari se dovolj pogosto razhajajo, da jih velja preveriti najprej: različica SOCKS, ki jo govori proxy, prenos, ki ga je izbral odjemalec, in mesto, kjer poteka razreševanje imen. Potrdite vsako od njih, preden obtožite požarni zid.

Uskladite različico SOCKS pred požarnim zidom

Skupnostni OpenVPN govori SOCKS5 za socks-proxy. Usmerite ga na proxy, ki ponuja samo SOCKS4, in TCP povezava se odpre, nato pa obstane, ker odjemalec čaka na odgovor na pozdrav, ki ga druga stran nikoli ne razčleni. Od zunaj je ta zastoj videti natanko kot filtrirana vrata, zato vprašanje različice pride pred vsakim pravilom požarnega zidu. En prenos s poznavanjem SOCKS to reši z enim ukazom.

curl --socks5-hostname 127.0.0.1:9050 gw.lab.example

Zaključena zahteva dokaže dve stvari hkrati: proxy je sprejel zahtevo SOCKS in razrešil ime. Shema URL ni potrebna, ker curl golo ime gostitelja obravnava kot HTTP, in to tej preizkušnji zadostuje.

Ta prenos izključi tudi napako, ki jo skriva dnevnik odjemalca. Proxy lahko dovoli brskalnik in vseeno zavrne cilj VPN, pri čemer se zavrnitev zgodi na CONNECT, pred kakršno koli overitvijo VPN. OpenVPN poroča samo o poteku časa, zato je lasten odgovor proxyja dokaz, ki ga potrebujete.

Prenos mora biti TCP na obeh straneh

SOCKS5 tu prenaša tok TCP, zato sam tunel potrebuje proto tcp-client. Profil, ki je še vedno nastavljen na UDP, po tej poti ne bo deloval, ker odjemalec ne uporablja načina asociacije UDP tega protokola. Preklop profila je resnična sprememba, ne formalnost: oddaljena stran mora poslušati TCP na istih vratih. Nato tovor postane TCP v TCP, kjer se izgubljeni segment dvakrat znova pošlje in tempo pade, kar interaktivne seje občutijo veliko bolj kot veliki prenosi.

proto tcp-client
remote gw.lab.example 8443
socks-proxy 127.0.0.1 9050

Ta direktiva sprejme gostitelja proxyja, neobvezna vrata in neobvezno datoteko s poverilnicami. Postavite jih v sam profil, da se kopija drugje obnaša enako.

Zaprite celotno verigo v en vsebnik

Izvajanje verige na gostitelju pomeni prevzem privzete poti in pustitev razreševalnika v stanju, ki ga kasneje nihče ne bo znal razložiti. Imenski prostor ali vsebnik jo namesto tega omeji, zato gostitelj obdrži svojo pot, medtem ko skok SOCKS in tunel živita skupaj. V notranjosti se nič ne dvigne brez tunelske naprave, pravic za njeno konfiguracijo in dosegljivega proxyja. Storitev Compose to dobi z cap_add: NET_ADMIN in bind-montirano /dev/net/tun.

cap_add:
  - NET_ADMIN
devices:
  - /dev/net/tun:/dev/net/tun

Ta par je ožji od zagona vsebnika s polnimi pravicami in to je ves potrebni dostop do naprave. Odjemalec Tor ali ločen vsebnik proxyja lahko priskrbi poslušalca. V obeh primerih ga privežite na loopback in do njega pridite iz imenskega prostora prek gostitelja, namesto da proxy izpostavite omrežju.

Razreševanje imen je mesto, kjer izolacija odpove

Tunel, ki prenaša pakete in obenem sprašuje razreševalnik gostitelja, ni ničesar izoliral. Dve stvari naredita izolacijo resnično: imenski prostor ima svoj razreševalnik in njegove poizvedbe gredo skozi proxy ali tunel, nikoli skozi fizični vmesnik. Za preizkus uporabite dve imeni: eno, ki obstaja samo za tunelom, in eno javno, ki bi moralo iti po isti poti.

docker compose exec vpn cat /etc/resolv.conf
docker compose exec vpn getent hosts internal.lab.example

Če se oddaljeno ime razreši in javno ne, je veriga selektivna, ne pokvarjena, in razlika pove, po kateri poti je šla vsaka poizvedba. Če se oba razrešita z gostitelja, a nobeden znotraj vsebnika, si vsebnik še vedno izposoja razreševalnik gostitelja. Zapišite najdeno datoteko razreševalnika, ker je to nastavitev, ki jo je treba spremeniti.

Dokažite vsak skok po vrsti

Seznam je kratek. Zahteva SOCKS5 dobi odgovor, tunel doseže svojega poslušalca prek proxyja in paketi, ki zapustijo imenski prostor, nosijo naslov, ki ga pričakuje oddaljena stran. Potrjujte enega za drugim, namesto da dodajate konfiguracijo. Ko odjemalec pravi „povezano“, nič pa se ne premakne, je prelom skoraj vedno v drugem ali tretjem dejstvu.

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

Zapišite kombinacijo, ki je delovala: različica SOCKS, prenos, razreševalnik in nastavitve imenskega prostora. Razreševanje te verige drugič po spominu stane več kot zapisek. Te štiri dejstva hranite v zahtevku, ne v klepetu.

Veriga, ki poroča „povezano“ in ničesar ne prepusti, običajno odpove na skoku, ki ga še niste dokazali. Preizkusite ta skok, preden dodate še eno plast.

Sorodni članki