Mengapakah subnet di belakang klien OpenVPN tidak dapat dicapai?
OpenVPN tidak dapat meneka klien mana yang memiliki LAN jauh. Entri iroute dalam fail klien, laluan balik dan pemajuan menjadikan subnet itu boleh dicapai.
Ping ke alamat terowong pelayan berjaya, jadual laluan klien sendiri kelihatan betul, dan LAN di belakang klien itu masih tidak dapat dicapai. Jadual penghalaan klien kelihatan betul, pelayan mempunyai laluan yang menuju ke terowong, dan paket masih hilang. Ini gejala klasik terowong layer-3 yang tidak tahu salah satu kliennya juga merupakan gerbang.
Antara muka tun tidak mempunyai hop seterusnya bagi setiap klien. Kernel melihat satu antara muka dengan banyak rakan, jadi keputusan tentang klien mana yang harus menerima paket untuk LAN jauh perlu dibuat di dalam proses OpenVPN. Keputusan itu dikonfigurasikan dengan iroute, dan tanpanya paket tiada tempat untuk pergi.
Pelayan menghala mengikut klien, bukan mengikut antara muka
Apabila pelayan perlu menghantar paket ke alamat terowong klien, jawapannya tidak kabur: alamat itu milik sesi klien tersebut. Apabila destinasinya seluruh subnet di belakang klien itu, alamat itu bukan milik sesiapa yang diketahui pelayan, dan laluan kernel ke terowong hanya berkata "melalui antara muka ini", tanpa menyatakan rakan yang mana.
OpenVPN menyelesaikannya dengan jadual penghalaan dalaman yang memetakan awalan destinasi kepada klien tertentu. Jadual itu dibina daripada entri iroute, sebab itulah laluan biasa pada hos pelayan tidak mencukupi. Laluan kernel membawa paket ke antara muka terowong; pemetaan dalaman menentukan sesi mana yang menerimanya. Itulah juga sebab pembaikan tidak pernah muncul dalam output laluan kernel.
Jika pemetaan tiada, paket tiba di pelayan, sepadan dengan laluan terowong dan digugurkan kerana tiada klien menuntut destinasi itu. Tiada apa yang merekodkan ralat bersih, sebab itulah kegagalan kelihatan seperti lubang hitam senyap dan bukan gelung penghalaan.
Menulis entri iroute yang menamakan klien
iroute tinggal dalam fail konfigurasi khusus klien, bukan dalam konfigurasi utama pelayan. Halakan pelayan ke direktori dengan pilihan client-config-dir, kemudian cipta fail yang namanya ialah nama umum sijil klien dan letakkan awalan di dalamnya.
Bagi cawangan yang LAN-nya 10.20.0.0/24 dan nama umum sijilnya branch-router, fail pada laluan itu mengandungi baris seperti iroute 10.20.0.0 255.255.255.0. Konfigurasi utama hanya memerlukan pilihan direktori; awalan itu tinggal dengan klien.
Nama umum ialah bahagian yang rapuh. Sijil yang dikeluarkan dengan subject lain, atau penggunaan yang mengesahkan pengguna melalui nama pengguna sedangkan fail dinamakan sempena sijil, menghasilkan fail yang tidak pernah dibaca. Semak nama yang sebenarnya dilaporkan pelayan untuk sesi itu, dan pertimbangkan pilihan yang membuat klien tidak sepadan gagal daripada bersambung senyap tanpa laluannya. Menamakan semula fail agar sepadan dengan sijil ialah pembaikan lima minit yang mengelakkan malam yang sangat panjang.
Satu klien boleh memiliki beberapa awalan. Tambah satu baris iroute bagi setiap rangkaian, dan simpan senarai di sebelah tetapan lain klien itu supaya pemetaan kekal boleh diaudit.
Membina laluan balik dalam kedua-dua arah
Membawa paket ke LAN jauh ialah separuh kerja. Klien juga mesti menghantar trafik LAN itu ke dalam terowong, yang biasanya dilakukan dengan menolak laluan kepada klien: baris seperti push "route 10.8.0.0 255.255.255.0" memberitahu setiap klien cara mencapai rangkaian di sebelah pelayan. Bagi cawangan, laluan setara menunjuk ke terowong untuk apa sahaja yang perlu dicapai di sebelah pelayan.
Arah balik memerlukan pemilik di sebelah jauh. Di sebelah itu, seseorang mesti tahu jalan pulang: laluan statik pada penghala LAN yang menunjuk kumpulan VPN ke pelayan, atau terjemahan alamat pada pelayan sebelum trafik masuk ke LAN. Laluan statik mengekalkan alamat asal kelihatan dalam log dan peraturan akses tetapi memerlukan kerjasama pemilik LAN; terjemahan berdiri sendiri tetapi menyembunyikan siapa yang benar-benar bersambung.
Pemajuan mesti didayakan pada hos pelayan. Tanpanya kernel menerima paket daripada terowong dan enggan menyalurkannya ke antara muka LAN, yang dari sudut pandangan klien kelihatan sama seperti iroute yang hilang.
Menyemak kebolehcapaian dengan prob yang betul
Uji mengikut lapisan daripada ping hujung jauh dan meneka. Dari pelayan, semak bahawa pemetaan dalaman untuk awalan wujud dan laluan kernel menunjuk ke terowong. Dari klien, sahkan bahawa laluan yang ditolak telah dipasang dan laluan lalainya untuk alamat LAN ialah terowong.
Kemudian perhatikan paket. Tangkapan pada antara muka terowong menunjukkan sama ada pelayan menghantar ke arah klien, dan tangkapan pada antara muka LAN menunjukkan sama ada ia memajukan. Jika yang pertama menunjukkan paket dan yang kedua tidak, masalahnya ialah pemajuan atau penapis; jika kedua-duanya tidak menunjukkan apa-apa, carian gagal lebih awal.
Dua pelayan yang disambungkan oleh terowong mengulangi peraturan yang sama di kedua-dua belah: setiap satu memerlukan iroute untuk kumpulan yang lain, dan setiap satu memerlukan laluan serta pemajuan yang menjadikan laluan simetri. Penghalaan dan dasar ialah perkara berasingan di sini. Penghalaan menentukan ke mana paket boleh pergi, manakala peraturan FORWARD menentukan sama ada ia dibenarkan, jadi klien dengan dua baris iroute boleh mencapai kedua-dua awalan melainkan penapis berkata sebaliknya.