Melakukan ping ke 192.0.2.10 hanya memberitahu anda bahawa satu alamat menjawab gema ICMP, dan itu sahaja. Pada rangkaian tanpa terowong ia masih boleh berjaya, kerana alamat itu mungkin berada pada subnet setempat; dengan terowong yang sihat ia boleh gagal, kerana pelayan menggugurkan ICMP semasa menyediakan HTTPS. Semakan yang diperlukan skrip anda ialah pertanyaan status platform serta ujian laluan ke destinasi yang digunakan aplikasi. Layannya sebagai dua medan berasingan, jangan sekali-kali sebagai satu boolean.

Apa yang sebenarnya dibuktikan oleh balasan gema

ICMP ialah protokol kebolehcapaian yang tidak mengenal antara muka atau terowong. Apabila balasan tiba, kernel melaporkan bahawa satu hos menjawab; ia tidak melaporkan laluan yang membawa permintaan atau yang membawa jawapan. Penapisan menjadikan isyarat lebih bising, kerana tembok api yang menyekat permintaan gema tidak mengatakan apa-apa tentang port di belakangnya. Dan profil terowong berpecah boleh mengecualikan alamat yang diuji dengan sengaja sementara semua destinasi lain berfungsi.

Apa yang sebenarnya anda ingin tahu ialah sama ada perkhidmatan tertentu boleh digunakan melalui laluan yang dilalui aplikasi. Pilih hos dan port yang dipanggil aplikasi, kemudian tuntut jawapan pada lapisan aplikasi.

Kebolehcapaian dan keadaan terowong ialah dua fakta berbeza, dan salah satunya boleh benar sementara yang lain palsu. Memisahkannya memberitahu anda siapa pemilik kegagalan. Menggabungkannya menjadi satu semakan menghasilkan tiket yang tiada siapa boleh halakan.

Tanya Android tentang pengangkutan, bukan ping

Android menjawab soalan status secara langsung melalui ConnectivityManager. Keupayaan rangkaian aktif membawa bendera pengangkutan VPN, ditetapkan apabila trafik dihalakan melalui antara muka VPN. Panggilan itu setempat, murah dan bebas daripada sama ada mana-mana hos jauh menjawab.

Versi Java ini mengembalikan false dan bukannya melontar pengecualian apabila tiada rangkaian aktif. Kerana ia membaca rangkaian aktif, ia mencerminkan profil yang dipilih pengguna dalam Tetapan.

ConnectivityManager cm = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
NetworkCapabilities caps = cm.getNetworkCapabilities(cm.getActiveNetwork());
boolean tunnel = caps != null && caps.hasTransport(NetworkCapabilities.TRANSPORT_VPN);

Untuk pemberitahuan perubahan, daftarkan NetworkCallback dan bukannya meninjau dengan pemasa. Jangan keliru dengan VpnService.prepare, yang hanya melaporkan sama ada pengguna memberi kebenaran untuk VPN, bukan sama ada paket mengalir. Pembatalan datang melalui VpnService.onRevoke, tetapi terlupa profil dalam Tetapan tidak menghasilkan sebarang siaran.

iOS: nama antara muka ialah heuristik, bukan kontrak

Banyak coretan iOS memeriksa tetapan proksi, menemui kamus __SCOPED__ dan mencari kunci antara muka seperti tap, tun, utun2, ppp atau ipsec. Pendekatan itu ialah konvensyen penamaan, bukan jaminan berdokumen, jadi kemas kini OS yang menamakan semula antara muka boleh memecahkannya. Ia juga cenderung melaporkan true untuk entri lapuk yang hidup lebih lama daripada terowong.

Apabila aplikasi anda memiliki konfigurasi, NEVPNManager memberikan status sebenar. Ia menerangkan terowong yang dimulakan aplikasi anda; dengan VPN setiap aplikasi, aplikasi lain mungkin berada sepenuhnya di luar terowong itu.

Muat semula keutamaan sebelum membaca status, kerana nilainya berubah semasa terowong naik dan turun:

let manager = NEVPNManager.shared()
manager.loadFromPreferences { error in
    let up = manager.connection.status == .connected
    print(up)
}

Bendera status platform masih tidak membuktikan trafik mencapai rakan setara. Jurang itulah yang ditutup oleh ujian laluan, dan sebab itulah satu boolean tidak mencukupi untuk sokongan.

Profil Windows mendedahkan medan status sebenar

Windows menjejak profil VPN secara berasingan daripada penyesuai, dan Get-VpnConnection mendedahkan ConnectionStatus untuk setiap profil yang dikenalnya. Profil yang dicipta melalui klien Windows atau pakej peruntukan muncul di sini. Cmdlet ini bukan pengesan terowong umum.

Baca medan itu untuk profil bernama, tambah -AllUserConnection apabila profil milik semua pengguna:

Get-VpnConnection -Name "Fabrikam" | Select-Object Name, ConnectionStatus, ServerAddress

Klien pihak ketiga sering kekal tidak kelihatan kepada cmdlet ini walaupun terowongnya aktif, jadi hasil kosong bermaksud tidak diketahui, bukan terputus. Senarai penyesuai juga mengelirukan: penyesuai vendor boleh kekal semasa melahu, dan sesetengah penyesuai hanya wujud semasa sesi. Untuk profil milik Windows, rasdial melaporkan kod keluar yang boleh anda cabangkan. Semua ini menerangkan kepercayaan setempat, bukan kebolehcapaian rakan setara.

Status tambah laluan: semakan dua bahagian

Profil yang bersambung tidak mengatakan apa-apa tentang ke mana paket pergi. Terowong berpecah boleh mengekalkan terowong aktif sambil mengecualikan destinasi yang anda pedulikan. Profil always-on kekal bersambung dengan pelayan mati, dan kill switch menyekat trafik dengan sengaja apabila terowong jatuh.

Uji kedua-dua lapisan: sahkan pengangkutan VPN atau profil aktif, kemudian sahkan destinasi diselesaikan dan menjawab melalui laluan itu. Pada Linux, tanya kernel antara muka mana yang akan digunakan:

ip route get 192.0.2.10
resolvectl query intranet.example.test

Apabila klien di luar kawalan anda, log kedua-dua hasil dan biarkan corak menunjuk lapisan. Bersambung tambah ujian laluan gagal mencadangkan terowong berpecah, DNS atau dasar. Terputus tambah ujian laluan berfungsi bermaksud laluan lain membawa trafik.

Ujian yang boleh anda jalankan mengikut urutan

Rakam status platform dahulu, sebelum anda mengubah mana-mana keadaan rangkaian. Selesaikan nama hos dan catat keluarga alamat, kerana rekod AAAA boleh mengambil laluan berbeza daripada rekod A. Buka port perkhidmatan dan tuntut jawapan aplikasi dan bukannya jabat tangan semata-mata. Simpan setiap pemerhatian dalam medan lognya sendiri.

Pada mesin Linux dengan dig dan curl, tiga arahan merangkumi penyelesaian, laluan dan perkhidmatan itu sendiri. Jalankannya dengan terowong naik dan sekali lagi apabila turun:

dig +short intranet.example.test
ip route get 198.51.100.20
curl -sS -o /dev/null -w "%{http_code}" --max-time 8 https://intranet.example.test/health

Empat medan berasingan mengalahkan satu boolean, kerana status, DNS, laluan dan dasar gagal secara berasingan dan mendarat pada pasukan berbeza. Ping di terminal kekal sebagai semakan kewarasan manual yang baik. Ia definisi konektiviti yang lemah untuk automasi, di mana API platform dan ujian laluan menjawab soalan sebenar.

Artikel berkaitan