Sesi pertama menang: menyekat log masuk OpenVPN sebelum pengusiran
Menolak log masuk kemudian bukan sama dengan menggantikan yang lama. Keputusan mesti dibuat sebelum pengusiran nama yang sama, dan pemeriksaan slot mesti bersifat atomik.
Dasar yang membenarkan satu sesi bagi setiap akaun kelihatan selesai sehingga log masuk kedua tiba. Dua hasil mungkin: pendatang baru menggantikan sesi yang sedang berjalan, atau sesi yang berjalan mengekalkan slot dan pendatang baru ditolak. Hanya yang kedua ialah dasar sesi pertama menang. Pilihan klien yang paling ramai orang guna membolehkan keserentakan dan oleh itu tidak menghasilkan hasil tersebut.
Dua kontrak tersembunyi di sebalik satu tetapan
Apabila keserentakan dimatikan, sambungan kedua yang membawa nama sijil yang sama boleh menyingkirkan sesi yang sudah berjalan. Menghidupkan keserentakan membenarkan beberapa sesi sekali gus, iaitu berlawanan dengan had. Kedua-dua keadaan bukan dasar penolakan, jadi keputusan mesti dibuat di tempat lain sepenuhnya.
Tuliskan kontrak itu sebelum melaksanakan apa-apa: siapa yang ditolak, bukti apa yang mengenal pasti sesi yang berjalan, dan apa yang berlaku apabila sesi mati tanpa pemutusan bersih. Dasar yang tidak pernah dinyatakan dengan cara itu tidak boleh diuji kemudian.
Pengusiran berlaku sebelum cangkuk sambungan anda
Pada laluan kod pelayan 2.6, penyediaan awal untuk klien baharu mengalihkan keluar instans sedia ada dengan nama yang sama apabila keserentakan dimatikan. Pengalihan keluar itu berlaku sebelum rantai pengendali sambungan berjalan. Skrip yang menyedari pertindihan dan memulangkan kegagalan oleh itu menolak pendatang baru selepas sesi yang berjalan sudah dibuang - tepat hasil yang dasar itu mahu halang. Urutan panggilan balik dalam pelaksanaan upstream ialah satu-satunya jawapan yang boleh dipercayai untuk binaan anda.
| Stage | Who can still refuse | Effect on the incumbent |
|---|---|---|
| Certificate check | Server trust configuration | None |
| Authentication decision | The authentication controller | None, because establishment has not run |
| Connect handler | A profile script | Already evicted in the same-name case |
| Post-establishment | Status tooling, monitoring | Both sessions already exist or one is gone |
Mengundi fail status juga bukan pintu. Dua percubaan yang tiba serentak boleh kedua-duanya melihat slot kosong sebelum mana-mana pun mengesahkannya, dan kedua-duanya meneruskan.
Pindahkan keputusan ke pengesahan
Antara muka pengurusan boleh mengambil alih keputusan pengesahan selepas pengesahan sijil. Dalam susunan itu pengawal bukan pemantau: ia menerima setiap instans klien yang bersambung dan menjawab sama ada instans itu boleh meneruskan. Kerana jawapan tiba sebelum pembentukan, penolakan membiarkan sesi yang berjalan tidak terganggu. Saluran yang sama melaporkan pemutusan, dan begitulah pengawal tahu bahawa slot telah dilepaskan secara sah.
Setiap instans baharu mesti melalui pintu itu, termasuk penyambungan semula dan mana-mana laluan yang mengesahkan semula tanpa gesaan. Pintu yang tidak pernah dicapai oleh sesetengah instans tidak melindungi apa-apa, dan ketinggalan itu kekal tidak kelihatan sehingga seseorang mencuba jalan pintas.
Token boleh berjalan melepasi pintu
Sebaik sahaja token dikeluarkan, pelayan boleh mengesahkannya secara dalaman dan melangkau pengesahan luaran untuk sambungan itu. Panggilan pengurusan tidak pernah berlaku, jadi pemeriksaan slot yang dilaksanakan hanya di situ tidak pernah melihat instans baharu. Tingkah laku itu keselesaan untuk pengguna dan lubang untuk dasar keserentakan. Buat sambungan yang disahkan token melalui pemeriksaan berwibawa yang setara, atau matikan laluan token apabila dasar menuntut keputusan pada setiap sambungan.
Jangan tebus itu dengan menerima setiap token tanpa syarat. Token yang tamat tempoh atau tidak sah masih mesti gagal, dan ia mesti gagal melalui titik keputusan yang sama seperti segala-galanya.
Ikat tempahan pada instans, bukan pada alamat
Alamat ialah identiti yang lemah: penyambungan semula dari komputer riba yang sama boleh datang dari alamat lain, dan kelayakan yang disalin boleh datang dari alamat yang sama. Ikat tempahan pada instans klien yang diberikan pelayan, supaya pengesahan semula instans yang sudah diterima dikenali sebagai pemilik. Pengecam instans baharu mesti memperoleh slotnya sendiri melalui keputusan yang pertama menang walaupun ia mengemukakan token yang sama.
Lepaskan hanya tempahan milik percubaan yang gagal. Peristiwa pemutusan tertunda daripada percubaan lama tidak boleh menghapuskan slot pemilik yang lebih baharu, itulah sebabnya pelepasan menamakan instans dan bukan akaun. Selepas pengawal dimulakan semula, selaraskan sesi yang hidup sebelum menerima sesiapa, dan gunakan peraturan yang sama pada setiap gerbang yang melayani akaun itu.
Putuskan secara berasingan bagaimana slot yang benar-benar lapuk dipulihkan. Pentadbir memerlukan cara berdokumen untuk membersihkannya, dan laluan itu tidak sepatutnya boleh dicapai oleh pengguna yang hanya mengklik sambung semula.
Uji pasangan yang penting: dua log masuk hampir serentak, penyambungan semula selepas pemutusan bersih, pengesahan semula sesi yang berjalan, pendatang baru yang ditolak, dan pengawal yang dimulakan semula. Dalam setiap kes sesi yang berjalan mesti kekal boleh digunakan dan pendatang baru mesti ditolak tanpa kerosakan pada akaun lain.