مقدمه
Iptables یک فایروال است که نقش اساسی در امنیت شبکه برای اکثر سیستم های لینوکس ایفا می کند. در حالی که بسیاری از آموزشهای iptables به شما یاد میدهند که چگونه قوانین فایروال را ایجاد کنید تا سرور خود را ایمن کنید، این یکی بر جنبه متفاوتی از مدیریت فایروال تمرکز دارد فهرست کردن و حذف قوانین است.
در این آموزش، نحوه انجام وظایف iptables زیر را پوشش خواهیم داد:
- لیست کردن قوانین
- پاک کردن شمارشگر بسته و بایت
- حذف قوانین
- فلاش کردن زنجیره (حذف تمام قوانین در یک زنجیره)
- همه زنجیرهها و جداول را پاک کنید، همه زنجیرهها را حذف کنید و تمام ترافیک را بپذیرید
پیش نیازها
این آموزش فرض می کند که شما از یک سرور لینوکس با دستور iptables نصب شده استفاده می کنید و کاربر شما دارای امتیازات sudo است.اگر در مورد این راه اندازی اولیه به کمک نیاز دارید، لطفاً به راهنمای راه اندازی سرور اولیه با اوبونتو 20.04 مراجعه کنید.
فهرست بندی قوانین بر اساس مشخصات
بیایید ابتدا نحوه فهرست کردن قوانین را بررسی کنیم. دو روش مختلف برای مشاهده قوانین 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 را نشان می دهد
- source: آدرس IP منبع یا زیرشبکه ترافیک یا هر جایی
- destination: آدرس 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
و bytes
است.
اکنون که می دانید چگونه قوانین فایروال فعال را به روش های مختلف فهرست کنید، بیایید ببینیم چگونه می توانید شمارنده بسته و بایت را بازنشانی کنید.
تنظیم مجدد تعداد بسته ها و اندازه کل
اگر می خواهید شمارنده های بسته و بایت را برای قوانین خود پاک یا صفر کنید، از گزینه -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
اکنون که میدانید چگونه قوانین فایروال را حذف کنید، بیایید به نحوه پاک کردن زنجیرههای قوانین بپردازیم.
فلاش کردن زنجیره ها
Iptables راهی را برای حذف همه قوانین در یک زنجیره، یا شستشوی یک زنجیره ارائه می دهد. در این بخش انواع روش های انجام این کار را پوشش خواهیم داد.
فلاشینگ یک زنجیره
برای flush کردن یک زنجیره خاص، که تمام قوانین موجود در زنجیره را حذف می کند، می توانید از -F یا معادل -flush، گزینه و نام زنجیره برای flush استفاده کنید.
به عنوان مثال، برای حذف تمام قوانین موجود در زنجیره INPUT
، این دستور را اجرا کنید:
sudo iptables -F INPUT
فلاش کردن تمام زنجیرها
برای فلاش تمام زنجیرهها، که تمام قوانین فایروال را حذف میکند، میتوانید از گزینه -F یا معادل آن -flush به تنهایی استفاده کنید:
sudo iptables -F
فلاش همه قوانین، حذف همه زنجیرهها و پذیرش همه
این بخش به شما نشان می دهد که چگونه تمام قوانین، جداول و زنجیره های فایروال خود را پاک کنید و به تمام ترافیک شبکه اجازه دهید.
ابتدا، سیاست های پیش فرض را برای هر یک از زنجیره های داخلی روی 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 زودگذر است و باید ذخیره شود تا از طریق راه اندازی مجدد سرور ادامه یابد. این موضوع در بخش Saving Rules آموزش Common Firewall Rules and Commands پوشش داده شده است.