شبكة VPN

يوفّر Android واجهات برمجة تطبيقات للمطوّرين لإنشاء شبكة افتراضية خاصة (VPN). الرائدة. بعد قراءة هذا الدليل، ستعرف كيفية تطوير واختبار شبكة خاصة افتراضية خاصة للأجهزة التي تعمل بنظام التشغيل Android.

نظرة عامة

تسمح الشبكات الافتراضية الخاصة للأجهزة غير المتصلة بأي شبكة بالوصول بأمان إلى الشبكة.

يتضمن Android برنامج شبكة افتراضية خاصة (PPTP وL2TP/IPSec) مدمجًا، وقد يتم أحيانًا اسم شبكة VPN القديمة قدّم نظام Android 4.0 (مستوى واجهة برمجة التطبيقات 14) واجهات برمجة التطبيقات التي تتيح يمكن للمطوّرين توفير حلول الشبكات الافتراضية الخاصة الخاصة بهم. حزمة شبكة VPN في تطبيق يثبّته المستخدمون على الجهاز ينشئ المطوّرون عادةً شبكة VPN أحد التطبيقات لأحد الأسباب التالية:

  • لعرض بروتوكولات الشبكة الافتراضية الخاصة التي لا تتوافق مع البرنامج المُدمَج.
  • لمساعدة المستخدمين على الاتصال بخدمة شبكة افتراضية خاصة بدون الحاجة إلى إجراء ضبْط مُعقَّد.

يشرح الجزء المتبقي من هذا الدليل كيفية تطوير تطبيقات VPN (بما في ذلك شبكة VPN قيد التشغيل دائمًا ولكل تطبيق) ولا تغطي تطبيق VPN المدمَج.

تجربة المستخدم

يوفر Android واجهة مستخدم (UI) لمساعدة أي شخص في إجراء التهيئة والتشغيل أوقِف شبكة VPN التي تستخدمها. تجعل واجهة مستخدم النظام الشخص الذي يستخدم الجهاز أيضًا هناك اتصال نشط عبر شبكة VPN. يعرض Android مكونات واجهة المستخدم التالية اتصالات شبكة VPN:

  • قبل أن يصبح تطبيق شبكة VPN نشطًا لأول مرة، يعرض النظام مربع حوار طلب الاتصال. ويطلب مربع الحوار من الشخص الذي يستخدم الجهاز ما يلي: تأكيد الوثوق به في شبكة VPN وقبول الطلب
  • تعرض شاشة إعدادات شبكة VPN (الإعدادات > الشبكة والإنترنت > شبكة VPN) شبكة VPN. التطبيقات التي قبل أحد الأشخاص فيها طلبات الاتصال. يتوفّر زر لضبطها. خيارات النظام أو حذف شبكة VPN.
  • تعرض حاوية "الإعدادات السريعة" لوحة معلومات عندما يكون الاتصال نشطة. يؤدي النقر على التصنيف إلى عرض مربّع حوار يتضمّن المزيد من المعلومات ورابطًا. إلى "الإعدادات".
  • يشتمل شريط الحالة على رمز (مفتاح) VPN للإشارة إلى اتصال نشط.

يحتاج تطبيقك أيضًا إلى توفير واجهة مستخدم حتى يتمكن الشخص الذي يستخدم الجهاز من تهيئة خيارات خدمتك. على سبيل المثال، قد يحتاج الحل إلى تسجيل إعدادات مصادقة الحساب. يجب أن تعرض التطبيقات واجهة المستخدم التالية:

  • تتحكّم هذه السياسة في بدء عملية ربط وإيقافها يدويًا. شبكة VPN قيد التشغيل دائمًا الاتصال عند الحاجة، ولكن مع السماح للأشخاص بتهيئة الاتصال عدد مرات استخدام شبكة VPN
  • هو إشعار لا يمكن إغلاقه عندما تكون الخدمة نشطة. يمكن أن لعرض حالة الاتصال أو تقديم مزيد من المعلومات، مثل إحصاءات الشبكة. يؤدي النقر على الإشعار إلى عرض التطبيق في المقدّمة. إزالة بعد أن تصبح الخدمة غير نشطة.

خدمة VPN

يعمل تطبيقك على ربط شبكات النظام لمستخدم (أو عمل تابع للعمل). ) إلى مدخل شبكة VPN. يمكن لكل مستخدم (أو ملف شخصي للعمل) تشغيل تطبيق شبكة ظاهرية خاصة (VPN) مختلف. تنشئ خدمة VPN التي يستخدمها النظام لبدء تشغيل إيقاف شبكة VPN وتتبُّع حالة الاتصال. يتم اكتساب خدمة شبكة VPN من VpnService

تعمل الخدمة أيضًا كحاوية لاتصالات مدخل شبكة VPN واجهات أجهزتهم المحلية. الاتصال بمثيل الخدمة VpnService.Builder لإنشاء واجهة محلية جديدة.

الشكل 1 كيف يربط VpnService بين Android؟ الاتصال بالشبكات على مدخل شبكة VPN
مخطّط بياني لبنية كتلي يوضّح طريقة إنشاء VpnService في TUN محلي
         واجهة المستخدم في شبكات النظام.

ينقل تطبيقك البيانات التالية لربط الجهاز بمدخل شبكة VPN:

  • يقرأ حزم IP الصادرة من واصف ملفات الواجهة المحلية، ويشفِّر ويرسلها إلى مدخل الشبكة الظاهرية الخاصة.
  • كتابة الحزم الواردة (المستلمة وفك تشفيرها من مدخل الشبكة الظاهرية الخاصة) إلى واصف ملف الواجهة المحلية.

تتوفر خدمة نشطة واحدة فقط لكل مستخدم أو ملف شخصي. بدء خدمة جديدة يوقف تلقائيًا خدمة حالية.

إضافة خدمة

لإضافة خدمة شبكة VPN إلى تطبيقك، عليك إنشاء خدمة Android مكتسبة من VpnService توضيح خدمة شبكة VPN في تطبيقك ملف البيان مع الإضافات التالية:

  • حماية الخدمة باستخدام BIND_VPN_SERVICE إذًا، حتى يتسنى للنظام فقط الربط بخدمتك.
  • أعلن عن الخدمة باستخدام فلتر الأهداف "android.net.VpnService" حتى بإمكان النظام العثور على خدمتك.

يوضّح هذا المثال كيفية الإفصاح عن الخدمة في ملف بيان التطبيق:

<service android:name=".MyVpnService"
         android:permission="android.permission.BIND_VPN_SERVICE">
     <intent-filter>
         <action android:name="android.net.VpnService"/>
     </intent-filter>
</service>

الآن بعد أن يتعرّف تطبيقك على الخدمة، يمكن أن يبدأ النظام تلقائيًا وإيقاف خدمة VPN في تطبيقك عند الحاجة على سبيل المثال، يتحكم النظام خدمتك عند تشغيل شبكة افتراضية خاصة (VPN) قيد التشغيل دائمًا

إعداد خدمة

لإعداد التطبيق ليصبح خدمة VPN الحالية للمستخدم، يُرجى الاتصال VpnService.prepare() إذا لم يكُن الشخص الذي يستخدم الجهاز التي سبق منحها إذنًا لتطبيقك، فإن الطريقة تعرض نية النشاط. وأنت تستخدم هذا الغرض لبدء نشاط نظام يطلب الإذن. تشير رسالة الأشكال البيانية يعرض النظام مربّع حوار مشابهًا لمربّعات حوار الأذونات الأخرى، مثل الكاميرا أو جهات الاتصال. إذا كان تطبيقك مُعدًّا من قبل، ستُرجع الطريقة null

يمكن أن يكون تطبيق واحد فقط خدمة VPN المعدّة حاليًا. الاتصال دائمًا VpnService.prepare() لأنّه من المحتمل أن يكون مستخدم قد وضع قيمة مختلفة باعتباره خدمة الشبكة الافتراضية الخاصة (VPN) منذ آخر مرة استدعيت تطبيقك الطريقة. لمزيد من المعلومات، يُرجى مراجعة قسم دورة حياة الخدمة.

ربط خدمة

بعد تشغيل الخدمة، يمكنك إنشاء واجهة محلية جديدة متصل بمدخل شبكة ظاهرية خاصة (VPN). لطلب الإذن والربط بخدمتك مدخل شبكة VPN، عليك إكمال الخطوات بالترتيب التالي:

  1. يمكنك الاتصال بالرقم VpnService.prepare() لطلب الإذن (عند مطلوبة).
  2. يمكنك الاتصال بالرقم VpnService.protect() للحفاظ على مقبس الاتصال النفقي لتطبيقك. خارج شبكة VPN للنظام وتجنب الاتصال الدائري.
  3. يمكنك الاتصال على الرقم DatagramSocket.connect() لربط الاتصال النفقي لتطبيقك. مقبس إلى مدخل الشبكة الظاهرية الخاصة.
  4. طرق الاتصال VpnService.Builder لضبط إعدادات محلية جديدة واجهة TUN على للزيارات الواردة من شبكة VPN.
  5. يمكنك طلب VpnService.Builder.establish() لكي يعمل النظام. تنشئ واجهة TUN المحلية وتبدأ في توجيه حركة البيانات عبر من واجهة pyplot.

يقترح مدخل شبكة VPN عادةً إعدادات واجهة TUN المحلية أثناء والمصافحة. يطلب تطبيقك VpnService.Builder طريقة لضبط كما هو موضح في النموذج التالي:

Kotlin

// Configure a new interface from our VpnService instance. This must be done
// from inside a VpnService.
val builder = Builder()

// Create a local TUN interface using predetermined addresses. In your app,
// you typically use values returned from the VPN gateway during handshaking.
val localTunnel = builder
        .addAddress("192.168.2.2", 24)
        .addRoute("0.0.0.0", 0)
        .addDnsServer("192.168.1.1")
        .establish()

Java

// Configure a new interface from our VpnService instance. This must be done
// from inside a VpnService.
VpnService.Builder builder = new VpnService.Builder();

// Create a local TUN interface using predetermined addresses. In your app,
// you typically use values returned from the VPN gateway during handshaking.
ParcelFileDescriptor localTunnel = builder
    .addAddress("192.168.2.2", 24)
    .addRoute("0.0.0.0", 0)
    .addDnsServer("192.168.1.1")
    .establish();

يوضح المثال في قسم شبكة VPN لكل تطبيق ضبط IPv6، بما في ذلك المزيد من الخيارات. يجب إضافة قيم VpnService.Builder التالية. قبل إنشاء واجهة جديدة:

addAddress()
أضِف عنوان IPv4 أو IPv6 واحدًا على الأقل مع قناع الشبكة الفرعية الذي يستخدمه النظام كعنوان واجهة TUN المحلي. يتلقّى تطبيقك عادةً عنوان IP. العناوين وأقنعة الشبكة الفرعية من بوابة شبكة VPN أثناء المصافحة.
addRoute()
أضِف مسارًا واحدًا على الأقل إذا كنت ترغب في أن يرسل النظام حركة المرور عبر شبكة VPN من واجهة pyplot. تصفية المسارات حسب عناوين الوجهة. لقبول كل الزيارات، يجب إعداد مسار مفتوح مثل 0.0.0.0/0 أو ::/0.

تعرض الطريقة establish() مثيل ParcelFileDescriptor الذي يستخدمه تطبيقك للقراءة والكتابة الحزم من وإلى المخزن المؤقت للواجهة. establish() تُرجعها null إذا لم يكن تطبيقك جاهزًا أو أبطل أحد الأشخاص إذن.

دورة حياة الخدمة

من المفترض أن يتتبّع تطبيقك حالة شبكة VPN التي يختارها النظام وأي شبكة نشطة. الاتصالات. يجب تحديث واجهة المستخدم في تطبيقك لإبقاء الشخص يستخدم إلى جهازك بأي تغييرات.

بدء خدمة

يمكن بدء خدمة VPN بالطرق التالية:

يبدأ تطبيقك خدمة VPN من خلال إرسال intent إلى. startService() لمعرفة المزيد، اقرأ مقالة بدء الخدمة.

يبدأ النظام الخدمة في الخلفية من خلال الاتصال. onStartCommand() ومع ذلك، يفرض Android قيودًا على تطبيقات الخلفية في الإصدار 8.0 (مستوى واجهة برمجة التطبيقات 26) أو الإصدارات الأحدث. إذا كنت تدعم هذا لمستويات واجهة برمجة التطبيقات، عليك نقل خدمتك إلى المقدّمة من خلال استدعاء Service.startForeground() لمزيد من المعلومات، يمكنك الاطلاع على تشغيل الخدمة في المقدّمة.

إيقاف خدمة

يمكن لشخص يستخدم الجهاز إيقاف الخدمة من خلال واجهة المستخدم الخاصة بتطبيقك. أوقِف خدمة Google بدلاً من مجرد إغلاق الاتصال. يوقف النظام أيضًا حالة الاتصال عندما يُجري الشخص الذي يستخدم الجهاز الإجراءات التالية على شاشة شبكة VPN في تطبيق الإعدادات:

  • قطع اتصال تطبيق شبكة VPN أو حذف هذا التطبيق
  • يؤدي إلى إيقاف شبكة VPN قيد التشغيل دائمًا للاتصال النشِط

يستدعي النظام طريقة onRevoke() الخاصة بخدمتك ولكن هذا الاتصال قد لا يحدث في سلسلة التعليمات الرئيسية. وعندما يستدعي النظام هذه الطريقة، واجهة الشبكة البديلة تقوم بالفعل بتوجيه حركة البيانات. يمكنك التخلص من الموارد التالية:

  • إغلاق مقبس النفق المحمي أمام مدخل شبكة VPN من خلال الاتصال DatagramSocket.close()
  • إغلاق واصف ملف الطرود (لا تحتاج إلى استنزافه) من خلال استدعاء ParcelFileDescriptor.close()

شبكة VPN قيد التشغيل دائمًا

يمكن لنظام Android تفعيل خدمة شبكة VPN عند تشغيل الجهاز وإبقائه مشغَّلاً أثناء تشغيله. الجهاز قيد التشغيل. وتُسمّى هذه الميزة شبكة VPN قيد التشغيل دائمًا وتتوفّر في الإصدار 7.0 من نظام التشغيل Android (المستوى 24 من واجهة برمجة التطبيقات) أو الإصدارات الأحدث بينما يحافظ Android على الخدمة فإن خدمة شبكة VPN هي المسؤولة عن مدخل شبكة VPN الاتصال. يمكن أيضًا لشبكة VPN قيد التشغيل دائمًا حظر الاتصالات التي لا تستخدم شبكة VPN.

تجربة المستخدم

في Android 8.0 أو الإصدارات الأحدث، يعرض النظام مربعات الحوار التالية لإجراء شخص يستخدم الجهاز الذي لديه شبكة VPN قيد التشغيل دائمًا:

  • عند انقطاع اتصال شبكة VPN التي يتم تشغيلها دائمًا أو عند تعذُّر الاتصال بها، يرى المستخدمون أو إشعار غير قابل للإغلاق. يؤدي النقر على الإشعار إلى عرض مربّع حوار تشرح المزيد. يختفي الإشعار عند إعادة الاتصال بشبكة VPN أو عندما يستعيد مستخدم الجهاز. يؤدي إلى إيقاف خيار "شبكة افتراضية خاصة (VPN) دائمة التشغيل".
  • تسمح شبكة VPN قيد التشغيل دائمًا لشخص يستخدم أحد الأجهزة بحظر أي شبكة. التي لا تستخدم شبكة VPN. عند تفعيل هذا الخيار، سيتم تفعيل "الإعدادات" يحذّر التطبيق المستخدمين من عدم اتصالهم بالإنترنت قبل استخدام شبكة VPN. الاتصال. يطلب تطبيق "الإعدادات" من الشخص الذي يستخدم الجهاز المتابعة أو إلغاء.

ولأن النظام (وليس عن طريق شخص) يبدأ ويوقف اتصالا دائما، عليك تعديل سلوك تطبيقك وواجهة المستخدم فيه:

  1. إيقاف أي واجهة مستخدم تفصِل الاتصال لأنّ النظام والإعدادات التطبيقات التحكم في الاتصال.
  2. احفظ أي إعداد بين كل تطبيق وابدأ في ضبط اتصال وأحدث الإعدادات. ولأن النظام يبدأ تشغيل تطبيقك عند الطلب، فإن الشخص قد لا يرغب دائمًا مستخدمي الجهاز في إعداد اتصال.

يمكنك أيضًا استخدام عمليات الضبط المُدارة لضبط الاتصال. تساعد الإعدادات المُدارة مشرف تكنولوجيا المعلومات في ضبط شبكتك الافتراضية الخاصة عن بُعد.

الرصد قيد التشغيل دائمًا

لا يتضمّن نظام Android واجهات برمجة التطبيقات للتأكد مما إذا كان النظام قد بدأ تشغيل شبكة VPN خدمة ما. ولكن عندما يُبلغ تطبيقك عن أي مثيلات للخدمة، يمكنك افتراض أنّ النظام بدأ خدمات غير مُعلَنة عن شبكة VPN قيد التشغيل دائمًا. في ما يلي مثال على ذلك:

  1. أنشئ مثيل Intent لبدء خدمة VPN.
  2. يمكنك الإبلاغ عن خدمة شبكة VPN من خلال إضافة عنصر إضافي إلى رسالة intent.
  3. في طريقة onStartCommand() للخدمة، ابحث عن في الإضافات للوسيطة intent.

الاتصالات المحظورة

ويمكن لأي شخص يستخدم الجهاز (أو أحد مشرفي تكنولوجيا المعلومات) إجبار جميع الزيارات على استخدام شبكة VPN. يحظر النظام أي حركة بيانات لشبكة لا تستخدم شبكة VPN. الأشخاص الذين يستخدمون يمكن لجهازك العثور على مفتاح حظر الاتصالات بدون شبكة VPN في خيارات شبكة VPN. في "الإعدادات".

إيقاف الميزة "قيد التشغيل دائمًا"

إذا لم يكن تطبيقك متوافقًا حاليًا مع شبكة VPN التي يتم تشغيلها دائمًا، يمكنك إيقاف الميزة (في نظام Android). 8.1 أو أعلى) من خلال تعيين SERVICE_META_DATA_SUPPORTS_ALWAYS_ON البيانات الوصفية للخدمة على false. يوضح المثال التالي على بيان التطبيق كيفية إضافة عنصر بيانات التعريف:

<service android:name=".MyVpnService"
         android:permission="android.permission.BIND_VPN_SERVICE">
     <intent-filter>
         <action android:name="android.net.VpnService"/>
     </intent-filter>
     <meta-data android:name="android.net.VpnService.SUPPORTS_ALWAYS_ON"
             android:value=false/>
</service>

عندما يوقف تطبيقك تشغيل شبكة VPN قيد التشغيل دائمًا، يوقف النظام واجهة مستخدم الخيارات عناصر التحكم في الإعدادات.

استخدام شبكة افتراضية خاصة حسب التطبيق

يمكن لتطبيقات الشبكة الافتراضية الخاصة فلترة التطبيقات المثبَّتة المسموح لها بإرسال حركة البيانات من خلال اتصال شبكة خاصة افتراضية (VPN). يمكنك إنشاء إما قائمة مسموح بها أو قائمة غير مسموح بها، ولكن ليس كليهما. في حال عدم إنشاء قوائم مسموح بها أو غير مسموح بها، سيرسل النظام رسالة جميع حركة بيانات الشبكة عبر شبكة VPN.

يجب أن يضبط تطبيق الشبكة الافتراضية الخاصة القوائم قبل إجراء الاتصال. إذا كنت بحاجة إلى تغيير القوائم، وإنشاء اتصال شبكة ظاهرية خاصة (VPN) جديد. يجب أن يكون التطبيق يتم تثبيته على الجهاز عند إضافته إلى إحدى القوائم.

Kotlin

// The apps that will have access to the VPN.
val appPackages = arrayOf(
        "com.android.chrome",
        "com.google.android.youtube",
        "com.example.a.missing.app")

// Loop through the app packages in the array and confirm that the app is
// installed before adding the app to the allowed list.
val builder = Builder()
for (appPackage in appPackages) {
    try {
        packageManager.getPackageInfo(appPackage, 0)
        builder.addAllowedApplication(appPackage)
    } catch (e: PackageManager.NameNotFoundException) {
        // The app isn't installed.
    }
}

// Complete the VPN interface config.
val localTunnel = builder
        .addAddress("2001:db8::1", 64)
        .addRoute("::", 0)
        .establish()

Java

// The apps that will have access to the VPN.
String[] appPackages = {
    "com.android.chrome",
    "com.google.android.youtube",
    "com.example.a.missing.app"};

// Loop through the app packages in the array and confirm that the app is
// installed before adding the app to the allowed list.
VpnService.Builder builder = new VpnService.Builder();
PackageManager packageManager = getPackageManager();
for (String appPackage: appPackages) {
  try {
    packageManager.getPackageInfo(appPackage, 0);
    builder.addAllowedApplication(appPackage);
  } catch (PackageManager.NameNotFoundException e) {
    // The app isn't installed.
  }
}

// Complete the VPN interface config.
ParcelFileDescriptor localTunnel = builder
    .addAddress("2001:db8::1", 64)
    .addRoute("::", 0)
    .establish();

التطبيقات المسموح بها

لإضافة تطبيق إلى قائمة التطبيقات المسموح بها، يمكنك الاتصال VpnService.Builder.addAllowedApplication() في حال حذف إذا تضمّنت القائمة تطبيقًا واحدًا أو أكثر، فستستخدم شبكة VPN التطبيقات في القائمة فقط. وتستخدم جميع التطبيقات الأخرى (غير المُدرَجة في القائمة) شبكات النظام كما لو كانت شبكة VPN لا يعمل. عندما تكون قائمة التطبيقات المسموح بها فارغة، تستخدم جميع التطبيقات شبكة VPN.

التطبيقات غير المسموح بها

لإضافة تطبيق إلى قائمة التطبيقات غير المسموح بها، يُرجى الاتصال VpnService.Builder.addDisallowedApplication() تستخدم التطبيقات غير المسموح لها شبكات النظام كما لو كانت شبكة VPN لا تعمل، وجميع التطبيقات تستخدم شبكة VPN.

تخطّي شبكة VPN

يمكن لشبكة VPN السماح للتطبيقات بتجاوز شبكة VPN واختيار الشبكة الخاصة بها. إلى تجاوز شبكة VPN، يمكنك الاتصال بالرقم VpnService.Builder.allowBypass() عند لإنشاء واجهة VPN. لا يمكنك تغيير هذه القيمة بعد بدء شبكة VPN. إذا لم يربط أحد التطبيقات العملية أو المقبس بوحدة فإن حركة بيانات الشبكة للتطبيق تستمر عبر شبكة VPN.

لا يتوفر اتصال بين التطبيقات المرتبطة بشبكة معينة في يحظر حركة البيانات التي لا تمر عبر شبكة VPN. لإرسال الزيارات من خلال الشبكة، وطرق اتصال التطبيقات، مثل ConnectivityManager.bindProcessToNetwork() أو Network.bindSocket() قبل توصيل المقبس.

نموذج التعليمات البرمجية

يتضمن "المشروع المفتوح المصدر لنظام Android" نموذجًا لتطبيق يسمى ToyVPN. يعرض هذا التطبيق كيفية إعداد خدمة شبكة VPN وربطها.