Ping sí 192.0.2.10 ń sọ fún ọ pé àdírẹ́sì kan dáhùn sí ICMP echo, kì í sọ ohun mìíràn. Nínú nẹ́tíwọ́kì tí kò ní ọ̀nà abẹ́lẹ̀ ó lè ṣàṣeyọrí ṣì, nítorí àdírẹ́sì náà lè wà nínú subnet àdúgbò; pẹ̀lú ọ̀nà abẹ́lẹ̀ tí ó yá ó lè kùnà, nítorí server ń fi ICMP sílẹ̀ nígbà tí ó ń pèsè HTTPS. Àyẹ̀wò tí script rẹ nílò ni ìbéèrè ipò pẹpẹ pẹ̀lú ìdánwò ipa sí ibi tí app ń lò. Wo wọ́n gẹ́gẹ́ bí àpapọ̀ méjì ọ̀tọ̀ọ̀tọ̀, kì í gẹ́gẹ́ bí boolean kan.

Ohun tí ìdáhùn echo ń fi hàn ní tòótọ́

ICMP jẹ́ ètò ìwọlé tí kò mọ̀ nípa interface tàbí ọ̀nà abẹ́lẹ̀. Nígbà tí ìdáhùn bá dé, kernel ń sọ pé ẹ̀rọ kan dáhùn; kò sọ ipa tí ó gbé ìbéèrè náà tàbí ipa tí ó gbé ìdáhùn náà. Ìṣẹ́ àyọkúrò ń mú àmì náà di aláriwo púpọ̀ sí i, nítorí firewall tí ó dẹnà àwọn ìbéèrè echo kò sọ ohun kankan nípa àwọn port tí ó wà lẹ́yìn rẹ̀. Àti pé profile ọ̀nà abẹ́lẹ̀ tí ó pín lè yọ àdírẹ́sì tí a dánwò kúrò ní àìmọ̀ọ́mọ̀ nígbà tí gbogbo ibi mìíràn ń ṣiṣẹ́.

Ohun tí o fẹ́ mọ̀ gan-an ni bóyá iṣẹ́ kan pàtó lè ṣe é lò ní ipa tí app ń gbà. Yan ẹ̀rọ àti port tí app ń pè, kí o sì béèrè ìdáhùn ní ìpele app.

Ìwọlé àti ipò ọ̀nà abẹ́lẹ̀ jẹ́ òtítọ́ ọ̀tọ̀ọ̀tọ̀, a sì lè jẹ́ òtítọ́ kan nígbà tí èkejì jẹ́ irọ́. Pínpín wọn yóò sọ fún ọ pé ẹni tí àìṣeé náà jẹ́. Pípọ̀ wọn pọ̀ sí àyẹ̀wò kan ń dá tikẹ́ẹ̀tì tí ẹnikẹ́ni kò lè tọ́jú.

Béèrè lọ́wọ́ Android nípa gbígbé, kì í ṣe ping

Android ń dáhùn ìbéèrè ipò ní tààrà nípasẹ̀ ConnectivityManager. Àwọn agbára nẹ́tíwọ́kì tí ń ṣiṣẹ́ ń gbé àmì gbígbé VPN, tí a ń gbé kalẹ̀ nígbà tí a bá ń darí ìrìnàjò nípasẹ̀ interface VPN. Ìpè náà jẹ́ ti àdúgbò, ó pọ̀ mọ́, kò sì sinmi lórí bóyá ẹ̀rọ ọ̀nà jínjìn kan dáhùn.

Ẹ̀yà Java yìí ń dá false padà dípò kí ó ju àtakò nígbà tí kò sí nẹ́tíwọ́kì tí ń ṣiṣẹ́. Nítorí ó ń ka nẹ́tíwọ́kì tí ń ṣiṣẹ́, ó ń fi profile tí olùlò yàn nínú Ètò hàn.

ConnectivityManager cm = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
NetworkCapabilities caps = cm.getNetworkCapabilities(cm.getActiveNetwork());
boolean tunnel = caps != null && caps.hasTransport(NetworkCapabilities.TRANSPORT_VPN);

Fún àwọn ìfitónilétí ìyípadà, forúkọ sílẹ̀ NetworkCallback dípò pínpín pẹ̀lú aago. Má ṣe dà á pọ̀ mọ́ VpnService.prepare, tí ó ń sọ kìkì bóyá olùlò ti fún ní àṣẹ fún VPN, kì í ṣe bóyá àwọn pákẹ́tì ń sàn. Ìyọkúrò ń wá nípasẹ̀ VpnService.onRevoke, ṣùgbọ́n gbìgbàgbé profile nínú Ètò kò ń dá ìkéde kankan.

iOS: àwọn orúkọ interface jẹ́ àfojúsùn, kì í ṣe àdéhùn

Ọ̀pọ̀ àpẹẹrẹ iOS ń ṣàyẹ̀wò ètò proxy, ń rí ìtumọ̀ __SCOPED__ àti ń wá àwọn kọ́kọ́rọ́ interface bí tap, tun, utun2, ppp tàbí ipsec. Ọ̀nà yẹn jẹ́ àṣà ìsọ ní orúkọ, kì í ṣe ìdánilójú tí a kọ sílẹ̀, nítorí náà ìmúdójúìwọ̀n OS tí ó yí orúkọ interface padà lè bà á jẹ́. Ó tún máa ń sọ true fún àwọn àkọsílẹ̀ àtijọ́ tí ó ń gbé ju ọ̀nà abẹ́lẹ̀ lọ.

Nígbà tí app rẹ bá ni ìṣètò náà, NEVPNManager ń fún ọ ní ipò gidi. Ó ń ṣàpèjúwe ọ̀nà abẹ́lẹ̀ tí app rẹ bẹ̀rẹ̀; pẹ̀lú VPN fún app kọ̀ọ̀kan, àwọn app mìíràn lè wà ní ìta ọ̀nà abẹ́lẹ̀ yẹn pátápátá.

Tún gbé àwọn ààyò wọlé kí o tó ka ipò náà, nítorí iye náà ń yí padà nígbà tí ọ̀nà abẹ́lẹ̀ ń gun àti ń sọ̀ kalẹ̀:

let manager = NEVPNManager.shared()
manager.loadFromPreferences { error in
    let up = manager.connection.status == .connected
    print(up)
}

Àmì ipò pẹpẹ kò ṣì fi hàn pé ìrìnàjò ń dé ọ̀dọ́gbà. Ààlà yẹn ni ìdánwò ipa ń bo, àti ìdí niyẹn tí boolean kan kò tó fún àtìlẹ́yìn.

Àwọn profile Windows ń fi pápá ipò gidi hàn

Windows ń tọpinpin àwọn profile VPN lọ́tọ̀ sí àwọn adapter, Get-VpnConnection sì ń fi ConnectionStatus hàn fún gbogbo profile tí ó mọ̀. Àwọn profile tí a ṣẹ̀dá nípasẹ̀ Windows client tàbí àpò ìpèsè ń farahàn níbí. Cmdlet yìí kì í ṣe aṣàwárí ọ̀nà abẹ́lẹ̀ gbogbogbò.

Ka pápá náà fún profile tí ó ní orúkọ, kí o sì fi -AllUserConnection kún un nígbà tí profile náà jẹ́ ti gbogbo olùlò:

Get-VpnConnection -Name "Fabrikam" | Select-Object Name, ConnectionStatus, ServerAddress

Àwọn client ẹ̀ka kẹta sábà máa ń wà ní àìrí fún cmdlet yìí pàápàá nígbà tí ọ̀nà abẹ́lẹ̀ wọn ń ṣiṣẹ́, nítorí náà àbájáde òfìfo túmọ̀ sí àìmọ̀, kì í ṣe gígé kúrò. Àwọn àkọ́jọ́ adapter tún ń ṣì lọ́nà kan náà: adapter olùpèsè lè wà nígbà tí kò ṣiṣẹ́, àwọn adapter mìíràn sì wà kìkì nígbà ìpàdé. Fún profile tí Windows ní, rasdial ń sọ kóòdù ìjáde tí o lè pín nípa rẹ̀. Gbogbo èyí ń ṣàpèjúwe ìgbàgbọ́ àdúgbò, kì í ṣe ìwọlé ọ̀dọ́gbà.

Ipò àti ipa: àyẹ̀wò ẹ̀ka méjì

Profile tí ó so pọ̀ kò sọ ohunkóhun nípa ibi tí àwọn pákẹ́tì ń lọ. Ọ̀nà abẹ́lẹ̀ tí ó pín lè jẹ́ kí ọ̀nà abẹ́lẹ̀ wà ní ṣíṣe nígbà tí ó ń yọ ibi tí ó ṣe pàtàkì fún ọ kúrò. Àwọn profile always-on máa ń so mọ́ server tí ó ti kú, kill switch sì ń dẹnà ìrìnàjò ní àìmọ̀ọ́mọ̀ nígbà tí ọ̀nà abẹ́lẹ̀ bá ṣubú.

Dánwò àwọn ìpele méjèèjì: jẹ́rìí pé gbígbé VPN tàbí profile ń ṣiṣẹ́, kí o sì jẹ́rìí pé ibi náà yanjú àti dáhùn ní ipa yẹn. Lórí Linux, béèrè lọ́wọ́ kernel interface tí yóò lò:

ip route get 192.0.2.10
resolvectl query intranet.example.test

Nígbà tí client wà ní ìta ìṣàkóso rẹ, ṣàkọsílẹ̀ àbájáde méjèèjì kí o sì jẹ́ kí àpẹẹrẹ náà tọ́ka sí ìpele náà. Sísopọ̀ pẹ̀lú ìdánwò ipa tí ó kùnà ń dábàá ọ̀nà abẹ́lẹ̀ tí ó pín, DNS tàbí ìlànà. Gígé kúrò pẹ̀lú ìdánwò ipa tí ó ń ṣiṣẹ́ túmọ̀ sí pé ipa mìíràn ń gbé ìrìnàjò náà.

Ìdánwò tí o lè ṣe ní ìtẹ̀léntẹ̀lẹ̀

Ṣàkọsílẹ̀ ipò pẹpẹ ní àkọ́kọ́, kí o tó yí ipò nẹ́tíwọ́kì èyíkéyìí padà. Yanjú orúkọ ẹ̀rọ náà kí o sì ṣàkíyèsí ẹbí àdírẹ́sì, nítorí àkọsílẹ̀ AAAA lè gbà ipa mìíràn ju àkọsílẹ̀ A lọ. Ṣí port iṣẹ́ náà kí o sì béèrè ìdáhùn app dípò ìfọwọ́sọ̀rọ̀ lásán. Tọ́jú gbogbo àkíyèsí nínú pápá àkọsílẹ̀ tirẹ̀.

Lórí ẹ̀rọ Linux tí ó ní dig àti curl, àwọn àṣẹ mẹ́ta ń bo yíyanjú, ipa àti iṣẹ́ náà fúnra rẹ̀. Ṣe wọ́n nígbà tí ọ̀nà abẹ́lẹ̀ wà lókè àti lẹ́ẹ̀kan sí nígbà tí ó wà nísàlẹ̀:

dig +short intranet.example.test
ip route get 198.51.100.20
curl -sS -o /dev/null -w "%{http_code}" --max-time 8 https://intranet.example.test/health

Pápá mẹ́rin ọ̀tọ̀ọ̀tọ̀ ń ṣẹ́gun boolean kan, nítorí ipò, DNS, ipa àti ìlànà ń kùnà lọ́nà ọ̀tọ̀ọ̀tọ̀ tí wọ́n sì ń dé ọ̀dọ̀ àwọn ẹgbẹ́ ọ̀tọ̀ọ̀tọ̀. Ping nínú terminal ṣì jẹ́ àyẹ̀wò ọwọ́ tí ó dára. Ó jẹ́ ìtumọ̀ ìsopọ̀ tí kò dára fún ìṣiṣẹ́ aládàáṣe, níbi tí API pẹpẹ àti ìdánwò ipa ń dáhùn ìbéèrè gidi.

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