Vaša služba beží na stroji, tunel je hore, a napriek tomu prehliadač na vašom stole stále čaká na odpoveď. V obvyklom zmysle nič nie je pokazené: aplikácia počúva vnútri sieťového menného priestoru, a ten stack je pre LAN neviditeľný. Jej slučka patrí mennému priestoru, takže klient na inom stroji nemá adresu, ktorá by dosiahla port. Jeden zámerný skok alebo jeden pár veth to napraví bez presúvania zvyšku hostiteľa.

Prečo na adrese LAN nič neodpovedá

Menný priestor je kompletný sieťový stack: rozhrania, trasy, pravidlá firewallu a súkromná slučka. Proces spustený cez ip netns exec vidí tento stack a nič iné, takže adresa, ku ktorej sa viaže, sa prekladá len vnútri menného priestoru. Vlastný 127.0.0.1 hostiteľa je úplne iná slučka.

Preto curl na hostiteľovi zlyhá, zatiaľ čo ten istý príkaz vnútri menného priestoru uspeje. Aplikácia je zdravá; adresa v stacku hostiteľa jednoducho nie je.

Publikujte jeden port skokom cez socat

socat prepája oba stacky v používateľskom priestore, čo stačí, keď má prejsť jediný port TCP. Strana hostiteľa počúva na LAN a pre každé prijaté spojenie spustí druhý socat vnútri menného priestoru, ktorý sa pripojí k slučke aplikácie. Vnútorný proces dosiahne aplikáciu presne tak, ako by to urobil lokálny klient. Na smerovaní menného priestoru sa nič nemení, takže aplikácia ďalej používa tunel ako jediný východ.

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

Vonkajší proces potrebuje root alebo schopnosť vstúpiť do menného priestoru. Ak VPN spadne, aplikácia stratí cestu a publikovaný port zlyhá zatvorený, čo je správanie, ktoré od väzenia chcete.

Použite pár veth, keď prechádza viac ako jeden port

Pár veth je správna odpoveď, keď má prejsť niekoľko portov alebo protokolov, alebo keď iní hostitelia majú iniciovať spojenia. Jeden koniec zostane v hostiteľovi, druhý sa presunie do menného priestoru a malá /30 dá obom stranám stabilnú adresu. Potom trasa hostiteľa posiela adresu menného priestoru cez pár.

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

Nepridávajte predvolenú trasu cez hostiteľa, ak nemáte v úmysle rozbiť väzenie. Tunel má zostať východom, takže cez pár je dostupná iba publikovaná adresa služby. Dajte mennému priestoru aj vlastný súbor resolvera, pretože ip netns exec číta /etc/netns/vpn/resolv.conf a bez neho je preklad mien vo väzení prázdny.

Testujte z druhého stroja, nie z hostiteľa

Spustite test z druhého stroja, pretože hostiteľ môže dosiahnuť lokálny poslucháč cestami, ktoré o LAN nič nehovoria. Najprv skontrolujte, na čo sa aplikácia vnútri menného priestoru skutočne naviazala, potom sa zvonka pripojte k publikovanej adrese. Naviazanie na všetky adresy tam väzenie nerozšíri, pretože divoká karta stále patrí mennému priestoru a LAN ju nevidí.

ip netns exec vpn ss -lntp

Ak spojenie z hostiteľa funguje a spojenie z LAN nie, chýbajúcim dielom je skok alebo trasa, nie adresa naviazania. Spustite OpenVPN vnútri menného priestoru namiesto presúvania živého zariadenia tun doň, pretože presun rozhrania ho vypne a môže vymazať trasy, ktoré potom zvonka neopravíte. Záložné príkazy majte na konzole, nie vo väzení.

Súvisiace články