Vračanje naslova iz skripta client-connect je videti, kot da bi moralo nastaviti IP odjemalca. Pa ga ne: edini kanal kavlja do strežnika je začasna datoteka, katere pot pride kot zadnji argument skripta, naslov pa je treba tja zapisati v sintaksi ifconfig-push. Skript, ki naslov natisne ali konča z ničlo, ne da bi karkoli zapisal, ustvari povezanega odjemalca z naslovom iz bazena, strežniški dnevnik pa je videti popolnoma zdrav.

Zmeda je razumljiva, ker se več drugih kavljev res odziva prek izhodnih kod ali okoljskih spremenljivk. Ta ima svojo pogodbo, pogodba pa se začne z imenom datoteke.

Kavelj zapiše datoteko, ne vračilne vrednosti

Deklaracija sta dve vrstici: script-security 2, da dovoli klic, nato client-connect /etc/openvpn/server/assign-address.sh. Ko se odjemalec overi, strežnik zažene ta skript z ustvarjeno potjo do datoteke, dodano kot zadnji argument, ki je $1 le, če deklaracija ne posreduje svojih dodatnih argumentov. Vse, kar se uporabi za tega odjemalca, gre v to datoteko kot običajne direktive, ena na vrstico, natanko tako, kot bi bile videti v konfiguraciji. Ovoj, ki dodaja svoje parametre, premakne položaj, klasični simptom pa je skript, ki piše v pot, ki je videti kot --verbose.

Izhodni status je druga polovica pogodbe. Ničla pomeni sprejmi in preberi datoteko; vse drugo zavrne povezavo, in tako je nepreslikana identiteta zavrnjena, namesto da bi se tiho vrnila v bazen. Zapišite celotno direktivo, preden vrnete uspeh, da napol zapisana datoteka nikoli ne postane konfiguracija odjemalca.

Dve direktivi si zaslužita pozornost, ker delujeta na vse ostalo. ifconfig-push določi naslov, medtem ko poslani route odjemalcu pove, kaj je dosegljivo skozi tunel; vrnite prvo in pozabite drugo, pa dobite odjemalca z naslovom in brez cilja. Vrstni red v datoteki ni pomemben, popolnost pa je. Kavelj, ki pošlje pot za predpono, do katere ne more priti noben partner, je ista napaka, videna z drugega konca.

Vhodi prihajajo prek okoljskih spremenljivk: common_name, trusted_ip, ifconfig_pool_remote_ip in ostale. Z vsemi ravnajte kot z nizi od zunaj strežnika, nikoli kot z deli lupine.

Preslikava naslovov je politika, ne aritmetika

Vabljiva bližnjica je razčleniti ime potrdila in njegove števke uporabiti kot zadnji oktet. To ni dodeljevalnik in spodleti na običajne načine: dve imeni z isto končnico trčita, ime, ki se konča s 300, ni naslov, potrdilo, ki ga skrbnik preimenuje, pa tiho premakne napravo. Pri vsakem klicu preverite pripadnost podmreži, uporabno območje gostiteljev, rezervirane naslove in edinstvenost, preslikavo pa hranite v tabeli, ki jo človek lahko prebere.

Kdor nadzoruje ime, nadzoruje naslov, zato se odločite, kaj common_name v tej namestitvi v resnici predstavlja. Ob omogočenem username-as-common-name je identiteta prijava in ne subjekt potrdila. Nikoli ne posredujte te vrednosti v vrednotenje lupine in nikoli ne dovolite, da bi odjemalec vplival na pot datoteke.

Dodeljevalnik, ki temelji na registru, mora prenesti sočasnost. Naslov rezervirajte atomsko, obravnavajte neuspešen zapis, ne da bi sprejeli napol konfiguriranega odjemalca, in vsako dodelitev označite s povezavo, ki ji pripada, da pozna prekinitev starejše seje ne more sprostiti naslova, ki ga novejša že drži. Več primerkov strežnika, ki si delijo en bazen, to zahtevo naredi ostrejšo, ne izbirno.

Topologija odloči, kaj pomeni ifconfig-push

S topology subnet na 10.77.0.0/24 je ifconfig-push 10.77.0.20 255.255.255.0 naslov plus njegova omrežna maska. Pod topology net30 drugi argument sploh ni maska, ampak naslov partnerja, zato kopiranje podmrežne oblike na strežnik net30 da odjemalca, ki se poveže in ne more prepuščati prometa. Topologijo spreminjajte namerno, nikoli zato, da bi bil primer videti skladen. Strežnik, ki že teče na net30, ima žive odjemalce na stari naslovitvi, zato je preklop selitev z vzdrževalnim oknom, ne urejanje ene vrstice.

Statični naslovi morajo biti zunaj dinamičnega bazena in zunaj vsake druge statične dodelitve, vključno s tistimi, ki jih razdelijo običajne datoteke client-config-dir. Če lahko dva mehanizma ustvarita isti naslov za različne odjemalce, bo eden od njiju to prej ali slej storil.

Preden mu zaupate, preizkusite štiri primere

Zaženite iste preverbe na preslikanem, nepreslikanem, ponovni povezavi in simulirani okvari registra. openvpn --config client.ovpn --verb 4 pokaže dodeljeni naslov v odgovoru push, na strežniku pa grep -A2 PUSH_REPLY /var/log/openvpn/openvpn.log potrdi, kaj je bilo v resnici poslano. Pri nepreslikani identiteti je pričakovani izid zavrnjena povezava, ne naslov iz bazena.

Nato preglejte imenik, v katerega demon zapisuje te začasne datoteke. Skript se izvaja v znižanem kontekstu storitve, zato pot, v katero lahko piše root, demon pa ne, spremeni vsako povezavo v zavrnitev z napako dovoljenj, zakopano nekaj vrstic niže v dnevniku.

Dodelitev ni avtorizacija: pribit naslov še vedno ne daje dostopa do vsakega cilja za strežnikom. Politiko usmerjanja in požarnega zidu držite v svojem sloju in jo preverite glede na naslov, ki ste ga pravkar določili.

Sorodni članki