Ien rûte út dit wurkstasjon is in SOCKS-proxy, en OpenVPN derachter meldt in ferbiningstimeout sûnder wat brûkber. In browser op deselde masine wurket troch dy proxy, de oanmeldgegevens binne goed, en de poarte antwurdet. Trije dingen ferskille faak genôch om earst te kontrolearjen: de SOCKS-ferzje dy't de proxy praat, it ferfier dat de klient keas, en wêr't de nammeroppeling bart. Befêstigje elk dêrfan foardat jo beslute dat de firewall skuldich is.

Ferienje de SOCKS-ferzje foar de firewall

Community-OpenVPN praat SOCKS5 foar socks-proxy. Rjochtsje it op in proxy dy't allinnich SOCKS4 biedt, en de TCP-ferbining iepenet, en dan stekket it, om't de klient wachtet op in antwurd op in groetnis dy't de oare kant nea parset. Fan bûten liket dat stekken krekt op in filtere poarte, en dêrom komt de ferzjekwestje foar elke firewallregel. In SOCKS-bewuste oanfraach beslist it yn ien opdracht.

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

In foltôge oanfraach bewiist twa dingen tagelyk: de proxy akseptearre de SOCKS-oanfraach en it rjochte de namme op. Gjin URL-skema is nedich, om't curl in keale host as HTTP behannelet, wat foar dizze test genôch is.

Dy oanfraach slút ek de flater út dy't it kliïntloch ferberget. In proxy kin de browser tastean en dochs de VPN-bestimming wegerje, en yn dat gefal bart de wegering by CONNECT, foar elke VPN-autentikaasje. OpenVPN meldt allinnich in timeout, dus it antwurd fan de proxy sels is it bewiis dat jo nedich hawwe.

It ferfier moat oan beide kanten TCP wêze

SOCKS5 draacht hjir in TCP-stream, dus de tunnel sels hat proto tcp-client nedich. In profyl dat noch op UDP stiet, sil net troch dit paad wurkje, om't de klient de UDP-assosiaasjemodus fan it protokol net brûkt. It profyl omsette is in echte feroaring en gjin formaliteit: de oare kant moat op deselde poarte nei TCP lústerje. De lading wurdt dan TCP yn TCP, wêr't in ferlern segmint twa kear werstjoerd wurdt en it tempo efterút giet, wat ynteraktive sesjes folle mear fernimme as grutte oerdrachten.

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

De rjochtline nimt de proxyhost, in opsjonele poarte en in opsjonele oanmeldbestân. Set dy yn it profyl sels, sadat in kopy earne oars itselde gedraacht.

Beheine de hiele ketting ta ien kontener

De ketting op 'e host dwaan betsjut syn standertrûte oernimme en de resolver yn in steat litte dy't nimmen letter útlizze kin. In namespace of in kontener beheine it ynstee, sadat de host syn eigen paad hâldt wylst de SOCKS-hop en de tunnel byinoar libje. Dêryn komt neat omheech sûnder in tunnelapparaat, de rjochten om dat apparaat te konfigurearjen en in berikbere proxy. In Compose-tsjinst krijt dat mei cap_add: NET_ADMIN en in bind-montearre /dev/net/tun.

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

Dat pear is smeller as de kontener mei folsleine rjochten draaie, en it is de hiele apparatetoegong dy't nedich is. In Tor-klient of in aparte proxykontener kin de lústerder leverje. Bynt it yn elk gefal oan loopback, en berik it út de namespace wei fia de host ynstee fan de proxy oan it netwurk bleat te stellen.

Nammeroppeling is wêr't de isolaasje mislearret

In tunnel dy't pakketten draacht wylst er de resolver fan 'e host freget, hat neat isolearre. Twa dingen meitsje de isolaasje echt: de namespace hat in eigen resolver, en syn fragen reizgje troch de proxy of de tunnel, nea oer de fysike ynterface. Brûk twa nammen foar de test: ien dy't allinnich efter de tunnel bestiet, en in iepenbiere dy't itselde paad folgje moatte soe.

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

As de namme oan 'e oare kant oplost en de iepenbiere net, is de ketting seletyf yn stee fan stikken, en it ferskil fertelt jo hokker paad elke fraach naam. As beide fan 'e host ôf oplosse mar gjinien yn 'e kontener, lient de kontener noch de resolver fan 'e host. Skriuw it resolverbestân op dat jo fûnen, want dat is de ynstelling dy't feroare wurde moat.

Bewiis elke hop yn oarder

De list is koart. In SOCKS5-oanfraach krijt in antwurd, de tunnel berikt syn lústerder troch de proxy, en pakketten dy't de namespace ferlitte drage it adres dat de oare kant ferwachtet. Befêstigje elk ien foar ien ynstee fan mear konfiguraasje op te steapeljen. As de klient seit ferbûn te wêzen en neat beweecht, sit de breuk hast altyd yn it twadde of tredde feit.

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

Skriuw de kombinaasje op dy't wurke: SOCKS-ferzje, ferfier, resolver en namespace-ynstellingen. Dizze ketting in twadde kear út it ûnthâld oplosse kostet mear as de notysje. Hâld dy fjouwer feiten yn it ticket yn stee fan yn in chatthread.

In ketting dy't ferbûn meldt en neat trochlit, is meastentiids mislearre by de hop dy't jo noch net bewiisd hawwe. Test dy hop foardat jo noch in laach tafoegje.

Relatearre artikelen