VPN-nimiavaruuden sisällä oleva sovellus ei ole tavoitettavissa lähiverkosta
Verkkonimiavaruus antaa yhdelle ohjelmalle oman tunnelin ja oman loopbackin. Julkaise vain sen portti socat-hypyllä tai veth-parilla isäntäkoneen sijaan.
Palvelusi toimii koneella, tunneli on ylhäällä, ja silti työpöytäsi selain odottaa yhä vastausta. Mikään ei ole rikki tavallisessa mielessä: sovellus kuuntelee verkkonimiavaruuden sisällä, ja se pino on näkymätön lähiverkolle. Sen loopback kuuluu nimiavaruudelle, joten toisella koneella olevalla asiakkaalla ei ole osoitetta, joka saavuttaisi portin. Yksi tarkoituksellinen hyppy tai yksi veth-pari korjaa sen siirtämättä isäntäkoneen muuta osaa.
Miksi lähiverkon osoitteeseen ei vastaa mikään
Nimiavaruus on täydellinen verkkopino: rajapinnat, reitit, palomuurisäännöt ja yksityinen loopback. ip netns exec -komennon kautta käynnistetty prosessi näkee vain tämän pinon eikä mitään muuta, joten osoite, johon se sitoutuu, ratkeaa vain nimiavaruuden sisällä. Isäntäkoneen oma 127.0.0.1 on täysin eri loopback.
Siksi curl epäonnistuu isäntäkoneella, kun taas sama komento nimiavaruuden sisällä onnistuu. Sovellus on kunnossa; osoitetta ei yksinkertaisesti ole isäntäkoneen pinossa.
Julkaise yksi portti socat-hypyllä
socat siltaa kaksi pinoa käyttäjäavaruudessa, mikä riittää, kun yhden TCP-portin on ylitettävä raja. Isäntäkoneen puoli kuuntelee lähiverkossa ja käynnistää jokaiselle hyväksytylle yhteydelle toisen socatin nimiavaruuden sisällä, joka yhdistää sovelluksen loopbackiin. Sisempi prosessi tavoittaa sovelluksen täsmälleen kuten paikallinen asiakas. Nimiavaruuden reitityksessä ei muutu mikään, joten sovellus käyttää tunnelia edelleen ainoana uloskäyntinään.
socat TCP-LISTEN:9100,reuseaddr,fork EXEC:'ip netns exec vpn socat STDIO tcp-connect:127.0.0.1:9100',nofork
Ulkoinen prosessi tarvitsee rootin tai oikeuden astua nimiavaruuteen. Jos VPN putoaa, sovellus menettää tiensä ja julkaistu portti epäonnistuu suljetusti, mikä on juuri se käytös, jonka haluat vankilalta.
Käytä veth-paria, kun yli yksi portti ylittää rajan
veth-pari on oikea vastaus, kun useiden porttien tai protokollien on ylitettävä raja tai kun muiden isäntien on aloitettava yhteyksiä. Toinen pää jää isäntäkoneeseen, toinen siirtyy nimiavaruuteen, ja pieni /30 antaa molemmille puolille vakaan osoitteen. Sitten isäntäkoneen reitti lähettää nimiavaruuden osoitteen parin yli.
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
Älä lisää oletusreittiä isäntäkoneen kautta, ellet aio rikkoa vankilaa. Tunnelin on jäätävä uloskäynniksi, joten parin yli on tavoitettavissa vain julkaistu palveluosoite. Anna nimiavaruudelle myös oma resolver-tiedosto, koska ip netns exec lukee tiedoston /etc/netns/vpn/resolv.conf ja ilman sitä nimien ratkaisu vankilan sisällä on tyhjä.
Testaa toiselta koneelta, älä isäntäkoneelta
Aja testi toiselta koneelta, koska isäntäkone voi tavoittaa paikallisen kuuntelijan teitä, jotka eivät kerro lähiverkosta mitään. Tarkista ensin, mihin sovellus todella sitoutui nimiavaruuden sisällä, ja yhdistä sitten ulkopuolelta julkaistuun osoitteeseen. Sitoutuminen jokaiseen osoitteeseen siellä ei levennä vankilaa, koska jokerimerkki kuuluu yhä nimiavaruudelle eikä lähiverkko voi nähdä sitä.
ip netns exec vpn ss -lntp
Jos yhteys isäntäkoneelta toimii ja lähiverkosta ei, puuttuva osa on hyppy tai reitti, ei sidontaosoite. Käynnistä OpenVPN nimiavaruuden sisällä sen sijaan, että siirtäisit sinne elävän tun-laitteen, sillä rajapinnan siirtäminen sammuttaa sen ja voi tyhjentää reittejä, joita et sen jälkeen voi korjata ulkopuolelta. Pidä palautuskomennot konsolissa, älä vankilan sisällä.