Dua nama DNS, satu port OpenVPN: apa yang benar-benar memilih
Dua nama hos yang menunjuk ke satu alamat tetap tiba di satu pendengar. Hanya medan yang dihantar klien boleh memilih backend, dan OpenVPN asli tidak menghantar apa-apa.
Dua rekod A, satu alamat, satu daemon: apa pun nama yang ditaip pengguna, paket yang tiba adalah sama, dan proses yang terikat pada port 1194 tiada apa-apa untuk membezakan kedua-duanya. Ini bukan salah konfigurasi yang menunggu pembaikan; ini ialah had apa yang boleh diungkapkan oleh carian nama. Apa-apa yang memilih antara dua instans OpenVPN mesti menjadi nilai yang klien masukkan ke dalam sambungan dan yang boleh dibaca semula oleh bahagian hadapan, dan klien OpenVPN standard tidak meletakkan nilai sedemikian secara terbuka. Berikut ialah ke mana ia membawa anda, dan susunan mana yang benar-benar memisahkan trafik.
Mulakan dengan apa yang dikembalikan oleh penyelesai
Klien meminta vpn-a.example dan menerima alamat; alamat itu serta port ialah segala-galanya yang didailnya. Nama itu habis secara tempatan, semasa carian, dan ia tidak pernah menjadi medan pada wayar, jadi pendengar di hujung sana tidak dapat melihat label mana yang digunakan. Halakan vpn-a.example dan vpn-b.example ke satu hos dan kedua-dua carian memberikan destinasi yang sama, sebab itulah daemon menyerap kedua-dua sambungan ke dalam satu instans tanpa merekodkan perbezaan. Profil berasaskan alamat berkelakuan sama seperti yang berasaskan nama, atas sebab yang sama.
Ini juga menutup sekumpulan jalan pintas yang menggiurkan: alias tambahan, memilih sijil bagi setiap nama pada satu soket, atau peraturan tembok api yang berkunci pada nama yang ditanya. Tiada satu pun daripadanya boleh bertindak atas maklumat yang sudah dibuang sebelum paket pertama meninggalkan klien. Jika dua pelayan mesti kekal berasingan, pemisahan itu mesti bergerak bersama sambungan itu sendiri, iaitu alamat, port, atau medan muatan yang ditakrifkan oleh protokol.
Satu-satunya pemilih yang dikira bergerak di dalam paket
HTTP mengendalikannya dengan pengepala Host, dan TLS dengan sambungan nama pelayan dalam ClientHello, dan begitulah satu alamat melayani banyak tapak di belakang satu pendengar. Kedua-duanya berfungsi kerana protokol pada wayar membawa permintaan untuk perkhidmatan tertentu. Fakta penting tentang OpenVPN ialah tiada satu pun medan itu hadir pada lapisan yang diperiksa oleh kotak perantaraan.
Dalam susunan standard, jabat tangan TLS yang melindungi saluran kawalan berlaku selepas sesi luar ditubuhkan dan dibawa di dalamnya, jadi pendengar yang belum menamatkan sesi itu melihat aliran legap. Ia masih boleh mengatakan ini OpenVPN, kerana opkod dan pembingkaian dalam bita pembukaan boleh dikenali, tetapi nama pelayan, jika ada, terletak di bahagian yang disulitkan. Reka bentuk yang mengharapkan untuk membaca hos maya daripada paket luar sedang membaca medan yang protokol tidak pernah menulis di sana. Itu datang daripada cara terowong dibina, bukan daripada jurang yang boleh ditutup oleh padanan corak yang lebih pintar.
Di mana pemisah protokol berhenti
Multiplekser jenis yang didokumenkan oleh projek sslh mendengar pada satu port, memeriksa bita pembukaan, dan menyerahkan sambungan kepada mana-mana backend yang bertutur protokol yang dikenali. Itu nilai sebenar apabila satu port perlu melayani SSH, HTTPS dan OpenVPN serentak.
sslh menyimpan siasatan berasingan bagi setiap protokol, dan siasatan TLS-nya boleh menarik keluar nama pelayan atau nilai ALPN daripada ClientHello sebenar. Mengenali OpenVPN asli ialah pengelasan berbeza daripada membaca sambungan TLS, dan kedua-duanya tidak bergabung, kerana klien yang tidak pernah menghantar ClientHello ke soket pendengar meninggalkan siasatan itu tanpa apa-apa untuk dibaca. Oleh itu peraturan yang sepadan dengan OpenVPN menjawab “ini klien OpenVPN” dan tidak pergi lebih jauh. Dua backend OpenVPN di belakang peraturan itu tidak dapat dibezakan, bahagian hadapan tiada asas untuk memilih, dan setiap sesi mendarat di tempat yang sama. Pemultipleksan berkongsi satu port antara perkhidmatan berbeza; ia tidak melakukan pengehosan maya dalam satu perkhidmatan.
Susunan yang benar-benar memisahkan dua pelayan
Pemisahan jujur paling murah ialah alamat awam kedua, satu bagi setiap instans, dan profil sedia ada sudah membawa apa yang diperlukan kerana ia menunjuk ke alamat berbeza. Seterusnya ialah port berbeza pada alamat yang sama, yang tidak memakan apa-apa selain satu nombor dalam setiap profil. TCP dan UDP menyimpan jadual port berasingan, jadi 1194/tcp dan 1194/udp ialah soket yang tidak berkaitan dan satu daripada setiap satu boleh wujud bersama pada satu hos; itu pemisahan pengangkutan, bukan penghalaan mengikut nama, dan ia sering dikelirukan dengannya. Kedua-dua pilihan bertahan daripada semakan tembok api, kerana peraturan itu sepadan dengan sesuatu yang benar-benar terkandung dalam paket.
Jika sempadan yang anda perlukan berjalan antara kumpulan pengguna dan bukannya antara dua pelaksanaan, satu instans dengan konfigurasi klien berbeza, pengendalian sijil sendiri dan dasar akses yang jelas boleh menutupnya. Apa yang dibeli ialah dasar di dalam pelayan, bukan pengasingan antara pelayan, dan kedua-duanya keperluan yang berbeza. Pengasingan yang mesti bertahan di bawah kompromi masih memerlukan alamat atau tepi tembok api.
Penamat TLS yang diletakkan di hadapan OpenVPN boleh mendedahkan nama pelayan sebenar kepada bahagian hadapan yang cekap, tetapi hanya apabila bahagian klien juga dikonfigurasikan untuk lapisan tambahan itu. Profil sedia ada tidak memperoleh tingkah laku itu dengan hanya dihalakan ke alamat yang sama.
Buktikan pemilih sebelum membina
Namakan medan yang akan mengenal pasti backend, kemudian sahkan bahawa klien benar-benar menghantarnya; jika jawapannya alamat, rancangan itu bertahan, dan jika ia nama pelayan di dalam jabat tangan yang tidak pernah sampai kepada pendengar, tiada kerja DNS akan menyelamatkannya. Tiga arahan menyelesaikan bahagian pendengar dengan cepat.
ss -lntup | grep -E ':443|:1194'
openssl s_client -connect vpn-a.example:443 -servername vpn-a.example </dev/null | head -n 20
journalctl -u openvpn-server@server-a -n 20 --no-pager
Baris openssl hanya memberikan sijil di tempat sesuatu pada alamat itu menamatkan TLS; terhadap pendengar OpenVPN asli ia tersekat atau gagal, dan itu sendiri ialah jawapan tentang apa yang didedahkan oleh lapisan luar. Baris journal, dibaca pada setiap backend, menunjukkan instans mana yang menerima sesi. Log bahagian hadapan merekodkan apa yang dikelaskan dan tidak pernah apa yang dimaksudkan, jadi backend kekal sebagai satu-satunya pihak berkuasa tentang di mana pengguna mendarat.
Akhiri dengan dua profil yang dimaksudkan untuk mencapai pelayan berbeza, sambungkan satu demi satu dan catat log backend bagi setiap satu. Jika kedua-dua sesi muncul dalam journal yang sama, pemilih itu hilang dan bukan salah konfigurasi, dan pembaikannya ialah alamat atau port yang boleh disasarkan oleh klien. Menyunting peraturan penghalaan tidak akan membantu, kerana peraturan itu tidak pernah diberi apa-apa untuk dihalakan. Setelah pemisahan itu nyata, tuliskan di sebelah profil supaya orang seterusnya tidak menambah alias kedua dan mengharapkan ia melakukan kerja itu.