iPhone có đang dùng VPN không? Một ứng dụng iOS thực sự thấy được gì
Không có một cờ VPN duy nhất trong iOS SDK. Ứng dụng chỉ có thể quan sát cấu hình của chính nó, một thông báo trạng thái và ảnh chụp proxy trong phạm vi hẹp, không hơn.
Hỏi một ứng dụng iOS xem điện thoại có đang dùng VPN không, và câu trả lời trung thực là nó không thể biết theo nghĩa bạn muốn. SDK không cung cấp cờ nào cho «thiết bị đang ở trong đường hầm», và các giao diện riêng có thể tiến gần đến điều đó thì đóng với ứng dụng được phát hành. Bạn có thể quan sát cấu hình của chính ứng dụng mình, trạng thái gắn với nó, và một hai gợi ý gián tiếp từ ngăn xếp mạng. Mỗi thứ trả lời một câu hỏi khác nhau, và phần lớn các kiểm tra hỏng đến từ việc lấy một trong số đó làm toàn bộ câu trả lời.
Huyền thoại về cờ VPN duy nhất
Niềm tin là đâu đó trong SDK có một thuộc tính báo cáo thiết bị có trong đường hầm hay không, giống như cờ khả năng tiếp cận báo cáo máy chủ có phản hồi hay không. Thuộc tính công khai như vậy không tồn tại. Và kể cả nếu có, «có một đường hầm» và «lưu lượng của tôi dùng nó» là hai khẳng định khác nhau, và với hầu hết ứng dụng chỉ cái thứ hai mới quan trọng.
Chính khoảng trống đó là lý do các thư viện quảng cáo trình phát hiện VPN một dòng thường đọc một thứ mong manh, như tên giao diện hay khóa proxy, và trình bày nó như một phán quyết.
Tải tùy chọn trước khi tin vào một nil
Phiên bản quản lý dùng chung tồn tại ngay khi bạn yêu cầu, nhưng thuộc tính giao thức của nó vẫn là nil cho đến khi callback tải xong. Vậy một giao thức nil nghĩa là «chưa tải» ít nhất thường xuyên như «chưa cài đặt». Hãy đọc bên trong khối hoàn tất, và chỉ sau đó mới quyết định: một đối tượng giao thức tồn tại, với cờ kích hoạt bật, là hình dáng của «đã cài đặt».
Tín hiệu thứ hai nằm trên đối tượng kết nối: trạng thái không hợp lệ, mà hệ thống báo cáo khi ứng dụng này không có cấu hình nào được cài đặt. Trạng thái không hợp lệ cùng với giao thức nil sau khi tải xong là sự vắng mặt thật, không phải cuộc đua thời gian.
Thay đổi kết nối đến dưới dạng thông báo
Các trình xử lý được truyền cho load và save báo cáo điều gì đã xảy ra với cấu hình, không phải đường hầm đang làm gì. Chờ một trong số chúng kích hoạt lúc kết nối là cuộc đua không bao giờ được giải. Thay vào đó hãy theo dõi thông báo thay đổi trạng thái, và đọc giá trị hiện tại của đối tượng kết nối khi nó đến.
Khi một cấu hình đã được cài đặt, trạng thái kết nối đi qua một chuỗi ngắn: đã ngắt, đang kết nối, đã kết nối, đang xác nhận lại, đang ngắt. «Đã kết nối» mô tả đường hầm chứ không phải máy chủ phía sau nó, nên đó không phải bằng chứng lưu lượng đang chảy. On-demand cũng có thể dựng đường hầm khi ứng dụng bị tạm dừng, và khi đó thông báo đến trước khi bạn có gì để cập nhật.
Ảnh chụp proxy trong phạm vi hẹp là gợi ý, không phải phán quyết
CFNetwork có thể cung cấp cho ứng dụng cài đặt proxy hiện tại của hệ thống, và bên trong kết quả đó có một từ điển phạm vi hẹp với khóa theo tên giao diện. Thấy một tên bắt đầu bằng tun, utun, ppp, ipsec hoặc tap là gợi ý rằng có một đường hầm. Nó vẫn là ảnh chụp những gì ứng dụng này thấy được, không phải phát biểu về nơi các gói tin đi.
Các nhà cung cấp không thống nhất về cách đặt tên, nên thiếu tiền tố không chứng minh gì, và một giao diện hiện diện có thể tồn tại mà không mang lưu lượng. Khả năng tiếp cận còn yếu hơn: một yêu cầu thành công tới địa chỉ riêng cho thấy đường đi đã hoạt động cho yêu cầu đó tại thời điểm đó, không phải rằng có VPN được cài đặt.
Trình giả lập mượn Mac, và các ứng dụng khác vẫn vô hình
Trình giả lập không có ngăn xếp mạng riêng; mọi kết nối nó tạo ra là của Mac. Vì vậy một VPN chạy trên Mac máy chủ đã có hiệu lực với ứng dụng được giả lập, và cài đặt của chính trình giả lập không hiển thị gì. Nếu đường hầm dựng lên sau khi trình giả lập khởi động, khởi động lại nó thường nhanh hơn gỡ lỗi ứng dụng. Máy chủ ở cổng không chuẩn cần cổng đó trong URL, hoặc một chuyển tiếp cục bộ như socat TCP-LISTEN:12345,fork TCP:host:12345.
API công khai sẽ không liệt kê các hồ sơ VPN thuộc về ứng dụng khác hoặc hồ sơ cấu hình. Với một ứng dụng đã biết, phép thử lược đồ URL qua canOpenURL là mẹo di động, và từ iOS 9 lược đồ được hỏi phải được khai báo trong Info.plist của bạn; bỏ qua thì lời gọi trả về false. OpenVPN Connect phản hồi trên openvpn://, điều đó khiến nó thành ví dụ tốt và trình phát hiện tổng quát tồi.
Kết hợp ba quan sát và nói chúng có nghĩa gì
Trong thực tế hãy chồng ba kết quả: một cấu hình đã tải và đang bật, một trạng thái kết nối không phải không hợp lệ, và một yêu cầu tới địa chỉ chỉ đến được qua đường hầm. Mỗi thứ tự nó gây nhầm lẫn; cùng nhau chúng nói điều ứng dụng có thể biết, chứ không phải điều người dùng giả định.
Viết kết quả thành ba dòng trong chẩn đoán của bạn, không phải một boolean. Khi người dùng nói VPN đang tắt trong khi ứng dụng của bạn không đồng ý, ba dòng cho thấy quan sát nào đã lệch, và đó là khác biệt giữa một phiếu hỗ trợ bạn có thể hành động và một phiếu kết thúc bằng «ở chỗ tôi nó chạy được».