Pri podizanju, soket jedinica koja veže fiksnu VPN adresu može pasti prije nego što joj tunel dodijeli adresu, a usluga iza nje nikad se ne pokrene. Dva prekidača izgledaju kao rješenja i rješavaju različite polovine tog problema. FreeBind dozvoljava systemd-u da stvori slušaoca dok adresa još nedostaje. After= samo poreda poslove, pa mijenja kada stvari kreću, ali ne čini da adresa stigne ranije.

Dva različita problema, dva različita prekidača

Prvi problem je neuspjeh vezivanja: kernel odbija slušanje na adresi koju host ne posjeduje, pa soket jedinica odmah pada i usluga se nikad ne aktivira. Drugi problem je neuspjeh spremnosti: adresa na kraju postoji, ali nešto je pokušava koristiti prije nego tunel prenosi saobraćaj. FreeBind rješava prvi i ne čini ništa za drugi. Direktive redoslijeda ne rješavaju nijedan direktno, jer one samo odlučuju šta kreće kojim redom. Imenovati neuspjeh koji zaista imate jeste cijela odluka.

Potvrdite koji od dva imate iz žurnala, a ne iz opisa usluge. Neuspjeh vezivanja imenuje adresu i javlja da joj se ne može dodijeliti. Neuspjeh spremnosti obično se pojavljuje kasnije, kao istek vremena ili odbijena veza viđena s druge strane, uz potpuno zdravu soket jedinicu u zapisima.

FreeBind: slušalac postoji prije adrese

FreeBind govori kernelu da dozvoli vezivanje na nelokalnu adresu, pa systemd može stvoriti slušni soket pri podizanju i predati ga aplikaciji kad god se aplikacija pokrene. To je smisao aktivacije soketa i razlog zašto soket može nadživjeti uslugu iza sebe.

[Socket]
ListenStream=
ListenStream=10.8.0.1:8443
FreeBind=yes

Prazna dodjela briše unose slušanja naslijeđene iz jedinice dobavljača prije nego se doda novi, što sprječava zaostalog wildcard slušaoca da odgovara na svakom interfejsu. Zamijenite adresu i port svojima i provjerite efektivnu jedinicu, a ne samo drop-in datoteku. Koristite drop-in pod imenom jedinice umjesto uređivanja datoteke paketa na mjestu, jer će sljedeće ažuriranje paketa prepisati izmjenu i neće ostaviti nikakav trag namjere. Zatim ga primijenite kroz postupak ponovnog učitavanja i restarta koji soket jedinica očekuje.

Referenca za systemd sokete dokumentuje ponašanje IPv4 i IPv6 iza te opcije, a važan detalj je da se odnosi na vezivanje, a ne na rutiranje. Ništa u njoj ne dodjeljuje adresu niti pokreće VPN. FreeBind je dozvola data slušaocu, a ne zamjena za interfejs.

After= i Wants=: redoslijed nije spremnost

Redoslijed i zahtjev su odvojene ose, a njihovo miješanje stvara jedinice koje kreću pravim redom i ipak padaju. After=vpn-client.service znači samo da, ako se oba posla pokrenu, ovaj čeka da se drugi pokrene. Ne uvlači VPN i ne čeka da VPN završi povezivanje.

Direktive zahtjeva kao što su Wants= i Requires= vode aktivaciju i razlikuju se po tome šta se dogodi kad zavisnost padne: jedna nastavlja, druga se zaustavlja. Nijedna ne zna šta znači povezan tunel. VPN proces može biti aktivan bez dodijeljene adrese, ili s dodijeljenom adresom i bez rute do partnera, i oba stanja zadovoljavaju zavisnost. Ako aplikaciji treba da adresa postoji, modelirajte taj uslov izričito umjesto da pokretanje procesa uzimate kao dokaz spremnosti.

Provjerite šta jedinica zaista deklariše pomoću systemctl cat i systemctl show -p After -p Wants -p Requires. Drop-in iz tri različita direktorija mogu dodati direktive koje nikad niste napisali, a systemd čita samo efektivnu jedinicu.

Šta network-online.target ne radi

Jedinica poredana nakon network-online.target čeka da mrežni menadžer proglasi mrežu upotrebljivom, što je tačka sinhronizacije pri podizanju, a ne trajni uslov. Ne govori ništa o tome je li određeni tunel podignut i neće se ponovo aktivirati kad se VPN ponovo poveže usred poslijepodneva. Tretirati ga kao monitor ponovnog povezivanja najčešće je pogrešno čitanje tog cilja.

Projekat systemd direktno dokumentuje tu razliku, a praktična posljedica je da sve što treba adresu tunela mora samo posjedovati zavisnost. Jedinica koja čeka network-online i zatim veže adresu tunela ispravna je samo kad se tunel slučajno prvi podigne, a to je slučajnost, a ne dizajn.

Testirajte životni ciklus koji ste zaista odabrali

Testirajte čisto podizanje, zahtjev nakon što se adresa pojavi i ponašanje nakon što VPN padne i vrati se. Ta tri slučaja razdvajaju ispravnog slušaoca od ispravne usluge.

systemd-analyze verify myapp.socket
systemctl cat myapp.socket
ss -ltn "sport = :8443"

Prva komanda hvata greške u datoteci jedinice prije restarta, druga prikazuje spojenu jedinicu, a treća dokazuje postoji li slušalac i na kojoj adresi. Slušalac na wildcard adresi tamo gdje ste očekivali adresu tunela upravo je zaostatak koji je prazan ListenStream trebao ukloniti. Ponovite treću komandu nakon ponovnog povezivanja VPN-a da vidite je li se adresa pomjerila.

Odaberite životni ciklus namjerno: ili slobodno vezan slušalac koji čeka povratak stabilne adrese, ili usluga koja se zaustavlja s tunelom i ponovo kreće pri oporavku. To su različiti dizajni i padaju na različite načine. Zatim držite politiku pristupa vezanom za izvore i putanje koje ste namjeravali, jer vezivanje odredišne adrese ne zahtijeva da su prihvaćeni paketi stigli kroz povjerljiv interfejs.

Povezani članci