Fífi oníbàárà OpenVPN kejì kún orí Linux host kan máa ń kùnà ní ọ̀kan nínú ibi méjì. Yálà oníbàárà inú kò lè dé server tirẹ̀ nítorí tunnel ìta ti gba irin-àjò yẹn, tàbí oníbàárà kejì tún tábìlì ọ̀nà kọ, tí tunnel àkọ́kọ́ sì dá iṣẹ́ dúró. Àwọn ìṣòro méjèèjì wà nínú ìtọ́nà, kì í ṣe nínú ìkọ̀kọ̀, a sì yanjú àwọn méjèèjì kí tunnel tuntun tó gbé irúfẹ́ ìrìn àwọn ètò kan. Àwọn àdírẹ́sì níbí jẹ́ àpẹẹrẹ: tun0 ni tunnel ìta, 203.0.113.9 ni server inú, TCP 9999 sì ni ìṣàn tí ó gbọdọ̀ lo ọ̀nà inú.

Àwọn ọ̀nà ìkùnà méjì, tábìlì ọ̀nà kan

Oníbàárà inú máa ń ṣí socket UDP sí server rẹ̀, socket yẹn sì ń tẹ̀lé tábìlì ọ̀nà lọ́wọ́lọ́wọ́ bíi gbogbo èyí mìíràn. Tí tunnel ìta bá ti ní àìpé, àwọn pákẹ́t ìfọwọ́sowọ́pọ̀ máa ń wọ tunnel ìta. Ìyẹn máa ń ṣiṣẹ́ nígbà tí server ìta lè dé server inú tí ẹ̀gbẹ́ kejì sì gbà láti gbé ìṣàn náà; bí bẹ́ẹ̀ kọ́, ìfọwọ́sowọ́pọ̀ máa ń dúró tí oníbàárà á sì tún gbìyànjú.

Ìkùnà kejì wá láti push server. Push tí ó wọ́pọ̀ ni redirect-gateway def1, tí ó ń fi 0.0.0.0/1 àti 128.0.0.0/1 sílẹ̀ dípò ríro pọ̀ ọ̀nà àìpé. Nítorí náà àwọn oníbàárà méjì tí ẹnìkọ̀ọ̀kan ń fi /1 bọ́tìnnì tirẹ̀ sílẹ̀ máa ń kọlù ara wọn, tí bọ́tìnnì tuntun sì ń borí fún fẹ́rẹ̀ẹ́ gbogbo ibi tí wọ́n ń lọ. Wá àwọn àkọ́sí méjì yẹn nínú tábìlì nígbà tí tunnel bá kú lẹ́yìn tí kejì so pọ̀, nítorí ó lè jẹ́ pé ọ̀nà àìpé fúnra rẹ̀ kò yí padà rí.

Sàmì sí ìṣàn kí o sì fún un ní tábìlì

Darí ìrìn tí a yàn nípa sísàmì sí i nínú tábìlì mangle àti fífi àmì náà bá ọ̀nà nínú òfin ìlànà. Òfin náà ń tọ́ka sí tábìlì àkànṣe tí ọ̀nà àìpé rẹ̀ jẹ́ ẹ̀rọ inú, nítorí náà àwọn pákẹ́t tí a sàmì sí nìkan ni ó ń gba ọ̀nà inú.

iptables -t mangle -A PREROUTING -p tcp -m multiport --dport 9999 -j MARK --set-mark 0x9999
ip rule add fwmark 0x9999 table 200 pref 1000
ip route add default dev tun1 table 200

Ọ̀pọ̀lọpọ̀ ìkùnà nínú òfin yìí wá láti inú àṣìṣe méjì. Iye àmì tí firewall ń gbé kalẹ̀ àti iye tí òfin ń bá mu gbọdọ̀ jẹ́ ọ̀kan náà, nítorí ìyàtọ̀ kì í mú àṣìṣe tàbí èsì wá. PREROUTING sì ń rí àwọn pákẹ́t tí ó wá láti ìta nìkan, nítorí náà ìsopọ̀ tí ó bẹ̀rẹ̀ lórí host yìí nílò òfin OUTPUT tí ó ní ìbámu kan náà kí a tó sàmì sí i.

Gba ẹ̀tọ́ ọ̀nà lọ́wọ́ oníbàárà kejì

Àwọn àṣàyàn méjì ń dá oníbàárà kejì dúró kí ó má ṣe ṣàtúnṣe tábìlì, wọ́n sì ń ṣiṣẹ́ ní ibi oríṣiríṣi. route-nopull ń kọbi ara mọ àwọn àṣàyàn ọ̀nà tí a push, nítorí náà kò sí ohun tí a fi sílẹ̀. route-noexec ń gba àwọn àṣàyàn tí a push sínú àyíká oníbàárà ṣùgbọ́n ó ń fi ìyípadà tábìlì sí hook, ìyẹn sì ni ohun tí o fẹ́ nígbà tí o nílò láti rí ohun tí server náà dábàá.

Hook ń ṣiṣẹ́ pẹ̀lú àwọn iye tí a push nínú àyíká rẹ̀, ó sì yẹ kí ó fi àwọn àkọsílẹ̀ tí o fọwọ́ sí kún un nìkan. Sọ ọ́ di idempotent: pa tábìlì tí ó ní kúrò kí o tó tún un kọ́, kí o má sì rò pé ìgbà tí ó kọjá fi ipò mímọ́ sílẹ̀. Ìsopọ̀ àtúnṣe máa ń pe hook lẹ́ẹ̀kan sí i, hook tí ń fi kún láìsí ìmọ́ sì ń kó àwọn ọ̀nà ẹlẹ́mẹjì jọ.

Yan olówó kan kí o sì kọ ọ́ sílẹ̀. Profáìlì tí ń gbé àṣàyàn méjèèjì kalẹ̀, tàbí hook tí ń bá script ọwọ́ díje, ń dá tábìlì tí ẹnikẹ́ni kò lè ṣàlàyé lẹ́yìn náà.

Di àwọn àdírẹ́sì server méjèèjì mú

Server inú nílò ọ̀nà host gba ẹ̀rọ ìta kí oníbàárà inú tó so pọ̀. Àkọsílẹ̀ yẹn ni ó ń dá irin-àjò inú dúró nínú tunnel ìta dípò fífi í lọ tẹ̀lé àìpé.

ip route add 203.0.113.9/32 dev tun0
ip route get 203.0.113.9

Tún fi ọ̀nà host tí ó bá mu fún server ìta kún tábìlì pàtàkì, bí bẹ́ẹ̀ kọ́ ìsopọ̀ àtúnṣe lè darí irin-àjò oníbàárà ìta fúnra rẹ̀ sínú tunnel tirẹ̀. Ìtòlẹ́sẹẹsẹ kì í ṣe àṣàyàn: fi àwọn àkọsílẹ̀ wọ̀nyí kún lẹ́yìn tí interface tí ó yẹ kí ó wà, ìyẹn hook tàbí script tí ń ṣiṣẹ́ lẹ́yìn ìsopọ̀. Ọ̀nà tí ń tọ́ka sí ẹ̀rọ tí ó ti kú ni a máa ń yọ kúrò tàbí kọbi ara mọ̀ ọ́, nítorí náà àkọsílẹ̀ tí a kọ nígbà ìbẹ̀rẹ̀ kò gba ìtòlẹ́sẹẹsẹ tí o rò já.

Wo ìwádìí dípò kíka gbogbo tábìlì. Ìjáde ìwádìí ọ̀nà ń dárúkọ ẹ̀rọ àti àdírẹ́sì orísun tí kernel máa lò, ìyẹn sì ni ohun tí oníbàárà ń rí nígbà tí ó ṣí socket rẹ̀.

Dán ẹ̀wọ̀n náà wò kí o sì jẹ́ kí ìkùnà hàn

Gbà àwọn pákẹ́t lórí interface ìta nígbà tí oníbàárà inú ń so pọ̀. Ìfọwọ́sowọ́pọ̀ inú gbọdọ̀ hàn gẹ́gẹ́ bí ẹrù tí a fi àṣírí bo nínú tunnel ìta; tí ó bá hàn gẹ́gẹ́ bí UDP lasán sí 203.0.113.9, ọ̀nà host kò sí, a kò sì kọ́ ẹ̀wọ̀n náà rí.

Ẹ̀wọ̀n tí ń padà sí uplink ti ara ní ìdákẹ́jẹ́ ni èsì tí ó burú jù, nítorí ipò interface kò kéde ohunkóhun, irin-àjò inú sì ń jáde láti àdírẹ́sì orísun tí kò tọ́. Tí oníbàárà kejì bá lè tún so pọ̀ tààrà nígbà tí tunnel ìta bá ṣubú, pa ọ̀nà yẹn dé tàbí so ó mọ́ interface ìta kí ìkùnà lè hàn.

Parí pẹ̀lú ìṣàn méjì àti dump òfin kan: ìsopọ̀ tí a sàmì sí àti èyí tí a kò sàmì sí gbọdọ̀ gba ọ̀nà ọ̀tọ̀ọ̀tọ̀, ip rule show sì gbọdọ̀ ṣe àkọsílẹ̀ ipò àkọ́kọ́ tí o ní lọ́kàn. Tí ìṣàn méjèèjì bá gba ọ̀nà kan náà, a kò ń lo àmì náà ní ibi tí o rò.

Àwọn àpilẹ̀kọ tó jọra