Vrátenie adresy zo skriptu client-connect vyzerá, akoby malo nastaviť IP klienta. Nenastaví: jediným kanálom hooku k serveru je dočasný súbor, ktorého cesta prichádza ako posledný argument skriptu, a adresa sa doň musí zapísať v syntaxi ifconfig-push. Skript, ktorý adresu vypíše alebo skončí s nulou bez toho, aby čokoľvek zapísal, vytvorí pripojeného klienta s adresou z poolu a protokol servera vyzerá úplne zdravo.

Zmatek je pochopiteľný, pretože niekoľko iných hookov skutočne odpovedá pomocou návratových kódov alebo premenných prostredia. Tento má vlastnú zmluvu a zmluva začína názvom súboru.

Hook zapisuje súbor, nie návratovú hodnotu

Deklarácia sú dva riadky: script-security 2, aby sa volanie povolilo, a potom client-connect /etc/openvpn/server/assign-address.sh. Keď sa klient autentifikuje, server spustí tento skript s vygenerovanou cestou k súboru pridanou ako posledný argument, ktorý je $1 len vtedy, ak deklarácia neodovzdáva žiadne vlastné dodatočné argumenty. Všetko, čo sa na tohto klienta uplatní, ide do toho súboru ako bežné direktívy, jedna na riadok, presne tak, ako by vyzerali v konfigurácii. Obal, ktorý pridáva vlastné parametre, posúva pozíciu, a klasickým príznakom je skript zapisujúci do cesty, ktorá vyzerá ako --verbose.

Návratový kód je druhá polovica zmluvy. Nula znamená prijmi a prečítaj súbor; čokoľvek iné spojenie odmietne, a tak sa nepriradená identita odmietne, namiesto toho aby ticho spadla späť do poolu. Pred vrátením úspechu zapíšte celú direktívu, aby sa napoly zapísaný súbor nikdy nestal konfiguráciou klienta.

Dve direktívy si zaslúžia pozornosť, pretože interagujú so všetkým ostatným. ifconfig-push fixuje adresu, zatiaľ čo odoslaná route hovorí klientovi, čo je cez tunel dostupné; vráťte prvú a zabudnite na druhú a získate klienta s adresou a bez cieľa. Poradie v súbore nehrá rolu, ale úplnosť áno. Hook, ktorý posiela trasu pre prefix, na ktorý nedosiahne žiadny partner, je tá istá chyba videná z druhého konca.

Vstupy prichádzajú cez premenné prostredia: common_name, trusted_ip, ifconfig_pool_remote_ip a zvyšok. Zaobchádzajte so všetkými ako s reťazcami zvonka servera, nikdy ako s fragmentmi shellu.

Mapovanie adries je politika, nie aritmetika

Lákavá skratka je analyzovať názov certifikátu a použiť jeho číslice ako posledný oktet. To nie je alokátor a zlyháva obvyklými spôsobmi: dva názvy s rovnakým sufixom kolidujú, názov končiaci na 300 nie je adresa a certifikát premenovaný správcom ticho presunie zariadenie. Pri každom volaní overujte členstvo v podsieti, použiteľný rozsah hostiteľov, rezervované adresy a jedinečnosť a mapovanie udržujte v tabuľke, ktorú človek prečíta.

Kto ovláda názov, ovláda adresu, preto rozhodnite, čo common_name v tomto nasadení skutočne predstavuje. Pri zapnutom username-as-common-name je identitou prihlásenie, nie subjekt certifikátu. Nikdy túto hodnotu neodovzdávajte do vyhodnotenia shellu a nikdy nedovoľte, aby klient ovplyvnil cestu k súboru.

Alokátor podložený registrom musí prežiť súbežnosť. Rezervujte adresu atomicky, ošetrite neúspešný zápis bez toho, aby ste pustili napoly nakonfigurovaného klienta, a označte každú alokáciu spojením, ktoré ju vlastní, aby neskoré odpojenie staršej relácie nemohlo uvoľniť adresu, ktorú už drží novšia. Niekoľko inštancií servera zdieľajúcich jeden pool robí túto požiadavku ostrejšou, nie voliteľnou.

Topológia rozhoduje, čo ifconfig-push znamená

S topology subnet na 10.77.0.0/24 je ifconfig-push 10.77.0.20 255.255.255.0 adresa plus jej maska siete. Pod topology net30 druhý argument vôbec nie je maska, ale adresa partnera, takže skopírovanie podsíťového tvaru na server net30 vám dá klienta, ktorý sa pripojí a nedokáže prepúšťať prevádzku. Topológiu meňte zámerne, nikdy preto, aby príklad vyzeral konzistentne. Server, ktorý už beží na net30, má živých klientov na starom adresovaní, takže prepnutie je migrácia s oknom údržby, nie úprava jedného riadku.

Statické adresy musia ležať mimo dynamického poolu a mimo každého iného statického priradenia, vrátane tých, ktoré rozdávajú bežné súbory client-config-dir. Ak dva mechanizmy môžu vytvoriť rovnakú adresu pre rôznych klientov, jeden z nich to skôr či neskôr urobí.

Predtým, než tomu uveríte, otestujte štyri prípady

Spustite rovnaké kontroly proti mapovanej identite, nemapovanej, opätovnému pripojeniu a simulovanej poruche registra. openvpn --config client.ovpn --verb 4 zobrazuje pridelenú adresu v push odpovedi a na serveri grep -A2 PUSH_REPLY /var/log/openvpn/openvpn.log potvrdzuje, čo sa skutočne odoslalo. Pri nemapovanej identite je očakávaným výsledkom odmietnuté spojenie, nie adresa z poolu.

Potom preskúmajte adresár, do ktorého démon zapisuje tie dočasné súbory. Skript beží v zníženom kontexte služby, takže cesta zapisovateľná pre root, ale nie pre démona, zmení každé spojenie na odmietnutie s chybou oprávnení pochovanou niekoľko riadkov nižšie v protokole.

Pridelenie nie je autorizácia: pripnutá adresa stále neudeľuje prístup ku každému cieľu za serverom. Držte politiku smerovania a firewallu vo vlastnej vrstve a overujte ju voči adrese, ktorú ste práve zafixovali.

Súvisiace články