اصول Iptables: قوانین و دستورات رایج فایروال

مقدمه
ابزار iptables یک فایروال نرمافزاری برای توزیعهای لینوکس است که به شما اجازه میدهد کنترل کنید ترافیک شبکه چگونه توسط کرنل لینوکس مدیریت شود. با iptables میتوانید قوانینی تعریف کنید که ترافیک را بر اساس ویژگیهایی مثل پروتکل، پورت، آدرس مبدأ یا مقصد و اینترفیس شبکه تطبیق دهند؛ و سپس تصمیم بگیرید اجازه عبورش بدهید، بلاکش کنید یا لاگش کنید. این قوانین در جدولها و زنجیرهایی (مانند زنجیرهای INPUT، OUTPUT و FORWARD) سازماندهی میشوند و از بالا به پایین ارزیابی میشوند؛ که ترتیب قوانین را بخش مهمی از رسیدن به رفتار مورد انتظار میسازد.
این راهنما به سبک برگه-تقلب (Cheat Sheet)، مرجعی سریع به دستورات iptables برای سناریوهای رایج و روزمره روی اوبونتو 24.04 فراهم میکند. شامل مثالهایی از اجازه و بلاک کردن سرویسها بر اساس پورت، اینترفیس شبکه و آدرس IP مبدأ؛ بههمراه راهنمایی درباره ترتیب قوانین، ماندگاری و بررسیهای ایمنی پایه است.
نکته: نسخههای جدید اوبونتو (شامل اوبونتو 24.04) از بکاند nftables از طریق لایه سازگاری iptables-nft استفاده میکنند. دستورات این راهنما همچنان طبق نوشتهشده کار میکنند؛ اما nftables چارچوب فایروال توصیهشده بلندمدت روی سیستمهای لینوکسی است.
نکته: قوانین این راهنما فقط برای ترافیک IPv4 اعمال میشوند. اوبونتو 24.04 بهطور پیشفرض IPv6 را فعال میکند. اگر IPv6 روی سرورتان فعال است، باید ip6tables یا nftables را هم پیکربندی کنید تا از افشاشدن سرویسها روی IPv6 جلوگیری شود.
نکات کلیدی
- iptables همچنان ابزار فایروال قدرتمند سطح-پایینی روی اوبونتو 24.04 است؛ که معمولاً از طریق لایه سازگاری iptables-nftِ پشتیبانشده توسط nftables اجرا میشود.
- قوانین فایروال به ترتیب از بالا به پایین پردازش میشوند؛ پس جایگذاری قانون و استفاده از
-Aدر مقابل-Iمیتواند بهطور چشمگیری بر نحوه مدیریت ترافیک اثر بگذارد. - همیشه قبل از اعمال قوانین محدودکننده روی سرورهای ریموت، اجازه دسترسی SSH بدهید تا از قفل شدن تصادفی خودتان جلوگیری کنید.
- قوانین iptables بهطور پیشفرض ماندگار نیستند؛ استفاده از iptables-persistent و netfilter-persistent تضمین میکند قوانین از ریبوتها جان سالم به در ببرند.
- بسیاری از وظایف رایج فایروال—مانند اجازه دادن ترافیک وب، دسترسی دیتابیس یا بلاک کردن IPهای خاص—را میتوان با قوانین هدفمند INPUT و OUTPUT مدیریت کرد.
- NAT و فوروارد پورت، بهعلاوه قوانین استاندارد filter، نیازمند فعال کردن فوروارد IP و پیکربندی قوانین در جدول nat هستند.
- اوبونتو بهطور پیشفرض IPv6 را فعال میکند؛ پس پیکربندی فقط قوانین IPv4 با iptables ممکن است سرویسها را افشا بگذارد؛ مگر اینکه ip6tables یا nftables هم پیکربندی شوند.
- برای مدیریت سادهتر فایروال روی اوبونتو، UFW رابط سطح-بالاتری فراهم میکند؛ در حالی که iptables برای کنترل شبکهای ریزبینانه و پیشرفته مناسبتر است.
نحوه استفاده از این راهنما
- بیشتر قوانینی که اینجا توصیف میشوند فرض میکنند پیکربندی iptables شما طوری تنظیم شده که ترافیک ورودی را از طریق سیاست پیشفرض INPUT حذف (DROP) کند و میخواهید ورودی را انتخابانه مجاز کنید.
- بیشتر سیستمهای اوبونتو از سیاست OUTPUT روی ACCEPT استفاده میکنند. اگر روی سرور شما اینطور است، قوانین OUTPUT نمایشدادهشده در این راهنما معمولاً اختیاریاند و میتوانند حذف شوند.
- از هر کدام از بخشهای بعدی که به آنچه سعی در دستیابی به آن دارید قابل استفادهاند بهره ببرید. بیشتر بخشها به هیچ بخش دیگری متکی نیستند؛ پس میتوانید مثالهای زیر را مستقل استفاده کنید.
- از منوی فهرست مطالب در سمت راست این صفحه (در عرضهای زیاد صفحه) یا تابع جستجوی مرورگرتان برای پیدا کردن بخشهای مورد نیاز استفاده کنید.
- مثالهای خط فرمان دادهشده را کپی و پیست کنید و مقادیر هایلایتشده را با مقادیر خودتان جایگزین کنید.
نکته: در سراسر این راهنما، اینترفیسهای نمونه مثل eth0/eth1 را با نامهای واقعی اینترفیسهای سیستمتان جایگزین کنید. نسخههای جدید اوبونتو از نامهای قابل پیشبینی استفاده میکنند (مثلاً ens3، enp0s3 و مشابه). برای فهرست کردن اینترفیسهای فعلیتان، اجرا کنید:
ip a
در نظر داشته باشید که ترتیب قوانین مهم است. همه دستورات iptables در این راهنما از گزینه -A برای افزودن قانون جدید به انتهای زنجیر استفاده میکنند. اگر میخواهید قانونی را جای دیگری از زنجیر بگذارید، میتوانید از گزینه -I استفاده کنید؛ که به شما اجازه تعیین موقعیت قانون جدید را میدهد (یا با حذف شماره قانون، در ابتدای زنجیر قرارش میدهد).
نکته: هنگام کار با فایروالها، مراقب باشید با بلاک کردن ترافیک SSH (پورت ۲۲، بهطور پیشفرض) خودتان را از سرور خودتان قفل نکنید. اگر بهدلیل تنظیمات فایروالتان دسترسی را از دست بدهید، ممکن است لازم باشد از طریق کنسول مبتنی بر وب به آن وصل شوید تا دسترسیتان را تعمیر کنید. اگر از پارمین کلود استفاده میکنید، میتوانید مستندات کنسول بازیابی محصول پارمین کلود را برای اطلاعات بیشتر بخوانید. وقتی از طریق کنسول وصل شدید، میتوانید قوانین فایروالتان را طوری تغییر دهید که اجازه دسترسی SSH (یا اجازه همه ترافیک) بدهند. اگر قوانین فایروال ذخیرهشدهتان اجازه دسترسی SSH میدهند، روش دیگر ریبوت کردن سرورتان است.
یادتان باشد میتوانید مجموعه قوانین فعلی iptables خود را با sudo iptables -S و sudo iptables -L چک کنید.
ببینیم دستورات iptables را.
ذخیره قوانین
قوانین iptables گذرا (Ephemeral) هستند؛ یعنی اگر میخواهید بعد از ریبوت باقی بمانند، باید دستی ذخیرهشان کنید. چون قوانین iptables بهطور پیشفرض ماندگار نیستند، یادتان باشد بعد از اعمال تغییرات قوانینتان را ذخیره کنید.
روی اوبونتو 24.04، یک روش رایج ذخیره قوانین iptables، استفاده از پکیج iptables-persistent است؛ که سرویس netfilter-persistent را نصب میکند. این با لایه سازگاری iptables-nftِ استفادهشده توسط سیستمهای جدید اوبونتو کار میکند.
با apt مثل این نصبش کنید:
sudo apt install iptables-persistent
در طول نصب، از شما پرسیده میشود که آیا میخواهید قوانین فعلی فایروالتان را ذخیره کنید.
اگر قوانین فایروالتان را بهروز کردید و میخواهید تغییرات را ذخیره کنید، این دستور را اجرا کنید:
sudo netfilter-persistent save
بعد از ذخیره، تمرین خوبی است تأیید کنید قوانین درست بارگذاری شدهاند:
sudo iptables -L -n -v
توزیعهای دیگر لینوکس ممکن است روشهای جایگزینی برای ماندگار کردن تغییرات iptables شما داشته باشند. لطفاً برای اطلاعات بیشتر به مستندات مرتبط مراجعه کنید.
بعد از ریبوت سرورتان، تأیید کنید قوانین همچنان فعالاند تا ماندگاری تایید شود.
فهرستکردن و حذف قوانین
اگر میخواهید یاد بگیرید چطور قوانین iptables را فهرست و حذف کنید، این آموزش را ببینید: «نحوه فهرستکردن و حذف قوانین فایروال Iptables» در پارمین کلود.
دستورات رایج iptables
این بخش شامل انواع دستورات iptables است که قوانینی میسازند که عموماً روی بیشتر سرورها مفیدند.
اجازه اتصالات Loopback
اینترفیس Loopback—که به lo هم ارجاع میشود—چیزی است که یک کامپیوتر برای فوروارد کردن اتصالات شبکه به خودش استفاده میکند. مثلاً اگر ping localhost یا ping 127.0.0.1 را اجرا کنید، سرورتان با استفاده از loopback خودش را ping میکند. اینترفیس loopback وقتی هم استفاده میشود که سرور اپلیکیشنتان را طوری پیکربندی کنید که به سرور دیتابیس با آدرس localhost وصل شود. به این ترتیب، میخواهید مطمئن شوید فایروالتان این اتصالات را مجاز میداند.
برای پذیرفتن همه ترافیک روی اینترفیس loopback، این دستورات را اجرا کنید:
sudo iptables -A INPUT -i lo -j ACCEPT
sudo iptables -A OUTPUT -o lo -j ACCEPT
اجازه اتصالات ورودی Established و Related
چون ترافیک شبکه عموماً برای کار درست نیازمند دوطرفه بودن (ورودی و خروجی) است، معمول است قانون فایروالی بسازید که ترافیک ورودیِ established و related را مجاز بداند. این تضمین میکند سرور، ترافیک بازگشتیِ اتصالات خروجیِ آغازشده توسط خودش را مجاز بداند. این دستور اجازه میدهد:
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
اجازه اتصالات خروجی Established
ممکن است بخواهید ترافیک خروجی همه اتصالات established—که معمولاً پاسخ به اتصالات ورودی قانونیاند—را مجاز کنید. این دستور اجازه میدهد:
sudo iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED -j ACCEPT
نکته: این قانون بهندرت روی هاستهای معمولی اوبونتو لازم است؛ چون سیاست OUTPUT معمولاً ACCEPT است.
اجازه دسترسی شبکه داخلی به شبکه خارجی
با فرض اینکه eth0 اینترفیس خارجی و eth1 اینترفیس داخلی شماست، این قانون به شبکه داخلیتان اجازه دسترسی به شبکه خارجی را میدهد:
sudo iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT
نکته: eth0 و eth1 را با نامهای واقعی اینترفیسهای سیستمتان تنظیم کنید؛ طبق نکته قبلی درباره نامهای قابل پیشبینی اینترفیسهای شبکه.
نکته: این قانون فورواردینگ بین اینترفیسها را مجاز میکند اما معمولاً فقط بخشی از پیکربندی کامل دروازه یا NAT است. در بسیاری از راهاندازیهای دنیای واقعی، ممکن است به اینها هم نیاز داشته باشید:
- فعال کردن فوروارد IP (
net.ipv4.ip_forward=1)- مجاز کردن ترافیک RELATED,ESTABLISHED در زنجیر FORWARD
- پیکربندی قانون MASQUERADE در جدول nat
الزامات دقیق به معماری شبکهتان بستگی دارد.
حذف بستههای نامعتبر
بعضی بستههای ترافیک شبکه بهعنوان نامعتبر علامت میخورند. گاهی میتواند مفید باشد این نوع بسته را لاگ کرد؛ اما اغلب مشکلی نیست که حذفش کنید. با این دستور انجامش دهید:
sudo iptables -A INPUT -m conntrack --ctstate INVALID -j DROP
بلاک کردن یک آدرس IP
برای بلاک کردن اتصالات شبکهای که از آدرس IP خاصی منشأ میگیرند—مثلاً 203.0.113.51—این دستور را اجرا کنید:
sudo iptables -A INPUT -s 203.0.113.51 -j DROP
در این مثال، -s 203.0.113.51 آدرس IP مبدأِ «203.0.113.51» را تعیین میکند. آدرس IP مبدأ را میتوان در هر قانون فایروالی—including قانون اجازه (Allow)—تعیین کرد.
اگر میخواهید بهجای آن اتصال را رد کنید—which به درخواست اتصال با خطای «connection refused» پاسخ میدهد—«DROP» را با «REJECT» مثل این جایگزین کنید:
sudo iptables -A INPUT -s 203.0.113.51 -j REJECT
بلاک کردن اتصالات به یک اینترفیس شبکه
برای بلاک کردن اتصالات از آدرس IP خاصی (مثلاً 203.0.113.51) به اینترفیس شبکه خاصی (مثلاً eth0)، از این دستور استفاده کنید:
sudo iptables -A INPUT -i eth0 -s 203.0.113.51 -j DROP
این همان مثال قبلی است؛ با افزودن -i eth0. اینترفیس شبکه را میتوان در هر قانون فایروالی تعیین کرد و روش خوبی برای محدود کردن قانون به شبکه خاصی است.
سرویس: SSH
اگر از سروری بدون کنسول محلی استفاده میکنید، احتمالاً میخواهید اتصالات ورودی SSH (پورت ۲۲) را مجاز کنید تا بتوانید به سرورتان وصل شده و مدیریتش کنید. این بخش نحوه پیکربندی فایروال با قوانین مختلف مرتبط با SSH را پوشش میدهد.
هشدار: قبل از اعمال قوانین فایروال روی سرور ریموت، مطمئن شوید دسترسی SSH (معمولاً پورت ۲۲) از IP فعلیتان مجاز است. اعمال قوانین محدودکننده بدون اجازه SSH ممکن است شما را از سرورتان قفل کند.
یک روند کار امنِ رایج این است:
۱. اول SSH را مجاز کنید
۲. قوانین فایروال اضافی را اعمال کنید
۳. اتصالپذیری را در نشست ترمینال دوم تأیید کنید
اجازه همه SSH ورودی
برای مجاز کردن همه اتصالات SSH ورودی، این دستورات را اجرا کنید:
sudo iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo iptables -A OUTPUT -p tcp --sport 22 -m conntrack --ctstate ESTABLISHED -j ACCEPT
دستور دوم—which ترافیک خروجی اتصالات SSHِ established را مجاز میکند—فقط وقتی لازم است که سیاست OUTPUT روی ACCEPT تنظیم نشده باشد.
اجازه SSH ورودی از IP یا زیرشبکه خاص
برای مجاز کردن اتصالات SSH ورودی از آدرس IP یا زیرشبکه خاص، مبدأ را تعیین کنید. مثلاً اگر میخواهید کل زیرشبکه 203.0.113.0/24 را مجاز کنید، این دستورات را اجرا کنید:
sudo iptables -A INPUT -p tcp -s 203.0.113.0/24 --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo iptables -A OUTPUT -p tcp --sport 22 -m conntrack --ctstate ESTABLISHED -j ACCEPT
دستور دوم فقط وقتی لازم است که سیاست OUTPUT روی ACCEPT تنظیم نشده باشد.
اجازه SSH خروجی
اگر سیاست OUTPUT فایروالتان روی ACCEPT تنظیم نشده و میخواهید اتصالات SSH خروجی—سرور شما آغازکننده اتصال SSH به سرور دیگری—را مجاز کنید، میتوانید این دستورات را اجرا کنید:
sudo iptables -A OUTPUT -p tcp --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo iptables -A INPUT -p tcp --sport 22 -m conntrack --ctstate ESTABLISHED -j ACCEPT
اجازه Rsync ورودی از IP یا زیرشبکه خاص
Rsync—which روی پورت ۸۷۳ اجرا میشود—را میتوان برای انتقال فایل از کامپیوتری به کامپیوتر دیگر استفاده کرد.
برای مجاز کردن اتصالات rsync ورودی از آدرس IP یا زیرشبکه خاص، آدرس IP مبدأ و پورت مقصد را تعیین کنید. مثلاً اگر میخواهید کل زیرشبکه 203.0.113.0/24 بتواند به سرورتان rsync بزند، این دستورات را اجرا کنید:
sudo iptables -A INPUT -p tcp -s 203.0.113.0/24 --dport 873 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo iptables -A OUTPUT -p tcp --sport 873 -m conntrack --ctstate ESTABLISHED -j ACCEPT
دستور دوم فقط وقتی لازم است که سیاست OUTPUT روی ACCEPT تنظیم نشده باشد.
سرویس: وبسرور
وبسرورها—مثل Apache و Nginx—معمولاً به درخواستها روی پورت ۸۰ و ۴۴۳ (بهترتیب برای اتصالات HTTP و HTTPS) گوش میدهند. اگر سیاست پیشفرضتان برای ترافیک ورودی روی drop یا deny تنظیم شده، میخواهید قوانینی بسازید که سرورتان بتواند به آن درخواستها پاسخ دهد.
اجازه همه HTTP ورودی
برای مجاز کردن همه اتصالات HTTP (پورت ۸۰) ورودی، این دستورات را اجرا کنید:
sudo iptables -A INPUT -p tcp --dport 80 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo iptables -A OUTPUT -p tcp --sport 80 -m conntrack --ctstate ESTABLISHED -j ACCEPT
دستور دوم فقط وقتی لازم است که سیاست OUTPUT روی ACCEPT تنظیم نشده باشد.
اجازه همه HTTPS ورودی
برای مجاز کردن همه اتصالات HTTPS (پورت ۴۴۳) ورودی، این دستورات را اجرا کنید:
sudo iptables -A INPUT -p tcp --dport 443 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo iptables -A OUTPUT -p tcp --sport 443 -m conntrack --ctstate ESTABLISHED -j ACCEPT
دستور دوم فقط وقتی لازم است که سیاست OUTPUT روی ACCEPT تنظیم نشده باشد.
اجازه همه HTTP و HTTPS ورودی
اگر میخواهید هر دو ترافیک HTTP و HTTPS را مجاز کنید، میتوانید از ماژول multiport برای ساخت قانونی که هر دو پورت را مجاز میکند استفاده کنید. برای مجاز کردن همه اتصالات HTTP و HTTPS (پورتهای ۸۰ و ۴۴۳) ورودی، این دستورات را اجرا کنید:
sudo iptables -A INPUT -p tcp -m multiport --dports 80,443 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo iptables -A OUTPUT -p tcp -m multiport --sports 80,443 -m conntrack --ctstate ESTABLISHED -j ACCEPT
دستور دوم فقط وقتی لازم است که سیاست OUTPUT روی ACCEPT تنظیم نشده باشد.
سرویس: MySQL
MySQL به اتصالات کلاینت روی پورت ۳۳۰۶ گوش میدهد. اگر سرور دیتابیس MySQL شما توسط کلاینتی روی سرور ریموت استفاده میشود، باید مطمئن شوید آن ترافیک را مجاز میدانید.
اجازه MySQL از IP یا زیرشبکه خاص
برای مجاز کردن اتصالات MySQL ورودی از آدرس IP یا زیرشبکه خاص، مبدأ را تعیین کنید. مثلاً اگر میخواهید کل زیرشبکه 203.0.113.0/24 را مجاز کنید، این دستورات را اجرا کنید:
sudo iptables -A INPUT -p tcp -s 203.0.113.0/24 --dport 3306 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo iptables -A OUTPUT -p tcp --sport 3306 -m conntrack --ctstate ESTABLISHED -j ACCEPT
دستور دوم فقط وقتی لازم است که سیاست OUTPUT روی ACCEPT تنظیم نشده باشد.
اجازه MySQL به اینترفیس شبکه خاص
برای مجاز کردن اتصالات MySQL به اینترفیس شبکه خاصی (مثلاً اینترفیس خصوصی روی سرور ابری)، از این دستورات استفاده کنید. نام اینترفیس را با خودتان جایگزین کنید (میتوانید با ip link چک کنید):
sudo iptables -A INPUT -i eth1 -p tcp --dport 3306 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo iptables -A OUTPUT -o eth1 -p tcp --sport 3306 -m conntrack --ctstate ESTABLISHED -j ACCEPT
دستور دوم فقط وقتی لازم است که سیاست OUTPUT روی ACCEPT تنظیم نشده باشد.
سرویس: PostgreSQL
PostgreSQL به اتصالات کلاینت روی پورت ۵۴۳۲ گوش میدهد. اگر سرور دیتابیس PostgreSQL شما توسط کلاینتی روی سرور ریموت استفاده میشود، باید مطمئن شوید آن ترافیک را مجاز میدانید.
PostgreSQL از IP یا زیرشبکه خاص
برای مجاز کردن اتصالات PostgreSQL ورودی از آدرس IP یا زیرشبکه خاص، مبدأ را تعیین کنید. مثلاً اگر میخواهید کل زیرشبکه 203.0.113.0/24 را مجاز کنید، این دستورات را اجرا کنید:
sudo iptables -A INPUT -p tcp -s 203.0.113.0/24 --dport 5432 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo iptables -A OUTPUT -p tcp --sport 5432 -m conntrack --ctstate ESTABLISHED -j ACCEPT
دستور دوم فقط وقتی لازم است که سیاست OUTPUT روی ACCEPT تنظیم نشده باشد.
اجازه PostgreSQL به اینترفیس شبکه خاص
برای مجاز کردن اتصالات PostgreSQL به اینترفیس شبکه خاصی، از این دستورات استفاده کنید. نام اینترفیس را با خودتان جایگزین کنید (میتوانید با ip link چک کنید):
sudo iptables -A INPUT -i eth1 -p tcp --dport 5432 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo iptables -A OUTPUT -o eth1 -p tcp --sport 5432 -m conntrack --ctstate ESTABLISHED -j ACCEPT
دستور دوم فقط وقتی لازم است که سیاست OUTPUT روی ACCEPT تنظیم نشده باشد.
سرویس: ایمیل
سرورهای ایمیل—مثل Sendmail و Postfix—بسته به پروتکلهای استفادهشده برای تحویل ایمیل، روی پورتهای مختلفی گوش میدهند. اگر سرور ایمیل اجرا میکنید، تعیین کنید از کدام پروتکلها استفاده میکنید و انواع مناسب ترافیک را مجاز کنید. همچنین نشان میدهیم چطور قانونی برای بلاک کردن ایمیل SMTP خروجی بسازید.
بلاک کردن ایمیل SMTP خروجی
اگر سرورتان نباید ایمیل خروجی بفرستد، ممکن است بخواهید آن نوع ترافیک را بلاک کنید. برای بلاک کردن ایمیل SMTP خروجی—which از پورت ۲۵ استفاده میکند—این دستور را اجرا کنید:
sudo iptables -A OUTPUT -p tcp --dport 25 -j REJECT
این iptables را طوری پیکربندی میکند که همه ترافیک خروجی روی پورت ۲۵ را رد کند. اگر لازم است سرویس متفاوتی را بر اساس شماره پورتش رد کنید—بهجای پورت ۲۵—آن شماره پورت را جایگزین ۲۵ بالا کنید.
اجازه همه SMTP ورودی
برای اینکه سرورتان بتواند به اتصالات SMTP روی پورت ۲۵ پاسخ دهد، این دستورات را اجرا کنید:
sudo iptables -A INPUT -p tcp --dport 25 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo iptables -A OUTPUT -p tcp --sport 25 -m conntrack --ctstate ESTABLISHED -j ACCEPT
دستور دوم فقط وقتی لازم است که سیاست OUTPUT روی ACCEPT تنظیم نشده باشد.
اجازه همه IMAP ورودی
برای اینکه سرورتان بتواند به اتصالات IMAP—پورت ۱۴۳—پاسخ دهد، این دستورات را اجرا کنید:
sudo iptables -A INPUT -p tcp --dport 143 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo iptables -A OUTPUT -p tcp --sport 143 -m conntrack --ctstate ESTABLISHED -j ACCEPT
دستور دوم فقط وقتی لازم است که سیاست OUTPUT روی ACCEPT تنظیم نشده باشد.
اجازه همه IMAPS ورودی
برای اینکه سرورتان بتواند به اتصالات IMAPS—پورت ۹۹۳—پاسخ دهد، این دستورات را اجرا کنید:
sudo iptables -A INPUT -p tcp --dport 993 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo iptables -A OUTPUT -p tcp --sport 993 -m conntrack --ctstate ESTABLISHED -j ACCEPT
دستور دوم فقط وقتی لازم است که سیاست OUTPUT روی ACCEPT تنظیم نشده باشد.
اجازه همه POP3 ورودی
برای اینکه سرورتان بتواند به اتصالات POP3—پورت ۱۱۰—پاسخ دهد، این دستورات را اجرا کنید:
sudo iptables -A INPUT -p tcp --dport 110 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo iptables -A OUTPUT -p tcp --sport 110 -m conntrack --ctstate ESTABLISHED -j ACCEPT
دستور دوم فقط وقتی لازم است که سیاست OUTPUT روی ACCEPT تنظیم نشده باشد.
اجازه همه POP3S ورودی
برای اینکه سرورتان بتواند به اتصالات POP3S—پورت ۹۹۵—پاسخ دهد، این دستورات را اجرا کنید:
sudo iptables -A INPUT -p tcp --dport 995 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo iptables -A OUTPUT -p tcp --sport 995 -m conntrack --ctstate ESTABLISHED -j ACCEPT
دستور دوم فقط وقتی لازم است که سیاست OUTPUT روی ACCEPT تنظیم نشده باشد.
مبانی NAT و فوروارد پورت
ترجمه آدرس شبکه (NAT) به سرور لینوکسی اجازه میدهد آدرسهای بسته را هنگام عبور ترافیک از طریقش تغییر دهد. NAT معمولاً وقتی استفاده میشود که سروری بهعنوان دروازه بین شبکهها عمل کند یا وقتی لازم باشد ترافیک را از پورتی به میزبان داخلی دیگری فوروارد کنید.
روی اوبونتو 24.04، دستورات iptables معمولاً از طریق لایه سازگاری iptables-nft اجرا میشوند؛ اما سینتکس نمایشدادهشده اینجا همچنان طبق انتظار کار میکند.
فعال کردن فوروارد IP
قبل از پیکربندی NAT یا فوروارد پورت، باید فورواردینگ IPv4 را فعال کنید تا کرنل بتواند بستهها را بین اینترفیسها مسیریابی کند:
sudo sysctl -w net.ipv4.ip_forward=1
برای ماندگار کردن این تغییر بین ریبوتها، /etc/sysctl.conf را ویرایش و مطمئن شوید خط زیر موجود است:
net.ipv4.ip_forward=1
سپس تنظیمات را اعمال کنید:
sudo sysctl -p
پیکربندی NAT پایه (MASQUERADE)
یک راهاندازی رایج NAT، به هاستهای شبکه خصوصی اجازه دسترسی به شبکههای خارجی از طریق سرور دروازه را میدهد.
با فرض:
eth0← اینترفیس خارجیeth1← اینترفیس داخلی
میتوانید NAT مبدأ (Masquerading) را با این فعال کنید:
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
معمولاً به قانون فورواردینگ هم نیاز خواهید داشت:
sudo iptables -A FORWARD -i eth1 -o eth0 -m conntrack --ctstate NEW -j ACCEPT
sudo iptables -A FORWARD -i eth0 -o eth1 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
eth0 و eth1 را با نامهای واقعی اینترفیسهایتان جایگزین کنید. سیستمهای جدید اوبونتو اغلب از نامهایی مثل ens3 یا enp0s3 استفاده میکنند (با ip a چک کنید).
مثال فوروارد پورت پایه
فوروارد پورت (DNAT) اجازه میدهد ترافیک ورودی روی یک اینترفیس و پورت، به میزبان داخلی دیگری ریدایرکت شود.
مثلاً برای فوروارد کردن ترافیک HTTP ورودی روی eth0 به سرور داخلی در 10.0.0.5:
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 10.0.0.5:80
باید فورواردینگ را هم برای آن ترافیک مجاز کنید:
# اجازه ترافیک بازگشتی برای اتصالات established/related
sudo iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# اجازه اتصالات ورودی جدید به وبسرور داخلی
sudo iptables -A FORWARD -p tcp -d 10.0.0.5 --dport 80 -m conntrack --ctstate NEW -j ACCEPT
تأیید قوانین NAT
برای مرور قوانین جدول NAT، اجرا کنید:
sudo iptables -t nat -L -n -v
مثل قوانین دیگر iptables، یادتان باشد اگر میخواهید قوانین بعد از ریبوت باقی بمانند، پیکربندیتان را با netfilter-persistent ذخیره کنید.
iptables در مقابل UFW
اوبونتو شامل UFW (فایروال بدون پیچیدگی) است؛ ابزار مدیریت فایروال سطح-بالاتری که وظایف رایج فایروال را ساده میکند. روی اوبونتو، هر دو UFW و iptables در نهایت سیستم فایروالینگ netfilter کرنل را پیکربندی میکنند. در بیشتر موارد، دستورات iptables از طریق لایه سازگاری iptables-nft اجرا میشوند؛ با nftables بهعنوان بکاند زیرین.
iptables ابزار مدیریت قوانین سطح-پایینی است که مفاهیم netfilter را مستقیم افشا میکند (جدولها، زنجیرها، ترتیب قوانین، تطبیقهای conntrack و targetها). برای سناریوهای پیشرفته بهترین است که نیاز به کنترل دقیق بر ترتیب ارزیابی، شرایط تطبیق پیچیده، زنجیرهای سفارشی، رفتار NAT و فورواردینگ دارید؛ یا هنگام عیبیابی الگوهای ترافیک خیلی خاص. در محیطهای اسکریپتی و ابزارهایی که انتظار دستکاری مستقیم قوانین دارند هم رایج است.
UFW برای سیاستهای سروری سرراست با پیشفرضهای منطقی و رابط قابلفهمتر طراحی شده. معمولاً برای الزامات رایجی مثل «پیشفرض رد ورودی، اجازه SSH، اجازه HTTP/HTTPS» نگهداریاش آسانتر است و روی بسیاری از سیستمها میتواند از پروفایلهای اپلیکیشن استفاده کند. انتخاب خوبی است وقتی پیکربندی سطح-بالای خوانا میخواهید که ممیزیاش از مدیریت قوانین منفرد iptables سادهتر و کمخطاتر باشد.
اینجا جدول مقایسه سریعی آمده:
| جنبه | UFW | iptables |
|---|---|---|
| سطح انتزاع | رابط سطح-بالا و نظرمحور | مدیریت قانون صریح سطح-پایین |
| مناسب برای | سیاستهای فایروال هاستِ رایج روی سرورهای منفرد | کنترل ریزبینانه، زنجیرهای سفارشی، تطبیق پیچیده، NAT/فورواردینگ |
| کنترل ترتیب قوانین | محدود/غیرمستقیم | مستقیم و صریح |
| ممیزیپذیری/خوانایی | معمولاً برای سیاستهای معمول آسانتر | بدون ساختار و مستندسازی دقیق میتواند پیچیده شود |
| ابزارها/یکپارچهسازی | CLI ساده؛ با روندهای کاری معمول اوبونتو خوب یکپارچه میشود | اغلب توسط اسکریپتها، مدیریت پیکربندی، ابزارهای کانتینر/شبکه استفاده میشود |
| بکاند روی اوبونتو 24.04 | netfilter را برنامهریزی میکند (معمولاً از طریق nftables زیرین) | معمولاً لایه سازگاری iptables-nft روی nftables |
| دامهای رایج | فعال کردن قبل از اجازه SSH؛ برداشت اشتباه از پروفایلها | قفل شدن بهدلیل ترتیب/سیاست قوانین؛ ماندگاری پیکربندینشده |
در عمل، UFW اغلب نقطه شروع بهتری روی اوبونتو برای الزامات معمولی است؛ چون شانس اشتباه را کم و تغییرات روتین را سریعتر میکند. iptables وقتی مفید میماند که رفتار ریزبینانهای لازم دارید که تمیز به انتزاعات UFW نگاشت نمیشود؛ وقتی لازم است با مجموعه قوانین و رویههای عملیاتی موجود یکپارچه شوید؛ یا هنگام پیادهسازی الگوهای شبکهای تخصصی (مثلاً قوانین فورواردینگ و NAT پیچیدهتر).
هر ابزاری که انتخاب کنید، قوانین مؤثر را روی سیستمهای پروداکشن تأیید کنید و مطمئن شوید مسیرهای دسترسی حیاتی (مثل SSH) قبل از فعال کردن سیاستهای محدودکننده مجازند. اگر iptables را انتخاب کردید، برای ماندگاری قوانین هم برنامهریزی کنید (مثلاً با iptables-persistent) و هدف قوانین را مستند نمایید تا عیبیابی قابل مدیریت باشد.
نکات عیبیابی و ایمنی
هنگام کار با iptables، اشتباهات کوچک میتوانند بهسرعت دسترسی شبکه را مختل کنند. نکات زیر به عیبیابی مسائل و اعمال امنتر قوانین فایروال روی سیستمهای اوبونتویی کمک میکنند.
جلوگیری از قفل شدن SSH
قبل از اعمال قوانین فایروال محدودکننده روی سرور ریموت، همیشه مطمئن شوید دسترسی SSH (معمولاً پورت ۲۲) صریحاً از IP فعلیتان مجاز است. یک روند کار امنِ رایج:
۱. اول، قانون اجازه SSH را اضافه کنید تا حین اعمال تغییرات دسترسیتان را از دست ندهید.
۲. بعد، هر گونه قانون فایروال اضافیای که برای سرویسهایتان لازم است را اعمال کنید.
۳. در نهایت، تأیید کنید همچنان میتوانید وصل شوید با تست از یک نشست ترمینال دوم، قبل از بستن نشست اصلیتان.
اگر دسترسی را از دست بدهید، ممکن است لازم باشد از کنسول بازیابی یا کنسول وب ارائهدهندهتان برای بازگرداندن اتصال استفاده کنید.
بررسی دقیق ترتیب قوانین
iptables قوانین را در هر زنجیر از بالا به پایین ارزیابی میکند. به همین دلیل:
- قوانین زودتر بر قوانین بعدتر اولویت دارند؛ چون ارزیابی وقتی بستهای با قانونی مطابقت یابد متوقف میشود.
- قانون DROP گستردهای که خیلی زود قرار گرفته میتواند ترافیک را قبل از رسیدن به قانون اجازهِ خاصترِ بلاک کند.
- افزودن قوانین با
-Aآنها را به انتهای زنجیر اضافه میکند؛ در حالی که درج با-Iآنها را زودتر قرار میدهد؛ که میتواند نحوه تطبیق ترافیک را تغییر دهد.
اگر ترافیک طبق انتظار تطبیق نمییابد، ترتیب قوانین را با این مرور کنید:
sudo iptables -L -n --line-numbers
تأیید قوانین بعد از تغییرات
بعد از تغییر قوانین فایروال، همیشه تأیید کنید فعال و با رفتار مورد انتظارند:
sudo iptables -L -n -v
اتصالپذیری سرویسهای حیاتی—بهویژه SSH و هر سرویس وبای که به آن متکیاید—را از نشست دیگری یا از هاست جداگانهای قبل از بستن ترمینال فعلیتان تست کنید.
تأیید ماندگاری بعد از ریبوت
یادتان باشد قوانین iptables بهطور پیشفرض ماندگار نیستند. بعد از ذخیره قوانینتان با netfilter-persistent، سرورتان را ریبوت و تأیید کنید قوانین همچنان بارگذاری شدهاند:
sudo iptables -L -n -v
این مرحله تأیید کمک میکند مطمئن شوید پیکربندی فایروالتان از ریاستارتهای سیستم جان سالم به در میبرد و هیچ قانونی هنگام ذخیره تغییرات جا نمانده است.
مراقب افشای IPv6 باشید
مثالهای این راهنما فقط قوانین IPv4 را پیکربندی میکنند. روی اوبونتو 24.04، IPv6 معمولاً بهطور پیشفرض فعال است. اگر ip6tables یا nftables را پیکربندی نکنید، سرویسها ممکن است همچنان روی IPv6 قابل دسترس باشند—even وقتی IPv4 قفلشده به نظر میرسد.
اگر مطمئن نیستید IPv6 روی سرورتان فعال است یا نه، اینترفیسهای شبکه و سرویسهای شنوندهتان را چک و مطمئن شوید سیاست فایروالتان پروتکلهایی که استفاده میکنید را پوشش میدهد.
وقتی شک دارید، تدریجی تست کنید
هنگام ساخت یا تغییر فایروال:
- قوانین را در گامهای کوچک اعمال کنید تا بتوانید تغییرِ عامل مشکل را ایزوله کنید.
- بعد از هر تغییر تست بگیرید تا تأیید کنید ترافیک حیاتی همچنان مجاز است.
- یک نشست کنسول بکاپ باز نگه دارید تا اگر دسترسی SSH را بلاک کردید راه برگشتی داشته باشید.
- هدف قوانینتان را مستند کنید تا عیبیابی و ممیزیهای آینده آسانتر شوند.
رویکرد تدریجی ریسک قطعیهای تصادفی را کم و دیباگ را بسیار آسانتر میکند.
سوالات متداول
۱. iptables برای چیست؟
iptables برای ساخت و مدیریت قوانین فایروال روی سیستمهای لینوکسی استفاده میشود. میتوانید از آن برای اجازه یا بلاک کردن ترافیک بر اساس معیارهایی مثل پورتها، پروتکلها، آدرسهای IP مبدأ یا مقصد و اینترفیسهای شبکه استفاده کنید. همچنین معمولاً برای مدیریت قوانین NAT در سناریوهایی مثل Masquerading و فوروارد پورت و کنترل رفتار فورواردینگ وقتی میزبانی ترافیک را بین شبکهها مسیریابی میکند، استفاده میشود.
به بیان دیگر، میتواند سرویسهای یک سرور منفرد را محافظت کند (فایروال هاست) و کمک کند قابلیتهای شبکهای به سبک دروازه را در صورت نیاز پیاده کنید.
۲. آیا iptables هنوز امروز مرتبط است؟
بله. بسیاری از سیستمها و ابزارها همچنان به iptables متکیاند؛ و روی اوبونتو 24.04 دستور iptables معمولاً از طریق لایه سازگاری iptables-nft استفاده میشود. همچنان استفادهاش را در خودکارسازی، عیبیابی و محیطهایی که انتظار رابط iptables-سبک دارند میبینید.
با این حال، nftables چارچوب توصیهشده بلندمدت برای فایروالینگ لینوکس است؛ پس ارزش یادگیری دارد اگر سیاستهای جدید را از صفر میسازید.
۳. تفاوت iptables و nftables چیست؟
iptables رابط سنتی برای پیکربندی قوانین فایروال netfilter است؛ در حالی که nftables چارچوب جدیدتری است که طراحی شده جایگزینش شود. روی نسخههای جدید اوبونتو، دستورات iptables اغلب قوانین را در پسزمینه از طریق nftables برنامهریزی میکنند؛ اما مدل پیکربندی و ابزارها متفاوتاند.
در عمل، یعنی ممکن است تفاوتهایی ببینید هنگام بازرسی قوانین (مثلاً با nft list ruleset)—حتی اگر آنها را با iptables ساخته باشید. اگر میخواهید تأیید کنید از کدام بکاند استفاده میکنید، sudo iptables --version را چک کنید و در خروجی روی اوبونتو 24.04 به دنبال nf_tables بگردید.
۴. چطور با iptables اجازه SSH بدهم؟
معمولاً SSH ورودی روی پورت ۲۲ را با قانونی مثل قانون نمایشدادهشده در بخش SSH این راهنما مجاز میکنید. اگر سیاست OUTPUT شما ACCEPT نیست، ممکن است به قانون متناظری هم نیاز داشته باشید که ترافیک خروجیِ established برای پاسخهای SSH را مجاز کند.
اگر از آدرس IP ثابتی وصل میشوید، محدود کردن SSH به IP یا زیرشبکه مبدأ شما پیشفرض امنتری از اجازه SSH از همهجاست. بعد از افزودن قوانین، تأیید کنید با sudo iptables -L -n -v در جای خود قرار دارند و از نشست دوم تست بگیرید قبل از بستن اتصال SSH موجودتان.
۵. چطور با iptables آدرس IP را بلاک کنم؟
میتوانید آدرس IP را با افزودن قانونی برای حذف (یا رد) ترافیک از آن آدرس مبدأ بلاک کنید. این راهنما مثالی شامل حذف همه ترافیک از IP مبدأ خاص با گزینه -s دارد.
اگر میخواهید کلاینت بلافاصله «connection refused» بگیرد بهجای حذف بیصدا، از REJECT بهجای DROP استفاده کنید. اگر IP همچنان عبور میکند، ترتیب قوانین را چک و درج قانون را نزدیک بالای زنجیر با -I در نظر بگیرید تا قبل از قوانین اجازهِ گستردهتر تطبیق یابد.
۶. چطور قوانین iptables را ریست کنم؟
ریست کردن قوانین معمولاً یعنی Flush کردن قوانین فعلی، حذف هر زنجیر سفارشی و بازگرداندن سیاستهای پیشفرض. رویکرد رایج، Flush کردن قوانین (iptables -F) و حذف زنجیرهای تعریفشده توسط کاربر (iptables -X) و سپس تنظیم صریح سیاستهای پیشفرض است.
اگر قوانین NAT پیکربندی کردهاید، ممکن است لازم باشد آنها را هم جداگانه پاک کنید (مثلاً با Flush کردن جدول nat) تا رفتار فورواردینگ قدیمی را جا نگذارید.
روی سرور ریموت در انجام این کار محتاط باشید؛ چون پاک کردن قوانین یا تنظیم سیاست پیشفرض محدودکننده میتواند فوراً نشست SSH شما را قطع کند.
۷. چطور قوانین iptables را ماندگار کنم؟
روی اوبونتو، رویکرد رایج نصب iptables-persistent و ذخیره قوانین با netfilter-persistent است تا هنگام بوت بازیابی شوند. بعد از ذخیره، ریبوت کنید و تأیید کنید قوانین همچنان موجودند تا ماندگاری تایید شود.
روی بسیاری از سیستمها، این قوانین در فایلهایی مثل /etc/iptables/rules.v4 و /etc/iptables/rules.v6 ذخیره میشوند.
اگر قوانین IPv6 جداگانه نگه میدارید، مطمئن شوید آنها را هم ذخیره و بازیابی میکنید؛ چون ماندگاری IPv4 بهتنهایی ترافیک IPv6 را پوشش نمیدهد.
۸. اگر با iptables خودم را قفل کنم چه اتفاقی میافتد؟
اگر SSH یا دسترسی مرتبط را اشتباهی بلاک کنید، ممکن است اتصال ریموت به سرور را از دست بدهید. در آن وضعیت، از کنسول بازیابی یا کنسول وب ارائهدهندهتان برای ورود و اصلاح قوانین فایروال استفاده کنید؛ سپس تأیید کنید دسترسی SSH مجاز است قبل از اعمال مجدد هر سیاست محدودکنندهای.
وقتی دسترسی کنسول را بازگرفتید، فهرست کردن قوانین با شماره خط (مثلاً sudo iptables -L -n --line-numbers) شناسایی و حذف قانونی که باعث قفل شدن شده را آسانتر میکند.
اگر از قوانین ذخیرهشده برای ماندگاری استفاده میکنید، اغلب میتوانید با اصلاح مجموعه قوانین ذخیرهشده و ریبوت بازیابی کنید؛ اما همچنان باید قبل از اتکا به ریبوت، دسترسی را از نشست دوم تأیید کنید.
نتیجهگیری
در این راهنما، دستورات رایج iptables را پوشش دادیم؛ شامل قوانین خط پایه امن، قوانین اجازه خاص-سرویس و مثالهایی برای NAT و فوروارد پورت. چون نسخههای جدید اوبونتو معمولاً iptables را از طریق لایه سازگاری iptables-nft اجرا میکنند، این دستورات همچنان اعمال میشوند؛ اما ارزشش را دارد برای مدیریت بلندمدت فایروال با nftables هم آشنا شوید.
هنگام اعمال تغییرات، یادتان باشد مجموعه قوانین مؤثرتان را تأیید کنید، از قفل شدن SSH اجتناب کنید، IPv6 را در صورت فعال بودنش در نظر بگیرید و ماندگاری را با iptables-persistent و netfilter-persistent پیکربندی کنید تا قوانینتان از ریبوتها جان سالم به در ببرند.




