При подизању, сокет јединица која везује фиксну VPN адресу може да не успе пре него што јој тунел додели адресу, и услуга иза ње никада не стартује. Два прекидача изгледају као поправке и решавају различите половине тог проблема. FreeBind омогућава systemd-у да створи слушаоца док адреса још недостаје. After= само поређа послове, па мења када ствари почињу, али не чини да адреса стигне раније.

Два различита проблема, два различита прекидача

Први проблем је неуспех при везивању: језгро одбија слушање на адреси коју домаћин не поседује, па сокет јединица одмах не успе и услуга се никада не активира. Други проблем је неуспех спремности: адреса на крају постоји, али нешто покушава да је користи пре него што тунел пренесе саобраћај. FreeBind решава први и не чини ништа за други. Директиве редоследа не решавају ниједан директно, јер оне само одлучују шта којим редом почиње. Именовање неуспеха који заиста имате је читава одлука.

Потврдите који од два имате из дневника, а не из описа услуге. Неуспех при везивању именује адресу и извештава да се не може доделити. Неуспех спремности се обично појављује касније, као истек времена или одбијена веза виђена са друге стране, док у логовима стоји потпуно здрава сокет јединица.

FreeBind: слушалац постоји пре адресе

FreeBind каже језгру да дозволи везивање на нелокалну адресу, па systemd може да створи слушајући сокет при подизању и да га преда апликацији кад год се апликација покрене. То је смисао активирања преко сокета и разлог зашто сокет може да надживи услугу иза себе.

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

Празна додела брише уносе слушања наслеђене од јединице добављача пре него што се дода нови, што спречава преосталог wildcard слушаоца да одговара на сваком интерфејсу. Замените адресу и порт својима и проверите ефективну јединицу, а не само drop-in датотеку. Користите drop-in под именом јединице уместо да уређујете датотеку пакета на месту, јер ће следеће ажурирање пакета преписати измену и неће оставити никакав траг намере. Затим га примените кроз поступак поновног учитавања и рестарта који сокет јединица очекује.

Референца за systemd сокете документује понашање IPv4 и IPv6 иза ове опције, а важан детаљ је да се односи на везивање, а не на рутирање. Ништа у њој не додељује адресу и не покреће VPN. FreeBind је дозвола дата слушаоцу, а не замена за интерфејс.

After= и Wants=: редослед није спремност

Редослед и захтев су одвојене осе, а њихово мешање ствара јединице које почињу правим редом и ипак не успевају. After=vpn-client.service значи само да, ако се оба посла покрену, овај чека да се други покрене. Не увлачи VPN и не чека да VPN заврши повезивање.

Директиве захтева као што су Wants= и Requires= воде активацију и разликују се по томе шта се дешава кад зависност не успе: једна наставља, друга се зауставља. Ниједна не зна шта значи повезан тунел. VPN процес може бити активан без додељене адресе, или са додељеном адресом и без руте до партнера, и оба стања задовољавају зависност. Ако је апликацији потребно да адреса постоји, моделирајте тај услов изричито уместо да покретање процеса узимате као доказ спремности.

Проверите шта јединица заиста декларише помоћу systemctl cat и systemctl show -p After -p Wants -p Requires. Drop-in из три различита директоријума могу додати директиве које никада нисте написали, а systemd чита само ефективну јединицу.

Шта network-online.target не ради

Јединица поређана након network-online.target чека да менаџер мреже прогласи мрежу употребљивом, што је тачка синхронизације при подизању, а не трајан услов. Не говори ништа о томе да ли је одређени тунел подигнут и неће се поново активирати када се VPN поново повеже усред поподнева. Третирати га као монитор поновног повезивања најчешће је погрешно читање тог циља.

Пројекат systemd директно документује ту разлику, а практична последица је да све што треба адресу тунела мора само да поседује зависност. Јединица која чека network-online и затим везује адресу тунела исправна је само када се тунел случајно први подигне, а то је случајност, а не дизајн.

Тестирајте животни циклус који сте заиста изабрали

Тестирајте чисто подизање, захтев након што се адреса појави и понашање након што VPN падне и врати се. Та три случаја одвајају слушаоца који ради од услуге која ради.

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

Прва команда хвата грешке у датотеци јединице пре рестарта, друга приказује спојену јединицу, а трећа доказује да ли слушалац постоји и на којој адреси. Слушалац на wildcard адреси тамо где сте очекивали адресу тунела је тачно остатак који је празан ListenStream требало да уклони. Поновите трећу команду након поновног повезивања VPN-а да видите да ли се адреса померила.

Изаберите животни циклус намерно: или слободно везан слушалац који чека повратак стабилне адресе, или услуга која се зауставља са тунелом и поново покреће при опоравку. То су различити дизајни и они не успевају на различите начине. Затим држите политику приступа везаном за изворе и путање које сте намеравали, јер везивање одредишне адресе не захтева да су прихваћени пакети стигли кроз поверљив интерфејс.

Повезани чланци