Kuweka alama kwenye trafiki kutoka cgroup moja ni sehemu rahisi. Maamuzi matatu tofauti lazima yalingane kabla programu moja kutoka kupitia kiolesura cha kimwili wakati kila kitu kingine kinabaki kwenye handaki: soketi ipi ni ya msamaha, utafutaji upi wa njia unaanzishwa na alama, na anwani ipi ya chanzo pakiti hubeba inapotoka. Majaribio mengi yaliyoshindwa hufanya la kwanza sawa, la pili nusu, na hayatazami la tatu kabisa.

Maamuzi matatu, sio moja

Uainishaji hujibu nani amesamehewa. Uelekezaji hujibu pakiti iliyowekwa alama inakwenda wapi badala yake. Uchaguzi wa chanzo hujibu upande wa mbali utaona nini na jibu linapaswa kurudi wapi.

Haya hushindwa kwa kujitegemea. Pakiti inaweza kuainishwa, kuelekezwa upya kwenye kiolesura cha kimwili, na bado kubeba anwani ya kibinafsi ambayo hakuna kipanga njia cha juu kinachoweza kuirudisha, ambayo huzalisha muda wa kumalizika unaofanana kabisa na kizuizi cha firewall. Hakuna chochote katika hatua ya uainishaji kinachokuonya kuhusu hilo. Hakuna chochote katika hatua ya uelekezaji pia.

Mpangilio pia ni muhimu. Uainishaji hufanyika pakiti inapozalishwa, uelekezaji hufanyika baada ya hapo, na tafsiri hufanyika mahali pa kutoka.

Ikiwa huwezi kutaja ni hatua ipi kati ya tatu iliyovunjika, hufanyi utatuzi, unapanga upya sheria na unatumaini.

Linganisha cgroup ambayo itakuwepo kesho

nftables inaweza kujaribu uanachama wa cgroup v2 wa soketi, jambo ambalo ni muhimu kweli kwa sababu hufuata mchakato badala ya marudio. Mtego ni kitambulisho. Programu ya desktop inayoanzishwa kutoka menyu mara nyingi huishi katika scope ya muda ambayo jina lake hubadilika kuanza kunakofuata.

nft list ruleset
systemctl status session.slice 2>/dev/null
cat /proc/self/cgroup

Kunakili jina la scope kutoka kikao kimoja na kuliweka kwa uthabiti huzalisha sheria inayofanya kazi leo na kuacha kimya kimya kulingana kesho. Badala yake weka programu katika muktadha thabiti wa utekelezaji uliokusudiwa, kama scope au unit maalum unayodhibiti, na linganisha na hiyo. Sheria basi hustahimili kuwasha upya na masasisho ya vifurushi. Pia inakuwa kitu ambacho mwenzako anaweza kufikiria bila historia ya kikao chako.

Pia kuwa sahihi kuhusu utaratibu gani unatumia. Uainishaji wa net_cls wa cgroup v1 na ulinganishaji wa soketi wa cgroup v2 ni vitu tofauti, na sehemu yenye jina linalofanana katika nyaraka haifanyi viwe vinabadilishana.

Mnyororo wa route ndio unaanzisha utafutaji wa pili

Kwa trafiki inayozalishwa ndani, aina ya mnyororo huamua kama kitu kitatokea baada ya alama kuwekwa. Mnyororo wa output wa aina ya filter unaweza kuweka alama kwenye pakiti na kernel itaendelea kutumia njia iliyochaguliwa tayari. Mnyororo wa aina ya route ndio utaratibu unaoomba utafutaji mpya.

table inet bypass {
  chain mark {
    type route hook output priority mangle; policy accept;
    socket cgroupv2 level 2 "app.slice" meta mark set 0x1 comment "app bypass"
  }
}
ip rule add fwmark 0x1 lookup 200
ip route add default via 203.0.113.1 dev wlan0 table 200

Kisha alama inahitaji sheria ya sera inayoituma kwenye jedwali, na jedwali hilo lazima likamilike: njia ya default, maeneo ya ndani ambayo programu bado inayahitaji, na lango la juu linalojibu kweli.

Chagua thamani ya alama kwa makusudi. WireGuard hutumia fwmark yake mwenyewe kwa trafiki ya usafirishaji wa nje, na kutua kwa bahati kwenye namba hiyo hiyo kunaweza kuathiri msamaha wa uelekezaji wa handaki yenyewe kwa njia ambazo ni chungu kutambua.

Anwani ya chanzo haifuati njia

Soketi ambayo tayari imechagua anwani ya chanzo kwa njia ya handaki huhifadhi anwani hiyo baada ya kuelekezwa upya. Hakuna chochote katika mabadiliko ya njia kinachoandika upya, ndiyo sababu pakiti hutoka kwenye kiolesura cha kimwili ikiwa na chanzo cha kibinafsi ambacho mtandao wa juu hauwezi kurudisha.

Dalili inayoonekana ni programu inayoonekana kutuma data na kamwe haipati jibu, na kumbukumbu ya firewall isiyoonyesha chochote kwa sababu pakiti haikurudi kamwe.

Marekebisho nyembamba ni sheria ya tafsiri ya chanzo iliyopunguzwa kwa alama ya programu hiyo na kiolesura chake halisi cha kutoka, iliyounganishwa na NAT iliyopo tayari badala ya kuibadilisha:

table inet bypass {
  chain postrouting {
    type nat hook postrouting priority srcnat; policy accept;
    meta mark 0x1 oifname "wlan0" masquerade
  }
}

Tafsiri msamaha tu na hakuna kingine. Sheria ya jumla ya masquerade hurekebisha dalili na kuharibu uwezo wako wa kusema ni trafiki ipi ilichukua njia ipi. Linganisha alama, kiolesura halisi cha kutoka na, ikiwezekana, anwani ya programu yenyewe. Sheria pana ni rahisi kuandika na karibu haiwezekani kukagua baadaye.

Kinachoponyoka bado kutoka kwenye msamaha

Utatuzi wa majina unaweza kutoka kwenye mchakato tofauti wa resolver katika cgroup nyingine, kwa hiyo kuainisha soketi ya kivinjari hakuainishi utafutaji wake. Ikiwa maswali ya resolver yanabaki kwenye handaki wakati muunganisho unatoka nje yake, majibu ya split-horizon yanaweza yasilingane na njia. Kutolingana huko huzalisha hitilafu zinazoonekana kama hitilafu za DNS na haziko.

Michakato ya watoto hurithi cgroup katika mipangilio mingi, lakini msaidizi anayejihamishia kwenye scope yake mwenyewe harithi. Kagua badala ya kudhani, hasa kwa kila kitu kinachojitekeleza upya.

Mwishowe, amua nini kifanyike wakati handaki liko chini. Msamaha ambao kimya kimya unakuwa bypass kamili ni mkao tofauti wa usalama kuliko ule unaofunga, na mmoja tu wao ndio uliousudia.

Makala zinazohusiana