Дадайце правіла палітыкі праз 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

Мэтавы вынік — тая ж палітыка з уладальнікам, створаная зноў, і састарэлы стан, адпраўлены на спачын, што трывала больш, чым паўторнае даданне правіла абалонкі пасля кожнага перападключэння. Трымайце адзін радок у запісе змяненняў, які называе файл, што ўладае правілам, і версію, якая яго падтрымлівае. Тады наступны інжынер знойдзе палітыку, не шукаючы ў гісторыі абалонкі. Правіла, якім ніхто не ўладае, — гэта правіла, якое зноў будзе страчана.

Падобныя артыкулы