این مطلب برای زمانی است که Network Automation فقط یک اسم روی فاکتور یا یک گزینه داخل دیتاسنتر نیست؛ قرار است در یک شبکه واقعی کار کند، تغییر بگیرد، لاگ بدهد، و وقتی مشکلی پیش آمد مسیر عیبیابی آن روشن باشد. موضوع اصلی این نوشته ساخت workflow مبتنی بر Git برای تغییرات شبکه و فایروال است؛ یعنی همان بخشی که اگر از اول درست طراحی نشود، بعداً خودش را به شکل قطعی، خطای مبهم، یا تغییرات پرریسک نشان میدهد.
در کار عملی منطق مهمتر از حفظ کردن چند دستور است. باید بدانیم در شبکهای که تغییرات config بین چند ادمین، چند شعبه و چند محصول پخش است چه چیزی ورودی تصمیم است، چه چیزی خروجی تصمیم است، و کدام نشانهها میگویند مشکل از policy، route، certificate، session، health check یا وابستگی بیرونی آمده است. برای همین این متن را مثل یک چکلیست اجرایی نوشتهام، نه توضیح تبلیغاتی محصول.
برای دیدن مطالب مرتبطتر، صفحه Network Automation هم میتواند مسیر خوبی برای ادامه مطالعه باشد.
سناریوی واقعی مسئله
سناریوی معمول این است که تیم شبکه یک تغییر ظاهراً ساده میدهد: یک policy اضافه میشود، یک interface جابهجا میشود، یک سرویس پشت load balancer قرار میگیرد، یا یک مسیر مانیتورینگ/احراز هویت فعال میشود. در همان لحظه شاید همه چیز سالم به نظر برسد، اما چند ساعت بعد کاربر میگوید بخشی از سرویس کند شده یا بعضی connectionها fail میشوند. اینجا اگر فقط به آخرین تغییر نگاه کنیم، احتمالاً علت اصلی را از دست میدهیم.
در ساخت workflow مبتنی بر Git برای تغییرات شبکه و فایروال باید مسیر داده را مرحله به مرحله دید. اول باید معلوم شود packet یا request از کجا وارد میشود، با چه identity یا contextی شناخته میشود، کدام rule روی آن match میشود، بعد از تصمیم امنیتی به کجا میرود، و در نهایت سمت مقصد چه پاسخی میدهد. این نگاه ساده است، اما جلوی بیشتر عیبیابیهای پراکنده و حدسی را میگیرد.
نشانه مهم در این سناریو معمولاً نامعلوم بودن تغییر آخر، برگشت سخت config یا اختلاف بین مستندات و واقعیت device است. این نشانه بهتنهایی حکم قطعی نمیدهد، ولی جهت بررسی را مشخص میکند. اگر نشانه را درست بخوانیم، لازم نیست دهها گزینه را همزمان تغییر بدهیم. تغییر همزمان چند چیز، بدترین دشمن عیبیابی در شبکه production است.
قبل از تغییر چه چیزهایی باید ثبت شود؟
قبل از هر اصلاح، snapshot عملیاتی لازم است. منظور فقط backup گرفتن از config نیست. باید بدانیم وضعیت sessionها، hit countها، logها، route table، objectها، certificateها و وضعیت health check در همان لحظه چه بوده است. اگر بعداً تغییر جواب نداد، بدون این snapshot نمیشود دقیق برگشت یا فهمید مشکل از کجا شروع شده.
- ساختار repo بر اساس site و device
- حذف secretها از config
- قانون review برای تغییرات حساس
- ارتباط commit با ticket یا change record
این موارد شاید بدیهی به نظر برسند، اما در عمل خیلی از downtimeها از همین جا شروع میشود: تغییر انجام شده، اما وضعیت قبل از تغییر ثبت نشده است. وقتی وضعیت قبلی نداریم، rollback هم فقط یک حدس خوشبینانه است.
روش عیبیابی مرحلهای
برای Network Automation بهتر است عیبیابی را از سادهترین لایه شروع کنیم. اول دسترسی پایه و مسیر را ببینیم، بعد سراغ policy و inspection برویم، بعد وابستگیهای پیشرفتهتر مثل profile، identity، certificate یا automation را بررسی کنیم. اگر از همان ابتدا سراغ گزینههای پیچیده برویم، احتمالاً یک مشکل ساده routing یا object اشتباه را نمیبینیم.
من در این نوع کار معمولاً سه سؤال ثابت میپرسم: آیا ترافیک به نقطه تصمیم میرسد؟ آیا rule درست match میشود؟ آیا بعد از تصمیم، مسیر برگشت و state درست است؟ همین سه سؤال برای بیشتر تجهیزات امنیتی و شبکهای جواب میدهد، حتی اگر اسم featureها فرق کند.
git diff
git commit -m "firewall: restrict vpn admin source"
git log --oneline -- device/site/config.conf
دستورها و خروجیها باید در همان change record نگهداری شوند. اگر بعداً یک نفر دیگر بخواهد ادامه کار را بگیرد، نباید مجبور شود از صفر بفهمد چه چیزهایی بررسی شده است.
خطاهای رایج
- ذخیره password و key در repo
- commitهای بیمعنی مثل update config
- نداشتن branch برای change
- ندیدن تفاوت intended config و running config
نقطه مشترک این خطاها عجله است. وقتی یک سرویس قطع است، فشار برای حل سریع طبیعی است، اما حل سریع با تغییر بیحساب فرق دارد. تغییر کوچک، قابل اندازهگیری و قابل برگشت معمولاً از تغییر بزرگ و مبهم بهتر جواب میدهد.
طراحی درست برای محیط production
در محیط production، اینکه چه چیزی وارد repo شود، چه چیزی secret محسوب شود و چه کسی merge را تأیید کند باید از قبل مشخص باشد. یعنی تیم بداند اگر تست اول fail شد چه کاری میکند، اگر فقط بخشی از کاربران مشکل داشتند چه چیزی را جدا میکند، و اگر rollback لازم شد دقیقاً کدام object یا policy برمیگردد. طراحی خوب فقط دیاگرام نیست؛ طراحی خوب یعنی تصمیمهای روز حادثه از قبل آماده باشند.
برای ساخت workflow مبتنی بر Git برای تغییرات شبکه و فایروال بهتر است naming هم جدی گرفته شود. اسم object، rule، profile و monitor باید طوری باشد که شش ماه بعد هم قابل فهم باشد. اسمهای کوتاه و مبهم شاید زمان ایجاد سریعتر باشند، اما هزینه عیبیابی را بالا میبرند. وقتی policy زیاد میشود، naming ضعیف خودش به یک ریسک امنیتی تبدیل میشود.
موضوع دیگر logging است. لاگ زیاد بدون معنا کمک نمیکند؛ لاگ کم هم تیم را کور میکند. باید مشخص باشد برای چه decisionهایی log لازم داریم، کدام logها فقط noise تولید میکنند، و کدام رویدادها باید به مانیتورینگ یا SIEM بروند. در Network Automation این تنظیم اگر درست انجام شود، هم troubleshooting را سریعتر میکند و هم ردپای تغییرات را نگه میدارد.
چکلیست اجرا
- configها را بدون secret export کن
- برای هر تغییر branch جدا بساز
- diff را قبل از merge بخوان
- commit را به ticket وصل کن
- بعد از اجرا running config را دوباره با intended مقایسه کن
این چکلیست جای تجربه را نمیگیرد، ولی جلوی بینظمی را میگیرد. تجربه زمانی ارزش دارد که به روش تبدیل شود؛ وگرنه هر بار باید همان اشتباهها را دوباره کشف کنیم.
تحویل کار به تیم بعدی
Git برای شبکه فقط ابزار برنامهنویسها نیست. وقتی config تاریخچه داشته باشد، عیبیابی تغییرات سریعتر و مسئولیتپذیری تیمی روشنتر میشود.
در نهایت، معیار موفقیت فقط این نیست که سرویس الان بالا آمده باشد. معیار بهتر این است که اگر همین مشکل دوباره رخ داد، تیم بتواند با داده، لاگ و مسیر تصمیم روشن جلو برود. این همان تفاوت بین خاموش کردن آتش و ساختن یک عملیات قابل اتکا است.
اگر این موضوع در شبکه شما درگیر چند محصول یا چند تیم است، بهتر است قبل از تغییر نهایی یک جدول مسئولیت هم داشته باشید: مالک policy، مالک route، مالک application، مالک certificate، و کسی که decision نهایی rollback را میگیرد. نبودن همین مالکیتها معمولاً زمان حل مشکل را چند برابر میکند.