Vaša storitev deluje na stroju, tunel je vzpostavljen, pa vendar brskalnik na vaši mizi še vedno čaka na odgovor. V običajnem smislu ni nič pokvarjeno: aplikacija posluša znotraj omrežnega imenskega prostora, in ta sklad je za LAN neviden. Njena povratna zanka pripada imenskemu prostoru, zato odjemalec na drugem stroju nima naslova, ki bi dosegel vrata. En namerni skok ali en par veth to popravi, ne da bi premaknili preostanek gostitelja.

Zakaj se na naslovu LAN nihče ne odziva

Imenski prostor je popoln omrežni sklad: vmesniki, poti, pravila požarnega zidu in zasebna povratna zanka. Proces, zagnan prek ip netns exec, vidi samo ta sklad in nič drugega, zato se naslov, na katerega se veže, razreši le znotraj imenskega prostora. Lasten 127.0.0.1 gostitelja je povsem druga povratna zanka.

Zato curl na gostitelju spodleti, medtem ko ista ukaz znotraj imenskega prostora uspe. Aplikacija je zdrava; naslova preprosto ni v skladu gostitelja.

Objavite ena vrata s skokom socat

socat poveže oba sklada v uporabniškem prostoru, kar zadostuje, ko mora prečkati ena sama vrata TCP. Stran gostitelja posluša v LAN in za vsako sprejeto povezavo zažene drugi socat znotraj imenskega prostora, ki se poveže s povratno zanko aplikacije. Notranji proces doseže aplikacijo natanko tako, kot bi to storil lokalni odjemalec. V usmerjanju imenskega prostora se nič ne spremeni, zato aplikacija še naprej uporablja tunel kot edini izhod.

socat TCP-LISTEN:9100,reuseaddr,fork EXEC:'ip netns exec vpn socat STDIO tcp-connect:127.0.0.1:9100',nofork

Zunanji proces potrebuje root ali zmožnost vstopa v imenski prostor. Če VPN pade, aplikacija izgubi pot, objavljena vrata pa spodletijo zaprta, in to je vedenje, ki ga želite od ječe.

Uporabite par veth, ko prečka več kot ena vrata

Par veth je pravi odgovor, ko mora prečkati več vrat ali protokolov, ali ko morajo drugi gostitelji začeti povezave. En konec ostane v gostitelju, drugi se premakne v imenski prostor, majhen /30 pa da obema stranema stabilen naslov. Nato pot gostitelja pošlje naslov imenskega prostora čez par.

ip link add veth0 type veth peer name veth1
ip link set veth1 netns vpn
ip addr add 10.77.0.1/30 dev veth0
ip link set veth0 up
ip netns exec vpn ip addr add 10.77.0.2/30 dev veth1
ip netns exec vpn ip link set veth1 up

Ne dodajajte privzete poti skozi gostitelja, razen če nameravate razbiti ječo. Tunel mora ostati izhod, zato je čez par dosegljiv le objavljeni naslov storitve. Dajte imenskemu prostoru tudi lastno datoteko resolverja, ker ip netns exec bere /etc/netns/vpn/resolv.conf in brez nje je razreševanje imen v ječi prazno.

Preizkusite z drugega stroja, ne z gostitelja

Test zaženite z drugega stroja, ker gostitelj lahko doseže lokalnega poslušalca po poteh, ki o LAN ne povedo nič. Najprej preverite, na kaj se je aplikacija znotraj imenskega prostora v resnici vezala, nato se od zunaj povežite z objavljenim naslovom. Vezava na vse naslove tam ječe ne razširi, ker nadomestni znak še vedno pripada imenskemu prostoru in LAN ga ne more videti.

ip netns exec vpn ss -lntp

Če povezava z gostitelja deluje, tista iz LAN pa ne, je manjkajoči del skok ali pot, ne naslov vezave. Zaženite OpenVPN znotraj imenskega prostora, namesto da bi tja premaknili delujočo napravo tun, saj premik vmesnika to izklopi in lahko izbriše poti, ki jih pozneje od zunaj ne boste mogli popraviti. Ukaze za obnovitev imejte na konzoli, ne v ječi.

Sorodni članki