Lietotne VPN nosaukumtelpā nav sasniedzama no LAN
Tīkla nosaukumtelpa vienai programmai dod savu tuneli un savu loopback. Publicējiet tikai tās portu ar socat lēcienu vai veth pāri, nevis visu resursdatoru.
Jūsu pakalpojums darbojas mašīnā, tunelis ir pacelts, un tomēr pārlūks uz jūsu galda joprojām gaida atbildi. Parastajā nozīmē nekas nav salūzis: lietotne klausās tīkla nosaukumtelpas iekšienē, un šis steks LAN nav redzams. Tās loopback pieder nosaukumtelpai, tāpēc klientam citā mašīnā nav adreses, kas sasniegtu portu. Viens apzināts lēciens vai viens veth pāris to salabo, nepārvietojot pārējo resursdatoru.
Kāpēc LAN adresē nekas neatbild
Nosaukumtelpa ir pilnīgs tīkla steks: saskarnes, maršruti, ugunsmūra noteikumi un privāts loopback. Process, kas palaists ar ip netns exec, redz tikai šo steku un neko citu, tāpēc adrese, pie kuras tas piesaistās, tiek atrisināta tikai nosaukumtelpas iekšienē. Paša resursdatora 127.0.0.1 ir pavisam cits loopback.
Tāpēc curl resursdatorā neizdodas, bet tā pati komanda nosaukumtelpas iekšienē izdodas. Lietotne ir vesela; adreses vienkārši nav resursdatora stekā.
Publicējiet vienu portu ar socat lēcienu
socat savieno abus stekus lietotāja telpā, un ar to pietiek, kad jāšķērso viens TCP ports. Resursdatora puse klausās LAN un katram pieņemtajam savienojumam nosaukumtelpas iekšienē palaiž otru socat, kas savienojas ar lietotnes loopback. Iekšējais process sasniedz lietotni tieši tā, kā to darītu vietējais klients. Nosaukumtelpas maršrutēšanā nekas nemainās, tāpēc lietotne turpina izmantot tuneli kā vienīgo izeju.
socat TCP-LISTEN:9100,reuseaddr,fork EXEC:'ip netns exec vpn socat STDIO tcp-connect:127.0.0.1:9100',nofork
Ārējam procesam nepieciešams root vai iespēja iekļūt nosaukumtelpā. Ja VPN nokrīt, lietotne zaudē ceļu, un publicētais ports sabojājas aizvērtā stāvoklī, un tā ir uzvedība, ko vēlaties no cietuma.
Izmantojiet veth pāri, kad šķērso vairāk nekā viens ports
veth pāris ir pareizā atbilde, kad jāšķērso vairāki porti vai protokoli, vai kad citiem resursdatoriem jāuzsāk savienojumi. Viens gals paliek resursdatorā, otrs pārceļas uz nosaukumtelpu, un mazs /30 abām pusēm dod stabilu adresi. Pēc tam resursdatora maršruts sūta nosaukumtelpas adresi pāri pārim.
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
Nepievienojiet noklusējuma maršrutu caur resursdatoru, ja vien neplānojat salauzt cietumu. Tunelim jāpaliek izejai, tāpēc pa pāri ir sasniedzama tikai publicētā pakalpojuma adrese. Dodiet nosaukumtelpai arī savu resolver failu, jo ip netns exec lasa /etc/netns/vpn/resolv.conf, un bez tā vārdu izšķiršana cietuma iekšienē ir tukša.
Pārbaudiet no citas mašīnas, ne no resursdatora
Palaidiet testu no otras mašīnas, jo resursdators var sasniegt vietējo klausītāju pa ceļiem, kas neko nepasaka par LAN. Vispirms pārbaudiet, kam lietotne nosaukumtelpas iekšienē faktiski piesaistījās, pēc tam no ārpuses savienojieties ar publicēto adresi. Piesaiste visām adresēm tur nepaplašina cietumu, jo aizstājējsimbols joprojām pieder nosaukumtelpai, un LAN to nevar redzēt.
ip netns exec vpn ss -lntp
Ja savienojums no resursdatora darbojas, bet no LAN ne, trūkstošā daļa ir lēciens vai maršruts, nevis piesaistes adrese. Palaidiet OpenVPN nosaukumtelpas iekšienē, nevis pārvietojiet tajā dzīvu tun ierīci, jo saskarnes pārvietošana to izslēdz un var izdzēst maršrutus, kurus pēc tam no ārpuses nevarēsiet salabot. Turiet atjaunošanas komandas konsolē, nevis cietuma iekšienē.