پیکربندی فایروال UFW روی اوبونتو؛ از صفر تا جلوگیری از قفل‌شدن

آموزش گام‌به‌گام پیکربندی فایروال UFW روی اوبونتو؛ باز کردن پورت‌های ضروری، مدیریت قوانین و نکات حیاتی برای جلوگیری از قطع دسترسی SSH و قفل‌شدن بیرون سرور.

۶ دقیقه به‌روزرسانی ۲۶ مرداد ۱۴۰۵

چرا فایروال UFW روی اوبونتو اهمیت دارد؟

وقتی یک سرور اوبونتو را تازه بالا می‌آورید، در حالت پیش‌فرض تمام پورت‌ها باز هستند. این یعنی هر کسی در اینترنت می‌تواند به سرویس‌هایی که روی سرور اجرا می‌شوند متصل شود؛ از SSH گرفته تا MySQL و وب‌سرور. این وضعیت عملاً یک دعوتنامه برای اسکن‌گرهای خودکار و حملات brute-force است. فایروال UFW (مخفف Uncomplicated Firewall) ابزاری است که دقیقاً برای همین مشکل طراحی شده: یک رابط خط فرمان ساده روی iptables که به شما اجازه می‌دهد با چند دستور کوتاه، ترافیک ورودی را کنترل کنید.

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

نصب و فعال‌سازی اولیه فایروال UFW

در اکثر نصب‌های اوبونتو، UFW از قبل نصب شده است. اگر نبود، با این دستور نصبش کنید:

sudo apt update
sudo apt install ufw

قبل از هر کاری، وضعیت فعلی فایروال را بررسی کنید:

sudo ufw status verbose

خروجی معمولاً Status: inactive است. حالا نوبت به تنظیم قوانین اولیه می‌رسد. اما یک هشدار جدی: اگر همین الان دستور sudo ufw enable را اجرا کنید، به احتمال زیاد دسترسی SSH خود را از دست می‌دهید، چون قانون پیش‌فرض، رد کردن تمام ترافیک ورودی است. پس اول قوانین را تنظیم کنید، بعد فایروال را فعال کنید.

تنظیم خط مشی پیش‌فرض

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

sudo ufw default deny incoming
sudo ufw default allow outgoing

این یعنی تمام ترافیک ورودی بسته می‌شود مگر اینکه صراحتاً اجازه داده باشید، و تمام ترافیک خروجی (مثل به‌روزرسانی‌ها و پاسخ‌های DNS) آزاد است. این خط مشی، پایه یک سرور امن است.

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

حالا باید پورت‌هایی را که واقعاً به آن‌ها نیاز دارید باز کنید. این کار را قبل از فعال‌سازی فایروال انجام دهید تا ریسک قطع ارتباط به صفر برسد.

باز کردن پورت SSH (مهم‌ترین قانون)

اگر روی پورت استاندارد 22 SSH دارید:

sudo ufw allow ssh

اگر پورت SSH را تغییر داده‌اید (مثلاً به 2222)، باید پورت را صریحاً مشخص کنید:

sudo ufw allow 2222/tcp

توجه کنید که allow ssh معادل allow 22/tcp است. اگر پورت غیراستاندارد دارید، حتماً پروتکل را هم مشخص کنید. این کار از باز شدن تصادفی پورت UDP جلوگیری می‌کند.

باز کردن پورت‌های وب و سرویس‌های رایج

برای وب‌سرور (HTTP و HTTPS):

sudo ufw allow 80/tcp
sudo ufw allow 443/tcp

برای MySQL یا MariaDB اگر از راه دور به آن وصل می‌شوید (فقط از IP خودتان، نه از همه‌جا):

sudo ufw allow from 203.0.113.10 to any port 3306/tcp

این قانون فقط به IP مشخص شده اجازه اتصال به MySQL می‌دهد. این یک روش بسیار بهتر از باز کردن پورت برای همه است. برای DNS، SMTP، و سرویس‌های دیگر هم به همین شکل عمل کنید:

sudo ufw allow 53/tcp
sudo ufw allow 53/udp
sudo ufw allow 25/tcp

باز کردن پورت برای بازی یا اپلیکیشن خاص

اگر بازی یا اپلیکیشنی دارید که روی پورت UDP کار می‌کند (مثل برخی بازی‌های آنلاین)، حتماً پروتکل را مشخص کنید:

sudo ufw allow 27015/udp

فعال‌سازی فایروال و بررسی قوانین

بعد از اینکه همه پورت‌های لازم را باز کردید، حالا می‌توانید فایروال را فعال کنید:

sudo ufw enable

سیستم از شما تأیید می‌گیرد و هشدار می‌دهد که این کار ممکن است SSH را قطع کند. چون قبلاً قانون SSH را اضافه کرده‌اید، با خیال راحت y را بزنید. بعد از فعال‌سازی، وضعیت را بررسی کنید:

sudo ufw status verbose

خروجی باید چیزی شبیه این باشد:

Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing)
New profiles: skip

To                         Action      From
--                         ------      ----
22/tcp                     ALLOW IN    Anywhere
80/tcp                     ALLOW IN    Anywhere
443/tcp                    ALLOW IN    Anywhere
3306/tcp                   ALLOW IN    203.0.113.10

مدیریت قوانین: افزودن، حذف و تغییر

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

حذف یک قانون

برای حذف قانون، دو روش دارید. روش اول با شماره قانون است. اول شماره‌ها را ببینید:

sudo ufw status numbered

خروجی با شماره در ابتدای هر خط نمایش داده می‌شود. سپس حذف کنید:

sudo ufw delete 3

روش دوم، حذف با خود قانون است:

sudo ufw delete allow 80/tcp

تغییر یک قانون

UFW قانون را ویرایش نمی‌کند؛ باید حذف و دوباره اضافه کنید. مثلاً برای تغییر IP مجاز در قانون MySQL:

sudo ufw delete allow from 203.0.113.10 to any port 3306/tcp
sudo ufw allow from 198.51.100.20 to any port 3306/tcp

باز کردن محدوده پورت

برای باز کردن یک بازه پورت (مثلاً 8000 تا 8100):

sudo ufw allow 8000:8100/tcp

خطای رایج: قفل‌شدن بیرون سرور و راه نجات

مهم‌ترین اشتباهی که تازه‌کارها مرتکب می‌شوند این است که فایروال را قبل از اضافه کردن قانون SSH فعال می‌کنند، یا قانون SSH را اشتباه می‌نویسند (مثلاً پورت را با پروتکل اشتباه باز می‌کنند). نتیجه: دسترسی SSH قطع می‌شود و شما بیرون سرور قفل می‌شوید.

اگر این اتفاق افتاد، چند راه نجات دارید:

  1. دسترسی کنسول از طریق پنل مدیریت: اگر سرور شما در دیتاسنتر یا شرکت هاستینگ مثل ServerNet است، معمولاً یک کنسول مبتنی بر وب (مثل noVNC یا IPMI) دارید. از آنجا وارد شوید و دستور sudo ufw disable را اجرا کنید.
  2. ری‌استارت با تنظیمات شبکه: اگر کنسول ندارید، از پنل مدیریت سرور را ری‌استارت کنید. UFW به صورت پیش‌فرض بعد از ری‌استارت فعال می‌ماند، پس این راه معمولاً جواب نمی‌دهد مگر اینکه قانونی برای ری‌ست کردن فایروال در بوت داشته باشید.
  3. قبل از فعال‌سازی، یک قانون fail-safe بسازید: این بهترین راه است. یک قانون اضافه کنید که بعد از ۵ دقیقه به طور خودکار فایروال را غیرفعال کند. اگر همه چیز درست بود، این قانون را حذف کنید:
sudo sh -c "echo 'sudo ufw disable' | at now + 5 minutes"

این دستور از ابزار at استفاده می‌کند. اگر نصب نیست، با sudo apt install at نصبش کنید. بعد از فعال‌سازی فایروال، اگر SSH برقرار بود، این قانون زمان‌بندی شده را با sudo atrm $(atq | awk '{print $1}') حذف کنید.

تست قوانین بدون قطع کردن اتصال فعلی

یک روش هوشمندانه دیگر: قبل از اعمال قوانین روی فایروال اصلی، یک session SSH دوم باز کنید و آن را باز نگه دارید. اگر session اول قطع شد، از session دوم برای رفع مشکل استفاده کنید. این یک قانون نانوشته بین مدیران سرور است.

لاگ‌گیری و عیب‌یابی

UFW به طور پیش‌فرض لاگ می‌گیرد. برای دیدن لاگ‌ها:

sudo tail -f /var/log/ufw.log

این لاگ به شما نشان می‌دهد چه بسته‌هایی رد شده‌اند. اگر سرویسی از بیرون در دسترس نیست، اول این لاگ را چک کنید. معمولاً می‌بینید که بسته از IP مورد نظر به پورت مورد نظر BLOCK شده است. این یعنی قانون شما اشتباه است یا اصلاً وجود ندارد.

برای تست اتصال از بیرون، می‌توانید از ابزارهایی مثل nc (netcat) استفاده کنید:

nc -zv your-server-ip 443

اگر پورت باز باشد، پیام succeeded می‌بینید. اگر بسته باشد، Connection refused یا timeout می‌گیرید.

جمع‌بندی و نکات نهایی

پیکربندی فایروال UFW روی اوبونتو کار سختی نیست، اما نیاز به دقت دارد. خلاصه اصول طلایی:

  • همیشه قبل از فعال‌سازی، قانون SSH را اضافه کنید.
  • از خط مشی پیش‌فرض deny incoming و allow outgoing استفاده کنید.
  • فقط پورت‌هایی را باز کنید که واقعاً به آن‌ها نیاز دارید.
  • برای سرویس‌های حساس مثل MySQL، دسترسی را محدود به IP خاص کنید.
  • یک session دوم SSH را همیشه باز نگه دارید.
  • لاگ‌ها را چک کنید تا بفهمید چه چیزی رد می‌شود.

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

آیا این مطلب برایتان مفید بود؟