امنیت و شبکه

آموزش فایروال لینوکس: ufw، firewalld و nftables روی سرور واقعی

فایروال لینوکس در هسته با netfilter کار می‌کند و شما آن را با ufw، firewalld یا nftables مدیریت می‌کنید. این راهنما از سیاست پیش‌فرض تا عیب‌یابی را با دستورهای واقعی پوشش می‌دهد.

پاسارگاد میزبان(مهندسی زیرساخت) 5 دقیقه مطالعه
نمایی از ترمینال لینوکس با دستورهای ufw و nftables برای تنظیم فایروال سرور
نمایی از ترمینال لینوکس با دستورهای ufw و nftables برای تنظیم فایروال سرور

فایروال لینوکس در خود هسته و با زیرسیستمی به نام netfilter کار می‌کند. شما معمولاً مستقیم با آن سروکار ندارید و یکی از ابزارهای ufw (اوبونتو و دبیان)، firewalld (خانواده RHEL مثل Rocky و AlmaLinux) یا nftables را به کار می‌برید. در این آموزش فایروال لینوکس، قاعده‌ای که روی هر سرور تازه باید اجرا شود این است: همه ورودی‌ها بسته، خروجی‌ها باز، اول پورت SSH را باز کن و بعد فایروال را روشن کن.

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

لایه‌های فایروال لینوکس: چه کسی واقعاً بسته‌ها را فیلتر می‌کند؟

سردرگمی اصلی تازه‌کارها این است که فکر می‌کنند ufw و iptables و nftables سه فایروال جدا هستند. نیستند. فیلتر کردن بسته را netfilter در هسته انجام می‌دهد و این ابزارها فقط قانون‌ها را به زبان هسته ترجمه می‌کنند.

  • iptables: ابزار قدیمی و هنوز رایج. در توزیع‌های جدید، دستور iptables معمولاً در پشت صحنه نسخه iptables-nft است و قانون‌ها را در nftables می‌نویسد.
  • nftables: جایگزین رسمی iptables از هسته 3.13 به بعد، با یک دستور واحد (nft) برای IPv4 و IPv6.
  • ufw: لایه ساده‌شده روی همین زیرساخت، پیش‌فرض اوبونتو.
  • firewalld: مدیریت مبتنی بر zone، پیش‌فرض RHEL، Rocky، AlmaLinux و Fedora.
ابزارتوزیع پیش‌فرضسطح سختیمناسب برای
ufwاوبونتو، دبیان (نصب دستی)سادهوب‌سرور و سرورهای تک‌منظوره
firewalldRocky، AlmaLinux، Fedoraمتوسطسرور با چند کارت شبکه یا چند zone
nftablesهمه توزیع‌های جدیدپیشرفته‌ترکنترل کامل، NAT، قانون‌های پیچیده

آموزش فایروال لینوکس با ufw روی اوبونتو

اگر سرورت اوبونتوست، ufw سریع‌ترین مسیر است. قبل از هر چیز مطمئن شو از طریق SSH وصلی و می‌دانی روی چه پورتی است؛ اگر هنوز با اتصال راحت نیستی، آموزش اتصال به سرور لینوکس با SSH را ببین.

sudo apt update && sudo apt install ufw
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow OpenSSH
sudo ufw allow 80,443/tcp
sudo ufw enable
sudo ufw status verbose

ترتیب این‌جا مهم است: allow OpenSSH قبل از enable. اگر SSH را روی پورت دیگری مثل 2222 گذاشته‌ای، به جای OpenSSH بنویس sudo ufw allow 2222/tcp.

چند الگوی پرکاربرد دیگر:

# فقط یک آی‌پی مشخص به دیتابیس دسترسی داشته باشد
sudo ufw allow from 203.0.113.10 to any port 5432 proto tcp

# محدود کردن تلاش‌های پیاپی روی SSH (بیش از ۶ اتصال در ۳۰ ثانیه رد می‌شود)
sudo ufw limit 22/tcp

# دیدن قانون‌ها با شماره و حذف یکی از آن‌ها
sudo ufw status numbered
sudo ufw delete 3

IPv6 را فراموش نکن. در فایل /etc/default/ufw مقدار IPV6=yes باید باشد تا قانون‌ها برای IPv6 هم ساخته شوند؛ وگرنه سرویسی که فکر می‌کنی بسته است، از طریق آدرس IPv6 باز می‌ماند. برای قدم‌های بعدی امن‌سازی همین سیستم‌عامل، امن‌سازی سرور اوبونتو در ۱۰ قدم ادامه منطقی این بخش است.

firewalld روی Rocky و AlmaLinux

firewalld با مفهوم zone کار می‌کند: هر کارت شبکه به یک zone وصل است و قانون‌ها روی zone اعمال می‌شوند. روی بیشتر سرورهای ابری، کارت اصلی در zone به نام public است.

sudo systemctl enable --now firewalld
sudo firewall-cmd --get-active-zones
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --permanent --add-port=8080/tcp
sudo firewall-cmd --reload
sudo firewall-cmd --list-all

تله رایج firewalld گزینه --permanent است. بدون آن، قانون فوراً اعمال می‌شود ولی با reload یا ریبوت از بین می‌رود. با آن، قانون ذخیره می‌شود ولی تا --reload نزنی اعمال نمی‌شود. اگر قانونی اضافه کردی و اثر نکرد، معمولاً یعنی reload را جا انداخته‌ای.

برای قانون‌های دقیق‌تر، مثل باز کردن پورت فقط برای یک آی‌پی، از rich rule استفاده کن:

sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="203.0.113.10" port port="5432" protocol="tcp" accept'
sudo firewall-cmd --reload

نوشتن مستقیم قانون با nftables

وقتی کنترل کامل می‌خواهی یا ufw و firewalld برای سناریویت محدودند (مثلاً NAT یا قانون‌های وابسته به حالت اتصال)، مستقیم سراغ nftables برو. در دبیان و اوبونتو، فایل پیکربندی پیش‌فرض /etc/nftables.conf است. یک نمونه حداقلی و امن برای وب‌سرور:

#!/usr/sbin/nft -f
flush ruleset

table inet filter {
  chain input {
    type filter hook input priority 0; policy drop;
    ct state established,related accept
    ct state invalid drop
    iif "lo" accept
    meta l4proto { icmp, ipv6-icmp } accept
    tcp dport { 22, 80, 443 } accept
  }
  chain forward {
    type filter hook forward priority 0; policy drop;
  }
  chain output {
    type filter hook output priority 0; policy accept;
  }
}

خانواده inet یعنی همین جدول هم IPv4 را پوشش می‌دهد هم IPv6. خط ct state established,related accept حیاتی است؛ بدون آن پاسخ درخواست‌هایی که خود سرور فرستاده (مثل apt update) برنمی‌گردد. ICMP را هم کامل نبند، چون IPv6 بدون ICMPv6 درست کار نمی‌کند.

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

sudo nft -c -f /etc/nftables.conf
sudo systemctl enable --now nftables
sudo nft list ruleset

مرجع کامل سینتکس در ویکی رسمی nftables است.

چطور پشت فایروال خودت قفل نشوی

بدترین اتفاق در کار با فایروال این است که سیاست drop را فعال کنی و SSH خودت قطع شود. این ترتیب را رعایت کن:

مراحل: فعال‌سازی امن فایروال روی سرور راه‌دور

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

sudo apt install at
echo "ufw disable" | sudo at now + 5 minutes
# یا برای nftables:
echo "nft flush ruleset" | sudo at now + 5 minutes

# بعد از اطمینان از اتصال:
sudo atq
sudo atrm 1

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

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

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

فهرست بررسی: وقتی پورت از بیرون باز نمی‌شود
  1. سرویس واقعاً گوش می‌دهد؟ با sudo ss -tulpn ببین پورت در حالت LISTEN هست یا نه. اگر آدرس جلویش 127.0.0.1 است، مشکل فایروال نیست؛ سرویس فقط روی localhost باز است. این اتفاق در پیکربندی nginx و دیتابیس زیاد می‌افتد. برای nginx، راهنمای نصب وب سرور nginx روی اوبونتو را ببین.
  1. قانون درست ثبت شده؟ خروجی sudo ufw status verbose یا sudo nft list ruleset را نگاه کن. ترتیب قانون‌ها در nftables مهم است؛ قانون drop بالاتر از accept، accept را بی‌اثر می‌کند.
  1. Docker قانون‌ها را دور زده؟ این یکی غافلگیرکننده است. Docker برای پورت‌های منتشرشده (-p 8080:80) مستقیم قانون می‌نویسد و ترافیک از زنجیره‌ای عبور می‌کند که ufw کنترلش نمی‌کند. نتیجه: ufw می‌گوید پورت بسته است ولی از اینترنت باز است. راه ساده این است که پورت را فقط به localhost ببندی (-p 127.0.0.1:8080:80) و جلوی آن ریورس پراکسی بگذاری، یا قانون‌هایت را در زنجیره DOCKER-USER بنویسی.
  1. مشکل از بیرون سرور است؟ اگر از خود سرور با curl -I http://localhost جواب می‌گیری و قانون‌ها هم درست‌اند ولی از ایران چیزی باز نمی‌شود، احتمال دارد مسئله فیلترینگ آی‌پی باشد، نه فایروال. این حالت را در چرا آی‌پی سرور از ایران باز نمی‌شود توضیح داده‌ایم.

فایروال فقط یک لایه از امن‌سازی است. ترتیب کامل کارها از اولین ورود، یعنی کلید SSH، غیرفعال کردن ورود root، به‌روزرسانی و fail2ban، در آموزش امنیت سرور لینوکس آمده است.

جمع‌بندی

برای اوبونتو با ufw شروع کن، روی Rocky و AlmaLinux از firewalld استفاده کن و هر وقت کنترل بیشتری لازم داشتی سراغ nftables برو. قاعده همیشه یکی است: ورودی بسته، خروجی باز، اول SSH و بعد فعال‌سازی، با یک زمان‌بند برگشت برای روز مبادا. بهترین راه یادگیری، تمرین روی سروری است که خراب شدنش اهمیتی ندارد؛ یک ساخت سرور ساعتی ایران و خارج انجام بده، قانون‌های همین مقاله را رویش اجرا کن و بعد سراغ سرور اصلی برو.

پرسش‌های پرتکرار

فرق ufw با iptables و nftables چیست؟

هر سه فقط قانون‌ها را به netfilter در هسته می‌دهند. ufw لایه ساده‌شده است، iptables ابزار قدیمی‌تر و nftables جایگزین رسمی و جدیدتر آن با یک سینتکس واحد برای IPv4 و IPv6.

اگر بعد از فعال کردن فایروال SSH قطع شد چه کنم؟

از کنسول وب پنل سرور وارد شو و فایروال را با ufw disable یا nft flush ruleset خاموش کن. برای پیشگیری، قبل از فعال‌سازی با دستور at یک برگشت خودکار پنج‌دقیقه‌ای تنظیم کن.

چرا با وجود بستن پورت در ufw، کانتینر Docker از بیرون در دسترس است؟

Docker برای پورت‌های منتشرشده مستقیم قانون می‌نویسد و ufw را دور می‌زند. پورت را فقط روی 127.0.0.1 منتشر کن یا قانون‌ها را در زنجیره DOCKER-USER بنویس.

آیا می‌شود ufw و firewalld را با هم استفاده کرد؟

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

اشتراک‌گذاری: تلگرام واتساپ ایکس

پاسارگاد میزبان

مهندسی زیرساخت

شرکت میزبان داده پردازی پاسارگاد ارائه دهنده خدمات ابری و زیرساخت

سرور ساعتی ایران و خارج، در کمتر از یک دقیقه

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

ساخت سرور ابری
امنیت و شبکه

آموزش امنیت سرور لینوکس: ترتیب درست امن‌سازی از اولین ورود

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

6 دقیقه مطالعه
امنیت و شبکه

امنیت سرور چیست؟ از اتاق سرور تا SSH و فایروال، راهنمای عملی

امنیت سرور یعنی سخت کردن دسترسی غیرمجاز، جلوگیری از توقف سرویس و محافظت از داده، در لایه‌های فیزیکی، شبکه، سیستم‌عامل و اپلیکیشن. این راهنما می‌گوید هر لایه دست کیست و در ساعت اول بعد از تحویل سرور دقیقاً چه کنی.

7 دقیقه مطالعه

آخرین بازبینی این مقاله: