Kinerja OpenVPN: berapa banyak klien konkuren yang dimungkinkan?

37

Saya mengevaluasi sistem untuk klien di mana banyak klien OpenVPN terhubung ke server OpenVPN. "Banyak" berarti 50.000 - 10.000.000.

Mengapa saya melakukan itu? Klien didistribusikan sistem tertanam, masing-masing duduk di belakang pemilik sistem router dsl. Server harus dapat mengirim perintah ke klien. Pendekatan naif pertama saya adalah membuat klien terhubung ke server melalui jaringan openvpn. Dengan cara ini, terowongan komunikasi aman dapat digunakan di kedua arah.

Ini berarti bahwa semua klien selalu terhubung ke server. Ada banyak klien yang menyimpulkan selama bertahun-tahun.

Pertanyaannya adalah: apakah server OpenVPN meledak ketika mencapai sejumlah klien? Saya sudah mengetahui batas nomor koneksi TCP maksimum, oleh karena itu (dan untuk alasan lain) VPN harus menggunakan transportasi UDP.

Guru OpenVPN, apa pendapat Anda?

Steffen Müller
sumber
Bisakah Anda membagikan kesimpulan akhir Anda tentang hal ini kepada kami? Apakah Anda dapat melakukan tes dengan> 5'000 pengguna?
Philipp
Halo Philipp, kami membuang rencana OpenVPN karena jelas bahwa kami akan menyentuh tanah yang belum pernah disentuh orang sebelumnya. Kami memilih koneksi Socket TCP normal berbasis SSL ke server manajemen koneksi Node.js.
Steffen Müller

Jawaban:

25

Saya ragu bahwa pengaturan yang besar pernah dicoba sebelumnya, sehingga Anda kemungkinan akan mendorong batas ketika mencoba. Saya bisa menemukan artikel tentang penyebaran VPN untuk 400 klien tetapi menilai dari teks, penulis hanya mengandalkan perkiraan kasar tentang berapa banyak klien yang dapat dijalankan per CPU dan tidak memiliki pemahaman tentang bagaimana pengaturannya akan melakukan.

Anda terutama perlu mempertimbangkan dua hal ini:

  1. Bandwidth transfer data Anda akan menggunakan akan memerlukan enkripsi / dekripsi di sisi server VPN, memakan sumber daya CPU

  2. Koneksi klien OpenVPN mengkonsumsi sumber daya, memori dan CPU di server bahkan ketika tidak ada data yang ditransfer

Setiap perangkat keras PC yang layak yang tersedia saat ini harus dengan mudah menjenuhkan tautan Gigabit dengan Blowfish atau AES-128, bahkan perangkat yang disematkan $ 100 mampu memberikan harga mendekati 100 Mbps , sehingga kemacetan CPU akibat intensitas bandwidth tidak boleh menjadi masalah.

Mengingat interval rekeying default 3600 detik, sejumlah 1.000.000 klien akan berarti bahwa server harus mampu menyelesaikan 278 pertukaran kunci rata-rata per detik. Meskipun pertukaran kunci adalah tugas yang agak intensif-CPU, Anda dapat melepasnya ke perangkat keras khusus jika diperlukan - kartu akselerator kriptografi yang tersedia dengan mudah memenuhi dan melampaui jumlah jabat tangan TLS ini. Dan batasan memori seharusnya tidak terlalu merepotkan - biner 64-bit harus mengatasi semua batasan memori virtual yang mungkin akan Anda tekan sebaliknya.

Tetapi keindahan sebenarnya dengan OpenVPN adalah Anda dapat mengukurnya dengan cukup mudah - cukup buat server OpenVPN dalam jumlah sewenang-wenang dan pastikan klien Anda menggunakannya (mis. Melalui DNS round-robin), konfigurasikan protokol perutean dinamis pilihan Anda (biasanya ini adalah RIP karena kesederhanaannya) dan infrastruktur Anda akan mampu mendukung jumlah klien yang sewenang-wenang selama Anda memiliki cukup perangkat keras.

the-wabbit
sumber
Terima kasih atas jawaban singkatnya. Apakah Anda melihat alternatif untuk menggunakan openvpn? Tujuan utama hanya memiliki komunikasi dua arah melalui router.
Steffen Müller
2
@ SteffenMüller Jika Anda tidak membutuhkan tumpukan lengkap tetapi hanya saluran kontrol, mengapa tidak menggunakan sesuatu yang mirip dengan botnet ? Implementasi tersedia dan SANS dengan mudahnya menawarkan makalah tentang cara mengaturnya
the wabbit
Terima kasih atas tautannya. Sayangnya, bot menggunakan polling sederhana untuk menanyakan apakah server memiliki informasi. Meskipun ini mungkin cara untuk pergi, saya mencari cara untuk membangun dan menjaga koneksi dua arah. Polling konstan menyebabkan penundaan eksekusi perintah atau volume data tinggi untuk permintaan polling yang tidak berguna. Mungkin koneksi TCP permanen adalah cara untuk pergi?
Steffen Müller
1
@ SteffenMüller Botnets terbukti dapat menangani ribuan klien dengan baik - jadi saran saya untuk memeriksanya. Anda tidak harus pergi dengan implementasi spesifik yang ditunjukkan oleh SANS - memang ada banyak yang lain. Selain itu, tanpa mengetahui persyaratan pasti Anda, sangat sulit untuk mengatakannya. Koneksi TCP yang mengirim keepalives tentu akan dapat memastikan hubungan state di gateway NAT tidak menua. Tetapi Anda harus mengurus semuanya (otentikasi, enkripsi, penanganan kesalahan) sendiri.
the-wabbit
2
BTW, tidak ada alasan Anda tidak dapat menurunkan interval rekeying (ada tradeoff keamanan, di mana kunci yang dikompromikan akan mengungkapkan plaintext kembali ke rekeying terakhir). Juga, saya akan jauh lebih khawatir tentang perutean atau gagal mencari koneksi lainnya. Maksud saya, jika OpenVPN dimaksudkan untuk memiliki <100 koneksi aktif, berapakah peluang ada O (n) pencarian koneksi di suatu tempat?
derobert
26

Saya sebenarnya telah melakukan ini, walaupun dengan "hanya" beberapa ratus koneksi jarak jauh yang serupa di belakang router DSL. Saya tidak bisa berkomentar terlalu banyak tentang masalah rekeying, tetapi beberapa hal praktis yang saya pelajari di sepanjang jalan:

1) Saat mengerahkan klien, pastikan Anda menentukan beberapa server VPN di klien conf, vpn1.example.com, vpn2.example.com, vpn3 ..... Bahkan jika Anda hanya menyediakan satu atau dua di antaranya sekarang, Anda memberi sendiri ruang kepala. Dikonfigurasi dengan benar, klien akan terus mencoba ulang secara acak hingga mereka menemukan yang berfungsi.

2) Kami menggunakan gambar server AWS VPN khusus, dan dapat meningkatkan kapasitas tambahan sesuai permintaan, dan Amazon DNS (R53) menangani sisi DNS dari berbagai hal. Itu benar-benar terlepas dari sisa infrastruktur kami.

3) Di akhir server, gunakan netmask dengan hati-hati untuk membatasi jumlah klien potensial. Itu harus memaksa klien ke server alternatif, mengurangi masalah CPU. Saya pikir kami membatasi server kami hingga 300 atau lebih klien. Pilihan ini agak sewenang-wenang di pihak kami - "firasat" jika Anda suka.

4) Juga di ujung server, Anda harus menggunakan firewall dengan hati-hati. Secara sederhana, kami telah mengonfigurasikan milik kami sehingga klien dapat terhubung ke VPN, tetapi server melarang keras semua koneksi ssh masuk kecuali dari alamat IP yang dikenal. Kita bisa SSH ke klien jika kita sesekali perlu, mereka tidak bisa SSH kepada kita.

5) Jangan mengandalkan OpenVPN yang melakukan koneksi ulang untuk Anda di ujung klien. 9 kali dari 10 itu akan, tetapi kadang-kadang macet. Memiliki proses terpisah untuk mengatur ulang / memulai kembali openVPN di akhir klien secara teratur.

6) Anda memerlukan cara untuk menghasilkan kunci unik untuk klien sehingga Anda dapat menolaknya kadang-kadang. Kami membuat ini secara internal dengan proses server build (PXEboot) kami. Tidak pernah terjadi pada kami, tetapi kami tahu kami bisa melakukannya.

7) Anda akan memerlukan beberapa alat manajemen, skrip untuk memonitor koneksi server VPN Anda secara efektif.

Tidak banyak materi di luar sana tentang bagaimana melakukan ini sayangnya, tetapi mungkin, dengan konfigurasi yang cermat.

Aitch
sumber
Terima kasih banyak atas wawasannya. Saya terkejut bahwa masalah rekeying telah menghantam Anda dengan 300 klien ...
Steffen Müller
Untuk memperjelas - mereka belum, tapi saya belum melacaknya juga ....: - / Angka "300" sepertinya masuk akal. Jika kita memiliki masalah, kita hanya akan memperbesar gambar AWS ke instance yang lebih besar. Saya belum pernah dekat dengan banyak koneksi pada server sebelumnya, mungkin hanya sekitar 100 maks, tetapi kami menjalankan beberapa server dan mereka kira-kira sejajar dengan openvpn secara acak memilih tujuan dari daftar yang diketahui.
Aitch
Dapatkah Anda membagikan rincian lebih lanjut tentang bagaimana Anda melakukan ini: "5) Jangan mengandalkan OpenVPN melakukan koneksi ulang untuk Anda di akhir klien. 9 kali dari 10 itu akan, tetapi kadang-kadang macet. Memiliki proses terpisah untuk setel ulang / mulai ulang openVPN di ujung klien secara teratur. "
Doug
Maaf meninggalkan pekerjaan itu 4,5 tahun yang lalu (!), Tidak dapat mengingat, tetapi hampir pasti semacam daftar proses, matikan kemudian restart layanan.
Aitch
(saya melakukan pengaturan serupa dengan saat ini sekitar 400 perangkat pada satu server VPN), Anda perlu membuat keputusan apa yang harus dilakukan ketika vpn tidak dapat dicapai, waktu habis atau ditolak. interval coba lagi acak tidak akan membantu Anda selamanya dan hanya akan menghasilkan lalu lintas. Tergantung pada masalah Anda harus melakukan sesuatu pada klien, pada firewall / DSL, yang biasanya Anda tidak bisa, dan karenanya mengirim sistem ke fase tidur "meh, transfer data nanti", atau jika masalahnya adalah server VPN itu sendiri . Anda dapat memperkirakannya melalui log dan memutuskan berdasarkan itu. rekeying bukan (belum) masalah bagi kami.
Dennis Nolte
3

Perbarui 2018

Tidak yakin apa yang telah berubah sejak 2012. Hanya ingin memberikan pembaruan tentang pengalaman saya pada 2018. Kami telah menggunakan jaringan openvpn yang sangat mirip dengan pengaturan OP. Titik akhir kami adalah pcs linux yang ditiup penuh alih-alih perangkat tertanam. Setiap titik akhir memiliki monitor yang digunakan untuk menampilkan informasi dan alarm untuk situs itu dan server kami memungkinkan kami satu titik untuk melakukan remote ke semua titik akhir. Jaringan tidak terlalu aktif tetapi terkadang memiliki 5-10 sesi jarak jauh secara bersamaan.

Dengan menggunakan openvpn saat ini di sekitar 100 klien pada gambar biru dengan satu inti dan 2gb ram, kami menggunakan sekitar 0,7% memori rata-rata dan penggunaan cpu hampir selalu sekitar 0%. Berdasarkan apa yang saya temukan untuk pengujian yang lebih kecil ini, saya pikir satu server dengan spesifikasi yang layak akan dengan mudah menangani 50.000 bersamaan jika memiliki ram untuk mendukungnya. Jika penggunaan ram ditingkatkan secara linear maka 16gb akan mampu menangani 50.000 pengguna dengan cukup tambahan pada mesin openvpn khusus.

Kami tidak pada skala yang cukup besar untuk mengatakan itu dengan keyakinan yang signifikan tetapi saya hanya ingin memberikan pembaruan baru-baru ini karena ketika awalnya menggunakan jaringan kami, saya menemukan ini dan mengharapkan lebih banyak penggunaan sumber daya pada skala ini. Sekarang, saya percaya cpu yang menjalankan ini memang memiliki enkripsi perangkat keras dan saya tidak yakin pada titik apa yang akan menjadi kelebihan lalu lintas, tetapi untuk titik akhir yang tidak banyak berkomunikasi, ini seharusnya tidak menjadi masalah.

Pada 1000000 Anda akan membutuhkan 200gb ram pada satu mesin (jika ditingkatkan secara linear dengan tambahan) sementara ini mungkin saya akan berpikir pada saat itu Anda ingin memiliki 5 mesin masing-masing dengan 64gb ram sehingga Anda tidak memiliki satu poin pun kegagalan. Ini harus memungkinkan pemeliharaan, memulai kembali dan penggantian 1 atau bahkan 2 mesin tanpa masalah yang berarti.

Perkiraan ram saya mungkin terlalu banyak karena saya membagi seluruh penggunaan openvpn dengan jumlah klien di mana hanya sebagian ram itu karena klien.

Kami telah menambahkan 74 titik akhir dalam setahun sejak awalnya digunakan. Saya berharap untuk terus meningkatkan jumlah itu secara signifikan dan akan membuat pembaruan lebih lanjut jika kita mencapai skala yang layak.

CraigZ
sumber
Dapatkah Anda membagikan rincian lebih lanjut tentang bagaimana Anda melakukan ini: "5) Jangan mengandalkan itu tidak akan membiarkan saya mengomentari utas di atas tetapi saya ingin menjawab ini: OpenVPN melakukan penyambungan kembali untuk Anda di ujung klien. 9 kali dari 10 itu akan, tetapi kadang-kadang macet. Memiliki proses terpisah untuk mengatur ulang / memulai kembali OpenVPN di klien akhir secara teratur. " - Doug 18 Mei 17 pada 17:12
CraigZ
Tekan batas karakter. Gunakan pengawas untuk melakukan ini. Lakukan restart secara otomatis setiap 6-12j
CraigZ
1

Saya mencari masalah yang sama, meskipun jumlah klien menjadi ratusan mungkin beberapa ribu.

Saya pikir saya tidak bisa membuat semua klien terhubung sepanjang waktu.

Saya sedang berpikir untuk memulai daemon OpenVPN pada klien pada interval waktu yang acak sehingga mereka dapat memeriksa apakah mereka disurvei. Jika mereka mereka mengirim email atau sesuatu yang sedang online dan mengirim paket tetap hidup untuk jangka waktu tertentu sehingga saya dapat terhubung ke mereka.

Jika tidak ada lalu lintas untuk beberapa waktu, daemon akan dihentikan.

Masalah yang saya hadapi saat ini adalah sepertinya tidak mungkin mendapatkan daftar klien VPN yang saat ini terhubung ...

Davor Dundovic
sumber
1
Anda bisa mendapatkan daftar klien yang terhubung saat ini melalui log status openvpn. Di sana Anda melihat semua ips yang terhubung ke server saat ini.
Fa11enAngel