En afbrydelsespost ankommer, efter at en anden forbindelse under samme navn allerede er begyndt, og en handler, der opdaterer den nyeste række for den bruger, lukker den forkerte session. Fejlen er ikke selve tidsstempelsammenligningen. Det er antagelsen om, at et navn plus et helt sekund identificerer én session. Hookhændelser beskriver forbindelser, og en forbindelse har brug for en nøgle, der kun tilhører den.

Begynd med, hvad afbrydelsesvariablerne egentlig betyder. Først derefter giver valget af identifikator mening.

Hvad afbrydelses-hooket egentlig bærer

I Community OpenVPN 2.6 definerer hook-reference time_unix som det øjeblik, klienten oprettede forbindelse; det sættes, før forbindelses-hooket kører, og det omdefineres ikke, når afbrydelses-hooket senere udløses. time_duration giver længden af den session i sekunder, så slutningen er cirka forbindelsestiden plus varigheden. Begge er hele sekunder, og ingen af dem er det øjeblik, din database behandlede hændelsen. At holde disse tre tider adskilt er det, der får en korrelation til at holde, i stedet for blot at se rigtig ud under test.

Denne aritmetik fortjener at blive skrevet ned, fordi det er den eneste sluttid, hooket selv tilbyder. Behandlingsforsinkelse og urforskelle mellem værter ligger stadig uden for den.

Hvorfor det oplagte par ikke er unikt

At parre navnet med forbindelsestiden indsnævrer søgningen og identificerer stadig ikke en session. En klient kan genoprette forbindelse inden for samme sekund, så to sessioner kan dele begge værdier. To dæmoninstanser eller en serverudskiftning, der beholder samme konfiguration, kan frembringe det par fra forskellige processer. Tunneladresser genbruges af samme grund, hvilket gør dem til attributter for en session snarere end identifikatorer for den.

Fejltilstanden er stille. En sen afbrydelse for den første session matcher den nyeste række og afslutter en tildeling, som den anden session stadig bruger, så brugeren oplever et tilfældigt tab af adgang, som de ikke har forårsaget. Et rækkeantal, der ser rigtigt ud bagefter, gør problemet sværere at få øje på.

Hvor en stabil identitet kommer fra

Styringsgrænsefladen tildeler hver klient en klientinstans-identifikator, og den identifikator er begrænset til den dæmoninstans, der udstedte den. En brugbar ekstern nøgle kombinerer en stabil serveridentifikator, en epoke der ændres, når dæmonen starter, og det klient-ID. Epoken er vigtig, fordi identifikatorer genstarter med processen, og et bart proces-ID kan senere genbruges af noget urelateret.

Miljøvariabler, der sættes inde i et underordnet forbindelsesscript, rejser ikke til den overordnede dæmons senere afbrydelsesscript, fordi disse scripts kører som separate processer med deres egne miljøer. Derfor er generering af et UUID på forbindelsestidspunktet kun halvdelen af en løsning. Afbrydelsessiden skal kunne navngive det samme UUID, hvilket betyder, at identiteten skal leve et sted, hvor begge hændelser kan nå den.

Gør afslutning betinget og idempotent

Afslut efter sessions ejer, ikke efter bruger. En handler, der sletter enhver tildeling, der i øjeblikket tilhører et navn, vil til sidst slette den forkerte, og det eneste forsvar er at kontrollere, at den post, der fjernes, er den post, denne hændelse beskriver.

Styringsgrænsefladen accepterer én tilsluttet styringsklient ad gangen, så integrer med den, der allerede ejer den, i stedet for at tilkoble en anden observatør, der konkurrerer om den samme socket.

Håndter gentagne hændelser uden at ændre resultatet to gange, og gem uparrede hændelser til afstemning i stedet for at kassere dem. Et afbrydelses-callback har dokumenterede livscyklusbetingelser og kommer måske aldrig efter et nedbrud eller et hårdt stop, så designet har brug for en måde at repræsentere en session, hvis afslutningshændelse mangler.

Test de besværlige tilfælde med vilje: to genoprettelser inden for ét sekund, to dæmoninstanser, en forbindelse hvis behandling mislykkedes, og en dæmon-genstart midt i en session. En nøgle, der overlever alle fire, er en nøgle, der er værd at stole på.

Relaterede artikler