OpenVPN client-connect-Fehler: ass d’Botzen beim disconnect garantéiert?
En ofgelehnte Client hëlt weder eng Firewall-Regel nach en opgeschriwwenen Datensatz zréck. Vergläicht de Callback-Kontrakt mat der Zréckroll, déi Ären Hook selwer muss maachen.
Wann e client-connect-Skript mat engem Code ongläich null ophält, weist OpenVPN de Client of, an d’Betreiber huelen normalerweis un, datt dat entspriechend client-disconnect-Skript opraamt. Oft leeft et ni, well d’disconnect-Verarbechtung dovun ofhänkt, wat d’connect-Phase fäerdeg konnte maachen. Ofleenung an Zréckroll als ee Mechanismus ze behandelen ass dat, wat eng feelgeschloen Umeldung an eng verluer Firewall-Regel oder en verwäisten Datensatz verwandelt. Et sinn zwee getrennt Flichten, an nëmmen eng dovun ass automatesch. Liest den eegene Exit-Wee vum Hook, ier Dir de Server beschëllegt, Zustand hannerlooss ze hunn.
En Exit ongläich null weist de Client of; en hëlt Är Aarbecht net zréck
Den Exit-Status vu client-connect ass eng Zousazungsentscheedung. Null heescht zouloossen, alles anescht heescht d’Instanz ofzerappen, ier se vollstänneg opgebaut ass. Näischt an deem Kontrakt iwwerpréift, wat d’Skript schonn an der Baussewelt gemaach huet. Wann d’Skript eng iptables-Regel bäigefüügt huet, eng Zeil geschriwwen oder en Zähler erhéicht huet, iwwerliewen déi Ännerungen d’Ofleenung.
Déi selwecht Asymmetrie gëllt fir Pluginnen, wou verschidden connect-Funktioune fir eng Instanz lafe kënnen. E méi spéide Feeler annulléiert net retroaktiv en éischte Succès, an déi éischt Funktioun huet keng Manéier ze wëssen, datt eng Schwësterfunktioun gescheitert ass.
Ofleenung ass automatesch, Botzen net
D’OpenVPN-2.6-Handbuch verbënnt d’client-disconnect-Verarbechtung mat der viregter erfollegräicher connect-Verarbechtung. Eng dokumentéiert Ausnam deckt Kaskadeketten of: wann ee connect-Schrëtt schonn Erfolleg zréckginn huet, lafen déi entspriechend disconnect-Schrëtt beim Ofrappen vun der Instanz trotzdem, och wann e méi späte connect-Schrëtt gescheitert ass. Déi Ausnam ass enk a hänkt dovun of, wéi vill Callbacke konfiguréiert sinn, dofir seet en Test mat engem Shell-Skript Iech näischt iwwer eng Kette.
Kartéiert déi tatsächlech Konfiguratioun, ier Dir ronderëm se designt: wéi eng Skript, wéi eng Plugg an a wéi enger Reiefolleg se lafen. D’Tabelle hei drënner listet op, wat eng hallef fäerdeg Ariichtung hannerléisst.
| What the hook did before failing | What the client sees | What stays behind |
|---|---|---|
| Created a firewall entry | A rejection, with no tunnel | A rule matching an address nobody owns |
| Wrote a state row | A rejection, with no tunnel | A record of a session that never started |
| Allocated a tunnel address | A rejection, with no tunnel | An address marked busy until something releases it |
All Zeil endet fir de Client gläich an fir den Host anescht. De Client kann net soen, wéi eng dovun geschitt ass, dofir muss den Hook zréckrollen, wat en gemaach huet, ier en de Feelerstatus zréckgëtt.
Kompenséiert an deem Skript, dat gescheitert ass
Validéiert alles wat méiglech ass, ier Dir de gedeelten Zoustand beréiert: Zertifikatsfelder, d’Verfügbarkeet vun der Adress, d’Grupp, zu där de Client gehéiert. Déi bëllegst Ofleenung ass déi, déi virun all Zousaz geschitt. Soubal d’Ariichtung verschidden extern Operatiounen ëmfaasst, féiert Buch driwwer, wéi eng fäerdeg goufen, a rollt se an ëmgedréiter Reiefolleg zréck, ier Dir de Feelerstatus zréckgitt.
E konkrete Fall: d’Skript erstellt eng Firewall-Androung pro Client an et feelt duerno beim Schreiwen vun der Zoustandszeil, déi se beschreift. De feelende Branch sollt d’Androung, déi en just erstallt huet, ewechhuelen an dann mat engem Code ongläich null ophalen. Op en disconnect-Evenement ze waarden, dat vläicht ni geplangt gëtt, ass de Wee, wéi eng Regel d’Sessioun iwwerlieft, fir déi se geduecht war.
Maacht d’Kompensatioun idempotent a mat Proprietär
Botze muss sécher sinn zweemol ze lafen a präzis doriwwer, wat et däerf läschen. En spéiden Evenement vun engem fréieren Versuch sollt net d’Zousaz vun enger méi neier Sessioun ewechhuelen, just well béid en gemeinsamen Numm oder eng recycléiert Tunneladress deelen. Registréiert de konkreten Handle oder d’Operatiouns-ID zesumme mat der Ressource, a läscht iwwer dee Schlëssel amplaz iwwer den Numm. Datebanktransaktioune hëllefen nëmmen bei den eegene Ännerunge vun der Datebank; eng Firewall-Regel baussent dëser Grenz brauch e explizitte Kompensatiounsschrëtt.
Huelt un, datt de Prozess tëscht der Ännerung an dem Botze stierwe kann, a füügt en Ofgläicher derbäi, deen de externen Zoustand no engem Zäitplang mat der Lëscht vun de zougeloosse Clienten vergläicht.
Test déi dräi Weeër, déi sech wierklech ënnerscheeden
Übt dräi Fäll: eng Ofleenung ier iergendeppes zougedeelt gëtt, eng no enger deelweiser Zousaz, an eng normal zougeloosse Sessioun, déi méi spéit ophält. Déi dräi produzéieren ënnerschiddlech Logzeilen an ënnerschiddlech Reschter. Kontrolléiert den externen Zoustand no all eenzel, net nëmmen d’Feelermeldung vum Client, well de Client, dee feelt, an zwee vun den dräi de erwaarten Resultat ass.
Logt d’Hook-Phase, den Exit-Status a wat zougedeelt oder fräigelooss gouf, ouni d’Zougangsdaten. En Hook-Log, deen d’Ressource nennt, déi en erstallt huet, ass dat, wat eng verluer Regel sechs Méint méi spéit auffannech mécht.