با systemd-networkd قاعده ip rule را پس از اتصال دوباره زنده نگه دارید
قاعدهای که از پوسته میسازید در رخداد بعدی پیوند ناپدید میشود. قاعده، جدول و مسیرهایش را در 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
نتیجه موردنظر بازآفرینی همان سیاست مالکیتدار و بازنشستگی وضعیت کهنه است و این پایدارتر از افزودن دوباره قاعده پوسته پس از هر اتصال است. یک خط در سجل تغییرات نگه دارید که پرونده مالک قاعده و نسخهای را که از آن پشتیبانی میکند نام ببرد. آنگاه مهندس بعدی میتواند سیاست را بدون جستوجو در تاریخ پوسته بیابد. قاعدهای که هیچکس مالک آن نیست قاعدهای است که دوباره گم میشود.