تا حالا شده یه رفتار مشکوکی توی شبکه بینید و یا یه چیزی رو بخواید دیباگ کنید برید سراغ لاگ های روتر تون؟ فرض کنید وسط خوندن لاگ ها هستید که یه دفعه … تغ … برقا میره و همه لاگ هاتون پاک میشه.

این رفتار به صورت پیشفرض توی تمام روتر های OpenWrt وجود داره که بهش میگن circular buffer به صورتی که یه دیمنی (daemon) وجود داره به اسم logd و میره این لاگ ها رو میگیره و میریزه توی بافری توی مموری و به صورت چرخشی هم هی اونو overwrite میکنه، که البته بسیار هم هوشمندانه است ولی دوتا مشکل بزرگ داره:

۱. تمام لاگ های شما بعد از هر بار ری‌استارت کامل پاک میشه.

۲. تازه اگه ری‌استارت هم نکنید لاگ هاتون بعد از چند ساعت (یا در بدترین حالت چند دقیقه، اگه نگیم ثانیه) رونویسی میشن توسط لاگ های جدید.

خب این یه مشکل بزرگیه، روتر شما دروازه کل شبکه شماست و لاگ هم تقریبا تنها وسیله‌ای هست که شما رو از اتفاق های شبکه و ورود و خروج های این دروازه مطلع میکنه، و ماندگاریش بسیار مهمه هم برای auditability کلی و هم برای مسائل امنیتی.

“چرا”؟

قبل اینکه بریم سراغ چطور، بیاید ببینیم چرا واقعا ما اینقدر میگیم که این موضوع مهمیه؟ از سه تا بُعد بخوایم به داستان نگاه کنیم این شکلی میشه:

  • عیب‌یابی: میتونید برید ببینید چرا مثلا دوساعت پیش یهو وای فای شما قطع شده، یا چرا دیروز این همه اختلال توی شبکه وجود داشته و کلی چیزای دیگه، بدون ذخیره کردن این لاگ ها شما فقط میتونیم اتفاق هایی که همین الان دارن میفتن رو دیباگ کنید و هیچ دسترسی به گذشته ندارید.

  • امنیت: میتونید ببینید که دقیقا کی داره سعی میکنه به شبکه شما نفوذ کنه یا اسکن کنه شبکه شما رو، یا مثلا یه دیوایسی داخل شبکه شماست و میتونید برید کل هیستوری اتصالش به شبکه رو ببینید و مانیتور کنید.

  • کارایی: میتونید مثلا پینگ شبکه رو در طول زمان رصد کنید، یا ببینید کدوم دستگاه ها دارند بیشترین ترافیک رو مصرف میکنن و …

“چطور”؟

ببینید هیچ راه مطلقی وجود نداره که بگیم این دیگه بهترین راه ممکنه، هر راه حل یه سری trade-off هایی داره شما باید با توجه به نیازمندی خودتون یکی رو انتخاب کنید، یکی ممکنه استفاده ازش راحت باشه یکی ممکنه پرایوسی بهتری رو فراهم کنه.

اینجا ما راه حل های معمول و رایج رو به علاوه مزایا و معایب هر کدوم رو یه دور با هم برسی میکنیم:

راه‌حل اول) ذخیره روی حافظه‌ی خارجی (مثل فلش مموری USB)

یکی از ابتدایی ترین راه حل هایی که وجود داره اینه که یه فلشی چیزی وصل کنیم به روتر و تنظیم کنیم روتر رو که لاگ هاش رو بریزه توی این فلش و عملی هم هست.

  • مزایا: ساده است، دیتا از روتر خارج نمیشه و به صورت آفلاین دست خودتونه در نتیجه پرایوسی بالایی هم داره.
  • معایب: همه روتر ها پورت USB ندارن و وصل کردن استوریج خارجی هم بهشون دشواره معمولا، دسترسی به لاگ های داخل این استوریج خارجی هم چندان راحت نیست.

شاید الان بگید “خب چه کاریه آخه؟ چرا لاگ هارو توی همین حافظه داخلی خوده روتر نریزیم؟”

سوال خوبیه، حافظه‌ی داخلی روتر معمولا write cycle های بسیار محدودی داره و نوشتن مداوم لاگ ها که توی دقیقه شاید ده ها بار اتفاق میوفته سریع ترین راه برای خراب کردن مودم شماست، چون باعث میشه این حافظه فرسوده بشه و در نهایت به اصطلاح روتر شما brick بشه، دقیقا همون دلیلی که بالاتر گفتیم logd لاگ ها رو میریزه توی مموری.

راه‌حل دوم) سرور syslog لوکال

یه راه حل دیگه ای که وجود داره اینه که یه سرور syslog توی شبکه روی یه دیوایسی (مثلا یه برد زربری پای، یا یه pc دیگه) بیارید بالا و روترتون رو کانفیگ کنید که لاگ هاش رو بفرسته روی این سرور.

  • مزایا: بهترین گزینه برای یه سیستم لاگینگ متمرکز و یکپارچه است که میتونید لاگ های باقی دیوایس هاتون رو هم بفرستید اینجا و در عین حال دیتا هم دست خودتونه و پرایوسی بالایی داره.
  • معایب: پیچیدگی بالایی داره و نگه‌داری ازش هم همچین ساده نیست، شما باید 24 ساعته حواستون باشه که یوقت این سرور syslog نترکه.

راه‌حل سوم) سرویس های ابری (کلاد)

این گزینه راحت ترین گزینه ممکنه برای کاربرای معمولیه، اینطوریه که شما لاگ هاتون رو میفرستید به یه سرویس ابری و این سرویس ابری برای شما این لاگ های ذخیره میکنه و روش کلی بهتون فیچر میده، مثلا این لاگ هارو ایندکس میکنه برای شما و میتونید روی این لاگ ها کویری های مختلف بزنید یا آنالیز میکنه و یه سری دیتا از لاگ هاتون میده، همه کلاد پروایدر ها معمولا این سرویس رو دارن، مثلا CloudWatch آمازون یا Cloud Logging گوگل و البته CloudLogs آروان‌کلاد که در حال حاضر تنها گزینه قابل استفاده برای ما ایرانی هاست.

  • مزایا: استفاده و ستاپ نسبتا ساده ای داره، طوری که یه بار تنظیم میکنید دیگه برای همیشه میمونه، از هرجایی بهش دسترسی دارید و میتونیم برید داخل داشبورد پروایدر و لاگ هاتون رو ببینید، اکثر این سرویس ها free tier های خوبی دارن و هزینه استفاده ازش هم تقریبا رایگان میشه.
  • معایب: دیتای شما از شبکه تون خارج میشه و وارد یه سرویس شخص ثالث میشه، همچنین اکثر این سرویس ها سعی میکنن وندور لاک ایجاد کنن و جا به جایی به یه سرویس دیگه رو برای شما سخت بکنن.

توی این پست ما راه‌حل سوم رو با هم جلو میبریم چون هم راحت‌تره و هم هزینه نگه‌داری نداره و هم میتونید توی روتر خونتون ستاپش کنید و هم میتونید توی scale های بالاتر تو محیط های اینترپرایز مثل شرکت یا محل کار هم داشته باشیدش و بالانس ترین راه حل ممکنه.

اینجا ما از CloudLogs آروان‌کلاد استفاده خواهیم کرد برای پروایدر سرویس لاگ. (مدیونید اگه فکر کنید چون خودم توی آروان کار میکنم دارم اینو میگم 😅، اما حالا دلیل واقعیش اینه که خوب بالاتر هم گفتیم، تنها سرویسی هستش که در حال حاضر برای ما ایرانی ها قابل استفاده است. )

چالش اصلی این کلاد پروایدر ها اینه که هرکدوم wire protocol خودشون رو دارن و نمیشه از یه پروتوکل جنرال مثل syslog استفاده کرد برای ارسال لاگ بهشون، من سعی کردم syslog-ng رو کانفیگ کنم که با یه تریک یا هکی بتونه لاگ هارو بفرسته سمت این سرویس ها و درنهایت هم نشد، syslog-ng یکی از آلترنیتیو های logd هستش، که به شدت هم پیچیده و سنگینه.

از این رو من یه پکیج ساده نوشتم برای OpenWrt که بره به شکل ساده و بهینه ای این لاگ ها رو فوروارد کنه به CloudLogs که در ادامه میریم این پکیج رو با هم نصب و کانفیگ میکنیم:

نصب و راه اندازی CloudLogs

۱. توی گام اول نیازه که ریپازیتوری پکیج رو رجیستر کنیم داخل opkg که بتونه پکیج رو پیدا کنه:

(با توجه به اینکه هنوز پکیج به ریپازیتوری اصلی اضافه نشده این گام به صورت موقت نیازه، در صورت اضافه شدن این پست آپدیت میشه، پروسه اش رو میتونید از اینجا پیگیری کنید.)

wget -O mohammadv184-public.key https://openwrt.mohammad-abbasi.me/public.key
opkg-key add mohammadv184-public.key

echo "src/gz mohammadv184_packages https://openwrt.mohammad-abbasi.me/packages/$(. /etc/openwrt_release ; echo $DISTRIB_ARCH)" >> /etc/opkg/customfeeds.conf

۲. توی گام دوم نیازه که ایندکس opkg رو آپدیت کنیم و در نهایت پکیج رو نصب کنیم:

opkg update
opkg install arvancloud-cloudlogs

۳. بعد از نصب نیازه که پکیج رو کانفیگ کنید و API Key که از داشبورد آروان گرفتید رو وارد کنید:

(برای نحوه دریافت API Key میتونید به این داکیومنت مراجعه کنید)

uci set arvancloud-cloudlogs.main.api_key='YOUR_API_KEY_HERE' 
uci set arvancloud-cloudlogs.main.enabled='1' 
uci commit arvancloud-cloudlogs

۴. در نهایت هم نیازه که سرویس رو یه دور restart کنیم که فعال بشه:

service arvancloud-cloudlogs restart

و همین، بعد از چند دقیقه میتونید برید داخل پنل آروان و از بخش لاگ ابری وارد داشبورد کلاد لاگز (اینجا) بشید و لاگ ها تون رو ببینید و سرچ کنید، به همین راحتی.

مؤخره

لاگ ها اهمیت خیلی بالایی دارن و بعضا میتونن حیاتی باشن برای ما، در نتیجه خوبه که اجازه ندیم خیلی راحت پاک بشن، همونطور که بالاتر دیدیم آپشن ها و راه‌حل های متنوعی هم داریم برای این موضوع از USB بگیر تا سرویس های ابری، در نهایت هم مهم نیست که کدوم روش رو انتخاب میکنید، مهم حفظ و ذخیره سازی این لاگ هاست که به شما امکان درک رفتار ها، عیب یابی یا حتی امن سازی شبکه تون رو میده.