Буруу таамаг бол VpnService програм системийн унтраалгыг эргүүлж, үүнээс хойш утас хамгаалагддаг гэсэн ойлголт юм. Үнэндээ болдог зүйл илүү нарийн: програм зөвшөөрөл гуйж, интерфэйс барьж, файлын тодорхойлолтоор пакетуудыг уншиж, бичиж, зогсох үед интерфэйсийг буцааж өгдөг. Нэгэн зэрэг зөвхөн нэг ийм туннель амьд байж болох бөгөөд систем үүнийг асуулгүй авах боломжтой. Хүмүүсийн протоколд тохох будлиантай зан үйлийн ихэнх нь энэ өмчлөлийн загвараас үүдэлтэй.

Амьдралын мөчлөгийн шилжилт бүрийг захын тохиолдол биш, дизайны нэг хэсэг гэж үзээрэй.

Домог: програм утасны VPN-ийг асаана

Урсгал VpnService.prepare()-өөс эхэлдэг бөгөөд энэ нь хэрэглэгчийн хүлээн авах ёстой Intent-ыг буцааж, establish()-өөр үргэлжилдэг бөгөөд энэ нь дараа нь програм хянадаггүй шалтгаанаар бүтэлгүйтэж болно. Хоёр дахь туннель байгуулах нь эхний интерфэйсийг идэвхгүй болгож, системийн мэдэгдлийг солино. Энэ дарааллын хаана ч програм бүх төхөөрөмжийн унтраалгыг эзэмшдэггүй; түүнд өгөгдсөн тодорхойлолт болон түүн дээр буух пакетуудыг эзэмшдэг. Байнгын мэдэгдэл ч програмын дизайнд биш, системд хамаарна.

Интерфэйсийг булаан авахгүй, олгодог тул өөр клиент хүрээг хүссэн үедээ авч болно. Програм үүнийг буцаах утгаар бус, буцаан дуудлагаар мэддэг.

Програмыг албадан зогсоосон нь мэдэгдлийн самбарт харагддаг нь мөн адил шалтгаантай: систем юу олгосноо мэдээлдэг, программ юу харуулахаар сонгосныг биш.

Домог: зөвшөөрлийг нэг удаа өгдөг

Систем туннелийг өөр клиентэд шилжүүлэхдээ суурь класс onBind()-оос буцаадаг binder дээр цуцлалтын гүйлгээ илгээдэг. Тэр binder-ыг өөрийнхээр сольдог програм цуцлалтын гүйлгээг өөрөө дамжуулах ёстой, эс бөгөөс VpnService.onRevoke() хэзээ ч ажиллахгүй бөгөөд үйлчилгээ байхгүй болсон тодорхойлолт руу үргэлжлүүлэн бичнэ. Зөвшөөрлийг хэрэглэгч ч буцааж болох бөгөөд систем дахин ачаалах эсвэл байнга асаалттай дахин холбогдох үед үйлчилгээг зогсоож болно.

Үүнийг шийдэх нь логны мөр биш, тодорхой ажил: тодорхойлолтыг уншихаа зогсоож, хааж, холбогдсон тугийг цэвэрлэж, хэрэглэгч ямар төлөвт байгааг хэлээрэй. Дараа нь програм дахин байгуулах, дахин асуух эсвэл хүлээх ёстойг шийдээрэй, учир нь байнга асаалттай тохиргоонд систем үйлчилгээг өөрөө буцааж авчирч болно.

Цуцлалтыг төлөв бус, онцгой тохиолдол гэж үздэг програм холбогдсон гэж мэдээлсээр байх бөгөөд түүний бичсэн пакет бүр хаягдана, энэ нь нууцлалын хэрэгсэлд тохиолдож болох хамгийн муу эвдрэлийн горим юм.

Домог: интерфэйс таны оронд трафикийг шүүдэг

Ирж буй зүйл бол түүхий IP. Барих эсвэл шүүх гэдэг нь IP, TCP, UDP, IPv6 толгойг задлан шинжлэх, урсгалыг хянах, хариултыг тодорхойлолт руу буцааж бичих бөгөөд энэ нь баригч програмыг системийн боломж бус жижиг сүлжээний стек болгодог. protect() нь програмын өөрийн тээврийн сокет өөрийгөө барихын оронд өөрийн туннелийг тойрч гарахын тулд байдаг бөгөөд туннель боссны дараа үүсгэсэн сокет бүр дээр шалгах үнэ цэнэтэй логик утга буцаадаг.

Бүтээгчийн зөвшөөрсөн ба хориглосон програмын жагсаалт хэний трафик интерфэйс рүү орохыг тодорхойлно. Тэд интерфэйсийн зөөвөрлөж буй IP пакетаас цааш ачаалалд хандах эрх өгөхгүй бөгөөд ямар ч API өөр клиентийн туннелийг илрүүлэхгүй эсвэл системийн VPN профайлуудыг жагсаана. Сүлжээний боломжууд сүлжээг VPN тээвэр гэж хэлж болох ч туннель хэнийх болохыг хэлж чадахгүй.

Тиймээс бусад програмын талаарх төлвийн асуултууд зөрчилтэй хариулт авдаг: мэдээлэл зүгээр л таны процессод ил болоогүй байна.

Амьдралын мөчлөг үнэндээ юу шаарддаг

Өөрийн хянадаг төлвүүдийг хянаарай: бэлэн, байгуулагдсан, цуцлагдсан, зогссон. Дахин холбогдолт нь задалж, дараа нь байгуулах байх ёстой бөгөөд тодорхойлолт болон тээврийн сокетийг нэг эзэмшигчтэй байлгах хэрэгтэй, учир нь байгуулахаар өрсөлдөж буй хоёр бүрэлдэхүүн ганц чөлөөтэй орны төлөө тэмцэнэ. Орчин үеийн Android дээр арын дэвсгэрийн эхлэлт хязгаарлагдмал тул ачаалах үеийн нэвтрүүлэг баталгаа биш; API түвшин зөвшөөрсөн газарт мэдэгдэлтэйгээ урд талын үйлчилгээг ашиглаарай.

Зөвхөн эцсийн төлөв бус, шилжилтийг логлоорой, төлөвийн машиныг зам бүрийг шалгаж болохоор жижиг байлгаарай. Тестэд хүрч чадахгүй төлөв бол логгүйгээр талбарт тааралдах төлөв юм.

Амьдралын мөчлөгийг төхөөрөмж дээр шалгаарай

Эмуляторууд холболтыг хуурамчаар хийж чадна, гэхдээ зөвшөөрөл ба цуцлалтын замыг итгэмжлэгдэхүйцээр биш, тиймээс эдгээрийг орыг хулгайлах хоёр дахь VPN клиент суулгасан бодит төхөөрөмж дээр ажиллуулаарай.

adb shell dumpsys connectivity | grep -i -A3 vpn
adb shell dumpsys activity services | grep -i -A2 vpnservice
adb logcat -s VpnService:V AndroidRuntime:E
adb shell am force-stop com.example.vpnapp

Туннелийг эхлүүлж, мэдэгдэл болон интерфэйсийг баталгаажуулж, дараа нь нөгөө клиентийг холбож, цуцлалтын буцаан дуудлага ажиллаж байгаа эсэх, төлөв цэвэрлэгдэж байгаа эсэхийг ажиглаарай. Програмыг албадан зогсоож, ямар нэг зүйл амьд тодорхойлолт мэдээлсээр байгаа эсэхийг шалгаарай.

Байнга асаалттай дахин ачаалсны дараа дарааллыг давтаарай, учир нь тэр зам хэрэглэгчийн эхлүүлсэн холболтоос ялгаатай. Та ногоон дүрс биш, харин програм өөрт хамаарахгүй болсон тодорхойлолтыг ашиглахаа больсон гэдгийг нотлох баримт хайж байна.

Холбоотой нийтлэлүүд