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

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

به خاطر داشته باشید که ترتیب قوانین شما مهم است. همه دستورها iptables از گزینه -A برای الحاق قانون جدید به انتهای یک زنجیره استفاده می‌کنند. اگر می‌خواهید آن را در جای دیگری از زنجیره قرار دهید، می‌توانید از گزینه -I استفاده کنید که به شما امکان می‌دهد موقعیت قانون جدید را مشخص کنید (یا با عدم تعیین یک عدد برای قانون، آن را در ابتدای زنجیره قرار دهید.)

توجه داشته باشید، هنگام کار با فایروال‌ها، توجه کنید که با مسدود کردن ترافیک SSH (به طور پیش فرض پورت 22) ابرک خود را قفل نکنید. اگر به دلیل تنظیمات فایروال خود دسترسی‌تان را از دست دادید، باید از طریق کنسول ابرک به آن متصل شوید. هنگامی که از طریق کنسول متصل شدید، می‌توانید قوانین فایروال خود را تغییر دهید تا به SSH دسترسی داشته باشید (یا اجازه دهید تمام ترافیک مجاز باشد). اگر قوانین فایروال ذخیره‌شده‌ی شما اجازه‌ی دسترسی به SSH را می‌دهد، روش دیگر، راه‌اندازی مجدد سرور است.

به یاد داشته باشید که می‌توانید مجموعه قوانین iptables فعلی خود را با sudo iptables -S و sudo iptables -L بررسی کنید.

ذخیره قوانین

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

در Ubuntu، یک راه برای ذخیره‌ی قوانین iptables استفاده از بسته iptables-persistent است. می‌توانید آن را با apt نصب کنید:

sudo apt install iptables-persistent

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

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

sudo netfilter-persistent save

فهرست و حذف کردن قوانین

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

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

این بخش شامل انواع دستورهای iptablesبرای ایجاد قوانینی است که در اکثر سرورها مفید هستند.

پذیرش اتصالات Loopback

رابط Loopback که به آن lo نیز می‌گویند، چیزی است که یک کامپیوتر برای ارسال اتصال‌های شبکه به خود استفاده می‌کند. به عنوان مثال، اگر localhostیا 127.0.0.1 را پینگ کنید، سرور شما با استفاده از Loopback خود را پینگ می‌کند. اگر اپلیکیشن سرورتان را برای اتصال به سرور پایگاه داده، با آدرس لوکال هاست پیکربندی کنید نیز رابط Loopbackاستفاده می‌شود. به این ترتیب، باید مطمین شوید که فایروال شما اجازه‌ی این اتصال را می‌دهد.

برای پذیرش تمام ترافیک در رابط Loopback، این دستورها را اجرا کنید:

sudo iptables -A INPUT -i lo -j ACCEPT
sudo iptables -A OUTPUT -o lo -j ACCEPT

اجازه دادن به اتصالات ورودی ایجاد شده و مرتبط

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

sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

اجازه دادن به اتصالات خروجی ایجاد شده

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

sudo iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED -j ACCEPT

اجازه دادن به شبکه داخلی برای دسترسی به شبکه خارجی

با فرض اینکه eth0 شبکه خارجی شما باشد و eth1 شبکه داخلی شما، این دستور به شبکه داخلی شما اجازه می‌دهد تا به شبکه خارجی دسترسی داشته باشد:

sudo iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT

حذف بسته‌های نامعتبر

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

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مبدا را می‌توان در هر قانون فایروال، از جمله قانون مجاز، مشخص کرد.

اگر می‌خواهید به جای آن اتصال را رد کنید، که به درخواست اتصال با خطای «Connection Refused» پاسخ می‌دهد، «DROP» را با «REJECT» جایگزین کنید:

sudo iptables -A INPUT -s 203.0.113.51 -j REJECT

مسدود کردن اتصال به یک اینترفیس

برای مسدود کردن اتصال از یک آدرس IP خاص، به عنوان مثال. 203.0.113.51، به یک اینترفیس خاص، به عنوان مثال eth0 از این دستور استفاده کنید:

iptables -A INPUT -i eth0 -s 203.0.113.51 -j DROP

سرویس SSH

اگر از کنسول ابرک برای اتصال به آن استفاده نمی‌کنید، احتمالن می‌خواهید اتصال SSH ورودی (پورت 22) را مجاز کنید تا بتوانید به سرور خود متصل شوید و آن را مدیریت کنید. این بخش نحوه پیکربندی فایروال برای 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

دستور دوم که ترافیک خروجی اتصالات SSH ایجاد شده را مجاز می‌کند، تنها زمانی ضروری است که سیاست پیش‌فرض OUTPUT روی ACCEPT تنظیم نشده باشد.

مجاز کردن SSH ورودی از آدرس IP یا Subnet خاص

برای مجاز کردن اتصال SSH ورودی از یک آدرس IPیا Subnet خاص، مبدا را مشخص کنید. به عنوان مثال، اگر می‌خواهید به کل /24203.0.113.0 اجازه‌ی اتصال SSH دهید، این دستورها را اجرا کنید:

sudo iptables -A INPUT -p tcp -s 203.0.113.0/24 --dport 22 -m conntrack --ctstate NEW,ESABLISHED -j ACCEPT
sudo iptables -A OUTPUT -p tcp --sport 22 -m conntrack --ctstate ESTABLISHED -j ACCEPT

دستور دوم که ترافیک خروجی اتصال SSH ایجاد شده را مجاز می‌کند، تنها زمانی ضروری است که سیاست OUTPUT روی ACCEPT تنظیم نشده باشد.

مجاز کردن SSH خروجی

اگر سیاست OUTPUT فایروال شما روی ACCEPT تنظیم نشده است و می‌خواهید اتصال SSH خروجی را مجاز کنید—سرور شما اتصال SSH را به سرور دیگری آغاز کند—می‌توانید این دستورها را اجرا کنید:

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

دستور دوم، که ترافیک خروجی اتصال SSH ایجاد شده را مجاز می‌کند، تنها زمانی ضروری است که سیاست OUTPUT روی ACCEPT تنظیم نشده باشد.

مجاز کردن Rsync ورودی از آدرس IP یا Subnet خاص

Rsync که روی پورت 873 اجرا می‌شود، می‌تواند برای انتقال فایل‌ها از یک سرور به سرور دیگر استفاده شود.

برای اجازه دادن به اتصالات Rsync ورودی از یک آدرس IPیا Subnet خاص، آدرس IP مبدا و پورت مقصد را مشخص کنید. به عنوان مثال، اگر می‌خواهید به /24203.0.113.0 اجازه دهید تا بتواند با سرور شما sync شود، این دستورها را اجرا کنید:

sudo iptables -A INPUT -p tcp -s 203.0.113.0/24 --dport 873 -m conntrack --ctstate NEW,ESABLISHED -j ACCEPT
sudo iptables -A OUTPUT -p tcp --sport 873 -m conntrack --ctstate ESTABLISHED -j ACCEPT

دستور دوم، که ترافیک خروجی اتصالات rsync ایجاد شده را مجاز می‌کند، تنها زمانی ضروری است که سیاست OUTPUT روی ACCEPT تنظیم نشده باشد.

سرویس وب‌سرور

وب‌سرورهایی مانند Apache و Nginx معمولن به درخواست‌ها روی پورت 80 و 443 برای اتصالات HTTP و HTTPS گوش می‌دهند. اگر سیاست پیش‌فرض شما برای ترافیک ورودی روی dropیا deny تنظیم شده باشد، لازم است قوانینی ایجاد کنید که به ابرک شما اجازه ‌دهد به آن درخواست‌ها پاسخ دهد.

اجازه دادن به همه ترافیک HTTP ورودی

برای اجازه دادن به تمام اتصالات HTTP ورودی (پورت 80) این دستورها را اجرا کنید:

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

دستور دوم، که ترافیک خروجی اتصالات HTTP ایجاد شده را مجاز می‌کند، تنها زمانی ضروری است که سیاست OUTPUT روی ACCEPT تنظیم نشده باشد.

اجازه دادن به همه درخواست‌های HTTPS ورودی

برای اجازه دادن به تمام اتصالات HTTPS ورودی (پورت 443) این دستورها را اجرا کنید:

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

دستور دوم، که ترافیک خروجی اتصالات HTTPS ایجاد شده را مجاز می‌کند، تنها زمانی ضروری است که سیاست OUTPUT روی ACCEPT تنظیم نشده باشد.

اجازه دادن به همه ترافیک HTTP و HTTPS ورودی

اگر می‌خواهید ترافیک HTTP و HTTPS را مجاز کنید، می‌توانید از ماژول multiport برای ایجاد قانونی استفاده کنید که هر دو پورت را مجاز می‌کند. برای مجاز کردن تمام اتصالات HTTP و HTTPS ورودی (پورت 443) این دستورها را اجرا کنید:

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 --dports 80,443 -m conntrack --ctstate ESTABLISHED -j ACCEPT

دستور دوم، که به ترافیک خروجی اتصالات HTTP و HTTPS ایجاد شده را مجاز می‌کند، تنها زمانی ضروری است که سیاست OUTPUT روی ACCEPT تنظیم نشده باشد.