Android มี API สำหรับนักพัฒนาแอปเพื่อสร้างโซลูชันเครือข่ายส่วนตัวเสมือน (VPN) หลังจากอ่านคู่มือนี้แล้ว คุณจะทราบวิธีพัฒนาและทดสอบไคลเอ็นต์ 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 เพื่อสร้างอินเทอร์เฟซภายในใหม่
VpnService เชื่อมต่อเครือข่าย Android กับเกตเวย์ VPNแอปของคุณจะโอนข้อมูลต่อไปนี้เพื่อเชื่อมต่ออุปกรณ์กับเกตเวย์ VPN
- อ่านแพ็กเก็ต IP ขาออกจากตัวบอกไฟล์ของอินเทอร์เฟซในเครื่อง เข้ารหัสแพ็กเก็ต และส่งไปยังเกตเวย์ VPN
- เขียนแพ็กเก็ตขาเข้า (ที่ได้รับและถอดรหัสจากเกตเวย์ VPN) ไปยังตัวบอกไฟล์ของอินเทอร์เฟซในเครื่อง
ผู้ใช้หรือโปรไฟล์แต่ละรายจะมีบริการที่ใช้งานอยู่ได้เพียงบริการเดียวเท่านั้น การเริ่มบริการใหม่จะหยุดบริการที่มีอยู่โดยอัตโนมัติ
เพิ่มบริการ
หากต้องการเพิ่มบริการ 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 คุณต้องทำตามขั้นตอนต่อไปนี้ตามลำดับ
- โทรหา
VpnService.prepare()เพื่อขออนุญาต (เมื่อจำเป็น) - เรียกใช้
VpnService.protect()เพื่อเก็บซ็อกเก็ตทันเนลของแอปไว้นอก VPN ของระบบและหลีกเลี่ยงการเชื่อมต่อแบบวนซ้ำ - เรียกใช้
DatagramSocket.connect()เพื่อเชื่อมต่อซ็อกเก็ตทันเนลของแอปกับเกตเวย์ VPN - เรียกใช้เมธอด
VpnService.Builderเพื่อกำหนดค่าอินเทอร์เฟซ TUN ในเครื่องใหม่บนอุปกรณ์สำหรับการรับส่งข้อมูล VPN - เรียกใช้
VpnService.Builder.establish()เพื่อให้ระบบสร้างอินเทอร์เฟซ TUN ในเครื่องและเริ่มกำหนดเส้นทางการรับส่งข้อมูลผ่านอินเทอร์เฟซ
โดยปกติแล้ว เกตเวย์ VPN จะแนะนำการตั้งค่าสำหรับอินเทอร์เฟซ TUN ในเครื่องระหว่างการแฮนด์เชค แอปของคุณเรียกใช้เมธอด VpnService.Builder เพื่อกำหนดค่าบริการดังที่แสดงในตัวอย่างต่อไปนี้
// 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()
ตัวอย่างในส่วน VPN ต่อแอปแสดงการกำหนดค่า IPv6 รวมถึงตัวเลือกเพิ่มเติม คุณต้องเพิ่มค่า VpnService.Builder ต่อไปนี้ก่อนจึงจะสร้างอินเทอร์เฟซใหม่ได้
addAddress()- เพิ่มที่อยู่ IPv4 หรือ IPv6 อย่างน้อย 1 รายการพร้อมกับซับเน็ตมาสก์ที่ระบบกำหนดเป็นที่อยู่อินเทอร์เฟซ TUN ในเครื่อง โดยปกติแล้ว แอปของคุณจะได้รับที่อยู่ IP และซับเน็ตมาสก์จากเกตเวย์ VPN ในระหว่างการแฮนด์เชก
addRoute()- เพิ่มเส้นทางอย่างน้อย 1 เส้นทางหากต้องการให้ระบบส่งการรับส่งข้อมูลผ่านอินเทอร์เฟซ VPN เส้นทางจะกรองตามที่อยู่ปลายทาง หากต้องการยอมรับการเข้าชมทั้งหมด ให้ตั้งค่าเส้นทางแบบเปิด เช่น
0.0.0.0/0หรือ::/0
เมธอด establish() จะแสดงผลอินสแตนซ์ ParcelFileDescriptor ที่แอปใช้เพื่ออ่านและเขียนแพ็กเก็ตไปยังและจากบัฟเฟอร์ของอินเทอร์เฟซ เมธอด establish() จะแสดงผล null หากแอปของคุณไม่พร้อมหรือมีผู้เพิกถอนสิทธิ์
วงจรของบริการ
แอปของคุณควรติดตามสถานะของ VPN ที่เลือกของระบบและการเชื่อมต่อที่ใช้งานอยู่ อัปเดตอินเทอร์เฟซผู้ใช้ (UI) ของแอปเพื่อให้ผู้ที่ใช้อุปกรณ์ทราบถึงการเปลี่ยนแปลง
การเริ่มบริการ
คุณเริ่มบริการ VPN ได้ด้วยวิธีต่อไปนี้
- แอปของคุณเริ่มบริการ ซึ่งโดยปกติแล้วเป็นเพราะผู้ใช้แตะปุ่มเชื่อมต่อ
- ระบบจะเริ่มบริการเนื่องจาก VPN แบบเปิดตลอดเวลาเปิดอยู่
แอปของคุณจะเริ่มบริการ VPN โดยส่ง Intent ไปยัง startService() ดูข้อมูลเพิ่มเติมได้ที่การเริ่มใช้บริการ
ระบบจะเริ่มบริการในเบื้องหลังโดยเรียกใช้ 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 จะเชื่อมต่อ แอปการตั้งค่าจะแจ้งให้ผู้ที่ใช้อุปกรณ์ดำเนินการต่อหรือยกเลิก
เนื่องจากระบบ (ไม่ใช่บุคคล) เป็นผู้เริ่มและหยุดการเชื่อมต่อที่เปิดตลอดเวลา คุณจึงต้องปรับพฤติกรรมและอินเทอร์เฟซผู้ใช้ของแอปดังนี้
- ปิดใช้ UI ที่ยกเลิกการเชื่อมต่อเนื่องจากระบบและแอปการตั้งค่าจะควบคุมการเชื่อมต่อ
- บันทึกการกำหนดค่าระหว่างการเริ่มต้นแอปแต่ละครั้งและกำหนดค่าการเชื่อมต่อด้วยการตั้งค่าล่าสุด เนื่องจากระบบจะเริ่มแอปตามต้องการ ผู้ที่ใช้อุปกรณ์จึงอาจไม่ต้องการกำหนดค่าการเชื่อมต่อเสมอไป
นอกจากนี้ คุณยังใช้การกำหนดค่าที่มีการจัดการเพื่อกำหนดค่าการเชื่อมต่อได้ด้วย การกำหนดค่าที่มีการจัดการช่วยให้ผู้ดูแลระบบไอทีกำหนดค่า VPN จากระยะไกลได้
ตรวจหาแบบเปิดตลอดเวลา
Android ไม่มี API เพื่อยืนยันว่าระบบได้เริ่มบริการ VPN ของคุณหรือไม่ แต่เมื่อแอปแจ้งอินสแตนซ์บริการที่แอปเริ่มทำงาน คุณจะถือว่าระบบเริ่มบริการที่ไม่ได้แจ้งสำหรับ VPN ที่เปิดตลอดเวลาได้ ดังตัวอย่างต่อไปนี้
- สร้างอินสแตนซ์
Intentเพื่อเริ่มบริการ VPN - แจ้งบริการ VPN โดยใส่ข้อมูลเพิ่มเติมลงใน Intent
- ในเมธอด
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 ใหม่ แอปต้องติดตั้งอยู่ในอุปกรณ์เมื่อคุณเพิ่มลงในรายการ
// 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()
แอปที่อนุญาต
หากต้องการเพิ่มแอปไปยังรายการที่อนุญาต ให้เรียกใช้ 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