iptables یک ابزار فایروال قدرتمند است که در سیستمهای لینوکس برای فیلتر کردن ترافیک شبکه، انجام عملیات NAT (ترجمه آدرس شبکه)، و انجام تنظیمات پیچیدهتر روی بستههای شبکه استفاده میشود. این ابزار بهویژه برای امنیت شبکه و محافظت از سیستمها در برابر حملات مختلف بسیار مهم است.
در این مقاله کانفیگ سرور به نصب، پیکربندی، و مدیریت iptables پرداخته میشود. تمامی دستوراتی که برای بررسی، افزودن و مدیریت قوانین iptables نیاز دارید، بهطور کامل توضیح داده میشود. همچنین به مباحث پیشرفته مانند NAT، Mangle، Raw و نحوه ذخیره و بازیابی قوانین پرداخته خواهد شد.
1. نصب iptables در لینوکس
در اکثر توزیعهای لینوکس مانند Ubuntu، Debian و CentOS، ابزار iptables بهطور پیشفرض نصب شده است. اما اگر این ابزار نصب نشده باشد، میتوانید از دستورات زیر برای نصب آن استفاده کنید.
در Ubuntu/Debian:
برای نصب iptables در توزیعهای مبتنی بر Debian مانند Ubuntu، از دستور زیر استفاده کنید:
sudo apt update
sudo apt install iptables
در CentOS/Red Hat:
برای نصب iptables در توزیعهای مبتنی بر Red Hat مانند CentOS یا RHEL، از دستور زیر استفاده کنید:
sudo yum install iptables
2. ساختار اصلی iptables
iptables از ۴ جدول اصلی برای فیلتر کردن ترافیک شبکه استفاده میکند که هرکدام وظیفه خاص خود را دارند:
- filter: این جدول بهطور پیشفرض برای فیلتر کردن ترافیک ورودی، خروجی و عبوری استفاده میشود.
- nat: این جدول برای ترجمه آدرس شبکه (NAT) و عملیات مربوط به آن است.
- mangle: این جدول برای تغییر ویژگیهای بستهها (مثل تغییر مسیر یا مارکگذاری بستهها) استفاده میشود.
- raw: این جدول برای کنترل و تغییر ویژگیهای بستهها بدون انجام connection tracking است.
3. مفهوم زنجیرهها (Chains) در iptables
در iptables، قوانین در زنجیرهها (chains) اعمال میشوند. هر جدول دارای مجموعهای از زنجیرهها است که بهطور پیشفرض به شرح زیر هستند:
- INPUT: برای ترافیک ورودی به سیستم.
- OUTPUT: برای ترافیک خروجی از سیستم.
- FORWARD: برای ترافیک عبوری که از یک دستگاه به دستگاه دیگر میرود.
- PREROUTING: برای دستکاری بستهها قبل از اینکه به زنجیرههای اصلی مانند INPUT یا FORWARD برسند.
- POSTROUTING: برای دستکاری بستهها پس از عبور از زنجیرههای اصلی.
4. بررسی وضعیت و قوانین موجود در iptables
برای مشاهده وضعیت فعلی iptables و قوانین فعال، از دستورات زیر استفاده کنید:
نمایش تمامی قوانین در جدول filter:
sudo iptables -L
این دستور تمامی قوانین موجود در جدول filter را نمایش میدهد. این نمایش بهصورت پیشفرض برای تمامی زنجیرهها (INPUT، OUTPUT و FORWARD) است.
نمایش قوانین بهصورت مفصل:
اگر میخواهید نمایش قوانین بهصورت مفصل و با جزئیات بیشتری باشد، از دستور زیر استفاده کنید:
sudo iptables -L -v
نمایش قوانین در جدول NAT:
برای مشاهده قوانین موجود در جدول NAT، از دستور زیر استفاده کنید:
sudo iptables -t nat -L
نمایش قوانینی که برای پورت خاصی تنظیم شدهاند:
برای نمایش قوانین مرتبط با یک پورت خاص مانند پورت 80 (HTTP)، از دستور زیر استفاده کنید:
sudo iptables -L -v -n | grep '80'
5. اعمال قوانین جدید در iptables
5.1. فیلتر کردن ترافیک ورودی
برای مسدود کردن ترافیک ورودی از یک آدرس IP خاص، از دستور زیر استفاده میکنیم:
sudo iptables -A INPUT -s 192.168.1.100 -j DROP
در اینجا:
-A INPUT: اضافه کردن قانون به زنجیره INPUT.-s 192.168.1.100: مشخص کردن آدرس IP مبدا.-j DROP: مسدود کردن ترافیک ورودی از این آدرس IP.
5.2. مسدود کردن پورت خاص (مثلاً پورت 22 SSH)
برای مسدود کردن ترافیک ورودی به پورت 22 (SSH)، از دستور زیر استفاده کنید:
sudo iptables -A INPUT -p tcp --dport 22 -j REJECT
در اینجا:
-p tcp: پروتکل TCP را انتخاب میکند.--dport 22: پورت مقصد را به 22 (SSH) تنظیم میکند.-j REJECT: درخواستها را رد میکند.
5.3. اجازه دادن به ترافیک خروجی
برای اجازه دادن به ترافیک خروجی از سیستم، از دستور زیر استفاده کنید:
sudo iptables -A OUTPUT -j ACCEPT
این قانون بهتمامی ترافیکهای خروجی اجازه میدهد که عبور کنند.
6. انجام عملیات NAT (ترجمه آدرس شبکه)
6.1. فعالسازی IP forwarding
قبل از استفاده از NAT، باید IP forwarding را فعال کنید تا بستهها بین شبکهها بتوانند مسیریابی شوند. برای فعالسازی IP forwarding، از دستور زیر استفاده کنید:
echo 1 > /proc/sys/net/ipv4/ip_forward
برای فعالسازی دائم آن، باید تغییرات را در فایل sysctl.conf ذخیره کنید:
sudo sysctl -w net.ipv4.ip_forward=1
6.2. Masquerading (ترجمه آدرس برای دستگاههای شبکه داخلی)
برای استفاده از Masquerading (یعنی تبدیل آدرسهای IP داخلی به آدرس عمومی)، از دستور زیر استفاده کنید:
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
در اینجا:
-t nat: نشاندهنده استفاده از جدول NAT است.-A POSTROUTING: این قانون به زنجیره POSTROUTING اضافه میشود.-o eth0: مشخص میکند که ترافیک از اینترفیسeth0عبور کند.-j MASQUERADE: آدرسهای IP داخلی را با آدرس IP عمومی تغییر میدهد.
6.3. Port Forwarding (ارسال پورتها به مقصد خاص)
برای ارسال ترافیک ورودی از یک پورت خاص به یک سرور داخلی (مثلاً پورت 80 به سرور داخلی با IP 192.168.1.10)، از دستور زیر استفاده کنید:
sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.1.10:80
در اینجا:
--dport 80: ترافیک ورودی به پورت 80 را فیلتر میکند.-j DNAT: انجام Destination NAT.--to-destination 192.168.1.10:80: ترافیک را به مقصد جدید هدایت میکند.
7. ذخیره تغییرات iptables
برای ذخیره تغییرات و اطمینان از اینکه پس از ریستارت سیستم، قوانین شما حفظ شوند، از دستورات زیر استفاده کنید.
در Ubuntu/Debian:
sudo iptables-save > /etc/iptables/rules.v4
در CentOS/Red Hat:
sudo service iptables save
8. استفاده از iptables برای محدود کردن دسترسی از IPهای خاص
در بعضی موارد، ممکن است بخواهید تنها دسترسی به سرور را از برخی آدرسهای IP خاص محدود کنید و بقیه را مسدود کنید. این روش میتواند برای حفاظت از سرور در برابر حملات DDoS یا جلوگیری از دسترسی غیرمجاز مفید باشد.
8.1. محدود کردن دسترسی از یک IP خاص
برای اجازه دادن به تنها یک آدرس IP خاص برای دسترسی به سرور، میتوانید از دستور زیر استفاده کنید:
sudo iptables -A INPUT -s 192.168.1.100 -j ACCEPT
sudo iptables -A INPUT -j DROP
در اینجا، تنها آدرس IP 192.168.1.100 اجازه دسترسی به سرور را دارد و تمامی دیگر آدرسها مسدود خواهند شد.
8.2. محدود کردن دسترسی به پورتها از یک رنج IP خاص
در صورتی که بخواهید دسترسی به پورت خاصی را از یک رنج IP مشخص محدود کنید، از دستور زیر استفاده کنید:
sudo iptables -A INPUT -p tcp --dport 22 -s 192.168.1.0/24 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 22 -j DROP
در اینجا، فقط IPهای موجود در رنج 192.168.1.0/24 میتوانند به پورت SSH (پورت 22) دسترسی داشته باشند.
9. انجام عملیات پیشرفته با iptables
در این بخش، به بررسی ویژگیهای پیشرفته iptables مانند Mangle, Raw, Limitations, و Connection Tracking خواهیم پرداخت.
9.1. استفاده از جدول Mangle برای تغییر بستهها
جدول mangle در iptables برای تغییر ویژگیهای بستهها مانند تنظیم مارکها، تغییر مسیر بستهها و حتی تغییر مشخصات دیگر بستهها استفاده میشود. در اینجا برخی از کاربردهای آن را بررسی میکنیم.
9.1.1. تغییر مارک بستهها
شما میتوانید با استفاده از جدول mangle و قوانینی مانند زیر مارک بستهها را تغییر دهید:
sudo iptables -t mangle -A PREROUTING -p tcp --dport 80 -j MARK --set-mark 1
این دستور به بستههایی که به پورت 80 وارد میشوند، مارک 1 را اختصاص میدهد.
9.1.2. تغییر TOS (Type of Service)
در اینجا یک نمونه دستور برای تغییر TOS در بستهها آمده است:
sudo iptables -t mangle -A POSTROUTING -p tcp --dport 80 -j TOS --set-tos 0x10
این دستور به بستههای TCP که به پورت 80 میروند، TOS با مقدار 0x10 اختصاص میدهد.
9.2. استفاده از جدول Raw برای دسترسی بدون اتصال (Connection Tracking)
جدول raw در iptables برای دسترسی به بستهها قبل از انجام عملیات connection tracking استفاده میشود. این جدول بهویژه زمانی مفید است که بخواهید از connection tracking جلوگیری کنید تا عملکرد سیستم بهبود یابد.
9.2.1. غیر فعال کردن Connection Tracking برای بستههای خاص
در اینجا نحوه غیر فعال کردن connection tracking برای بستهها آمده است:
sudo iptables -t raw -A PREROUTING -p tcp --dport 80 -j NOTRACK
این دستور باعث میشود بستههایی که به پورت 80 میروند، از connection tracking رد شوند.
9.3. محدود کردن سرعت (Rate Limiting) با iptables
در صورتی که بخواهید محدودیتی برای تعداد درخواستها در زمان خاصی اعمال کنید (مانند محدود کردن درخواستهای ورودی به سرور)، میتوانید از ویژگی limit استفاده کنید.
9.3.1. محدود کردن درخواستها به پورت خاص
برای محدود کردن تعداد درخواستهای ورودی به پورت 80 (HTTP)، از دستور زیر استفاده کنید:
sudo iptables -A INPUT -p tcp --dport 80 -m limit --limit 10/minute -j ACCEPT
این دستور محدودیت ۱۰ درخواست در دقیقه را برای پورت 80 تعیین میکند.
9.4. Connection Tracking در iptables
connection tracking به iptables این امکان را میدهد که وضعیت هر اتصال را پیگیری کند (برای مثال، آیا یک اتصال جدید است یا یک اتصال قبلی ادامه دارد).
9.4.1. استفاده از RELATED و ESTABLISHED
برای مجاز کردن بستههایی که بخشی از یک اتصال معتبر هستند (یعنی بستههای ESTABLISHED یا RELATED)، از دستور زیر استفاده کنید:
sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
این دستور تمامی بستههایی که جزو اتصالات فعال هستند را مجاز میکند.
9.4.2. مسدود کردن بستههایی که در حال شروع یک اتصال جدید هستند
برای مسدود کردن تمامی اتصالات جدیدی که به سیستم وارد میشوند، میتوانید از دستور زیر استفاده کنید:
sudo iptables -A INPUT -m state --state NEW -j DROP
این دستور تمامی بستههایی که مربوط به اتصالات جدید هستند را مسدود میکند.
10. بررسی، حذف، و ذخیره قوانین
10.1. حذف قوانین
اگر نیاز به حذف یک قانون خاص دارید، میتوانید از دستور -D برای حذف استفاده کنید. بهطور مثال:
sudo iptables -D INPUT -s 192.168.1.100 -j DROP
این دستور قانون مسدود کردن ترافیک از آدرس IP 192.168.1.100 را حذف میکند.
10.2. نمایش قوانین خاص
برای جستجو و نمایش قوانین خاص، از دستور grep استفاده کنید. بهطور مثال، برای پیدا کردن قوانینی که مربوط به پورت 22 (SSH) هستند، دستور زیر را اجرا کنید:
sudo iptables -L -v -n | grep '22'
10.3. ذخیره قوانین iptables
پس از اعمال تغییرات در قوانین iptables، شما باید آنها را ذخیره کنید تا پس از ریستارت سیستم، قوانین اعمال شده حفظ شوند.
در Ubuntu/Debian:
sudo iptables-save > /etc/iptables/rules.v4
در CentOS/Red Hat:
sudo service iptables save
10.4. بازیابی قوانین
برای بازیابی قوانین ذخیره شده، از دستور زیر استفاده کنید:
در Ubuntu/Debian:
sudo iptables-restore < /etc/iptables/rules.v4
در CentOS/Red Hat:
sudo service iptables restart
11. مدیریت iptables با Systemd
در نسخههای جدید لینوکس که از systemd استفاده میکنند، برای مدیریت iptables میتوانید از سرویس iptables برای بارگذاری قوانین استفاده کنید.
11.1. فعال کردن iptables با systemd
برای فعال کردن iptables در بوت سیستم، از دستور زیر استفاده کنید:
sudo systemctl enable iptables
11.2. راهاندازی مجدد iptables با systemd
برای راهاندازی مجدد iptables (بارگذاری مجدد قوانین)، از دستور زیر استفاده کنید:
sudo systemctl restart iptables
12. نکات امنیتی و بهترین شیوهها برای استفاده از iptables
- کمترین امتیاز (Least Privilege): هرگاه ممکن است، تنها قوانین ضروری را برای دسترسی به پورتها و سرویسها اعمال کنید.
- گزارشگیری (Logging): از iptables میتوانید برای گزارشگیری ترافیک مشکوک استفاده کنید. بهطور مثال، دستور زیر را برای گزارشگیری ترافیک ورودی به پورت 80 اضافه کنید:
sudo iptables -A INPUT -p tcp --dport 80 -j LOG --log-prefix "HTTP Access: "
- سیاست پیشفرض DROP: برای افزایش امنیت، بهتر است که سیاست پیشفرض را بر روی DROP قرار دهید و تنها ترافیک مجاز را اجازه دهید. بهطور مثال:
sudo iptables -P INPUT DROP
- فیلتر کردن ترافیک DNS: میتوانید ترافیک DNS را فیلتر کنید تا فقط درخواستهای از سرورهای خاص DNS را مجاز کنید:
sudo iptables -A INPUT -p udp --dport 53 -s 8.8.8.8 -j ACCEPT
12.1 استفاده از iptables برای فیلتر کردن بر اساس MAC Address
گاهی لازم است که دسترسی به شبکه را فقط به دستگاههای خاصی محدود کنیم. با استفاده از MAC Address Filtering میتوان این کار را انجام داد.
🔹 اجازه دسترسی به شبکه فقط برای یک MAC خاص:
sudo iptables -A INPUT -m mac --mac-source 00:1A:2B:3C:4D:5E -j ACCEPT
sudo iptables -A INPUT -j DROP✅ این قانون تنها به دستگاهی که MAC آن 00:1A:2B:3C:4D:5E است، اجازه اتصال میدهد و بقیه را مسدود میکند.
13. استفاده از Iptables برای محدود کردن ترافیک با استفاده از Layer 7 (L7) Filtering
L7 filtering یا فیلتر کردن در لایه 7، به شما امکان میدهد که ترافیک را بر اساس محتوای بستهها و نوع پروتکل (مثل HTTP، FTP، DNS و غیره) فیلتر کنید. این ویژگی میتواند به شما کمک کند که علاوه بر آدرسهای IP و پورتها، محتوای درخواستهای شبکه را نیز تجزیه و تحلیل کرده و فیلتر کنید.
13.1. نصب ماژولهای لازم برای فیلترینگ L7
برای استفاده از L7 filtering، ابتدا باید بسته xtables-addons را نصب کنید که به شما این امکان را میدهد تا فیلترهایی مانند string match و regexp را برای بررسی محتویات بستهها اعمال کنید.
برای Ubuntu/Debian:
sudo apt-get install xtables-addons-common iptables
برای CentOS/RHEL:
sudo yum install xtables-addons iptables
13.2. فیلتر کردن درخواستهای HTTP (بر اساس محتوا)
برای فیلتر کردن درخواستهای HTTP و بررسی محتوای آنها، میتوانید از ماژول string استفاده کنید. برای مثال، اگر بخواهید تمامی درخواستهایی که در محتوای آنها عبارت “test” وجود دارد را مسدود کنید، میتوانید از دستور زیر استفاده کنید:
sudo iptables -A INPUT -p tcp --dport 80 -m string --string "test" --algo bm -j DROP
این دستور تمامی درخواستهایی که در هدر یا بدنه HTTP شامل عبارت “test” باشند را مسدود میکند.
13.3. فیلتر کردن ترافیک FTP
در صورتی که بخواهید ترافیک FTP را محدود کنید، میتوانید از ویژگی L7 filtering برای بررسی پروتکل FTP استفاده کنید:
sudo iptables -A INPUT -p tcp --dport 21 -m string --string "USER" --algo bm -j DROP
این دستور تمامی درخواستهای FTP که در آنها دستور USER وجود داشته باشد را مسدود میکند.
14. استفاده از Iptables برای محدود کردن و مدیریت ترافیک VPN
در بعضی مواقع، شما ممکن است بخواهید ترافیک ورودی از VPNها یا شبکههای خصوصی مجازی را محدود یا مدیریت کنید. به کمک iptables میتوانید ترافیک VPN را به طور خاص فیلتر کنید و از حملات و دسترسیهای غیرمجاز جلوگیری نمایید.
14.1. شناسایی ترافیک VPN
ترافیک VPN معمولاً از طریق پورتهای خاصی مانند UDP 1194 برای OpenVPN یا UDP 500 برای IPSec عبور میکند. شما میتوانید با استفاده از iptables این ترافیکها را فیلتر کنید.
برای محدود کردن دسترسی VPN، ابتدا باید ترافیکهای ورودی از پورتهای خاص VPN را شناسایی کرده و سپس اقدامات لازم را انجام دهید.
sudo iptables -A INPUT -p udp --dport 1194 -j ACCEPT
sudo iptables -A INPUT -p udp --dport 500 -j ACCEPT
14.2. مسدود کردن ترافیک VPN از منابع مشکوک
برای جلوگیری از اتصالهای VPN غیرمجاز از منابع مشکوک، میتوانید از لیست سفید و سیاه استفاده کنید. به عنوان مثال، برای مسدود کردن ترافیک VPN از یک رنج IP خاص، میتوانید از دستور زیر استفاده کنید:
sudo iptables -A INPUT -p udp --dport 1194 -s 192.168.1.0/24 -j DROP
این دستور تمامی اتصالهای ورودی VPN از شبکه 192.168.1.0/24 به پورت OpenVPN (پورت 1194) را مسدود میکند.
14.3. محدود کردن دسترسی VPN برای کاربران خاص
اگر شما میخواهید تنها به کاربران خاص از طریق VPN اجازه دسترسی دهید، میتوانید فیلترهایی تنظیم کنید که فقط به IPهای خاص اجازه دسترسی به پورتهای VPN را بدهند:
sudo iptables -A INPUT -p udp --dport 1194 -s 203.0.113.10 -j ACCEPT
sudo iptables -A INPUT -p udp --dport 1194 -j DROP
در اینجا، تنها IP 203.0.113.10 میتواند به پورت OpenVPN دسترسی داشته باشد و تمامی دیگر IPها مسدود خواهند شد.
این دو ویژگی جدید، فیلترینگ در لایه 7 (L7 Filtering) و مدیریت ترافیک VPN، به شما این امکان را میدهند که کنترل دقیقتری بر ترافیک شبکه و دسترسیهای غیرمجاز داشته باشید.
15. استفاده از iptables برای مسدود کردن ترافیک از کشورها (Geo-blocking)
در این بخش، قصد داریم نحوه مسدود کردن ترافیک ورودی از کشورهای خاص با استفاده از iptables را بررسی کنیم. برای انجام این کار، باید از ماژولهای اضافی مانند xt_geoip استفاده کنید که امکان مسدود کردن یا اجازه دادن به ترافیک بر اساس موقعیت جغرافیایی را فراهم میکند.
15.1. نصب ماژول GeoIP
برای استفاده از Geo-blocking، ابتدا باید GeoIP را نصب کنید. در بیشتر سیستمهای لینوکس، ابتدا باید بستههای زیر را نصب کنید:
برای Ubuntu/Debian:
sudo apt-get install geoip-bin xtables-addons-common
برای CentOS/RHEL:
sudo yum install xtables-addons iptables
15.2. بارگذاری پایگاه داده GeoIP
پس از نصب، باید پایگاه دادههای GeoIP را بارگذاری کنید. شما میتوانید پایگاه دادهها را از وبسایت رسمی GeoIP دانلود کنید. برای مثال:
wget http://geolite.maxmind.com/download/geoip/database/GeoLite2-Country.mmdb.gz
gunzip GeoLite2-Country.mmdb.gz
15.3. مسدود کردن ترافیک از کشور خاص
بعد از نصب و بارگذاری پایگاه داده GeoIP، میتوانید ترافیک ورودی از کشورهای خاص را مسدود کنید. برای مسدود کردن تمامی ترافیک از کشور خاص، از دستور زیر استفاده کنید (در این مثال ترافیک از چین مسدود میشود):
sudo iptables -A INPUT -m geoip --src-cc CN -j DROP
در اینجا، تمامی ترافیک ورودی از کشور چین (کد کشور CN) مسدود میشود.
15.4. اجازه دادن به ترافیک از یک کشور خاص
برعکس، اگر بخواهید تنها به ترافیک از یک کشور خاص اجازه دهید، میتوانید از دستور زیر استفاده کنید:
sudo iptables -A INPUT -m geoip --src-cc US -j ACCEPT
sudo iptables -A INPUT -j DROP
در اینجا، تنها ترافیک از کشور ایالات متحده (کد کشور US) مجاز است و تمامی دیگر ترافیکها مسدود میشوند.
16. جمعبندی
در این مقاله، ما به آموزش کامل iptables پرداختهایم و تمامی قابلیتها از جمله فیلتر کردن ترافیک، استفاده از NAT، انجام عملیات پیشرفته و ذخیره قوانین را بررسی کردهایم. این تنظیمات به شما این امکان را میدهد که بهطور کامل بر روی ترافیک شبکه خود کنترل داشته باشید و امنیت سیستم خود را بهطور مؤثر افزایش دهید. همچنین ویژگیهای پیشرفتهای همچون NAT، Mangle، Raw، Rate Limiting و Connection Tracking را مورد بررسی قرار دادیم.
با استفاده از این ابزار، میتوانید کنترل دقیقی بر ترافیک ورودی، خروجی و عبوری در شبکه خود داشته باشید و امنیت سیستم را بهطور مؤثر افزایش دهید.




