در بسیاری از تجهیزات شبکه، مثل روترهای میکروتیک، لاگها بعد از هر ریبوت پاک میشن و همین موضوع عیبیابی مشکلات شبکه رو سختتر میکنه. علاوه بر این، فضای محدود ذخیرهسازی و تجمیع نشدن لاگها معمولاً باعث میشه نتونیم یک تصویر کامل از رفتار شبکه داشته باشیم. برای حل این چالش معمولاً لاگها رو به یک مقصد متمرکز ارسال میکنیم تا هم پایدار ذخیره بشن و هم امکان تحلیل بهتری داشته باشیم.
تو این پست میخوایم ببینیم چطور میتونیم لاگهای میکروتیک رو از طریق Fluentd دریافت و در سرویس لاگ ابری آروانکلاد ذخیره کنیم. در اینجا از میکروتیک استفاده میکنیم، همین رویکرد برای روترهای سیسکو، OpenWrt و سایر تجهیزات شبکه هم قابل استفاده است.
┌───────────────┐ ┌───────────────┐ ┌───────────────┐ │ MikroTik │ │ Cisco │ │ OpenWrt │ │ Router │ │ Router │ │ Router │ └───────┬───────┘ └──────┬────────┘ └──────┬────────┘ │ │ │ └──────────── Syslog (UDP 5140) ────────────┘ │ ▼ ┌───────────┐ │ Fluentd │ └─────┬─────┘ │ HTTPS (secure) ▼ ┌────────────────────────────────────────────────────┐ │ ArvanCloud CloudLogs │ │ │ │ ┌─────────────────────┐ ┌─────────────────────┐ │ │ │ Network │ │ Network-Debug │ │ │ │ service=="network" │ │ service=="network" │ │ │ │ severity!="debug" │ │ severity=="debug" │ │ │ └──────────┬──────────┘ └──────────┬──────────┘ │ │ │ │ │ │ ▼ ▼ │ │ ┌────────────────┐ ┌────────────────┐ │ │ │ Network │ │ Debug │ │ │ │ Retention: 1mo │ │ Retention: 1D │ │ │ └────────────────┘ └────────────────┘ │ └────────────────────────────────────────────────────┘
برای اینکه بتونیم لاگهای میکروتیک رو دریافت و به سرویس کلودلاگز آروان ارسال کنیم، یک Fluentd به عنوان لاگ کالکتور راهاندازی میکنیم. Fluentd انتخاب خوبیه چون پلاگین رسمی آروانکلاد رو داره و با فرمتهای مختلف لاگ سازگاره. در این مثال از داکر استفاده کردیم تا پیاده سازی راحتتری داشته باشه. اگر در سازمانتون از کوبرنتیز یا سرویسهای آماده استفاده میکنید، همین ساختار کانفیگ رو میتونید متناسب با زیرساخت خودتون پیادهسازی کنید.
برای راهاندازی Fluentd به سه فایل اصلی نیاز داریم:
docker-compose.yaml
Dockerfile
fluent.conf
در ادامه هرکدوم رو مرحله به مرحله مرور میکنیم.
فایل docker-compose.yaml
در ابتدا سرویس Fluentd رو با پورت UDP 5140 بالا میآریم و فایل کانفیگ رو بهصورت read-only داخل کانتینر Mount میکنیم:
version: "3" services: fluentd: build: . container_name: fluentd-syslog ports: - "5140:5140/udp" restart: unless-stopped volumes: - ./fluent.conf:/fluentd/etc/fluent.conf:ro
فایل Dockerfile
توی Dockerfile پلاگین رسمی آروانکلاد رو نصب میکنیم:
FROM fluent/fluentd:v1.16-1 USER root # ArvanCloud official plugin RUN gem install fluent-plugin-arvancloud USER fluent CMD ["fluentd", "-c", "/fluentd/etc/fluent.conf"]
فایل fluent.conf
توی کانفیگ، لاگها از پورت ۵۱۴۰ دریافت میشن سپس توی مرحلهی فیلتر پردازش میشن و در نهایت به کلودلاگز ارسال میشه. توی مرحلهی فیلتر میتونید اگر تغییری نیاز دارید اعمال کنید. برای مثال فیلد environment رو به صورت ثابت به هر لاگ اضافه کردیم. فیلد severityهم از تگ Syslog استخراج میشه و چون کلودلاگز این فیلد رو میشناسه، به نمایش و فیلتر لاگها کمک میکنه.
# Receive syslog messages <source> @type syslog port 5140 bind 0.0.0.0 tag mikrotik <transport udp> </transport> <parse> message_format auto </parse> </source> # Add additional fields to the log records <filter mikrotik.**> @type record_transformer enable_ruby true <record> service mikrotik environment production severity ${tag_parts[2]} </record> </filter> # Send logs to ArvanCloud <match mikrotik.**> @type arvancloud api_key "apikey ****" <buffer> @type memory flush_interval 5s chunk_limit_size 5M retry_max_times 3 </buffer> </match>
برای اینکه Fluentd بتونه لاگها رو به سرویس کلودلاگز ارسال کنه، باید یک ماشین یوزر بسازید و از API Key اختصاص داده شده بهش استفاده کنید. میتونید از این داکیومنت برای ساخت ماشین یوزر استفاده کنید. ماشین یوزر ساخته شده رو توی بخش api_key قرار بدید.
خب بعد از اینکه هر سه تا فیل رو ایجاد و کانفیگ کردید باید مثل زیر توی یه دایرکتوری قرار بدید:
/opt/fluentd-syslog/ ├─ docker-compose.yaml ├─ Dockerfile └─ fluent.conf
برای اجرا توی مسیری که این فایلها وجود داره دستور زیر رو اجرا میکنیم:
docker compose up --build -d
برای دیباگ هم میتونید از کامندهای زیر استفاده کنید. به ترتیب لاگهای سرویس، وضعیت پورت و پکتهای دریافتی رو میتونید چک کنید:
docker compose logs ss -nulp | grep 5140 sudo tcpdump -i any -nn -vv 'port 5140'
در ابتدا باید یک Log Action تعریف کنیم و سپس یک Log Rule برای ارسال انواع لاگها به این مقصد بسازیم.
در ادامه مرحلهبهمرحله تنظیمات انجامشده را توضیح میدهیم.
برای ساخت ریموت، به مسیر زیر برید:
System => Logging => Actions
از طریق دکمهی new یک ریموت جدید با مشخصات زیر اضافه میکنیم:

این تنظیمات باعث میشه میکروتیک تمام لاگهای انتخابی رو در قالب استاندارد BSD Syslog و طریق پروتکل UDP به مقصد موردنظر ارسال کند.
در مرحله بعد یک Rule ایجاد میکنیم تا مشخص کند کدام لاگها از طریق ریموت ارسال شوند. برای ساخت Rule به مسیر زیر برید:
System => Logging => Rules
از طریق دکمهی new یک Rule جدید با مشخصات زیر اضافه میکنیم:

در این Rule میتونید تاپیکهای مختلف رو اضافه کنید و خروجی اونها رو به مقصد ArvanCloud بفرستید. برای شروع، پیشنهاد میشه تاپیک debug را فعال کنید. این کار بهتون کمک میکنه تا از ارتباط میکروتیک با سرور Syslog مطمئن بشید.
با این ساختار میتوانید لاگهای تجهیزات میکروتیک رو در کلودلاگز ذخیره کنید. همین روش برای سایر تجهیزات شبکه هم قابل استفاده است.
چند نکتهی مهم:
میکروتیک به صورت پیشفرض Syslog رو از طریق UDP و بدون رمزنگاری ارسال میکنه پس بهتره که Fluentd رو توی شبکهی داخلی قرار بدید تا تا لاگها در مسیر قابل شنود نباشند.
ارسال Syslog روی اینترنت با UDP خیلی وقتها دچار اختلال است. اگر Syslog رو توی سطح اینترنت دارید بهتره از TCP استفاده کنید.
برخی نسخههای میکروتیک در ارسال Syslog باگ دارند. برای اطمینان میتونید از طریق دستور tcpdump از دریافت لاگها اطمینان پیدا کنید.
بعد از اینکه لاگها از میکروتیک ارسال شدن، باید کلودلاگز رو کانفیگ کنیم و مشخص کنیم لاگها چه جوری فیلتر و ذخیره بشن. توی کلودلاگز دوتا مفهوم داریم: اسپیس و سینک
لاگ اسپیس محلی برای ذخیرهسازی لاگهاست. هر لاگ اسپیس پارامترهایی مثل Retention و Region رو داره که مشخص میکنه لاگها چند وقت نگه داشته بشن و کجا ذخیره بشن.
هر میزکار یک لاگ اسپیس default داره که Audit Logs میزکار توش ذخیره میشن. این اسپیس رایگانه و کاربر نمیتونه هیچ لاگی رو به اون ارسال کنه.
برای ساخت لاگ اسپیس جدید به بخش فضاهای ثبت لاگ برید و روی دکمهی ساخت لاگ اسپیس کلیک کنید.

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

نام و توضیحات رو وارد کنید. لاگ اسپیسی که توی مرحله قبل ساختید (مانند Network-Logs) رو در قسمت مقصد انتخاب کنید و توی قوانین این شرط رو بزارید:
payload.service == "mikrotik"
این قانون باعث میشه فقط لاگهایی که فیلد service اونها برابر با mikrotik هست، به این سینک ارسال بشن.
اگر میخواید لاگهای debug رو هم حذف کنید، میتونید فیلتر رو اینطوری بنویسید:
payload.service == "mikrotik" AND payload.severity != "debug"
اگر قانون تعریف نکنید، تمام لاگهای دریافتی به این اسپیس ارسال میشن. اگر چند سینک بدون فیلتر دارید، لاگها به صورت تکراری (Duplicate) در اسپیسهای مختلف ذخیره میشن.
بعد از ساخت سینک داخل پنل کلودلاگز با کلیک روی مشاهدهی لاگها به صفحه اکسپلور میریم تا لاگها رو چک کنیم.

در اکسپلورر میتونید:
بازه زمانی مشخص کنید.
جستجوی متنی (Full-Text Search) انجام بدید.
بر اساس فیلدها (مثل severity, host) فیلتر کنید.
یک فیلد خاص رو برای نمایش تو هر سطر انتخاب کنید.

کلودلاگز به صورت خودکار ساختار (Schema) لاگها رو تشخیص میده و توی فیلد payload قرار میده.
اگر این آموزش مفید بود، خوشحال میشم لایکش کنید!
اگر سوال یا مشکلی هم داشتید، توی کامنتها بپرسید، من هستم.
لینکهای مرتبط: