Jinsi ya kuendesha mchakato mmoja wa Linux nje ya handaki la WireGuard
Ipe programu moja muktadha wake wa mtandao ili itoke kwenye mwenyeji wa WireGuard mwenye handaki kamili, kisha rekebisha kanuni za upelekaji na uwekaji alama zinazoizuia.
Huwezi kumsamehe programu kutoka kwa mwenyeji wa WireGuard mwenye handaki kamili kwa kuhariri njia. Njia huchagua uelekeo kulingana na lengwa, na kile unachotaka kumsamehe ni mchakato, kwa hivyo kerneli haina cha kulinganisha. Mbinu inayofanya kazi ni kuipa mchakato huo muktadha wake wa mtandao: nafasi ya majina yenye kiolesura chake, anwani zake na njia chaguo-msingi yake, iliyounganishwa na mwenyeji kwa jozi ya veth. Niliendesha hii kwenye Ubuntu 24.04 nikiwa na wireguard-tools 1.0.20210914, na nafasi ya majina haikuwa tatizo kamwe — tatizo lilikuwa sera ya upelekaji ya mwenyeji na kanuni za uwekaji alama za handaki.
Kwanza chagua aina ya muktadha unaouhitaji
Kwa vitendo aina mbili zinaonekana. Ikiwa mwenyeji anaendesha handaki kamili na programu moja inapaswa kutoka kwa njia ya ISP, unajenga nafasi ya pili ya majina, unaiunganisha na mwenyeji na kumruhusu mwenyeji kupeleka na kutafsiri trafiki kwa ajili yake. Ikiwa nafasi ya majina tayari inabeba kiolesura cha VPN na unahitaji tu amri inayoanzishwa ndani yake, hiyo ni kesi ya kawaida ya ip netns exec na sehemu kubwa ya kazi ya uelekezaji imekwisha fanyika.
Hakuna aina inayokupa kanuni iliyo na kikomo cha kitambulisho kimoja cha mchakato. Netfilter hulinganisha anwani, milango, alama na violesura; hakuna jedwali la uelekezaji kwa kila mchakato. Uwekaji alama unaweza kuelekeza trafiki, lakini alama lazima iwekwe kwenye pakiti ambazo tayari umezitambua, na hiyo ni tatizo lile lile tabaka moja chini. Nafasi ya majina hutenganisha staki yote kwa mti huo wa michakato, na ndiyo sababu ni jibu la kawaida.
Ikiwa hitaji ni kweli kwamba hakuna kinachotoka kwenye handaki, simamisha handaki badala yake. Nafasi ya majina ipo kwa kesi mchanganyiko: programu moja nje, kila kitu kingine ndani, kwenye mashine moja, kwa wakati mmoja.
Jenga muktadha wa pili na uunganishe na mwenyeji
Mpangilio wa kielelezo: mwenyeji ana kiolesura cha WireGuard kinachobeba njia chaguo-msingi, na nafasi ya majina ya mtandao inayoitwa clearnet iliyounganishwa na mwenyeji kwa jozi ya veth. Anwani zilizo hapa chini ni mifano.
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
Nafasi hiyo ya majina sasa inaweza kufikia mwenyeji na hakuna kingine. Mwenyeji lazima apeleke trafiki na aandike upya anwani ya chanzo, kwa sababu 192.168.100.0/24 ni ya faragha na kipanga njia cha juu haina njia ya kurudi ndani yake:
sysctl -w net.ipv4.ip_forward=1
iptables -t nat -A POSTROUTING -o <wan-interface> -j MASQUERADE
Thibitisha upande wa nafasi ya majina kabla ya kuendelea.ip netns exec clearnet ip route inapaswa kuonyesha njia ya veth na njia chaguo-msingi kupitia 192.168.100.1, na ping kwa anwani hiyo inapaswa kujibu. Ikiwa ping kwa anwani ya mwenyeji inashindikana, anwani au hali ya kiungo si sahihi na hakuna kanuni ya firewall itakayosaidia.
Wakati majina yanatatuliwa lakini hakuna kinachorudi, soma FORWARD
Kushindwa kwa kawaida kunaonekana kama hitilafu ya uelekezaji: nafasi ya majina inatatua jina, pakiti inatoka na jibu halifiki kamwe. Kwenye wenyeji walio na sera ya FORWARD ya DROP — usambazaji kadhaa na picha nyingi zilizoimarishwa hufanya hivyo — pakiti hutupwa njiani, na hitilafu ambayo programu huchapisha haisemi chochote kuhusu uchujaji.
Soma mnyororo kabla ya kuongeza chochote:
iptables -S FORWARD
nft list chain inet filter forward
Kisha ruhusu trafiki katika pande zote mbili, pamoja na vihesabu, ili ujue kama kanuni iliwahi kulingana:
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'
Kanuni iliyo na kihesabu cha pakiti sifuri haiko njiani. Ama majina ya violesura ni tofauti na ulivyodhani, au kanuni ya awali kwenye mnyororo ilikubali, ilitupa au ilirudisha pakiti kwanza. Rekebisha mpangilio, si maandishi ya kanuni.
Trafiki ya majibu ni nusu ambayo watu huisahau. Kanuni ya kurudi inahitaji jina lile lile la veth pamoja na ulinganifu wa hali ya muunganisho, au ukubalifu wa kawaida wa kiolesura ikiwa unaweka sera wazi. Ongeza kanuni ya kutoka pekee na dalili ya awali inarudi, huku kanuni yako mpya imesimama hapo na inaonekana sahihi.
Weka kanuni za uwekaji alama za handaki mbali na njia mpya
Hatua hii inabadilisha nafasi ya majina inayofanya kazi kuwa inayovuja. Mipangilio ya WireGuard kwa kawaida husakinisha sera ya alama ya firewall pamoja na kanuni zake za uelekezaji na jedwali maalum, kwa hivyo pakiti zisizo na alama huanguka kwenye jedwali kuu wakati zilizo na alama hutumia jedwali la handaki. Trafiki inayopelekwa kutoka nafasi ya majina hutathminiwa dhidi ya uelekezaji wa sera inapotoka, na kulingana na jinsi kanuni hizo zilivyoandikwa inaweza kuanguka kwenye jedwali la handaki.
Nyongeza mbili hutenganisha njia. Rudi mapema kwenye mnyororo wa mangle kwa subneti ya nafasi ya majina, na ongeza kanuni inayotegemea chanzo inayoweka subneti hiyo kwenye jedwali kuu:
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
Kipaumbele 100 hupangwa kabla ya kanuni za handaki kwenye mwenyeji wangu, kwa hivyo jedwali la kawaida huamua kwa chanzo hicho. Usinakili nambari kwa upofu: vipaumbele ambavyo wg-quick husakinisha hutofautiana kati ya matoleo na kati ya mipangilio ya IPv4 na IPv6, kwa hivyo endesha ip rule show na uchague kipaumbele kinachoanguka kabla ya kanuni za handaki kwenye mashine yako.
Thibitisha kwa utafutaji maalum wa chanzo badala ya kuamini orodha ya kanuni:
ip route get 1.1.1.1 from 192.168.100.2
ip netns exec clearnet ip route get 1.1.1.1
Ikiwa amri ya kwanza inaripoti kiolesura cha WireGuard, kanuni mpya bado haiko mbele ya sera ya handaki. Ikiwa inaripoti kiolesura cha WAN wakati ile ya pili bado inaonyesha njia chaguo-msingi ya veth, mwenyeji na nafasi ya majina hawakubaliani na unapaswa kusoma tena majedwali yote mawili ya uelekezaji.
Anzisha mchakato unaofungua muunganisho
Kuanzisha amri ni mstari mmoja, lakini anzisha mchakato ambao kwa kweli huunda soketi.ip netns exec clearnet curl -s https://ifconfig.me ni jaribio dogo zaidi la uaminifu: linaonyesha anwani ambayo nafasi ya majina inawasilisha kwa dunia, si ile ambayo mwenyeji angetumia.
Kwa huduma, ambatanisha nafasi ya majina kwa njia ili mchakato ubaki ndani yake maisha yake yote:
[Service]
NetworkNamespacePath=/run/netns/clearnet
Programu za picha ni mahali ambapo mbinu ya mstari mmoja hushindwa kimya kimya. Kivinjari kinachoanzishwa kutoka kwenye menyu mara nyingi humkabidhi ombi kwa nakala inayoendesha tayari nje ya nafasi ya majina, kwa hivyo dirisha jipya linaonekana na trafiki bado inatoka kupitia handaki. Ipe wasifu tofauti ili nakala mpya iundwe kwa kweli, kisha angalia muktadha wa mchakato badala ya kukisia:
readlink /proc/$(pgrep -f clearnet-profile | head -1)/ns/net
readlink /run/netns/clearnet
Matokeo mawili lazima yalingane. Ukaguzi huo huo hufanya kazi kwa programu yoyote inayoendesha kwa muda mrefu, na inafaa kuufanya mara moja kwa kila programu badala ya kudhani kianzishi kilifanya ulichokusudia.
Utatuzi wa majina unahitaji uamuzi wake. Kuunda nafasi ya majina hakupi usanidi wa kitatuzi; faili za kila nafasi ya majina zinatumika kupitia /etc/netns/<name>/resolv.conf na bila moja unarithi tabia ambayo ni rahisi kusoma vibaya. IPv6 inahitaji matibabu sawa: ikiwa nafasi ya majina haina njia chaguo-msingi ya v6 wakati programu inapendelea v6, maombi yanaweza kukwama kabla ya kurudi nyuma, jambo ambalo linaonekana kama handaki lililovunjika.
Angalia muundo, si anwani ya kutoka pekee
Anwani ya umma inayofanya kazi inathibitisha njia, si hitaji lote. Pitia mengine kwa mpangilio huu:
ip netns exec clearnet ip route get 1.1.1.1inaonyesha njia chaguo-msingi ya veth, si kiolesura cha WireGuard.- Vihesabu vya FORWARD kwenye kanuni zote mbili huongezeka wakati ombi linaendesha.
- Mchakato wa programu unaripoti inode ya nafasi ya majina unayotarajia.
- Baada ya kuwasha upya nafasi ya majina ipo kabla ya huduma kuanza; unit inayoendesha mapema hushindwa au, mbaya zaidi, inaendesha nje ya nafasi ya majina.
Kisha amua nini kifanyike wakati handaki linaanguka. Nafasi ya majina inaendelea kufanya kazi, ambayo ni lengo la zoezi hili na pia hatari: programu iliyosamehewa inabaki imeunganishwa wakati kila kitu kingine kinasimama. Rekodi hilo kama uchaguzi wa sera na uwe wazi kuhusu kile msamaha haukugharamia — utambulisho wa akaunti, hali ya kivinjari iliyohifadhiwa na mtoa huduma wako wa DNS zote ziko nje ya wigo wa nafasi ya majina ya mtandao, na kuchukua msamaha kama kutokujulikana ni kosa linaloishi zaidi ya usanidi.