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

در این راهنما، شیوه‌ی دریافت لاگ‌های میکروتیک از راه Fluentd و ذخیره‌ی آن‌ها در سرویس لاگ ابری آروان‌کلاد را بررسی می‌کنیم. در نمونه‌های این راهنما از میکروتیک استفاده شده است اما می‌توان همین رویکرد را برای تجهیزات دیگر مانند روترهای سیسکو، OpenWrt و سایر دستگاه‌های شبکه نیز پیاده‌سازی کرد.

کانفیگ Fluentd

برای دریافت لاگ‌های میکروتیک و ارسال آن‌ها به لاگ ابری آروان‌کلاد، یک Fluentd به‌‌عنوان Log Collector راه‌اندازی می‌کنیم. Fluentd به‌دلیل پشتیبانی از پلاگین رسمی آروان‌کلاد و سازگاری با فرمت‌های متنوع لاگ، گزینه‌ی مناسبی به‌شمار می‌رود. در این نمونه برای سادگی در پیاده‌سازی از Docker استفاده شده است. با این حال، اگر زیرساخت شما مبتنی‌بر Kubernetes یا سرویس‌های مدیریت‌شده باشد، همین کانفیگ را می‌توانید متناسب با زیرساخت خود پیاده‌سازی کنید.

برای راه‌اندازی 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 جدید با مشخصات زیر اضافه کنید:

در این قانون می‌توانید تاپیک‌های موردنظر را اضافه کرده و خروجی آن‌ها را به مقصد Arvancloud بفرستید. برای شروع، پیشنهاد می‌شود تاپیک debug را فعال کنید. با انجام این کار از برقراری ارتباط میان میکروتیک و سرور Syslog مطمین می‌شوید.

توجه داشته باشید که میکروتیک به‌شکل پیش‌فرض Syslog را از راه UDP و بدون رمزنگاری ارسال می‌کند. بنابراین بهتر است Fluentd را در شبکه‌ی داخلی قرار دهید تا امکان شنود لاگ‌ها در مسیر وجود نداشته باشد.

هم‌چنین ارسال Syslog بر بستر اینترنت و از راه UDP ممکن است دچار اختلال شود. اگر قصد ارسال Syslog روی اینترنت را دارید، استفاده از TCP گزینه‌ی بهتری است.

ممکن است برخی نسخه‌های میکروتیک در ارسال Syslog با مشکل روبه‌رو شوند. برای اطمینان می‌توانید با استفاده از دستور tcpdump دریافت لاگ‌ها را بررسی کنید.

مشاهده لاگ‌ها در لاگ ابری

پس از ارسال لاگ‌های میکروتیک باید لاگ ابری را پیکربندی کنید تا امکان فیلتر و ذخیره‌سازی لاگ‌ها فعال شود. در لاگ ابری دو مفهوم اصلی وجود دارد: اسپیس و سینک.

لاگ اسپیس

لاگ اسپیس محل ذخیره‌سازی لاگ‌هاست. هر لاگ اسپیس پارامترهایی مانند Retention و Region دارد که تعیین می‌کند لاگ‌ها تا چه مدت نگه‌داری و در چه موقعیتی ذخیره شوند.

هر میزکار یک لاگ اسپیس default دارد که Audit Logs میزکار در آن ذخیره می‌شوند. این اسپیس رایگان است و امکان ارسال لاگ از سوی کاربر به آن وجود ندارد.

برای ایجاد لاگ اسپیس جدید، وارد بخش «فضاهای ثبت لاگ» شده و روی دکمه‌ی «ساخت لاگ اسپیس» کلیک کنید.

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

سینک

سینک مشخص می‌کند هر لاگ به کدام اسپیس منتقل شود. با استفاده از فیلترها می‌توانید لاگ‌های موردنظر را به یک اسپیس خاص هدایت کنید یا یک لاگ را هم‌زمان به چند اسپیس مختلف بفرستید.

برای ساخت سینک جدید، در پنل لاگ ابری و در بخش «جمع‌آوری لاگ»، گزینه‌ی ساخت سینک جدید را انتخاب کنید.

ابتدا نام و توضیحات دل‌خواه‌تان را بنویسید. سپس لاگ اسپیس ساخته‌شده در مرحله‌ی قبل (برای مثال Network-Logs) را در قسمت مقصد انتخاب کنید. در بخش قوانین، شرط زیر را قرار دهید:

payload.service == "mikrotik"

این قانون تضمین می‌کند که تنها لاگ‌هایی که فیلد service آن‌ها برابر با mikrotik است، به این سینک ارسال شوند.

اگر می‌خواهید لاگ‌های debug هم حذف شوند، می‌توانید فیلتر را به‌شکل زیر بنویسید:

payload.service == "mikrotik" AND payload.severity != "debug"

اگر هیچ قانونی تعریف نکنید، تمام لاگ‌های دریافتی به این اسپیس ارسال می‌شوند. 

توجه داشته باشید که اگر چند سینک بدون فیلتر داشته باشید، لاگ‌ها به‌شکل تکراری (Duplicate) در اسپیس‌های مختلف ذخیره خواهند شد.

پس از ساخت سینک، با کلیک روی مشاهده‌ی لاگ‌ها در پنل لاگ ابری به صفحه‌ی اکسپلورر هدایت می‌شوید و می‌توانید لاگ‌ها را بررسی کنید.

در بخش اکسپلورر می‌توانید:

  • بازه‌ی زمانی مشخصی برای مشاهده‌ی لاگ‌ها تعیین کنید
  • جست‌وجوی متنی کامل (Full-Text Search) انجام دهید
  • لاگ‌ها را بر اساس فیلدهایی مانند severity یا host فیلتر کنید
  • و فیلدهای دل‌خواه برای نمایش در هر سطر را انتخاب کنید.

لاگ ابری به‌شکل خودکار ساختار (Schema) لاگ‌ها را شناسایی کرده و آن‌ها را در فیلد payload قرار می‌دهد.