معرفی

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

در این آموزش، نحوه انجام وظایف iptables زیر را توضیح خواهیم داد:

  • قوانین را فهرست کنید
  • پاک کردن شمارشگر بسته و بایت
  • قوانین را حذف کنید
  • زنجیرهای فلاش (حذف تمام قوانین در یک زنجیره)
  • همه زنجیره‌ها و جداول را پاک کنید، همه زنجیره‌ها را حذف کنید و تمام ترافیک را بپذیرید

پیش نیازها

این آموزش فرض می کند که شما از یک سرور لینوکس با دستور iptables نصب شده استفاده می کنید و کاربر شما دارای امتیازات sudo است.

قوانین فهرست بندی بر اساس مشخصات

بیایید ابتدا نحوه فهرست کردن قوانین را بررسی کنیم. دو روش مختلف برای مشاهده قوانین iptables فعال وجود دارد: در یک جدول یا به عنوان لیستی از مشخصات قوانین. هر دو روش تقریباً اطلاعات یکسانی را در قالب های مختلف ارائه می دهند.

برای فهرست کردن همه قوانین فعال iptables بر اساس مشخصات، دستور iptables را با گزینه -S اجرا کنید:

sudo iptables -S

Output
-P INPUT DROP
-P FORWARD DROP
-P OUTPUT ACCEPT
-N ICMP
-N TCP
-N UDP
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate INVALID -j DROP
-A INPUT -p udp -m conntrack --ctstate NEW -j UDP
-A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -m conntrack --ctstate NEW -j TCP
-A INPUT -p icmp -m conntrack --ctstate NEW -j ICMP
-A INPUT -p udp -j REJECT --reject-with icmp-port-unreachable
-A INPUT -p tcp -j REJECT --reject-with tcp-reset
-A INPUT -j REJECT --reject-with icmp-proto-unreachable
-A TCP -p tcp -m tcp --dport 22 -j ACCEPT
...

همانطور که می بینید، خروجی دقیقاً مانند دستوراتی است که برای ایجاد آنها استفاده شده است، بدون دستور iptables قبلی. اگر تا به حال از iptables-persistent یا iptables save استفاده کرده باشید، این نیز شبیه فایل های پیکربندی قوانین iptables خواهد بود.

فهرست کردن یک زنجیره خاص

اگر می خواهید خروجی را به یک زنجیره خاص (INPUT، OUTPUT، TCP و غیره) محدود کنید، می توانید نام زنجیره را مستقیماً بعد از گزینه -S تعیین کنید. به عنوان مثال، برای نشان دادن تمام مشخصات قوانین در زنجیره TCP، این دستور را اجرا کنید:

sudo iptables -S TCP

Output
-N TCP
-A TCP -p tcp -m tcp --dport 22 -j ACCEPT

حال بیایید نگاهی به راه جایگزین برای مشاهده قوانین فعال iptables بیاندازیم: به عنوان جدول قوانین.

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

فهرست کردن قوانین iptables در نمای جدول می تواند برای مقایسه قوانین مختلف با یکدیگر مفید باشد. برای خروجی تمام قوانین iptables فعال در یک جدول، دستور iptables را با گزینه -L اجرا کنید:

sudo iptables -L

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

اگر می خواهید خروجی را به یک زنجیره خاص (INPUT، OUTPUT، TCP و غیره) محدود کنید، می توانید نام زنجیره را مستقیماً بعد از گزینه -L تعیین کنید.

بیایید به یک مثال زنجیره ورودی نگاهی بیندازیم:

sudo iptables -L INPUT

Output
Chain INPUT (policy DROP)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
ACCEPT     all  --  anywhere             anywhere
DROP       all  --  anywhere             anywhere             ctstate INVALID
UDP        udp  --  anywhere             anywhere             ctstate NEW
TCP        tcp  --  anywhere             anywhere             tcp flags:FIN,SYN,RST,ACK/SYN ctstate NEW
ICMP       icmp --  anywhere             anywhere             ctstate NEW
REJECT     udp  --  anywhere             anywhere             reject-with icmp-port-unreachable
REJECT     tcp  --  anywhere             anywhere             reject-with tcp-reset
REJECT     all  --  anywhere             anywhere             reject-with icmp-proto-unreachable

خط اول خروجی نام زنجیره (در این مورد INPUT) و به دنبال آن خط مشی پیش فرض آن (DROP) را نشان می دهد. خط بعدی شامل سرصفحه های هر ستون در جدول است و با قوانین زنجیره دنبال می شود. بیایید به آنچه که هر سرصفحه نشان می دهد بپردازیم:

  • target: اگر بسته ای با قانون مطابقت داشته باشد، هدف مشخص می کند که با آن چه کاری باید انجام شود. به عنوان مثال، یک بسته را می توان پذیرفت، رها کرد، ثبت کرد یا به زنجیره دیگری فرستاد تا با قوانین بیشتری مقایسه شود.
  • prot: پروتکل، مانند tcp، udp، icmp یا همه
  • opt: به ندرت استفاده می شود، این ستون گزینه های IP را نشان می دهد
  • منبع: آدرس IP منبع یا زیرشبکه ترافیک یا هر جایی
  • مقصد: آدرس IP مقصد یا زیرشبکه ترافیک یا هر جایی

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

نمایش تعداد بسته ها و اندازه کل

هنگام فهرست کردن قوانین iptables، می‌توان تعداد بسته‌ها و اندازه کل بسته‌ها را در بایت نشان داد که با هر قانون خاص مطابقت دارد. این اغلب هنگام تلاش برای بدست آوردن یک ایده کلی از اینکه کدام قوانین با بسته ها مطابقت دارند مفید است. برای این کار از گزینه های -L و -v با هم استفاده کنید.

به عنوان مثال، بیایید دوباره به زنجیره INPUT با گزینه -v نگاه کنیم:

sudo iptables -L INPUT -v

Output
Chain INPUT (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
 284K   42M ACCEPT     all  --  any    any     anywhere             anywhere             ctstate RELATED,ESTABLISHED
    0     0 ACCEPT     all  --  lo     any     anywhere             anywhere
    0     0 DROP       all  --  any    any     anywhere             anywhere             ctstate INVALID
  396 63275 UDP        udp  --  any    any     anywhere             anywhere             ctstate NEW
17067 1005K TCP        tcp  --  any    any     anywhere             anywhere             tcp flags:FIN,SYN,RST,ACK/SYN ctstate NEW
 2410  154K ICMP       icmp --  any    any     anywhere             anywhere             ctstate NEW
  396 63275 REJECT     udp  --  any    any     anywhere             anywhere             reject-with icmp-port-unreachable
 2916  179K REJECT     all  --  any    any     anywhere             anywhere             reject-with icmp-proto-unreachable
    0     0 ACCEPT     tcp  --  any    any     anywhere             anywhere             tcp dpt:ssh ctstate NEW,ESTABLISHED

توجه داشته باشید که فهرست اکنون دارای دو ستون اضافی، pkts و بایت است.

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

تنظیم مجدد تعداد بسته ها و اندازه کل

اگر می خواهید شمارنده بسته و بایت را برای قوانین خود پاک کنید یا صفر کنید، از گزینه -Z استفاده کنید. همچنین در صورت راه‌اندازی مجدد، مجدداً تنظیم می‌شوند. اگر می خواهید ببینید آیا سرور شما ترافیک جدیدی دریافت می کند که با قوانین موجود شما مطابقت دارد، این کار مفید است.

برای پاک کردن شمارنده ها برای تمام زنجیره ها و قوانین، از گزینه -Z به تنهایی استفاده کنید:

sudo iptables -Z

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

sudo iptables -Z INPUT

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

sudo iptables -Z INPUT 1

اکنون که می‌دانید چگونه بسته‌های iptables و شمارنده‌های بایت را بازنشانی کنید، بیایید به دو روشی که می‌توان برای حذف آنها استفاده کرد نگاهی بیندازیم.

حذف قوانین بر اساس مشخصات

یکی از راه‌های حذف قوانین iptables، تعیین قوانین است. برای انجام این کار، می توانید دستور iptables را با گزینه -D و سپس مشخصات قانون اجرا کنید. اگر می خواهید قوانین را با استفاده از این روش حذف کنید، می توانید از خروجی لیست قوانین، iptables -S برای کمک استفاده کنید.

به عنوان مثال، اگر می خواهید قانونی را که بسته های ورودی نامعتبر را حذف می کند (-A INPUT -m conntrack –ctstate INVALID -j DROP) حذف کنید، می توانید این دستور را اجرا کنید:

sudo iptables -D INPUT -m conntrack –ctstate INVALID -j DROP

توجه داشته باشید که گزینه -A که برای نشان دادن موقعیت قانون در زمان ایجاد استفاده می شود، در اینجا باید حذف شود.

حذف قوانین بر اساس زنجیره و شماره

راه دیگر برای حذف قوانین iptables توسط زنجیره و شماره خط آن است. برای تعیین شماره خط یک قانون، قوانین را در قالب جدول فهرست کنید و گزینه –line-numbers را اضافه کنید:

sudo iptables -L –line-numbers

Output
Chain INPUT (policy DROP)
num  target     prot opt source               destination
1    ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
2    ACCEPT     all  --  anywhere             anywhere
3    DROP       all  --  anywhere             anywhere             ctstate INVALID
4    UDP        udp  --  anywhere             anywhere             ctstate NEW
5    TCP        tcp  --  anywhere             anywhere             tcp flags:FIN,SYN,RST,ACK/SYN ctstate NEW
6    ICMP       icmp --  anywhere             anywhere             ctstate NEW
7    REJECT     udp  --  anywhere             anywhere             reject-with icmp-port-unreachable
8    REJECT     tcp  --  anywhere             anywhere             reject-with tcp-reset
9    REJECT     all  --  anywhere             anywhere             reject-with icmp-proto-unreachable
10   ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:ssh ctstate NEW,ESTABLISHED
...

این شماره خط را به هر ردیف قانون اضافه می کند که با سربرگ num نشان داده شده است.

هنگامی که می دانید کدام قانون را می خواهید حذف کنید، شماره زنجیره و خط قانون را یادداشت کنید. سپس دستور iptables -D و سپس شماره زنجیره و قانون را اجرا کنید.

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

sudo iptables -D INPUT 3

اکنون که می‌دانید چگونه قوانین دیوار آتش را حذف کنید، بیایید به نحوه پاک کردن زنجیره‌های قوانین بپردازیم.

 Flushing یک زنجیر

Iptables راهی را برای حذف تمام قوانین در یک زنجیره، یا flush کردن یک زنجیره ارائه می دهد. در این بخش به انواع روش های انجام این کار پرداخته می شود.

Flushing کردن یک زنجیره خاص

برای flush کردن یک زنجیره خاص، که تمام قوانین موجود در زنجیره را حذف می کند، می توانید از -F یا معادل آن –flush، گزینه و نام زنجیره برای flush استفاده کنید.

به عنوان مثال، برای حذف تمام قوانین موجود در زنجیره INPUT، این دستور را اجرا کنید:

sudo iptables -F INPUT

Flushing کردن تمام زنجیرها

برای flush کردن تمام زنجیره‌ها، که تمام قوانین فایروال را حذف می‌کند، می‌توانید از گزینه -F یا معادل آن -flush استفاده کنید:

sudo iptables -F

Flushing کردن همه قوانین، حذف همه زنجیره ها و پذیرش همه

این بخش به شما نشان می دهد که چگونه تمام قوانین، جداول و زنجیره های فایروال خود را پاک کنید و به تمام ترافیک شبکه اجازه دهید.

ابتدا سیاست های پیش فرض را برای هر یک از زنجیره های داخلی روی ACCEPT تنظیم کنید. دلیل اصلی انجام این کار این است که اطمینان حاصل شود که از سرور خود از طریق SSH قفل نخواهید شد:

sudo iptables -P INPUT ACCEPT
sudo iptables -P FORWARD ACCEPT
sudo iptables -P OUTPUT ACCEPT

سپس جداول nat و mangle را بشویید، همه زنجیره‌ها (-F) را پاک کنید و تمام زنجیره‌های غیر پیش‌فرض (-X) را حذف کنید:

sudo iptables -t nat -F
sudo iptables -t mangle -F
sudo iptables -F
sudo iptables -X

فایروال شما اکنون به تمام ترافیک شبکه اجازه می دهد. اگر اکنون قوانین خود را فهرست کنید، خواهید دید که هیچ کدام وجود ندارد و تنها سه زنجیره پیش فرض (INPUT، FORWARD و OUTPUT) باقی می مانند.

نتیجه

پس از گذراندن این آموزش، نحوه فهرست کردن و حذف قوانین فایروال iptables خود را مشاهده کرده اید.

به یاد داشته باشید که هر تغییر iptables از طریق دستور iptables زودگذر است و باید ذخیره شود تا از طریق راه اندازی مجدد سرور ادامه یابد. این در بخش قوانین ذخیره سازی در آموزش قوانین و دستورات دیوار آتش مشترک پوشش داده شده است.


سرور مجازی آلمان

سرور مجازی آمریکا

سرور مجازی فرانسه

سرور مجازی کانادا

سرور مجازی لهستان

سرور مجازی هلند

سرور مجازی انگلیس

برچسب‌ها:, , , , , , ,