Сачувајте правило ip rule после поновног повезивања са systemd-networkd
Правило ip додато из љуске нестаје при следећем догађају везе. Декларишите правило, његову табелу и руте у systemd-networkd да би се политика поново створила.
Додајте правило политике помоћу ip rule и оно ради док веза не нестане; у том тренутку га једноставно нема. Ништа није гласно пропало: стање кернела се променило, а ниједан власник конфигурације није знао да правило треба да постоји. То је цела разлика између правила које преживи и онога које не. На домаћину са systemd-networkd решење је дати правилу власника, а не понављати команду после сваког повезивања.
Правило постоји само ако га неко поседује
Политика усмеравања кернела је стање, а не конфигурација. Живи у систему који ради, и све што разори интерфејс од ког зависи може га однети са собом. Команда у љусци мења то стање и не оставља никакав запис о намери.
Мрежни менаџери раде обрнуто: читају конфигурацију, примењују је и примењују је поново када догађај на вези поништи претходно стање. Правило декларисано у њиховој конфигурацији се поново ствара, док је правило додато поред њих страни објекат без власника.
Та разлика има име у networkd и вреди је прочитати пре него што било шта укључите. Страна правила се у новијим верзијама подразумевано уклањају, што изненађује оне који су очекивали да њихови ручни уноси остану.
Прочитајте верзију пре него што се поуздате у поставку
Понашање власништва контролише поставка у networkd.conf, а та поставка не постоји у старијим издањима systemd. Проверите инсталирану верзију пре него што правите дизајн око ње, јер се старији домаћин понаша другачије од документације коју читате.
Две вредности су важне. Једна одлучује да ли се уклањају правила која нису декларисана у networkd конфигурацији, а друга исто чини за руте. Обе се тичу власништва, а не садржаја политике, и обе подразумевано бирају строже понашање у актуелним издањима. Њихово глобално искључивање одржава живо свако страно правило, што је много шира одлука од декларисања једне жељене VPN политике.
systemctl --version | head -1
networkctl --version | head -1
grep -R "ManageForeign" /etc/systemd/ /usr/lib/systemd/ 2>/dev/null
Тај grep вам каже шта је постављено локално и шта је добављачев подразумевани. Одсуство је такође информација, јер значи да важи компајлирани подразумевани. Запишите га у белешке да следећа особа не мора поново да га открива.
Декларишите правило и табелу на коју упућује
Правило у .network датотеци именује табелу и то је све што име чини. Оно не ствара руте унутар те табеле и не проверава имају ли смисла. Декларисање правила без рута даје политику која упари саобраћај и затим га одбаци.
Декларишите руте у истој датотеци, са достижним следећим скоковима и исправном табелом. Задржите приоритет у декларисаном правилу да слети тамо где очекујете у уређеној листи. Правило које дође до погрешне табеле раније него што је предвиђено мења више саобраћаја од услуге коју сте хтели да поправите. Читајте фрагмент испод као облик, а не као потпуну датотеку, јер власништво над интерфејсом и остатак везе још морају бити присутни.
[RoutingPolicyRule]
Family=ipv4
IPProtocol=tcp
SourcePort=443
Table=100
Priority=1000
[Route]
Destination=10.80.0.0/24
Gateway=10.80.0.1
Table=100
Затим поново учитајте и очитајте стање кернела, а не датотеку. Конфигурација која се чисто парсирала ипак може дати правило које нисте намеравали, а два погледа се слажу само када је декларација била потпуна.
Изаберите једног власника за интерфејс
Два менаџера на једном тунелу стварају сукоб који изгледа као грешка у оба. Увоз постојећег wg-quick подешавања у networkd је миграција, а не додатак, и покретање оба оставља интерфејс и његова правила под два власника.
Обавите миграцију у једном потезу: зауставите стару јединицу, онемогућите је, декларишите интерфејс и његове руте у networkd, па поново учитајте. Проверите да стара јединица не може да се врати при подизању. Преостала јединица која се поново активира после рестарта преписује стање које сте управо декларисали. Чувајте стару конфигурациону датотеку док нова не преживи поновно повезивање, па је повуците из употребе.
Власништво над ознаком заслужује исту пажњу: ако правило одговара ознаци заштитног зида, нешто мора да постави ту ознаку. Правило које упућује на ознаку коју нико не поставља је мртва конфигурација која изгледа намерно.
Вежбајте догађаје животног циклуса
Конфигурација вреди онолико колико вреди њено понашање кроз догађаје. Спустите везу, подигните је, рестартујте услугу и обновите адресу. После сваког од њих прочитајте листу правила и садржај табеле.
sudo networkctl reload
ip rule show
ip route show table 100
sudo systemctl restart systemd-networkd
Намеравани резултат је иста политика са власником поново створена и застарело стање повучено, што је трајније од поновног додавања правила из љуске после сваког повезивања. Чувајте један ред у запису промена који именује датотеку која поседује правило и верзију која га подржава. Тада следећи инжењер може да нађе политику без претраживања историје љуске. Правило које нико не поседује је правило које ће поново бити изгубљено.