VPN

Android มี API ให้นักพัฒนาแอปสร้างเครือข่ายส่วนตัวเสมือน (VPN) Google Cloud หลังจากอ่านคู่มือนี้ คุณจะทราบวิธีพัฒนาและทดสอบ ไคลเอ็นต์ VPN ของตัวเองสำหรับอุปกรณ์ที่ใช้ Android

ภาพรวม

VPN ช่วยให้อุปกรณ์ที่ไม่ได้อยู่ในเครือข่ายจริงๆ เข้าถึง เครือข่าย

Android มีไคลเอ็นต์ VPN ในตัว (PPTP และ L2TP/IPSec) ซึ่งบางครั้ง ซึ่งเรียกว่า VPN เดิม Android 4.0 (API ระดับ 14) เปิดตัว API เพื่อให้แอป นักพัฒนาซอฟต์แวร์สามารถนำเสนอโซลูชัน VPN ของตนเอง คุณจัดแพ็กเกจโซลูชัน VPN ลงในแอปที่ผู้ใช้ติดตั้งลงในอุปกรณ์ โดยปกติแล้วนักพัฒนาแอปจะสร้าง VPN เนื่องจากเหตุผลข้อใดข้อหนึ่งต่อไปนี้

  • เพื่อให้บริการโปรโตคอล VPN ที่ไคลเอ็นต์ในตัวไม่รองรับ
  • เพื่อช่วยให้ผู้ใช้เชื่อมต่อบริการ VPN ได้โดยไม่มีการกำหนดค่าที่ซับซ้อน

ส่วนที่เหลือของคู่มือนี้จะอธิบายวิธีพัฒนาแอป VPN (รวมถึง เปิดใช้เสมอและ VPN แบบต่อแอป) และไม่ครอบคลุม ไคลเอ็นต์ VPN ในตัว

ประสบการณ์ของผู้ใช้

Android มีอินเทอร์เฟซผู้ใช้ (UI) เพื่อช่วยกำหนดค่า เริ่มใช้งาน โซลูชัน VPN ของคุณ นอกจากนี้ UI ของระบบยังทำให้ผู้ที่กำลังใช้อุปกรณ์ ทราบถึงการเชื่อมต่อ VPN ที่ใช้งานอยู่ Android แสดงคอมโพเนนต์ UI ต่อไปนี้สำหรับ การเชื่อมต่อ VPN:

  • ก่อนที่แอป VPN จะใช้งานได้เป็นครั้งแรก ระบบจะแสดง กล่องโต้ตอบคำขอการเชื่อมต่อ กล่องโต้ตอบจะแจ้งให้ผู้ที่ใช้อุปกรณ์ ยืนยันว่าพวกเขาเชื่อถือ VPN และยอมรับคำขอ
  • หน้าจอการตั้งค่า VPN (การตั้งค่า > เครือข่ายและอินเทอร์เน็ต > VPN) จะแสดง VPN แอปที่ผู้ใช้ยอมรับคำขอเชื่อมต่อ มีปุ่มสำหรับกำหนดค่า ตัวเลือกระบบหรือลืม VPN
  • ถาดการตั้งค่าด่วนจะแสดงแผงข้อมูลเมื่อมีการเชื่อมต่อ ใช้งานอยู่ การแตะป้ายกำกับจะแสดงกล่องโต้ตอบที่มีข้อมูลและลิงก์เพิ่มเติม ไปที่การตั้งค่า
  • แถบสถานะจะมีไอคอน VPN (คีย์) ที่แสดงการเชื่อมต่อที่ใช้งานอยู่

นอกจากนี้ แอปของคุณต้องมี UI เพื่อให้ผู้ที่ใช้อุปกรณ์ได้ กำหนดค่าตัวเลือกของบริการ ตัวอย่างเช่น โซลูชันของคุณอาจต้อง เพื่อบันทึกการตั้งค่าการตรวจสอบสิทธิ์บัญชี แอปควรแสดง UI ต่อไปนี้

  • ตัวควบคุมเพื่อเริ่มและหยุดการเชื่อมต่อด้วยตนเอง VPN แบบเปิดตลอดเวลา สามารถเชื่อมต่อได้เมื่อจำเป็น แต่อนุญาตให้ผู้ใช้สามารถกำหนดค่าการเชื่อมต่อได้ ทุกครั้งที่พวกเขาใช้ VPN ของคุณ
  • การแจ้งเตือนที่ปิดไม่ได้เมื่อบริการทำงานอยู่ การแจ้งเตือนอาจ แสดงสถานะการเชื่อมต่อหรือให้ข้อมูลเพิ่มเติม เช่น สถิติเครือข่าย การแตะการแจ้งเตือนจะนำแอปไปยังเบื้องหน้า นำ การแจ้งเตือนหลังจากบริการไม่มีการใช้งาน

บริการ VPN

แอปของคุณเชื่อมต่อเครือข่ายของระบบสำหรับผู้ใช้ (หรือที่ทำงาน โปรไฟล์) ไปยังเกตเวย์ VPN ผู้ใช้แต่ละคน (หรือโปรไฟล์งาน) สามารถเรียกใช้ แอป VPN อื่นๆ คุณสร้างบริการ VPN ที่ระบบใช้เพื่อเริ่มต้นและ หยุด VPN และติดตามสถานะการเชื่อมต่อ บริการ VPN ของคุณรับช่วงมาจาก VpnService

บริการนี้ยังทำหน้าที่เป็นคอนเทนเนอร์สำหรับการเชื่อมต่อเกตเวย์ VPN และ อินเทอร์เฟซอุปกรณ์ภายในเครื่องได้ การเรียกใช้อินสแตนซ์บริการ VpnService.Builder เพื่อสร้างอินเทอร์เฟซภายในใหม่

รูปที่ 1. วิธีที่ VpnService เชื่อมต่อ Android การสร้างเครือข่ายไปยังเกตเวย์ VPN
แผนภาพสถาปัตยกรรมบล็อกแสดงวิธีที่ VpnService สร้าง TUN ในเครื่อง
         ในเครือข่ายของระบบ

แอปของคุณจะโอนข้อมูลต่อไปนี้เพื่อเชื่อมต่ออุปกรณ์กับเกตเวย์ VPN

  • อ่านแพ็กเก็ต IP ขาออกจากข้อบ่งชี้ไฟล์ของอินเทอร์เฟซภายในและเข้ารหัส แล้วส่งไปยังเกตเวย์ VPN
  • เขียนแพ็กเก็ตขาเข้า (รับและถอดรหัสจากเกตเวย์ VPN) ไปยัง ตัวบอกไฟล์ของอินเทอร์เฟซภายใน

มีบริการที่ใช้งานอยู่เพียง 1 บริการต่อผู้ใช้หรือโปรไฟล์ การเริ่มบริการใหม่ หยุดบริการที่มีอยู่โดยอัตโนมัติ

เพิ่มบริการ

หากต้องการเพิ่มบริการ VPN ลงในแอป ให้สร้างบริการ Android ที่รับช่วงมาจาก VpnService ประกาศบริการ VPN ในแอปของคุณ Manifest ที่มีการเพิ่มดังต่อไปนี้

  • ปกป้องบริการด้วยBIND_VPN_SERVICE สิทธิ์เพื่อให้มีเพียงระบบเท่านั้นที่สามารถเชื่อมโยงกับบริการของคุณได้
  • โฆษณาบริการโดยใช้ตัวกรอง Intent "android.net.VpnService" เพื่อให้ ระบบจะค้นหาบริการของคุณได้

ตัวอย่างนี้แสดงวิธีประกาศบริการในไฟล์ Manifest ของแอป

<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() หากบุคคลที่ใช้อุปกรณ์ไม่ ได้รับสิทธิ์สำหรับแอปของคุณแล้ว เมธอดจะแสดง Intent ของกิจกรรม คุณใช้ Intent นี้เพื่อเริ่มกิจกรรมของระบบที่ขอสิทธิ์ ระบบจะแสดงกล่องโต้ตอบที่คล้ายกับข้อความการให้สิทธิ์อื่นๆ เช่น การเข้าถึงกล้องหรือรายชื่อติดต่อ หากแอปมีการเตรียมไว้แล้ว เมธอดจะกลับมา null

บริการ VPN ที่เตรียมไว้ในปัจจุบันจะมีเพียงแอปเดียวเท่านั้น โทรเสมอ VpnService.prepare() เนื่องจากผู้ใช้อาจตั้งค่า เป็นบริการ VPN นับตั้งแต่ที่แอปของคุณเรียกใช้เมธอดครั้งล่าสุด ดูข้อมูลเพิ่มเติมได้ที่ ส่วนวงจรของบริการ

เชื่อมต่อบริการ

เมื่อบริการทำงานอยู่ คุณสามารถสร้างอินเทอร์เฟซใหม่ในเครื่อง เชื่อมต่อกับเกตเวย์ VPN แล้ว วิธีขอสิทธิ์และเชื่อมต่อกับบริการ เกตเวย์ VPN คุณต้องทำตามขั้นตอนตามลำดับต่อไปนี้

  1. โทร VpnService.prepare() เพื่อขอสิทธิ์ (เมื่อ )
  2. โทรหา VpnService.protect() เพื่อเก็บ Tunnel Socket ของแอป ภายนอก VPN ของระบบและหลีกเลี่ยงการเชื่อมต่อแบบวงกลม
  3. โทร DatagramSocket.connect() เพื่อเชื่อมต่ออุโมงค์ข้อมูลของแอป ไปยังเกตเวย์ VPN
  4. เรียกใช้เมธอด VpnService.Builder เพื่อกำหนดค่าท้องถิ่นใหม่ อินเทอร์เฟซ TUN บน สำหรับการรับส่งข้อมูล VPN
  5. โทรหา VpnService.Builder.establish() เพื่อให้ระบบ สร้างอินเทอร์เฟซ TUN ภายในเครื่องและเริ่มกำหนดเส้นทางการรับส่งข้อมูลผ่าน ของ Google

ตามปกติแล้ว เกตเวย์ 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 อย่างน้อย 1 รายการพร้อมซับเน็ตมาสก์ที่ระบบ กำหนดให้เป็นที่อยู่สำหรับอินเทอร์เฟซ TUN ภายในเครื่อง โดยปกติแล้วแอปของคุณจะได้รับ IP และซับเน็ตมาสก์จากเกตเวย์ VPN ในระหว่างแฮนด์เชค
addRoute()
เพิ่มอย่างน้อย 1 เส้นทางหากต้องการให้ระบบส่งการเข้าชมผ่าน VPN ของ Google ระบบจะกรองเส้นทางตามที่อยู่ปลายทาง หากต้องการยอมรับการเข้าชมทั้งหมด ให้ตั้งค่า เส้นทางแบบเปิด เช่น 0.0.0.0/0 หรือ ::/0

เมธอด establish() แสดงผล ParcelFileDescriptor อินสแตนซ์ที่แอปของคุณใช้เพื่ออ่านและเขียน แพ็กเก็ตที่ส่งไปและกลับจากบัฟเฟอร์ของอินเทอร์เฟซ establish() จะแสดง null หากแอปไม่ได้เตรียมไว้หรือมีคนเพิกถอน สิทธิ์

วงจรของบริการ

แอปของคุณควรติดตามสถานะของ VPN ที่เลือกของระบบและการเปิดใช้งาน การเชื่อมต่อ อัปเดตอินเทอร์เฟซผู้ใช้ (UI) ของแอปเพื่อให้ผู้ใช้สามารถใช้ อุปกรณ์ทราบถึงการเปลี่ยนแปลงใดๆ

กำลังเริ่มต้นบริการ

บริการ VPN ของคุณสามารถเริ่มต้นได้ด้วยวิธีต่อไปนี้

  • แอปของคุณเริ่มให้บริการ ซึ่งปกติมักเป็นเพราะผู้ใช้แตะปุ่มเชื่อมต่อ
  • ระบบเริ่มต้นบริการเนื่องจาก VPN แบบเปิดตลอดเวลาเปิดอยู่

แอปของคุณเริ่มต้นบริการ VPN โดยการส่ง Intent ไปยัง startService() หากต้องการเรียนรู้เพิ่มเติม โปรดอ่านการเริ่มต้น service [บริการ]

ระบบจะเริ่มต้นบริการในเบื้องหลังด้วยการโทร onStartCommand() อย่างไรก็ตาม Android ได้วางข้อจำกัดเกี่ยวกับ แอปพื้นหลังในเวอร์ชัน 8.0 (API ระดับ 26) ขึ้นไป หากคุณรองรับฟีเจอร์ดังกล่าว ระดับ API คุณต้องเปลี่ยนบริการของคุณไปใช้เบื้องหน้าโดยการเรียกใช้ Service.startForeground() หากต้องการเรียนรู้เพิ่มเติม โปรดอ่านการเรียกใช้ บริการที่ทำงานอยู่เบื้องหน้า

การหยุดบริการ

บุคคลที่ใช้อุปกรณ์สามารถหยุดบริการของคุณโดยใช้ UI ของแอป หยุด แทนที่จะปิดการเชื่อมต่อเพียงอย่างเดียว ระบบจะหยุดการทำงานของ เมื่อผู้ที่ใช้อุปกรณ์ดำเนินการต่อไปนี้ในหน้าจอ VPN ของแอปการตั้งค่า

  • ยกเลิกการเชื่อมต่อหรือไม่จำแอป VPN
  • ปิดการเชื่อมต่อ VPN ตลอดเวลาสำหรับการเชื่อมต่อที่ใช้งานอยู่

ระบบจะเรียกใช้เมธอด onRevoke() ของบริการของคุณแต่การเรียกนี้ อาจไม่เกิดขึ้นในเทรดหลัก เมื่อระบบเรียกใช้เมธอดนี้ อินเทอร์เฟซเครือข่ายสำรองกำลังกำหนดเส้นทางการรับส่งข้อมูลอยู่แล้ว คุณสามารถกำจัดทิ้งได้อย่างปลอดภัย แหล่งข้อมูลต่อไปนี้

  • ปิดซ็อกเก็ตอุโมงค์ข้อมูลที่มีการป้องกันไปยังเกตเวย์ VPN โดยการเรียกใช้ DatagramSocket.close()
  • ปิดข้อบ่งชี้ไฟล์พัสดุ (คุณไม่จำเป็นต้องระบาย) ด้วยการโทร ParcelFileDescriptor.close()

VPN แบบเปิดตลอดเวลา

Android สามารถเริ่มใช้บริการ VPN เมื่ออุปกรณ์เปิดเครื่องและทำงานต่อไปได้ขณะ อุปกรณ์เปิดอยู่ ฟีเจอร์นี้เรียกว่า VPN แบบเปิดตลอดเวลา และมีให้ใช้งานใน Android 7.0 (API ระดับ 24) ขึ้นไป ขณะที่ Android ยังคงให้บริการ ซึ่งก็คือบริการ VPN ที่เป็นผู้รับผิดชอบเกตเวย์ VPN การเชื่อมต่อ นอกจากนี้ VPN แบบเปิดตลอดเวลายังสามารถบล็อกการเชื่อมต่อที่ไม่ใช้ VPN ได้อีกด้วย

ประสบการณ์ของผู้ใช้

ใน Android 8.0 ขึ้นไป ระบบจะแสดงกล่องโต้ตอบต่อไปนี้เพื่อทำให้ ผู้ที่ใช้อุปกรณ์ว่า VPN แบบเปิดตลอดเวลา:

  • เมื่อการเชื่อมต่อ VPN ตลอดเวลายกเลิกการเชื่อมต่อหรือเชื่อมต่อไม่ได้ ผู้ใช้จะเห็น การแจ้งเตือนที่ปิดไม่ได้ การแตะที่การแจ้งเตือนจะแสดงกล่องโต้ตอบที่ จะอธิบายเพิ่มเติม การแจ้งเตือนจะหายไปเมื่อ VPN เชื่อมต่ออีกครั้งหรือเมื่อมีคน จะปิดตัวเลือก VPN แบบเปิดตลอดเวลา
  • การเชื่อมต่อ VPN ตลอดเวลาช่วยให้ผู้ที่ใช้อุปกรณ์บล็อกเครือข่ายใดก็ได้ การเชื่อมต่อที่ไม่ใช้ VPN เมื่อเปิดตัวเลือกนี้ การตั้งค่า แอปจะเตือนผู้คนว่าจะไม่มีการเชื่อมต่ออินเทอร์เน็ตก่อนใช้งาน VPN เชื่อมต่อ แอปการตั้งค่าจะแจ้งให้ผู้ที่ใช้อุปกรณ์ดำเนินการต่อหรือ ยกเลิก

เนื่องจากระบบ (ไม่ใช่บุคคล) จะเริ่มต้นและหยุดการเชื่อมต่อตลอดเวลา คุณจำเป็นต้องปรับลักษณะการทำงานของแอปและอินเทอร์เฟซผู้ใช้ ดังนี้

  1. ปิดใช้ UI ที่ยกเลิกการเชื่อมต่อเนื่องจากระบบและการตั้งค่า จะควบคุมการเชื่อมต่อได้
  2. บันทึกการกำหนดค่าระหว่างการเริ่มต้นแอปแต่ละรายการและกำหนดค่าการเชื่อมต่อกับ การตั้งค่าล่าสุด เนื่องจากระบบจะเริ่มต้นแอปตามคำขอ ผู้ใช้ อุปกรณ์อาจไม่ต้องการกำหนดค่าการเชื่อมต่อเสมอไป

คุณยังใช้การกำหนดค่าที่มีการจัดการเพื่อกำหนดค่า การเชื่อมต่อ การกำหนดค่าที่มีการจัดการช่วยให้ผู้ดูแลระบบไอทีกำหนดค่า VPN ของคุณได้จากระยะไกล

ตรวจหาเปิดตลอดเวลา

Android จะไม่มี API เพื่อยืนยันว่าระบบเริ่มต้น VPN ของคุณหรือไม่ service. แต่เมื่อแอปแจ้งว่าอินสแตนซ์บริการใดเริ่มทำงานแล้ว คุณจะสันนิษฐานได้ว่า ว่าระบบเริ่มใช้บริการที่ไม่มีการแจ้งว่าไม่เหมาะสมสำหรับ 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 ตัวอย่างไฟล์ Manifest ของแอปต่อไปนี้แสดงวิธีเพิ่ม องค์ประกอบข้อมูลเมตา

<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 ตลอดเวลา ระบบจะปิดตัวเลือก UI ควบคุมได้ในการตั้งค่า

VPN สำหรับแต่ละแอป

แอป VPN สามารถกรองแอปที่ติดตั้งซึ่งได้รับอนุญาตให้ส่งการเข้าชมผ่าน การเชื่อมต่อ VPN คุณจะสร้างรายการที่อนุญาต หรือรายการที่ไม่อนุญาตก็ได้ แต่ไม่ใช่ทั้ง 2 อย่าง หากคุณไม่สร้างรายการที่อนุญาตหรือไม่อนุญาต ระบบจะส่ง การจราจรของข้อมูลในเครือข่ายทั้งหมดผ่าน 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() ถ้า ในรายการจะมีแอปอย่างน้อย 1 รายการ จะมีเฉพาะแอปในรายการนั้นเท่านั้นที่ใช้ 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