“VPN có đang bật không?” thực ra là ba câu hỏi trong một câu. Mã của bạn cần câu nào là quyết định đầu tiên, và đó chính là điều mà hầu hết các triển khai bỏ qua. Trên thiết bị này có đường hầm không, lưu lượng đến đích này có đi ra qua nó không, hay đầu xa trả lời bằng danh tính mà bạn mong đợi. Chọn thuộc tính, sau đó chọn tín hiệu đo nó, và cuối cùng ghi vào nhật ký cái nào bạn thực sự đã đo.

Ba thuộc tính, ba tín hiệu

Khi nén mỗi câu thành một dòng, ba câu hỏi có ba câu trả lời khác nhau. Bảng dưới đây chính là quyết định, không phải bản tóm tắt của nó.

PropertySignal that answers itWhat it still leaves open
ExistenceThe platform's own connection state: RAS on Windows, NetworkManager on D-Bus on Linux, scutil on macOSTunnels of a type the platform does not manage, which includes most third-party clients
PathA route lookup for the one destination, or a scoped proxy or interface key that names the tunnelWhether the far end is the peer you trust
IdentityAn authenticated response from the far end, or a source-address policy applied on the serverWhich local interface carried the packets

Hãy đọc dòng cuối cùng thật chậm. Một máy chủ riêng trả lời chứng minh rằng có thứ gì đó đã trả lời, không phải rằng câu trả lời đi qua đường hầm, và nó không nói gì về việc ai ở đầu bên kia. Nếu thuộc tính bạn cần là đường đi, hãy đo đường đi.

Tồn tại: trạng thái của chính nền tảng

Windows trả lời điều này cho các cấu hình gốc thông qua Remote Access Service API. RasEnumConnections liệt kê những gì đang kết nối, RasGetConnectStatus báo cáo trạng thái của một mục, và RasGetLinkStatistics thêm tốc độ, bộ đếm byte và tuổi của kết nối. Các giới hạn chính là điểm mấu chốt: OpenVPN, WireGuard và ứng dụng của nhà cung cấp không bao giờ đăng ký kết nối RAS, nên một đường hầm lành mạnh loại đó hiển thị danh sách trống và mã ngây thơ báo cáo nó là đã tắt.

Các máy tính để bàn Linux phơi bày cùng thuộc tính đó qua NetworkManager trên D-Bus, nơi PropertiesChanged trên đối tượng kết nối VPN biến phép kiểm tra thành sự kiện và thuộc tính State báo cáo khi liên kết đạt trạng thái đã kết nối. Từ một shell, nmcli connection show --active đọc cùng thông tin đó, và đó chính là thứ bạn muốn khi gỡ lỗi. macOS giữ danh sách đó trong khung System Configuration, với scutil là góc nhìn dòng lệnh của nó. Cả ba đều mô tả một kết nối do nền tảng quản lý, và cả ba đều im lặng về một đường hầm mà nó không quản lý.

Đường đi: gói tin thực sự đi đâu

So khớp tên là lối tắt mà mọi người chộp lấy trước tiên: liệt kê các giao diện, thử chuỗi với tun, tap, ppp hoặc ipsec, và coi một kết quả khớp là bằng chứng. Đó là một phương pháp phỏng đoán, và tập giao diện có thể trông giống nhau dù có thứ gì đi qua hay không. Các bản dựng iOS cũ trả lời theo cách này và các bản sau ngừng lại, vì các giao diện nhìn thấy được không còn phân biệt hai trạng thái nữa.

Thứ thay thế nó ở đó là từ điển proxy của hệ thống. Khi VPN đang kết nối, lệnh gọi cài đặt proxy trả về các khóa giới hạn trong các giao diện liên quan đến đường hầm, và khi không có gì kết nối thì từ điển trở về rỗng. Đó là một khẳng định yếu hơn vẻ ngoài của nó, vì nó ghi lại niềm tin của hệ thống rằng có một đường hầm, chứ không phải đích nào đang dùng nó.

Android có phiên bản cái bẫy của riêng mình: bản tin vpn.connectivity đến được các bộ nhận khai báo trong manifest trên một số bản dựng và các bộ nhận đăng ký lúc chạy trên những bản khác. Hãy coi đó là nỗ lực tốt nhất, và giữ một phép dò trực tiếp phía sau.

Khi đích đến là điều quan trọng, hãy hỏi bảng định tuyến thay vì danh sách bộ điều hợp. Các phương pháp phỏng đoán cổng mặc định vỡ trên máy nhiều mạng và trên các đường hầm tự cài cổng của chúng.

Danh tính: thăm dò đầu xa

Một vòng lặp gửi ICMP echo đến đầu xa vài giây một lần là phép kiểm tra rẻ nhất thuộc loại này, và nó thất bại theo một hướng hữu ích. Hãy nhắm nó vào một địa chỉ chỉ tồn tại bên trong mạng riêng, vì một địa chỉ công cộng trả lời qua bất kỳ liên kết lên nào đang hoạt động và không chứng minh được gì. Ở nơi ICMP bị lọc, một kết nối TCP ngắn tới cổng dịch vụ làm công việc tương tự.

Một phép kiểm tra phía máy chủ có đúng một tín hiệu: địa chỉ nguồn trên kết nối. Việc duy trì danh mục dải địa chỉ là công việc bảo trì, và nó không thể tách một đường hầm khỏi bất kỳ mạng nào khác tình cờ dùng cùng dải.

Chính sách thô có thể sống chung với điều đó. Danh tính thì không, nên hãy xác thực máy khách thay vì tin vào nơi các gói tin của nó có vẻ đến từ.

Ghi nhật ký danh mục, không phải phán quyết

Giữ các danh mục lỗi tách biệt trong nhật ký: không có giao diện nào cả, có giao diện nhưng không đến được đích, đến được đích nhưng xác thực bị từ chối. Đó là ba chủ sở hữu khác nhau, và mỗi cái mở ra một cuộc điều tra khác.

Gộp chúng thành một “VPN hỏng” duy nhất sẽ gửi báo cáo đến một nhóm không thể sửa nó. Danh mục là kết quả hữu ích; phán quyết là thứ khiến nó sai.

Bài viết liên quan