App àdúgbò, ìlànà VPN: ìdí tí ẹ̀wọ̀n FORWARD rẹ kì í ṣiṣẹ́ rárá
Ìlànà kan lórí ẹ̀rọ máa ń lo OUTPUT, kì í ṣe FORWARD. Yan hook nínú namespace tó tọ́, lẹ́yìn náà pinnu bóyá mark tàbí ọ̀nà tó rọrùn tó.
O fi ìlànà kún ẹ̀wọ̀n FORWARD fún ìrìnàjò VPN, o ṣe ìbéèrè náà láti inú ẹ̀rọ Linux kan náà, àmọ́ kíkà náà dúró ní ọ̀dọ̀ òdo. Ó ṣeé ṣe kí ìlànà náà tọ́. Pákìtì kò gbà ọ̀nà yẹn rárá, nítorí ìbéèrè tí ó dàgbà lórí ẹ̀rọ fúnra rẹ̀ ni ẹ̀rọ kì í gbé lọ. Títẹ̀lé ìgbésí ayé pákìtì láti socket dé waya ṣàlàyé ìdí, àti ibi tí ìlànà yẹ kí ó wà.
Wá ibi tí pákìtì bí
Ìtò hook Netfilter pín àwọn ipò mẹ́ta, àti pé ọ̀kan ṣoṣo nínú wọn ni ó kan FORWARD:
| Origin | Path | Hook that sees it |
|---|---|---|
| Local process | OUTPUT then POSTROUTING | OUTPUT, POSTROUTING |
| Addressed to a local service | PREROUTING then INPUT | PREROUTING, INPUT |
| Received for another host | PREROUTING, FORWARD, POSTROUTING | FORWARD |
App àdúgbò máa ń bẹ̀rẹ̀ ní ọ̀nà OUTPUT, nítorí kernel ti fi hàn pé pákìtì máa ń bẹ̀rẹ̀ níbí àti pé kì í ṣe olùdíje fún gbígbé lọ. Ṣíṣe tunnel kò yí ìpín yẹn padà; tunnel jẹ́ ẹ̀rọ tí pákìtì lè gbà jáde, kì í ṣe ìgbésẹ̀ tí ó yí ìjáde àdúgbò padà sí ìrékọjá.
Pákìtì méjì, ìtàn kan
Nígbà tí tunnel bá dìde, pákìtì inú app àti pákìtì òde tí a fi ààlà mọ́ jẹ́ ohun méjì tí ó yàtọ̀. Pákìtì inú máa ń gbé ibi tí a ń lọ àti ẹrù tí app yàn. Pákìtì òde máa ń gbé àkọsílẹ̀ ààlà lọ sí àdírẹ́sì àti port ẹlẹgbẹ́, àti pé òun ni ó ń kọjá interface ti ara ní ti gidi.
Ìlànà rẹ kan ọ̀kan nínú wọn, àti yíyàn èyí tí kò tọ́ jẹ́ ìdí tí ó wọ́pọ̀ tí ìlànà fi dà bí ẹni pé kò ṣe nkankan. Ìlànà tí ó bá àdírẹ́sì òde ẹlẹgbẹ́ mu máa ń wo gbogbo pákìtì tunnel ní ọ̀nà kan náà, ohunkóhun tí app inú ń ṣe. Ìlànà tí ó bá ibi ìlọ inú mu máa ń wo ìrìnàjò tí ó kàn ọ́, yóò sì ṣiṣẹ́ nígbà tí pákìtì yẹn bá dé hook tí o gbé ìlànà náà sí.
Namespace ń gbé ààlà
Container máa ń jẹ́ kí èyí le kíkankíkan láìyí ìlànà padà. Ìbéèrè app jẹ́ ìjáde àdúgbò nínú namespace nẹ́tíwọ́kì container. Ẹ̀rọ gbàlejò máa ń gba ìrìnàjò yẹn lórí interface Ethernet tí kò sí níti gidi, ó sì lè gbé e lọ, nítorí náà ìlànà FORWARD lórí ẹ̀rọ gbàlejò lè ní ìtumọ̀ bí ó tilẹ̀ jẹ́ pé ìlànà tí ó dá ìbéèrè náà kò tọ́wọ̀ ẹ̀wọ̀n OUTPUT ẹ̀rọ gbàlejò rárá.
Kí o tó yan hook, ṣe àyẹ̀wò ibi tí àkójọ ìlànà àti tunnel wà ní ti gidi. Tunnel nínú container, tunnel lórí ẹ̀rọ gbàlejò pẹ̀lú container tí a ṣe ìtọ́sọ́nà rẹ̀ kọjá, àti tunnel nínú namespace ọ̀tọ̀ọ̀tọ̀ jẹ́ àwọn ìṣètò mẹ́ta tí ó yàtọ̀ pẹ̀lú ibi ìlànà mẹ́ta tí ó yàtọ̀. Ka àwọn ìlànà nínú namespace tí ó ni ẹ̀rọ náà, kì í ṣe nínú èyí tí ó jẹ́ àìlópin nìkan.
Bèèrè bóyá o nílò mark rárá
Bí èròǹgbà ni láti fi àfikún ibi ìlọ kan gba tunnel lọ, ọ̀nà fún àfikún yẹn lè tó. Ṣàyẹ̀wò àwọn ọ̀nà tí ó wúlò kíákíá, pẹ̀lú ohunkóhun tí server ti tì síi: ọ̀nà àìlópin tí a yí padà máa ń fi ìrìnàjò púpọ̀ ju ìlànà dín tí o ní lọ́kàn lọ gba VPN, kò sì sí iye mark tí yóò mú àbáyọ mu ìdí.
Ìpín ni a nílò nígbà tí ìpinnu bá sinmi lórí ohun tí ọ̀nà kò lè sọ, bí orísun, olùmúlò tàbí ìlànà. Fún ìrìnàjò tí a gbà, mark nínú PREROUTING máa ń ṣiṣẹ́. Fún ìrìnàjò àdúgbò, mark gbọ́dọ̀ wáyé ní ìgbésẹ̀ ìjáde tí ó lè dá ìwá ọ̀nà tuntun sílẹ̀ lẹ́yìn tí a bá fi mark sí. Nínú nftables èyí jẹ́ ẹ̀wọ̀n irú route lórí hook ìjáde; ẹ̀wọ̀n àlẹ̀mọ́ ìjáde tí ó wọ́pọ̀ yóò fi iye sílẹ̀ yóò sì fi ọ̀nà sílẹ̀ láìyí.
Nínú iptables, èyí tí ó dọ́gba wà nínú ìṣètò mangle OUTPUT, ìpinnu ìtọ́sọ́nà gbọ́dọ̀ wáyé lẹ́yìn tí mark bá ti wà. Lẹ́yìn náà ìlànà ìlànà gbọ́dọ̀ lo mark, yóò sì tọ́ka sí table tí ó ní ọ̀nà tí ó ṣeé lò. Fífi mark conntrack sí jẹ́ iṣẹ́ kẹta, ọ̀tọ̀ọ̀tọ̀; ó máa ń fi iye pamọ́ lórí ṣíṣàn, kì í sì í fúnra rẹ̀ fi iye yẹn sórí pákìtì lọ́wọ́lọ́wọ́ kí ìtọ́sọ́nà lè kà á.
Ṣàyẹ̀wò ìwá àti kíkà papọ̀
nft list ruleset
ip route get 198.51.100.25
ip route get 198.51.100.25 mark 0x1
Àdírẹ́sì àti mark jẹ́ àpẹẹrẹ, àwọn ìbéèrè ọ̀nà méjì sì ń dáhùn àwọn ìbéèrè tí ó yàtọ̀. Èkejì máa ń béèrè ohun tí kernel yóò ṣe bí pákìtì bá gbé mark yẹn, kò sì fi hàn pé àkójọ ìlànà rẹ máa ń fi ọ̀kan sílẹ̀. Wo ó gẹ́gẹ́ bí ìdánwò àbá, kì í ṣe ẹ̀rí pé ìlànà náà ń ṣiṣẹ́.
Lẹ́yìn náà ṣe ìbéèrè tí kò léwu kí o sì wo ohun méjì lẹ́ẹ̀kan náà: kíkà lórí hook tí o yàn, àti ọ̀nà jáde tí pákìtì náà gbà ní ti gidi. Bí kíkà bá pọ̀ sí i tí pákìtì sì ń jáde níbòmíràn, mark tàbí table kò tọ́. Bí méjèèjì kò bá yí padà, pákìtì kò dé hook yẹn rárá, ìbéèrè tó kàn náà sì ni namespace tàbí ọ̀nà.
Níkẹyìn, fi ààlà sí ìdánwò náà ní ohun tí ẹ̀rọ náà lè sọ. Ọ̀nà kan fún àdírẹ́sì kan kì í di ìlànà àìnípẹ̀kun fún iṣẹ́ tí àwọn àdírẹ́sì rẹ̀ ń yí. Pinnu ìwọ̀n pákìtì kọ́, lẹ́yìn náà ṣàyẹ̀wò bóyá àpẹẹrẹ ìtọ́sọ́nà àti mark lè dá ìwọ̀n yẹn dúró lẹ́yìn ìsopọ̀ mìíràn.