OpenVPN client-connect-Hook: wou är Adress wierklech hien geet
En client-connect-Skript kann eng Adress net zréckginn, andeems et se print. Kuckt wéi déi temporär Datei vum Hook, den Exit-Status an d'Topologie d'IP vum Client bestëmmen.
Eng Adress aus engem client-connect-Skript zréckzeginn, gesäit aus wéi wann et d'IP vum Client sollt astellen. Et mécht et awer net: den eenzegen Kanal vum Hook zum Server ass eng temporär Datei, deenen hire Wee als leschten Argument vum Skript kënnt, an d'Adress muss do an der ifconfig-push-Syntax geschriwwe ginn. E Skript, dat d'Adress print oder mat Null ophält, ouni eppes ze schreiwen, produzéiert en ugeschlossene Client mat enger Adress aus dem Pool, an de Serverlog gesäit komplett gesond aus.
D'Konfusioun ass vernünfteg, well verschidden aner Hooks jo iwwer Exit-Codes oder Ëmfeldvariabelen äntweren. Dësen huet säin eegene Kontrakt, an de Kontrakt fänkt mat engem Dateinumm un.
Den Hook schreift eng Datei, net en Zeréckgabwäert
D'Deklaratioun sinn zwou Zeilen: script-security 2 fir den Opruff ze erlaaben, duerno client-connect /etc/openvpn/server/assign-address.sh. Wann e Client sech authentifizéiert, féiert de Server dat Skript aus, woubäi de generéierte Dateiwee als leschten Argument ugehängt gëtt, deen nëmmen dann $1 ass, wann d'Deklaratioun keng eege zousätzlech Argumenter iwwergëtt. Alles wat op dee Client ugewannt gëtt, geet an déi Datei als gewéinlech Direktiven, eng pro Zeil, genau wéi se an enger Konfiguratioun erschéngen. E Wrapper, deen seng eege Parameteren derbäusetzt, verréckelt d'Positioun, an de klassesche Symptom ass e Skript, dat an e Wee schreift, deen wéi --verbose ausgesäit.
Den Exit-Status ass déi aner Halschent vum Kontrakt. Null heescht akzeptéieren an d'Datei liesen; alles anescht verwierft d'Verbindung, an esou gëtt eng net gemappte Identitéit ofgelehnt, amplaz sech roueg an de Pool zréckzezéien. Schreift déi komplett Direktiv, ier Dir Erfolleg zréckgitt, sou datt eng hallef geschriwwen Datei ni d'Konfiguratioun vun engem Client gëtt.
Zwou Direktive verdéngen Opmierksamkeet, well se mat allem aneren interagéieren. ifconfig-push fixéiert d'Adress, während eng gepushte route dem Client seet, wat duerch den Tunnel erreechbar ass; gitt déi éischt zréck a vergiesst déi zweet, an Dir kritt e Client mat enger Adress an néierens wou en hien geet. D'Reihenfolg an der Datei ass egal, d'Vollstännegkeet awer net. En Hook, deen eng Route fir e Präfix pusht, deen kee Peer erreeche kann, ass dee selwechte Feeler vun der anerer Säit aus gesinn.
Input kënnt iwwer Ëmfeldvariabelen: common_name, trusted_ip, ifconfig_pool_remote_ip an de Rescht. Behandelt se all als Strings vun ausserhalb vum Server, ni als Shell-Fragmenter.
Adressmapping ass eng Politik, net Arithmetik
En verlockende Kierzwee ass, den Zertifikatsnumm ze parsen an seng Zifferen als leschten Oktett ze benotzen. Dat ass keen Zoulauschter, an et schléit op gewéinlech Manéier fehl: zwee Nimm mat demselwe Suffix kollidéieren, en Numm deen op 300 ophält ass keng Adress, an en Zertifikat, deen en Administrateur ëmbenennt, verréckelt roueg en Apparat. Validéiert Subnetzmemberzschaft, de benotzbare Hostbereich, reservéiert Adressen an Eenzegaartegkeet bei all Opruff, a hält d'Mapping an enger Tabell, déi en Mënsch liesen kann.
Wien den Numm kontrolléiert, kontrolléiert d'Adress, also entscheet, wat common_name an dëser Ausrollung tatsächlech representéiert. Mat aktivéiertem username-as-common-name ass d'Identitéit de Login an net de Sujet vum Zertifikat. Gitt dee Wäert ni an d'Shell-Auswäertung, a loosst den Client ni en Dateiwee beaflossen.
En registrierungsbaséierten Zoulauschter muss Konkurrenz iwwerliewen. Reservéiert d'Adress atomar, behandelt e feelgeschloene Schreiwen, ouni en hallef konfiguréierte Client zouzeloossen, an etikettéiert all Zoulauschter mat der Verbindung, déi et gehéiert, sou datt eng spéit Trennung vun enger eelerer Sessioun keng Adress fräisetze kann, déi eng méi nei schonn hält. Verschidde Serverinstanzen, déi ee Pool deelen, maachen déi Fuerderung méi schaarf an net optional.
D'Topologie entscheet, wat ifconfig-push bedeit
Mat topology subnet op 10.77.0.0/24 ass ifconfig-push 10.77.0.20 255.255.255.0 eng Adress plus hir Netzmaske. Ënner topology net30 ass den zweete Argument guer keng Maske mä d'Peer-Adress, also gëtt beim Kopéieren vun der Subnetzform op en net30-Server e Client, deen sech verbënnt a kee Verkéier duerchléisst. Ännert d'Topologie bewosst, ni fir en Beispill konsequent ausgesinn ze loossen. En Server, deen schonn net30 bedreift, huet lieweg Clienten op der aler Adresséierung, also ass den Ëmsteller eng Migratioun mat engem Maintenance-Fënster, keng Ännerung vun enger Zeil.
Statesch Adresse mussen ausserhalb vum dynamesche Pool an ausserhalb vun all anerer statescher Zouweisung leien, inklusiv deenen, déi gewéinlech client-config-dir-Dateien ausginn. Wa sech zwee Mechanismen déiselwecht Adress fir verschidde Cliente kënne produzéieren, wäert ee vun hinnen et schlussendlech maachen.
Test véier Fäll, ier Dir et vertraut
Féiert déiselwecht Kontrollen op enger gemappter Identitéit, enger net gemappter, enger Neiverbindung an engem simuléierte Registrierungsfehler aus. openvpn --config client.ovpn --verb 4 weist déi zougewisen Adress an der Push-Antwert, an um Server bestätegt grep -A2 PUSH_REPLY /var/log/openvpn/openvpn.log, wat tatsächlech geschéckt gouf. Fir déi net gemappt Identitéit ass dat erwaart Resultat eng verworf Verbindung, keng Pooladress.
Dann kontrolléiert de Verzeechnis, an deen den Daemon déi temporär Dateien schreift. D'Skript leeft am erofgesaten Servicekontext, also verwandelt e Wee, deen root schreiwen kann, den Daemon awer net, all Verbindung an eng Oflehnung mat engem Berechtegungsfeeler, dee méi wäit ënnen am Log begruewe läit.
Zoulauschterung ass keng Autorisatioun: eng fixéiert Adress gëtt nach ëmmer keen Zougang zu all Destinatioun hannert dem Server. Hält d'Routing- a Firewallpolitik an hirer eegener Schicht, a verifizéiert se géint d'Adress, déi Dir just fixéiert hutt.