Hai công việc rất khác nhau được xếp dưới tên VPN lập trình, và chỉ một trong số đó là dành cho một ứng dụng thông thường trên một trong hai nền tảng di động. Việc thứ nhất là bật một hồ sơ mà người dùng đã lưu; việc thứ hai là xây dựng một đường hầm bên trong tiến trình của riêng bạn. Android cung cấp cho bạn việc thứ hai qua VpnService và iOS cung cấp cho bạn việc thứ hai qua quyền Network Extension, trong khi việc thứ nhất nằm ở hệ thống, chủ thiết bị hoặc một máy chủ MDM. Việc xác định bạn thực sự cần cái nào thường làm dự án nhỏ hơn.

Hai công việc cùng một cái tên

Kích hoạt một hồ sơ đã lưu nghĩa là bảo một đường hầm hiện có vươn lên: một máy chủ, một thông tin xác thực, một giao thức, tất cả đã được cấu hình ở nơi người dùng có thể thấy. Xây dựng một đường hầm nghĩa là mã của bạn sở hữu giao diện, vòng lặp gói tin và giao thức. Chúng trông giống nhau trong một danh sách sản phẩm và gần như không chia sẻ cách triển khai nào.

Không nền tảng di động nào phơi bày việc thứ nhất cho một ứng dụng SDK. Một kết nối xuất hiện mà người dùng không làm gì không thể phân biệt với phần mềm độc hại, vì vậy cả hai hệ thống đặt một cổng đồng ý trước mọi ứng dụng mang lưu lượng.

Android: một cổng đồng ý, và không có API hồ sơ

VpnService đã tồn tại từ Android 4.0 và cho phép một ứng dụng tạo giao diện tun, sau đó đọc và ghi các gói tin. Dịch vụ phải được khai báo với BIND_VPN_SERVICE, và VpnService.prepare() tạo ra hộp thoại hệ thống yêu cầu người dùng cho phép nó. Mẫu của nền tảng, ToyVpn, là tuyên bố rõ ràng nhất về hình dạng dự định: mã của bạn sở hữu giao diện và mọi thứ chảy qua nó.

Điều nó không làm là thêm một mục vào màn hình cài đặt VPN của hệ thống. Không có API công khai cho việc đó, và ứng dụng Cài đặt giữ hồ sơ của mình trong một kho mà ứng dụng thông thường không thể chạm tới. Các lệnh gọi tới những lớp ẩn từ một ứng dụng bình thường tạo ra các hồ sơ mà hệ thống không bao giờ liệt kê, đó là lý do mã từng có vẻ hoạt động trong một bản dựng lại âm thầm ngừng hoạt động trong bản tiếp theo.

Con đường được quản lý là riêng biệt. Chủ thiết bị hoặc chủ hồ sơ có thể chỉ định một gói VPN luôn bật qua các API chính sách thiết bị, và một công cụ doanh nghiệp có thể đẩy một hồ sơ mà người dùng sau đó phê duyệt. Đó là thẩm quyền quản lý thiết bị, không phải một quyền mà ứng dụng yêu cầu khi cài đặt. Nếu khách hàng của bạn là một tổ chức, đây là con đường cần lập kế hoạch; nếu khách hàng của bạn là một người cài đặt từ cửa hàng, nó hoàn toàn không khả dụng.

iOS: quyền là ranh giới

iOS chia cùng công việc theo cách khác. Một ứng dụng khách VPN triển khai nhà cung cấp đường hầm gói tin hoặc proxy ứng dụng trong khuôn khổ Network Extension, và quyền tương ứng phải được cấp cho tài khoản nhà phát triển. Một cấu hình VPN cá nhân qua NEVPNManager tồn tại cho trường hợp đơn giản hơn, và nó vẫn chạy trong cùng mô hình quyền. Apple ghi lại toàn bộ bề mặt trong tài liệu tham chiếu Network Extension, đáng đọc trước khi bạn xác định phạm vi công việc.

Không có cách được hỗ trợ để mở màn hình cài đặt VPN, đọc các cấu hình đã lưu của người dùng hoặc khởi động một trong số chúng. Điều một ứng dụng khách có thể làm là gửi một hồ sơ cấu hình để người dùng cài đặt, rồi dùng đường hầm tạo ra qua các lệnh gọi mạng thông thường. Đường hầm theo từng ứng dụng được một máy chủ MDM gán qua quy tắc theo yêu cầu, không do ứng dụng chọn khi chạy.

Một ứng dụng khách VPN từ nhà cung cấp lớn không phải bằng chứng rằng tài khoản của bạn có thể gửi điều tương tự. Những quyền đó được yêu cầu theo từng tài khoản nhà phát triển và được xem xét, vì vậy rủi ro lịch trình nằm ở Apple, không nằm trong kế hoạch sprint của bạn.

Máy tính vươn xa hơn, nhưng quyền sở hữu không đổi

Windows là trường hợp dễ dãi. Add-VpnConnection tạo một mục sổ điện thoại từ một phiên PowerShell nâng cao, và rasdial kết nối hoặc ngắt nó từ một script. Một ứng dụng cũng có thể điều khiển ứng dụng khách của nhà cung cấp qua dòng lệnh được ghi lại của nó. Việc tạo hồ sơ vẫn là một hành động quản trị, vì mục đó sống trong một kho trên toàn máy.

macOS cư xử như vậy với các công cụ khác. scutil --nc start và stop hoạt động trên các dịch vụ đã tồn tại, trong khi tạo một dịch vụ là công việc quản trị hệ thống. Sở hữu tiến trình trên một máy tính xách tay không biến bạn thành chủ sở hữu cấu hình.

Nên xây dựng gì thay vào đó

Nếu yêu cầu thực sự là ứng dụng của bạn chạm tới một API nội bộ, đường hầm mà người dùng đã chạy là đủ. Hãy gửi các yêu cầu HTTPS bình thường, để hệ thống chọn đường đi, và ngừng cố kiểm soát đường hầm. Nếu yêu cầu là chỉ lưu lượng của ứng dụng bạn dùng đường hầm, hãy yêu cầu VPN theo từng ứng dụng qua kênh quản lý, hoặc kết thúc TLS bên trong ứng dụng với một dịch vụ có thể truy cập mà không cần nó.

Các API ẩn không phải một lối tắt đáng chọn. Chúng thay đổi giữa các bản phát hành, chúng thất bại trong việc xét duyệt ứng dụng, và những lỗi chúng tạo ra trông giống lỗi mạng thông thường đối với người kế thừa mã. So sánh không phải Android với iOS; đó là sở hữu một đường hầm so với yêu cầu nền tảng định tuyến lưu lượng, và chỉ cái đầu tiên là của bạn để xây dựng.

Bài viết liên quan