Bí a ṣe lè darí app kan nípasẹ̀ VPN láìfi gbogbo ẹ̀rọ
Kò sí desktop tí a kò ṣàkóso tó ń pèsè yíyí VPN fún ọ̀kọ̀ọ̀kan ìlànà. Yan ìpele tó ń yan ìṣàn: socket tí a so, òfin UID, profáìlì firewall tàbí ìfò SOCKS.
VPN client ń sopọ̀, browser ń ṣiṣẹ́, àmọ́ ìpàṣẹ kan ṣoṣo tí ó ṣe pàtàkì fún ọ ì ṣì ń jáde nípasẹ̀ ìsopọ̀ ilé rẹ. Tàbí òdìkejì ń ṣẹlẹ̀: tunnel gba ọ̀nà àkọ́kọ́, server fáìlì àdúgbò sì pòórá kúrò lórí desktop. Mo pàdé èyí pẹ̀lú agent ìkọ́ kan tí ó ní láti dé dígí artifact inú, nígbà tí ìyókù ẹ̀rọ náà wà ní LAN ọ́fíìsì, client sì fún ni ní àṣàyàn méjì péré, gbogbo ìṣàn tàbí kò sí rárá. Ìbéèrè náà jẹ́ ọ̀kan náà ní ẹ̀gbẹ́ méjèèjì, app yìí kì í ṣe gbogbo ẹ̀rọ, ọ̀pọ̀ client kò sì ní àpótí àmì fún un, nítorí tábìlì ọ̀nà kò mọ ohun tí program jẹ́ rí.
Ìdí tí tábìlì ọ̀nà kò fi lè rí program rẹ
Nígbà tí ìlànà bá fi packet ránṣẹ́, stack ń wá adírẹ́sì ibi-ìlọ nínú tábìlì ọ̀nà. Bóyá orúkọ fáìlì ìmúṣẹ tàbí port kò wọ inú ìwádìí yẹn. Orúkọ ìkànnì kó̀sí nítorí ìdí kan náà: tunnel ń gbé ìṣàn dé adírẹ́sì kan, nígbà tí orúkọ bá yanjú sí adírẹ́sì, ìtọ́nà ni ìmúdì kan ṣoṣo tí kernel ṣì ní. Ìdí ni pé "VPN fún ojú-ìwé yìí nìkan" ní ìparí túmọ̀ sí proxy, "VPN fún program yìí nìkan" sì túmọ̀ sí ọ̀kan nínú àkójọ àwọn ọ̀nà díẹ̀.
| Ọ̀nà | Kí ni ó ń yan | Kí ni ó ń bo | Nígbà tí tunnel bá ṣubú |
|---|---|---|---|
| Sísopọ̀ socket | adírẹ́sì orísun | client tí ìwọ ń darí | àwọn ìsopọ̀ ń kùnà |
| Òfin UID (Linux) | olùlò tó ni | gbogbo ìlànà akọọlẹ kan | àwọn ìsopọ̀ ń kùnà |
| Profáìlì firewall (Windows) | profáìlì adapter | program kan | ó kùnà ní ipò tí ó ti dé |
| Àyè orúkọ nẹ́tíwọ́kì | ìdọmọlẹ́gbẹ́ nínú àyè orúkọ | ohun gbogbo tí a bẹ̀rẹ̀ ní inú | àwọn ìsopọ̀ ń kùnà |
| Ìfò SOCKS | ètò proxy app | app kan tàbí profáìlì browser kan | àwọn ìsopọ̀ ń kùnà |
Kò sí ọ̀kan nínú wọ́n tó jẹ́ ọ̀nà fún ìlànà kọ̀ọ̀kan. Ọ̀kọ̀ọ̀kan ń gbé ìpinnu lọ sí ìpele tí ó lè rí program, olùlò tàbí ìṣètò app fúnra rẹ̀.
Ibi-ìlọ kan ṣì jẹ́ ọ̀nà, kì í ṣe òfin program. Lórí macOS ọ̀nà tí ó wọ́pọ̀ ni yíyọ àmì "Fi gbogbo ìṣàn ránṣẹ́ lórí VPN" kí o sì fi ọ̀nà host kún un: sudo route add -host internal-tuner.example -interface ppp0, tí a tún yọ kúrò pẹ̀lú sudo route delete -host internal-tuner.example -interface ppp0. Kọ́kọ́ ka orúkọ interface láti ifconfig, nítorí pé ppp0 jẹ́ àpẹẹrẹ nìkan. Àwọn wildcard kò ṣiṣẹ́ nínú ọ̀nà host, nítorí náà iṣẹ́ tí ó ń bá orúkọ púpọ̀ sọ̀rọ̀ nílò àkọsílẹ̀ kan fún orúkọ kọ̀ọ̀kan, òfin náà sì bo gbogbo ìlànà lórí ẹ̀rọ, kì í ṣe ẹni tí ó wà lọ́kàn rẹ.
So socket mọ́ adírẹ́sì tunnel
Nígbà tí ìwọ bá ń darí client, sísopọ̀ ni olùyàn tí ó rọ̀ jùlọ. Socket tí a so mọ́ adírẹ́sì àdúgbò tunnel ń jáde nípasẹ̀ interface yẹn níwọ̀n ìgbà tí ọ̀nà kan wà sí ibi-ìlọ níbẹ̀, ohun gbogbo mìíràn lórí ẹ̀rọ sì ń pa ọ̀nà deede rẹ̀ mọ́. Ohun tí ó fẹ̀ẹ́ ni pé sísopọ̀ ń yan adírẹ́sì orísun nígbà tí tábìlì ọ̀nà ṣì ń yan ibi-jáde. Sísopọ̀ nìkan kò gbé ìṣàn tí kò ní ọ̀nà wọ tunnel, ìyẹn sì ni àṣìṣe tí ó wà lẹ́yìn ọ̀pọ̀ ìròyìn "mo so ó mọ́ béè ṣì ń jáde ní ọ̀nà tí kò tọ́".
import socket
s = socket.socket()
s.bind(("10.8.0.2", 0))
s.connect(("build.internal.example", 443))Àwọn irinṣẹ́ ìpele gíga ń fi ọ̀nà kan náà hàn: curl --interface 10.8.0.2, CURLOPT_INTERFACE nínú PHP àti àlàyé source_address nínú àwọn HTTP client Python. Adírẹ́sì gbọ́dọ̀ jẹ́ ti tunnel, àṣìṣe títẹ̀ níbí sì kùnà gẹ́gẹ́ bí àṣìṣe ìsopọ̀ lasan, kì í ṣe ẹ̀sùn ìtọ́nà. Sísopọ̀ mọ́ orúkọ ẹ̀rọ dípò adírẹ́sì jẹ́ ẹ̀tọ́ Linux, kò sì kọjá sí Windows tàbí macOS, ìdí ni pé àwọn script tí ó lè gbé ká ń fi adírẹ́sì ránṣẹ́.
Linux: bá ẹni tó ni mu, kì í ṣe orúkọ program
Kernel lè bá olùlò tí ó ni socket mu, nítorí náà akọọlẹ ìyàsọ́tọ̀ di olùyàn. Fi tunnel sínú tábìlì ọ̀nà tirẹ̀ kí o sì fi ìṣàn akọọlẹ yẹn nìkan ránṣẹ́ síbẹ̀:
ip rule add uidrange 1001-1001 lookup 100
ip route add default dev tun0 table 100Èyí ń ṣiṣẹ́ nìkan bí tunnel kò bá ti jẹ́ ọ̀nà àkọ́kọ́ tẹ́lẹ̀. Bẹ̀rẹ̀ client pẹ̀lú --route-nopull, tàbí ṣe àlẹ̀mọ́ ìtúnjáde tí a ti rán pẹ̀lú --pull-filter ignore "redirect-gateway" lórí OpenVPN 2.4 àti ìran tó tẹ̀lé, kí o sì fi àkọsílẹ̀ tábìlì kún un fúnra rẹ. Bí bẹ́ẹ̀ kọ́, àwọn ọ̀nà àkọ́kọ́ méjèèjì wà, èyí tí ó ní ipò kéré ni yóò ṣẹ́gun. Ẹ̀dà àmọ̀ọ́nú rẹ̀ ni yíyí ọ̀nà àkọ́kọ́ sí ẹnu-ọ̀nà tunnel, tàbí ṣíṣe é láti script ìpínyà: ó ń pa ìṣàn mọ́ kúrò lórí íńtánẹ́ẹ̀tì nígbà tí tunnel bá ṣubú, ṣùgbọ́n yíyípàá ni, kì í ṣe olùyàn, ó sì wà títí ẹnìkan yóò fi yọ ọ́.
Ẹ̀dà tí ó lágbára jù ni àyè orúkọ nẹ́tíwọ́kì. Dá a, ṣe client nínú rẹ̀, kí o sì bẹ̀rẹ̀ app pẹ̀lú ip netns exec. Kò sí ohun tí ó wà ní òde àyè orúkọ tí ó rí interface tunnel, nítorí náà app kò lè padà sí ọ̀nà ẹ̀rọ ní àṣìṣe. Iye owó rẹ̀ wà ní tòótọ́: àyè orúkọ nílò bata veth láti dé nẹ́tíwọ́kì ti ara àti fáìlì resolver tirẹ̀, nítorí àyè orúkọ ìgbékalẹ̀ kò pín ètò yíyanjú orúkọ ti ẹ̀rọ.
Àwọn ọ̀nà ìkùnà méjì ń ṣàlàyé ọ̀pọ̀ ìjáde. Yíyanjú orúkọ ṣì ń ṣẹlẹ̀ nínú resolver ẹ̀rọ, nítorí náà ìbéèrè ń jáde ní òde tunnel pàápàá nígbà tí ìsopọ̀ TCP bá wọ inú. IPv6 sì nílò ip -6 rule tirẹ̀, nítorí òfin v4 kò bo ó.
Windows àti macOS: dín firewall mọ́ ààlà tàbí fi proxy lélẹ̀
Windows kò ní olùyàn ọ̀nà fún app kọ̀ọ̀kan, ṣùgbọ́n àwọn òfin firewall rẹ̀ lè ní ààlà sí profáìlì kan, a sì lè pín adapter VPN gẹ́gẹ́ bí Gbogbo ènìyàn nígbà tí LAN ilé ṣì jẹ́ Àdáni. Dá àwọn òfin ìdínà ìjáde fún program lórí profáìlì Àdáni àti Agbègbè, fi Gbogbo ènìyàn sílẹ̀ ní ṣíṣí, app yóò sì lè dé nẹ́tíwọ́kì nípasẹ̀ tunnel nìkan. Kọ́kọ́ ṣètò ẹ̀ka nẹ́tíwọ́kì ìsopọ̀, lẹ́yìn náà jẹ́rìí nínú pánẹ́ẹ̀lì ìbójútó firewall pé òfin náà bá a mu. Ìdínà ni, kì í ṣe ọ̀nà: ó kùnà ní ipò tí ó ti dé nígbà tí tunnel bá ṣubú, kò sì lè dá app tí ó kọ̀ firewall sílẹ̀ dúró.
macOS ń tẹ̀lé ọgbọ́n kan náà pẹ̀lú irinṣẹ́ mìíràn. Olùgbọ́ SOCKS tí a dé ọ̀dọ̀ rẹ̀ nípasẹ̀ SSH ni àṣàyàn tí kò gbógun jùlọ, nítorí ssh -D 1080 user@host ń dá port àdúgbò kan, àwọn app tí a ṣètò láti lò ó nìkan sì ń gba ọ̀nà yẹn. Òfin pf lè dínà program nípasẹ̀ olùlò tàbí ẹgbẹ́, ṣùgbọ́n kò tí ì lè yan tunnel fún program yẹn nìkan. Tunnelblick kò lè ṣe àlẹ̀mọ́ nípasẹ̀ ìkànnì rárá, nítorí àwọn ọ̀nà ń ṣiṣẹ́ pẹ̀lú adírẹ́sì; àwọn olùlò OpenConnect ń lọ sí vpn-slice nígbà tí server bá ti ọ̀dọ̀ ìtòlẹ́sẹẹsẹ àkọ́kọ́ tí ó gbòòrò jù.
Àwọn ojútùú méjì ń bo ohun tí irinṣẹ́ platform ń pàdánù. Àwọn àfikún browser tí ó ń yí proxy padà nípasẹ̀ ìkànnì ni ìdáhùn tí ó wà fún "ojú-ìwé yìí nìkan", nítorí wọ́n ń ṣiṣẹ́ ní ìpele app níbi tí orúkọ ṣì wà; wọ́n bo browser kan, kò sí mìíràn. Ọ̀nà tí ó le koko ni láti ṣe client olùpèsè nínú ẹ̀rọ àròyé, kí àlejò ni ó ni ìyípadà ọ̀nà nígbà tí ẹ̀rọ ṣì pa ọ̀nà rẹ̀ mọ́, pẹ̀lú iye owó stack nẹ́tíwọ́kì méjì láti tọ́jú.
Ìfò SOCKS fún àwọn irinṣẹ́ tí kò ní àṣàyàn sísopọ̀
Ọ̀pọ̀ app ni a lè tọ́ka sí proxy HTTP tàbí SOCKS pàápàá bí wọ́n kò bá mọ nǹkan kan nípa interface. Client SSH ń pèsè ọ̀kan láìsí ìyípadà ní ẹ̀gbẹ́ server:
ssh -N -D 127.0.0.1:9999 [email protected]Ohunkóhun tí a ṣètò láti lò port yẹn ń jáde ní bastion nígbà tí ìyókù desktop ń pa ìsopọ̀ deede rẹ̀ mọ́. Ẹ̀dà 3proxy àdúgbò tí a so mọ́ adírẹ́sì tunnel ń ṣe ohun kan náà fún port kan láìsí SSH, stunnel sì bo port kan ṣoṣo tí a fi TLS wé. Àwọn ààlà jẹ́ ti ìṣe: proxy ń gbé àwọn protocol tí ó mọ bí a ṣe ń lò ó nìkan, UDP nílò ìsopọ̀ UDP SOCKS5 tí ètò "SOCKS5" ọ̀pọ̀ client kò mú ṣiṣẹ́, DNS sì gbọ́dọ̀ jẹ́ yíyanjú nípasẹ̀ proxy (socks5h nínú curl) bí bẹ́ẹ̀ kọ́ orúkọ yóò jáde sí resolver àdúgbò.
Fi olùgbọ́ náà sí loopback àyàfi bí ẹ̀rọ mìíràn bá nílò rẹ̀.
Jẹ́rìí ọ̀nà pẹ̀lú ìmúra, kì í ṣe ìfiránṣẹ́ ipò
Àwọn fèrèsé ipò app ń ṣàpèjúwe ètò, kì í ṣe packet. Múra ìṣàn lórí interface méjèèjì kí o sì fi wé:
tcpdump -i any -n port 443
ss -tnp | grep 443Bí ìsopọ̀ bá farahàn lórí interface ti ara láìsí àkọsílẹ̀ tí ó bá a mu lórí tunnel, olùyàn kò ṣiṣẹ́, ohunkóhun tí client bá ròyìn. Ṣàyẹ̀wò IPv6 àti resolver lọ́tọ̀, kí o sì wá ọ̀nà kejì bí ìlànà olùrànwọ́ tàbí proxy ẹ̀rọ tí ó jogún.
Lẹ́yìn náà yan ààlà tí ó bá ìbéèrè mu: proxy tó fún ojú-ìwé kan, òfin UID tó fún akọọlẹ kan, profáìlì firewall tó nígbà tí ìsopọ̀ gbọ́dọ̀ kùnà ní ipò tí ó ti dé, àyè orúkọ sì ni àṣàyàn kan ṣoṣo tí ó fi tunnel pamọ́ kúrò lọ́dọ̀ ohun gbogbo ní òde rẹ̀.