Iptables یک برنامه فایروال برای توزیع‌های لینوکس است. در این آموزش، نگاهی خلاصه خواهیم داشت به فرمان‌های iptables که برای سناریوهای روزمره و ایجاد قواعد فایروال کاربرد خواهند داشت. در این رابطه، به مثال‌هایی در رابطه با دادن مجوّز و یا بلوکه‌کردن سرویس‌ها مطابق پورت، رابط شبکه و یا آدرس‌های IP منبع خواهیم پرداخت.

نحوه استفاده از این راهنما

بسیاری از قواعدی که در اینجا توضیح داده می‌شوند، بر این فرض است که iptables برای ممانعت از ترافیک ورودی تنظیم شده است و شما قصد دارید که به ترافیک به صورت گزینشی، مجوّز بدهید.

از بخش‌هایی استفاده کنید که در زمینه‌های موردنیازتان کاربردی خواهند بود. بسیاری از بخش‌ها شاید در برخی پروژه‌ها کاربردی نباشند. ضمن اینکه می‌توانید از مثال‌ها به صورت مستقل استفاده کنید.

مثال‌های فرمان‌های iptables را حتماً مطابق با پروژه خودتان تنظیم کنید.

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

نکته:

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

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

حالا بیایید نگاهی داشته باشیم به فرمان‌های iptables

ذخیره‌سازی قواعد

قواعد Iptables به صورت موقتی هستند. به این معنا که برای دائمی‌شدن بعد از راه‌اندازی دوباره سیستم، می‌بایست آنها را به صورت دستی ذخیره کرد.

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

sudo apt install iptables-persistent

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

sudo netfilter-persistent save

سایر توزیع‌های لینوکس ممکن است روش خاص خود را برای دائمی‌کردن تغییرات iptables داشته باشند. اطلاعات مرتبط با این موضوع به راحتی از اسناد راهنمای هر توزیع قابل‌دسترس خواهند بود.

قواعد کلی مفید

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

مجوّز ارتباطات Loopback

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

باری قبول تمام ترافیک‌ها در رابط loopback، فرمان‌های زیر را اجرا کنید.

sudo iptables -A INPUT -i lo -j ACCEPT

sudo iptables -A OUTPUT -o lo -j ACCEPT

مجوّز به ارتباط‌های ایجاد شده ورودی

با توجه به اینکه ترافیک شبکه به صورت کلی باید دو طرفه (ورودی و خروجی) باشد، رویکرد منطقی این است که یک قاعده فایروال برای دادن مجوّز به ترافیک ایجادی مرتبط داشته باشیم. بر این اساس، سرور به ترافیک بازگشتی که توسط خودِ سرور پایه‌ریزی شده، اجازه ورود خواهد داد. برای این منظور از فرمان زیر استفاده می‌کنیم.

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

مجوّز به ارتباط‌های خروجی

شاید بخواهید به تمام ترافیک‌های خروجی ایجاد شده مجوّز بدهید؛ چیزی که در واقع، پاسخی به ترافیک‌های ورودی خواهد بود. این فرمان اجازه این کار را به شما خواهد داد.

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

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

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

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

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

برخی بسته‌های ترافیک شبکه با عنوان نامعتبر یا invalid برچسب‌گذاری می‌شوند. داشتن و ذخیره این بسته‌ها شاید تنها در برخی موارد مفید باشد. برای حذف آنها به روش زیر اقدام می‌کنیم.

sudo iptables -A INPUT -m conntrack --ctstate INVALID -j DROP

مسدود کردن یک آدرس IP

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

sudo iptables -A INPUT -s 203.0.113.51 -j DROP

در این مثال، عبارت -s 203.0.113.51 یک آدرس IP منبع را مشخص می‌کند. آدرس IP منبع می‌تواند در هر قاعده فایروال و از جمله allow تعریف شود.

در همین حال، اگر بخواهید جلوی یک ارتباط را بگیرید، به طوری که در پاسخ به درخواست ارتباط، پیغام خطای “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

این در واقع، همان مثال قبلی با اضافه‌شدن -i eth0 است. رابط کاربری شبکه می‌تواند در هر کدام از قواعد فایروال تعریف شود و روشی بسیار مناسب برای محدود‌سازی قاعده به شبکه خاص است.

سرویس: 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 یا زیرشبکه خاص

به منظور ایجاد مجوّز برای ارتباط‌های ورودی 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

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

دادن مجوّز به SSH خروجی

در صورتی که وضعیت OUTPUT فایروال به صورت ACCEPT تنظیم نشده باشد و بخواهید به ترافیک‌های SSH خروجی (ارتباط SSH ایجادی سرور شما به سرور دیگر) مجوّز بدهید، می‌توانید از فرمان‌های iptables زیر استفاده کنید.

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

برای اینکه ارتباط‌های 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

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

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

وب‌سرورهایی مانند آپاچی و Nginx معمولاً درخواست‌های HTTP و HTTPS را در پورت‌های 80 و 443 دریافت می‌کنند. اگر سیاست پیشفرض فایروال برای ترافیک ورود ی به صورت 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 را دریافت کنید، از فرمان‌های iptables استفاده نمایید.

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 یک قاعده برای هر دو پورت ایجاد نمایید. برای این منظور، فرمان‌های زیر مورد استفاده قرار می‌گیرند.

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 تنظیم نشده باشد.

سرویس: MySQL

MySQL ارتباطات کلاینت را از طریق پورت 3306 دریافت می‌کند. اگر سرور پایگاه داده 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

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

دادن مجوّز MySQL برای رابط کاربری خاص در شبکه

برای اینکه ارتباط‌های MySQL بتوانند با یک رابط کاربری خاص از شبکه برقرار شوند، از فرمان‌های زیر استفاده کنید. به عنوان مثال، رابط کاربری خصوصی شبکه eth1 را درنظر بگیرید.

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

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

سرویس: PostgreSQL

PostgreSQLارتباط‌های کلاینت در پورت 5432 را دریافت می‌کند. در صورتی که سرور پایگاه داده 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

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

دادن مجوّز ارتباط PostgreSQL برای رابط کاربری خاص در شبکه

برای اینکه ارتباط‌های MySQL بتوانند با یک رابط کاربری خاص از شبکه مانند eth1 برقرار شوند، از فرمان‌های زیر استفاده کنید.

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

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

 سرویس: Mail

سرورهای پست الکترونیکی مانند Sendmail و Postfix، بسته به نوع پروتکل مورد استفاده برای ارسال ایمیل، داده‌های پورت‌های مختلفی را دریافت می‌کنند. در صورتی که از یک سرور ایمیل استفاده می‌کنید، ابتدا مشخص کنید که کدام پروتکل را به کار می‌برید و به ترافیک متناسب با آن مجوّز بدهید. ضمن اینکه در اینجا به شما نشان می‌دهیم که چگونه می‌توان جلوی ترافیک خروجی ایمیل SMTP را گرفت.

بلوکه‌کردن ایمیل خروجی ایمیل SMTP

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

sudo iptables -A OUTPUT -p tcp --dport 25 -j REJECT

در نتیجه، iptables تمام ترافیک خروجی در پورت 25 را مسدود می‌کند. در صورتی که مسدودسازی یک سرویس با شماره پورت دیگر مدّنظر باشد، می‌توانید شماره پورت را در فرمان بالا جایگزین کنید.

دادن مجوّز به کل ترافیک ورودی SMTP

برای اینکه سرور بتواند به ارتباط‌هیا SMTP در پورت 25 پاسخ دهد، از فرمان‌های iptables زیر استفاده کنید.

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

فرمان دوم که امکان ترافیک خروجی ارتباط‌های SMTP  را فراهم می‌کند، تنها زمانی ضروری است که وضعیت 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

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

مجوّز به تمام ورودی‌های IMAPS

برای اینکه سرور شما بتواند پاسخ مناسب به ارتباط‌های IMAPS در پورت 993 داشته باشد، فرمان‌های زیر را اجرا کنید.

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

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

مجوّز به تمام ارتباط‌های ورودی POP3

به منظور دادن مجوّز به سرور برای پاسخ به ارتباط‌های ورودی POP3 در پورت 110، فرمان‌های iptables زیر را اجرا نمایید.

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

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

مجوّز به کل ترافیک ورودی POP3S

برای دادن مجوّز به سرور به منظور پاسخ به ارتباط‌های POP3S در پورت 995، فرمان‌های زیر را اجرا کنید.

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 تنظیم نشده باشد. این فرمان امکان ترافیک خروجی ارتباط‌های POP3S را فراهم می‌کند.

جمع‌بندی

در این مطلب، تعداد زیادی از فرمان‌های iptables را که ممکن است به صورت روزمره کاربرد داشته باشند را مرور کردیم. البته باید درنظر داشته باشید که iptables یک ابزار فوق‌العاده انعطاف‌پذیر است و می‌توان با ترکیب فرمان‌ها و گزینه‌ها مختلف به هدف موردنظرتان برسید.