Aplikacija unutar VPN imenskog prostora nedostupna je s LAN-a
Mrežni imenski prostor daje jednom programu vlastiti tunel i vlastitu loopback adresu. Objavite samo njegov port kroz socat skok ili veth par, umjesto kroz host.
Vaša usluga radi na računalu, tunel je podignut, a preglednik na vašem stolu još uvijek čeka odgovor. Ništa nije pokvareno u uobičajenom smislu: aplikacija sluša unutar mrežnog imenskog prostora, a taj je stog nevidljiv za LAN. Njezina loopback adresa pripada imenskom prostoru, pa klijent na drugom računalu nema adresu koja stiže do porta. Jedan namjerni skok ili jedan veth par to popravlja bez premještanja ostatka hosta.
Zašto ništa ne odgovara na LAN adresi
Imenski prostor je potpuni mrežni stog: sučelja, rute, pravila vatrozida i privatna loopback adresa. Proces pokrenut kroz ip netns exec vidi taj stog i ništa drugo, pa se adresa koju veže razrješava samo unutar imenskog prostora. Vlastita 127.0.0.1 hosta posve je druga loopback adresa.
Zato curl na hostu ne uspijeva, dok isti nalog unutar imenskog prostora uspijeva. Aplikacija je zdrava; adresa jednostavno ne postoji u stogu hosta.
Objavite jedan port socat skokom
socat premošćuje dva stoga u korisničkom prostoru, što je dovoljno kada preko granice mora prijeći jedan TCP port. Strana hosta sluša na LAN-u i za svaku prihvaćenu vezu pokreće drugi socat unutar imenskog prostora koji se spaja na loopback adresu aplikacije. Unutarnji proces dolazi do aplikacije točno kao lokalni klijent. Ništa se u usmjeravanju imenskog prostora ne mijenja, pa aplikacija nastavlja koristiti tunel kao jedini izlaz.
socat TCP-LISTEN:9100,reuseaddr,fork EXEC:'ip netns exec vpn socat STDIO tcp-connect:127.0.0.1:9100',nofork
Vanjskom procesu treba root ili mogućnost ulaska u imenski prostor. Ako VPN padne, aplikacija gubi put, a objavljeni port se zatvara, što je ponašanje koje želite od zatvora.
Upotrijebite veth par kada prelazi više od jednog porta
veth par je pravi odgovor kada mora prijeći nekoliko portova ili protokola ili kada drugi hostovi moraju započinjati veze. Jedan kraj ostaje u hostu, drugi prelazi u imenski prostor, a mali /30 daje objema stranama stabilnu adresu. Ruta hosta zatim šalje adresu imenskog prostora preko para.
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 dodajte zadanu rutu kroz host ako ne namjeravate slomiti zatvor. Tunel treba ostati izlaz, pa je preko para dostupna samo objavljena adresa usluge. Dajte imenskom prostoru i vlastitu datoteku razrješivača, jer ip netns exec čita /etc/netns/vpn/resolv.conf i bez nje je razrješavanje imena unutar zatvora prazno.
Testirajte s drugog računala, ne s hosta
Pokrenite test s drugog računala, jer host može doći do lokalnog slušatelja putovima koji ne govore ništa o LAN-u. Najprije provjerite na što se aplikacija doista vezala unutar imenskog prostora, zatim se izvana spojite na objavljenu adresu. Vezanje na svaku adresu tamo ne proširuje zatvor, jer wildcard i dalje pripada imenskom prostoru i LAN ga ne može vidjeti.
ip netns exec vpn ss -lntp
Ako veza s hosta radi, a veza s LAN-a ne, dio koji nedostaje je skok ili ruta, a ne adresa vezanja. Pokrenite OpenVPN unutar imenskog prostora umjesto da tamo premještate aktivni tun uređaj, jer premještanje sučelja ga isključuje i može počistiti rute koje zatim ne možete popraviti izvana. Držite naredbe za oporavak na konzoli, a ne unutar zatvora.