Nígbà tí emulator kò bá lè dé ọdọ build server tí ẹrọ ìwé ìwò lórí host ń ṣí dáadáa, ìbéèrè tí ó wúlò kì í ṣe bóyá VPN ń ṣiṣẹ́. Ìbéèrè náà ni èwo nínú àwọn ọ̀nà méjì tí guest kò ní. Ẹrọ oníkà ń ṣiṣẹ́ network stack tirẹ̀ lẹ́yìn NAT emulator, àti àkójọ resolver rẹ̀ jẹ́ ẹ̀dà tí wọ́n ya nígbà boot, nítorí náà tunnel tí ó dé lẹ́yìn máa ń yí ipa-ọ̀nà host padà láìyí ohun tí guest béèrè padà. Ìgbà tí a bá yé àwọn ìpele méjì yìí, ó máa ń ṣàlàyé fẹ́rẹ̀ẹ́ gbogbo ìrísí ìṣòro yìí.

Guest jẹ́ stack ọ̀tọ̀ lẹ́yìn NAT tí kò yí

Network user-mode ti QEMU ń gbé guest sí 10.0.2.15 pẹ̀lú gateway ní 10.0.2.2, àti iṣẹ́ DNS ní 10.0.2.3 sí 10.0.2.6. A kì í fi kernel host ránṣẹ́ traffic tí ó ń jáde látọ̀dọ̀ guest; a máa ń yí i padà sí socket ní ẹ̀gbẹ́ host, ọ̀kan fún gbogbo ìsopọ̀ guest, àwọn socket yẹn sì ń jáde láti inú ààyè àdírẹ́sì host. Ìdí niyẹn tí ìsopọ̀ guest fi jogún ìpinnu ipa-ọ̀nà host ní àkókò tí a ṣẹ̀dá rẹ̀, àti ìdí niyẹn tí guest kò fi ní àkọsílẹ̀ kankan nínú tábìlì ipa-ọ̀nà tí ó dárúkọ tunnel rẹ.

Ọ̀nà kan náà ń fún guest ní ọ̀nà àbájáde tí ó wúlò. 10.0.2.2 jẹ́ orúkọ mìíràn fún loopback interface host, nítorí náà iṣẹ́ tí ń gbọ́ ní 127.0.0.1 lórí laptop lè dé láti ọ̀dọ̀ guest ní àdírẹ́sì yẹn. Ohunkóhun tí client fi hàn ní loopback nìkan ni a lè dé bá pẹ̀lú ọ̀nà yìí, èyí sì ni ìpìlẹ̀ ètò proxy tí a ṣàlàyé nísàlẹ̀.

Ohun tí guest kò lè ṣe ni ṣíṣàyẹ̀wò network host bí ẹni pé ó jẹ́ namespace tirẹ̀. Kò sí bridge, kò sí tábìlì ipa-ọ̀nà tí a pín, kò sì sí resolver tí a jogún; iṣẹ́ NAT tí ń gba àwọn packet rẹ̀ àti àwòrán tí ẹrọ ìbẹ̀rẹ̀ ya nígbà tí ẹrọ oníkà bẹ̀rẹ̀ nìkan ni ó wà.

DNS jẹ́ àwòrán, kì í ṣe ìwòye alààyè

Nígbà ìbẹ̀rẹ̀ emulator ń ka àkójọ resolver host, ó sì fún guest ní àwọn server tó dópin mẹ́rin, tí wọ́n fi hàn ní àwọn àdírẹ́sì 10.0.2.3 sí 10.0.2.6. Bí tunnel bá wà nísàlẹ̀ ní àkókò yẹn, àwòrán náà ní resolver gbogbo ènìyàn tí laptop ń lò, guest sì ń béèrè lọ́wọ́ rẹ̀ ní gbogbo ọjọ́ ayé rẹ̀. Àwọn orúkọ gbogbo ènìyàn ń yanjú, àwọn orúkọ inú kì í yanjú, gbogbo àmì sì ń tọ́ka sí VPN nígbà tí ohun tí ó ti pẹ́ gan-an jẹ́ àkójọ resolver tí wọ́n ya ní ìṣẹ́jú díẹ̀ kí tunnel tó gòkè.

Nítorí náà ṣíṣe àtúnṣe ìtòlẹ́sẹẹsẹ kì í ṣe ìtàn àròsọ. So tunnel pọ̀ ṣáájú, lẹ́yìn náà tún emulator bẹ̀rẹ̀, kí o sì yàn cold boot ju ìmúpadà àwòrán lọ, nítorí àwòrán quick-boot lè padà pẹ̀lú ipò resolver àti ipa-ọ̀nà tí ó fipamọ́ ṣáájú. Bí o bá nílò láti wo ohun tí guest ń lò nísisìyí, béèrè lọ́wọ́ ẹrọ, kì í ṣe host:

adb shell dumpsys connectivity | grep -i -A2 dns
adb shell ping -c 1 build.internal.example

Emulator tún ń gba resolver tí ó ṣe kedere nígbà ìmúbẹ̀rẹ̀, èyí wúlò nígbà tí o bá mọ ọdọ server tí guest yẹ kí ó lò, ó sì léwu nígbà tí server yẹn jẹ́ ti gbogbo ènìyàn:

emulator -avd Pixel_API_34 -dns-server 203.0.113.53

Resolver gbogbo ènìyàn kò ní ẹ̀dà zone inú, nítorí náà fífi ọ̀kan muti ń yí ìṣòro ìtòlẹ́sẹẹsẹ padà sí àìṣeyọrìí tí kò ní ipẹ́kú. Bí profile bá ń ti DNS àdáni jáde, jẹ́ kí tunnel pèsè rẹ̀ kí o sì cold boot guest dípò kíkọ àdírẹ́sì mọ́ ọn.

Ipa-ọ̀nà ń tẹ̀lé host ní àkókò ìsopọ̀

Nítorí àwọn ìsopọ̀ guest di socket host, a ń ṣe ìpinnu ipa-ọ̀nà nígbà tí a bá ṣẹ̀dá socket. Tunnel tí ó gòkè ṣáájú ìbéèrè túmọ̀ sí pé ìbéèrè náà jáde gba tunnel, ní ìbámu pẹ̀lú àwọn ipa-ọ̀nà profile. Profile split-tunnel tí ń gbé àwọn prefix tí a yàn nìkan máa ń fi subnet àdáni rẹ sílẹ̀ níta pẹ̀lú ìdùnnú, nítorí náà dídé ọdọ host jẹ́ àròsọ nípa guest, kì í ṣe àbájáde. Àwọn ìsopọ̀ guest tí ó ti wà ń pa ipa-ọ̀nà tí a fi dá wọn mọ́, ìdí niyẹn tí client tí ó tún so pọ̀ kì í fi tún ṣàtúnṣe gbogbo ìgbà download tí ó há mọ́ inú emulator.

Ìmúdájú wà lórí interface host, kì í ṣe nínú ìṣirò guest:

sudo tcpdump -ni tun0 'host 203.0.113.10'

Bí ìbéèrè guest bá farahàn lórí interface tunnel, ipa-ọ̀nà ń ṣiṣẹ́, ìṣòro náà sì wà lókè rẹ̀. Bí ó bá farahàn lórí interface ti ara, profile kò bo prefix yẹn, kò sì sí àtúntò ní ẹ̀gbẹ́ guest tí yóò yí i padà.

Nígbà tí client kò fi ohun mìíràn fúnni bí kì í ṣe proxy loopback

Àwọn client òwò díẹ̀ kì í ṣẹ̀dá system tunnel rárá. Wọ́n ń fi olùgbọ́ HTTP tàbí SOCKS hàn ní 127.0.0.1, wọ́n sì retí pé àwọn app máa lò ó. Guest kò lè rí socket yẹn tààrà, ṣùgbọ́n a lè sọ fún emulator pé kí ó lò ó, yálà nípasẹ̀ àwọn ìṣàkóso tí ó gbòòrò (Settings, lẹ́yìn náà Proxy, ipò afọwọ́ṣe, host 127.0.0.1 àti port tí client tẹ̀ jáde) tàbí nígbà ìmúbẹ̀rẹ̀:

emulator -avd Pixel_API_34 -http-proxy http://127.0.0.1:8080

Ṣe ẹ̀dà port láti fèrèsé client; port tí a fojú díwọ̀n máa ń kùnà ní ìdákẹ́jẹ́, ó sì dàbí tunnel tí ó ti bàjẹ́. Rántí ohun tí èyí ń bo: àwọn app tí ó mọ proxy ń bọ̀wọ̀ fún ètò proxy HTTP, àwọn socket aṣálẹ̀ sì ń kọ̀ ọ́ pátápátá. Bí iṣẹ́ náà bá jẹ́ native binary tí ń ṣí àwọn ìsopọ̀ tirẹ̀, ọ̀nà proxy kò dọ́gba pẹ̀lú tunnel, a sì gbọ́dọ̀ ṣe ìfiwéra náà ní kedere.

Fi àbájáde hàn láti inú guest

Ya ìyanjú àti ipa-ọ̀nà sọ́tọ̀ pẹ̀lú ìdánwò méjì nínú ìpàdé kan náà. Orúkọ tí ó kùnà nígbà tí àdírẹ́sì nọ́mbà ń dáhùn jẹ́ ìṣòro àwòrán DNS, àtúnṣe rẹ̀ sì ni ìtòlẹ́sẹẹsẹ tàbí resolver tí ó ṣe kedere. Bí àwọn méjèèjì bá kùnà, ó ń tọ́ka sí ipa-ọ̀nà tàbí ìlànà, ìwádìí tí ó kàn sì ni bóyá app ń ṣiṣẹ́ nínú work profile tí ó ní àwọn ìdíwọ́ network tirẹ̀.

Níkẹyìn, mọ guest tí o ń dánwò lórí. Àwọn àwòrán emulator tí ó ti pẹ́ gan-an ni wọ́n fi jáde láìsí àtìlẹ́yìn tun tí client VPN ní ẹ̀gbẹ́ guest nílò, nítorí náà kò sí profile tí ó lè ṣiṣẹ́ níbẹ̀ rí; àwọn àwòrán ìsinsìnyí ní í. Client tí ó kùnà lórí àwòrán ìsinsìnyí jẹ́ ìṣòro client tàbí profile, àti kíkọ tunnel host lẹ́ẹ̀kan sí i kò ní yí àbájáde padà.

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