Vraćanje adrese iz client-connect skripte izgleda kao da treba postaviti IP klijenta. Ali ne postavlja ga: jedini kanal kuke prema serveru jest privremena datoteka čija staza dolazi kao posljednji argument skripte, a adresa se mora zapisati ondje u sintaksi ifconfig-push. Skripta koja ispiše adresu ili izađe s nulom bez ičega zapisanog stvara povezanog klijenta s adresom iz skupa, a serverski zapis izgleda posve zdravo.

Zabuna je razumljiva jer nekoliko drugih kuka doista odgovara putem izlaznih kodova ili varijabli okruženja. Ova ima vlastiti ugovor, a ugovor počinje imenom datoteke.

Kuka zapisuje datoteku, a ne povratnu vrijednost

Deklaracija je dva retka: script-security 2 kojim se dopušta poziv, zatim client-connect /etc/openvpn/server/assign-address.sh. Kad se klijent autentificira, server pokreće tu skriptu s generiranom stazom datoteke dodanom kao posljednji argument, koja je $1 samo ako deklaracija ne prosljeđuje vlastite dodatne argumente. Sve što se primjenjuje na tog klijenta ide u tu datoteku kao obične direktive, jedna po retku, točno kako bi izgledale u konfiguraciji. Omotač koji dodaje vlastite parametre pomiče položaj, a klasičan simptom je skripta koja piše na stazu koja izgleda poput --verbose.

Izlazni status druga je polovica ugovora. Nula znači prihvati i pročitaj datoteku; sve ostalo odbija vezu, i tako se nemapirani identitet odbija umjesto da se tiho vrati u skup. Napišite cijelu direktivu prije vraćanja uspjeha, da napola zapisana datoteka nikad ne postane klijentova konfiguracija.

Dvije direktive zaslužuju pozornost jer djeluju na sve ostalo. ifconfig-push fiksira adresu, dok gurnuta route govori klijentu što je dostupno kroz tunel; vratite prvu i zaboravite drugu pa dobivate klijenta s adresom i bez kamo ići. Redoslijed unutar datoteke nije važan, ali potpunost jest. Kuka koja gura rutu za prefiks do kojeg nijedan par ne može doći ista je pogreška viđena s druge strane.

Ulazi dolaze kroz varijable okruženja: common_name, trusted_ip, ifconfig_pool_remote_ip i ostale. Tretirajte ih sve kao nizove izvan servera, nikada kao dijelove ljuske.

Mapiranje adresa je politika, ne aritmetika

Primamljiv prečac je raščlaniti ime certifikata i upotrijebiti njegove znamenke kao posljednji oktet. To nije alokator i ne uspijeva na uobičajene načine: dva imena s istim sufiksom sudaraju se, ime koje završava na 300 nije adresa, a certifikat kojemu je administrator promijenio ime tiho premješta uređaj. Provjeravajte pripadnost podmreži, upotrebljivi raspon hostova, rezervirane adrese i jedinstvenost pri svakom pozivu i držite mapiranje u tablici koju čovjek može pročitati.

Tko kontrolira ime, kontrolira i adresu, zato odlučite što common_name u ovoj implementaciji doista predstavlja. Uz uključen username-as-common-name, identitet je prijava, a ne subjekt certifikata. Nikada ne prosljeđujte tu vrijednost u evaluaciju ljuske i nikada ne dopustite da klijent utječe na stazu datoteke.

Alokator podržan registrom mora preživjeti istodobnost. Rezervirajte adresu atomski, obradite neuspjeli zapis bez puštanja napola konfiguriranog klijenta i označite svaku alokaciju vezom koja ju posjeduje, da kasno odspajanje starije sesije ne može osloboditi adresu koju novija već drži. Nekoliko serverskih instanci koje dijele jedan skup čini taj zahtjev oštrijim, a ne izbornim.

Topologija odlučuje što ifconfig-push znači

Uz topology subnet na 10.77.0.0/24, ifconfig-push 10.77.0.20 255.255.255.0 je adresa plus njezina mrežna maska. Pod topology net30 drugi argument nije nikakva maska nego adresa para, pa kopiranje podmrežnog oblika na net30 server daje klijenta koji se povezuje i ne može propuštati promet. Mijenjajte topologiju namjerno, nikada da bi primjer izgledao dosljedno. Server koji već radi na net30 ima žive klijente na starom adresiranju, pa je prebacivanje migracija s prozorom za održavanje, a ne izmjena jednog retka.

Statične adrese moraju stajati izvan dinamičkog skupa i izvan svake druge statične dodjele, uključujući one koje dodjeljuju obične datoteke client-config-dir. Ako dva mehanizma mogu proizvesti istu adresu za različite klijente, jedan će od njih to na kraju i učiniti.

Testirajte četiri slučaja prije nego što joj povjerujete

Pokrenite iste provjere na mapirani identitet, nemapirani, ponovno povezivanje i simulirani kvar registra. openvpn --config client.ovpn --verb 4 pokazuje dodijeljenu adresu u push odgovoru, a na serveru grep -A2 PUSH_REPLY /var/log/openvpn/openvpn.log potvrđuje što je doista poslano. Za nemapirani identitet očekivani je rezultat odbijena veza, a ne adresa iz skupa.

Zatim pregledajte direktorij u koji demon zapisuje te privremene datoteke. Skripta se izvršava u sniženom kontekstu usluge, pa staza u koju root može pisati ali demon ne može svaku vezu pretvara u odbijanje s pogreškom dopuštenja zakopanom nekoliko redaka niže u zapisu.

Alokacija nije autorizacija: prikvačena adresa još uvijek ne daje pristup svakom odredištu iza servera. Držite politiku usmjeravanja i vatrozida u vlastitom sloju i provjerite je prema adresi koju ste upravo fiksirali.

Povezani članci