Kaip paleisti vieną Linux procesą už WireGuard tunelio ribų
Suteikite vienai programai savo tinklo kontekstą, kad ji išeitų iš WireGuard hosto su visu tuneliu, tada pataisykite jai trukdančias persiuntimo ir žymėjimo taisykles.
Negalite atleisti programos nuo WireGuard hosto su visu tuneliu redaguodami maršrutus. Maršrutai pasirenka kelią pagal paskirties vietą, o tai, ką norite atleisti, yra procesas, todėl branduoliui nėra su kuo lyginti. Veikiantis būdas – suteikti tam procesui savo tinklo kontekstą: vardų erdvę su savo sąsaja, adresais ir numatytuoju maršrutu, sujungtą su hostu veth pora. Aš paleidau tai Ubuntu 24.04 su wireguard-tools 1.0.20210914, ir vardų erdvė niekada nebuvo problema – problema buvo hosto persiuntimo politika ir tunelio žymėjimo taisyklės.
Pirmiausia pasirinkite, kokio tipo konteksto jums reikia
Praktiškai pasitaiko dvi formos. Jei hostas paleidžia visą tunelį ir viena programa turi išeiti ISP keliu, jūs sukuriate antrą vardų erdvę, prijungiate ją prie hosto ir leidžiate hostui už ją persiųsti ir išversti srautą. Jei vardų erdvė jau turi VPN sąsają ir jums reikia tik joje paleidžiamos komandos, tai įprastas ip netns exec atvejis, ir didžioji dalis maršrutizavimo darbo jau atlikta.
Nė viena forma nesuteikia taisyklės, apribotos vienu proceso ID. Netfilter lygina adresus, prievadus, žymes ir sąsajas; maršrutų lentelės pagal procesą nėra. Žymėjimas gali nukreipti srautą, bet žymė turi būti uždėta ant paketų, kuriuos jau identifikavote, ir tai ta pati problema vienu sluoksniu žemiau. Vardų erdvė atskiria visą steką tam procesų medžiui, todėl tai įprastas atsakymas.
Jei reikalavimas tikrai yra tai, kad niekas neišeitų iš tunelio, sustabdykite tunelį. Vardų erdvė egzistuoja mišriam atvejui: viena programa lauk, visa kita vidun, tame pačiame kompiuteryje, tuo pačiu metu.
Sukurkite antrą kontekstą ir prijunkite jį prie hosto
Iliustracinis išdėstymas: hostas turi WireGuard sąsają, kuri neša numatytąjį maršrutą, ir tinklo vardų erdvę pavadinimu clearnet sujungtą su hostu veth pora. Žemiau esantys adresai yra pavyzdžiai.
ip netns add clearnet
ip link add veth-clear-out type veth peer name veth-clear-in
ip addr add 192.168.100.1/24 dev veth-clear-out
ip link set veth-clear-out up
ip link set veth-clear-in netns clearnet
ip netns exec clearnet ip addr add 192.168.100.2/24 dev veth-clear-in
ip netns exec clearnet ip link set veth-clear-in up
ip netns exec clearnet ip route add default via 192.168.100.1
Ši vardų erdvė dabar gali pasiekti hostą ir nieko daugiau. Hostas turi persiųsti srautą ir perrašyti šaltinio adresą, nes 192.168.100.0/24 yra privatus, o aukštesnio lygio maršrutizatorius neturi maršruto atgal į jį:
sysctl -w net.ipv4.ip_forward=1
iptables -t nat -A POSTROUTING -o <wan-interface> -j MASQUERADE
Prieš eidami toliau, patvirtinkite vardų erdvės pusę.ip netns exec clearnet ip route turėtų parodyti veth maršrutą ir numatytąjį maršrutą per 192.168.100.1, o ping į šį adresą turėtų atsakyti. Jei ping į hosto adresą nepavyksta, adresai arba jungties būsena neteisingi, ir jokia ugniasienės taisyklė nepadės.
Kai vardai išsprendžiami, bet niekas negrįžta, skaitykite FORWARD
Klasikinė klaida atrodo kaip maršrutizavimo klaida: vardų erdvė išsprendžia vardą, paketas išeina, ir atsakymas niekada neateina. Hostuose, kurių FORWARD politika yra DROP – taip daro kelios distribucijos ir dauguma sustiprintų atvaizdų – paketas numetamas kelyje, o programa spausdinama klaida nieko nesako apie filtravimą.
Prieš ką nors pridėdami, perskaitykite grandinę:
iptables -S FORWARD
nft list chain inet filter forward
Tada praleiskite srautą abiem kryptimis, su skaitikliais, kad galėtumėte pasakyti, ar taisyklė kada nors sutapo:
iptables -A FORWARD -i veth-clear-out -o <wan-interface> -j ACCEPT
iptables -A FORWARD -i <wan-interface> -o veth-clear-out -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
watch -n1 'iptables -L FORWARD -v -n'
Taisyklė su nuliniu paketų skaitikliu nėra kelyje. Arba sąsajų pavadinimai skiriasi nuo jūsų prielaidos, arba ankstesnė grandinės taisyklė pirmoji priėmė, numetė ar grąžino paketą. Taisykite tvarką, o ne taisyklės tekstą.
Atsakymo srautas yra ta pusė, kurią žmonės pamiršta. Grąžinimo taisyklei reikia to paties veth pavadinimo ir jungties būsenos atitikimo, arba paprasto sąsajos priėmimo, jei paliekate politiką atvirą. Pridėkite tik išėjimo taisyklę ir pradinis simptomas grįžta, o jūsų nauja taisyklė stovi ten ir atrodo teisingai.
Laikykite tunelio žymėjimo taisykles toliau nuo naujo kelio
Šis žingsnis paverčia veikiančią vardų erdvę nutekančia. WireGuard sąrankos paprastai įdiegia ugniasienės žymės politiką kartu su savo maršrutizavimo taisyklėmis ir atskira lentele, todėl nepažymėti paketai grįžta į pagrindinę lentelę, o pažymėti naudoja tunelio lentelę. Iš vardų erdvės persiųstas srautas išeidamas vertinamas pagal politikos maršrutizavimą, ir priklausomai nuo to, kaip tos taisyklės buvo parašytos, jis gali patekti į tunelio lentelę.
Du papildymai atskiria kelius. Grįžkite anksti mangle grandinėje vardų erdvės potinkliui ir pridėkite šaltiniu pagrįstą taisyklę, kuri įdeda tą potinklį į pagrindinę lentelę:
iptables -t mangle -I PREROUTING -s 192.168.100.0/24 -j RETURN
ip rule add from 192.168.100.0/24 lookup main priority 100
Prioritetas 100 mano hoste rikiuojasi prieš tunelio taisykles, todėl tam šaltiniui sprendžia įprasta lentelė. Nekopijuokite skaičiaus aklai: prioritetai, kuriuos wg-quick įdiegia, skiriasi tarp versijų ir tarp IPv4 bei IPv6 sąrankų, todėl paleiskite ip rule show ir pasirinkite prioritetą, kuris jūsų kompiuteryje atsiduria prieš tunelio taisykles.
Patikrinkite su šaltiniui specifine paieška užuot pasitikėję taisyklių sąrašu:
ip route get 1.1.1.1 from 192.168.100.2
ip netns exec clearnet ip route get 1.1.1.1
Jei pirmoji komanda praneša WireGuard sąsają, nauja taisyklė dar nėra prieš tunelio politiką. Jei ji praneša WAN sąsają, o antroji vis dar rodo veth numatytąjį maršrutą, hostas ir vardų erdvė nesutaria, ir turėtumėte perskaityti abi maršrutų lenteles.
Paleiskite procesą, kuris atidaro ryšį
Paleisti komandą yra viena eilutė, bet paleiskite procesą, kuris iš tikrųjų sukuria lizdą.ip netns exec clearnet curl -s https://ifconfig.me yra mažiausias sąžiningas testas: jis rodo adresą, kurį vardų erdvė pateikia pasauliui, o ne tą, kurį naudotų hostas.
Paslaugai prijunkite vardų erdvę pagal kelią, kad procesas joje liktų visą gyvenimą:
[Service]
NetworkNamespacePath=/run/netns/clearnet
Grafinės programos yra vieta, kur vienos eilutės metodas tyliai nepavyksta. Naršyklė, paleista iš meniu, dažnai perduoda užklausą egzemplioriui, kuris jau veikia už vardų erdvės ribų, todėl atsiranda naujas langas, o srautas vis tiek išeina per tunelį. Suteikite jai atskirą profilį, kad naujas egzempliorius tikrai būtų sukurtas, tada patikrinkite proceso kontekstą, o ne spėliokite:
readlink /proc/$(pgrep -f clearnet-profile | head -1)/ns/net
readlink /run/netns/clearnet
Abi išvestys turi sutapti. Ta pati patikra tinka bet kuriai ilgai veikiančiai programai, ir verta ją atlikti kartą kiekvienai programai, o ne manyti, kad paleidiklis padarė tai, ką turėjote omenyje.
Vardų sprendimas reikalauja savo sprendimo. Vardų erdvės sukūrimas nesuteikia jai resolverio konfigūracijos; failai kiekvienai vardų erdvei palaikomi per /etc/netns/<name>/resolv.conf o be jo paveldite elgesį, kurį lengva perskaityti neteisingai. IPv6 reikalauja to paties: jei vardų erdvė neturi v6 numatytojo maršruto, o programa teikia pirmenybę v6, užklausos gali užstrigti prieš atsitraukdamos, o tai atrodo kaip sulūžęs tunelis.
Patikrinkite rėmą, o ne tik išėjimo adresą
Veikiantis viešasis adresas įrodo maršrutą, o ne visą reikalavimą. Pereikite likusią dalį šia tvarka:
ip netns exec clearnet ip route get 1.1.1.1rodo veth numatytąjį maršrutą, o ne WireGuard sąsają.- FORWARD skaitikliai abiejose taisyklėse didėja, kol vykdoma užklausa.
- Programos procesas praneša numatomą vardų erdvės inode.
- Po perkrovimo vardų erdvė egzistuoja prieš paslaugos paleidimą; unit, kuris veikia anksčiau, nepavyksta arba, dar blogiau, veikia už vardų erdvės ribų.
Tada nuspręskite, kas turi įvykti, kai tunelis nukrinta. Vardų erdvė veikia toliau, ir tai yra pratimo tikslas bei kartu rizika: atleista programa lieka prisijungusi, o visa kita sustoja. Užrašykite tai kaip politikos pasirinkimą ir aiškiai pasakykite, ko atleidimas neapima – paskyros tapatybė, išsaugota naršyklės būsena ir jūsų DNS teikėjas visi yra už tinklo vardų erdvės ribų, o atleidimo laikymas anonimiškumu yra klaida, kuri pergyvena konfigūraciją.