نحوه نوشتن قانون در iptables
تاریخچه iptables
در واقع تاریخ برای iptables از آنجایی شروع میشود که در نسخه1.1 کرنل لینوکس از ابزار ipfilter برای فیلتر کردن بستهها و از ابزار ipfwadm برای اعمال قوانین استفاده شد. بعدها در کرنل 2.2 لینوکس ابزاری دیگری به اسم IPChains معرفی شد که در کرنل 2.4 جای خود را به iptables داد. این فایروال که توسط تیم netfilter ارایه شده است، در حال حاضر به صورت گستردهای استفاده میشود و از هر دو پروتکل ipv4 و ipv6 پشتیبانی میکند .
با توجه به اینکه iptables از لحاظ عملکردی یک فایروال عالی برای سیستم های لینوکسی محسوب می شود. به همین دلیل در بیشتر توزیعهای لینوکسی به صورت پیش فرض نصب شده و قابل استفاده میباشد. این نرم افزار در اصل رابط اصلی برای ارتباط با قلابها یا hookهای اصلی netfilter در سطح کرنل لینوکس میباشد. میتوان گفت قانونهایی (Rules) که ایجاد میشوند در واقع از hookهای netfilter برای بررسی پکتها و تطبیق آنها با این قوانین استفاده میکنند. iptables در واقع یه نرم افزار userspace میباشد که با فریم ورک netfilter برای بررسی بستههای شبکه کار میکند. این نرم افزار زمانی که بستهای وارد شبکه میشود وارد عمل شده و با استفاده از hookهای netfilter بسته را با قوانین نوشته شده تطبیق میدهد و با توجه به قانون منطبق شده با آن بسته برخورد میکند.
قلابهای Netfilter
- NF_IP_PRE_ROUTING
- NF_IP_LOCAL_IN
- NF_IP_FORWARD
- NF_IP_POST_ROUTING
- NF_IP_LOCAL_OUT
جدولهای iptables
- Filter
- NAT
- Mangle
- RAW
- Security
iptables از جدولهای مختلفی برای کنترل ترافیکهای ورودی و خروجی از طریق ارتباط با هوکهای Netfilter استفاده میکند. در واقع جدولها از مجموعهای از chainهای پیش فرض و تعریف شده توسط کاربر تشکیل میشوند. chainها نیز شامل مجموعهای از قوانین میباشند. زمانی که بستهای دریافت میشود، ابتدا جدول مربوط به بسته پیدا و با توجه به جریان بسته، قوانین موجود در chain با بسته تطابق داده میشود. در واقع این chainها هستند که تعیین میکنند قوانین چه زمانی برای ارزیابی بستهها استفاده شوند و قوانین نیز تعیین کننده نوع رفتار با بستههای دریافتی میباشند(reject, drop , accept وغیره).
جدول Filter
جدول فیلتر صرفا برای اعطا و یا عدم اعطای مجوز به ترافیکهای TCP/IP ورودی و خروجی سیستم استفاده میشود. این جدول به صورت پیشفرض شامل سه Chain اصلی INPUT برای ترافیک ورودی سیستم، OUTPUT برای ترافیک خروجی از سیستم و FORWARD برای ترافیک forward شده از سیستم میباشد.
جدول NAT
در این جدول قوانین مرتبط با تغییرات آدرسهای IP یا پورتهای بستهها ورودی و خروجی به سیستم قرار میگیرد. این جدول نیز همانند جدول Filter به صورت پیشفرض شامل سه Chain اصلی PREROUTING برای اعمال تغییرات در بستههای ورودی به سیستم، POSTROUTING برای بسته خروجی از سیستم و OUTPUT میباشد.
جدول Mangle
ازاین جدول معمولا برای انجام عملیات بررسی بستهها قبل از ورود به سایر جداول استفاده و تغییراتی مورد نظر از طریق آن بر روی هدر بستههای ip اعمال میشود. این جدول عمدتا برای انجام سه هدف TOS و TTL و Mark استفاده میشود. Chainهای جدول Mangel.
- INPUT
- OUTPUT
- FORWARD
- PREROUTING
- POSTROUTING
جدول RAW
از جدول RAW برای ایجاد معافیت برای بستهها ازاعمال Connection tracking بر روی آنها استفاده میشود. این کار موجب آفزایش کارایی سیستم میشود.برای استفاده از قوانین این جدول از تارگت NOTRACK استفاده میشود.
نحوهی کار با قوانین iptables
نکتهی مهم در مورد کار با قوانین iptables این است که حتما بایستی از مجوز کاربر root یا کابران Sudoer استفاده شود.
نحوه نمایش قوانین جداول
Iranshell@iptables:~$ [ iptables -L ] [ chain ] [ rule-number ] [ -t table]
Iranshell@iptables:~$ iptabeles -L -t nat
Iranshell@iptables:~$ iptabeles -L INPUT -t nat
Iranshell@iptables:~$ iptabeles -L INPUT 10 -t nat
اگر داخل دستوری نام جدول را مشخص نکنیم، به صورت پیش فرض برای آن مقدار فیلتر در نظر گرفته میشود و مقادیر داخل جدول فیلتر نمایش داده خواهد شد.به همراه دستور iptables پارامترهای زیادی استفاده شود که در زیر تعدادی از آنها را توضیح میدهیم.
پارامترهای پایهای
-j, –jump
با استفاده از این پارامتر در واقع هدف سیاست و عملی که قرار است بر روی بسته انجام شود را مشخص میکنیم.
- ACCEPT (برای صدور اجازه عبور به ترافیک ورودی یا خروجی از این پارامتر استفاده میشود.)
- DROP (برای صدور عدم اجازه عبور به ترافیک ورودی با خروجی از این مقدار استفاده میشود)
- LOG ( فقط برای لاگ گیری از ترافیک استفاده میشود و هیچ عملی دیگری انجام نمیدهد.)
- REDIRECT ( برای تغییر مسیر ترافیک ازمبدای مشخص به مقصدی مشخص استفاده میشود.)
- REJECT ( برای مسدود کردن ترافیک با ارسال کد خطا به مبدا ترافیک استفاده میشود.)
- RETURN ()
- QUEUE (برای واگذار کردن ترافیک به یک پردازش دیگر استفاده میشود.)
- MARK
SNAT (برای تغییر آدرس مبدا به آدرسی مشخص استفاده میشود.) - DNAT (برای تغییر آدرس مقصد بسته استفاده میشود.)
- MASQUERADE (برای تغییر آدرس مبدا به آدرس اینترفیس خروجی استفاده میشود.)
فرمت Rule
-A, –Append
از این پارمتر برای اضافه کردن قانون مورد نظر به انتهای قوانین موجود در Chain مورد نظر استفاده میکنیم.
Iranshell@iptables:~$ iptables -A [ chain ] [ rule ]
Iranshell@iptables:~$ iptables -A INPUT -j DROP
–line-numbers
از پارامتر line-numbers برای نمایش عدد مربوط به هر قانون در لیست قوانین یک Chain استفاده میکنیم.
Iranshell@iptables:~$ iptables -L --line-numbers
Iranshell@iptables:~$ iptables -L OUTPUT -t nat --line-numbers
-D, -delete
از این فلگ برای حذف یک قانون در chain مورد نظرمان استفاده میکنیم.
Iranshell@iptables:~$ iptables -D INPUT 1
-I, –insert
از این پارامتر برای اضافه کردن یک قانون در سطر اول قوانین یک Chain استفاده میکنیم.
Iranshell@iptables:~$ iptables -I INPUT -p TCP --dport 8091 -j DROP
-F, –Flush
از این پارامتر برای پاک کردن تمام قوانین اعمال شده در جداول و Chainهای مختلف iptables استفاده میکنیم.
Iranshell@iptables:~$ iptables -F
Iranshell@iptables:~$ iptables -F INPUT
Iranshell@iptables:~$ iptables -F -t nat
Iranshell@iptables:~$ iptables -F INPUT -t nat
-R, –replace
برای تغییر پارامترها یا جایگزین کردن یک قانون در جدول از فلگ R استفاده میکنیم.
Iranshell@iptables:~$ iptables -R INPUT 1 -j ACCEPT
-S, –list-rules
از این فلگ جهت نمایش لیست کردن کل قوانین موجود استفاده میکنیم. همچنین میتوانیم از آن برای نمایش یک قانون درChain یک جدول نیز استفاده کنیم.
Iranshell@iptables:~$ iptables -S
Iranshell@iptables:~$ iptables -t nat -S
Iranshell@iptables:~$ iptables -t nat -S INPUT 4
-p, –protocol
از پارامتر p برای مشخص کردن نوع پروتکل در داخل قانون استفاده میکنیم که مقدار آن می تواند نام یا شماره پروتکل باشد. برای استثنا کردن نیز از علامت ! به همراه پارامتر p استفاده میکنیم.
Iranshell@iptables:~$ iptables -A INPUT -p icmp -j ACCEPT
Iranshell@iptables:~$ iptables -A INPUT !p icmp -j ACCEPT
-s, –source
از پارامتر s برای مشخص کردن مبدا بستههای ورودی و خروجی استفاده میکنیم. در این قسمت میتوانیم از آدرس ip یا hostname برای مقدار این پارامتر استفاده کنیم. همچنین برای استثنا کردن نیز از علامت ! به همراه پارامتر s استفاده میکنیم.
نحوه نوشتن Rule
برای مسدود کردن ترافیک icmp از یک مبدا (یک هاست یا یک رنج آی پی) خاص از دستورات زیر میتوانیم استفاده کنیم.
Iranshell@iptables:~$ iptables -A INPUT -p icmp -s 192.168.3.10 -j DROP
Iranshell@iptables:~$ iptables -A INPUT -p icmp -s 192.168.3.0/24 -j DROP
Iranshell@iptables:~$ iptables -A INPUT -p icmp -s 192.168.3.10/255.255.255.0 -j DROP
Iranshell@iptables:~$ iptables -A INPUT -p icmp -s Iranshell -j DROP
-d, –Distination
در نوشتن قوانین از پارامتر d برای مشخص کردن مقصد بستهها استفاده میکنیم.
-i , –in-interface
با استفاده از این پارامتر میتوانیم کارت شبکه ورودی را مشخص کنیم. نکته مهم در خصوص این پارامتر این است که این پارامتر فقط در Chainهای INPUT ،FORWARD ،PREROUTING قابل استفاده میباشد.
Iranshell@iptables:~$ iptables -A INPUT -i eth0 -p icmp -j ACCEPT
-o , –out-interface
این پارامتر مشابه پارامتر قبلی عمل میکند با این تفاوت از آن برای مشخص کردن اینترفیس خروجی استفاده میکنیم. این فلگ در Chainهای OUTPUT ،FORWARD ،POSTROUTING قابل استفاده میباشد.
-m, –match match
در نوشتن سیاست از این پارامتر برای تعریف ماژولهای iptable استفاده میکنیم. برای نوشتن یک Rule میتوانیم از ماژول های tcp, udp, udplite, icmp, esp, ah, sct یا از پارامتر all استفاده کنیم.
Iranshell@iptables:~$ iptables -A OUTPUT -m --ttl 60 -j ACCEPT
-v , –verbose
این پارامتر در هنگام لیست کردن سیاستهای یک جدول یه یک Chain باعث میشود خروجی با جزییات بیشتری برایمان نمایش داده شود.
Iranshell@iptables:~$ iptables -L -t nat -v
چند مثال از قوانین iptables
ایجاد دسترسی به سرویسهای خود فایروال
1- از قانون زیر برای باز کردن پورت SSH سیستم برای دسترسی کاربران راه دور استفاده میکنیم.
Iranshell@iptables:~$ iptables -A INPUT -p tcp --dport 22 -j ACCEPT
Iranshell@iptables:~$ iptables -A OUTPUT -p tcp --sport 22 -m conntrack --ctstate ESTABLISHED -j ACCEPT
2- از قانون زیر برای باز کردن icmp سیستم از سمت بیرون به سمت سیستم استفاده میکنیم.
Iranshell@iptables:~$ iptables -A OUTPUT -p --icmp-type echo-request -j ACCEPT
Iranshell@iptables:~$ iptables -A INPUT -p --icmp-type echo-reply -j ACCEPT
3- از قانون زیر برای باز کردن icmp سیستم از سمت سیستم به سمت بیرون استفاده میکنیم.
Iranshell@iptables:~$ iptables -A OUTPUT -p --icmp-type echo-reply -j ACCEPT
Iranshell@iptables:~$ iptables -A INPUT -p --icmp-type echo-request -j ACCEPT
ایجاد اجازه دسترسی به وب سرور داخلی از اینترنت
4- برای قرار دادن وب سرور داخلی با آدرس 192.168.3.10 در بستر اینترنت، می توانیم از دستورات زیر استفاده و از طریق IP سمت اینترنت فایروال (1.1.1.1) به کاربران اجازه دسترسی به سرور داخلی را فراهم کنیم (NAT ،Publish).
Iranshell@iptables:~$ iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 80 -d 1.1.1.1 -j DNAT --to 192.168.3.10
برای اینکه به Route برگشت از سمت سرور نیاز نباشد میتوانیم با استفاده از rule زیر آدرس مبدا بسته را به آدرس داخلی فایروال ترجمه کنیم.
Iranshell@iptables:~$ iptables -t nat -A POSTROUTING -o eth1 -p tcp --dport 80 -d 192.168.3.10 -j SNAT --to-source 192.168.3.1
برای اینکه بستههای مربوط به درخواستهای سرور وب از فایروال عبور کند به Ruleهای زیر نیاز داریم.
Iranshell@iptables:~$ iptables -A FORWARD -i eth0 -o eth1 -p tcp --syn --dport 80 -m conntrack --ctstate NEW -j ACCEPT
Iranshell@iptables:~$ iptables -A FORWARD -o eth0 -i eth1 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
Iranshell@iptables:~$iptables -A FORWARD -i eth0 -o eth1 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
برای مسدود کردن باقی ترافیک از دستور زیر استفاده میکنیم.
Iranshell@iptables:~$ iptables -P FORWARD DROP
ایجاد اجازه دسترسی کاربران داخلی به اینترنت
5- برای اینکه کاربران شبکه داخلی بتوانند به اینترنت دسترسی داشته باشند باید از یکی از قانونهای زیر استفاده کنیم.
Iranshell@iptables:~$ iptables -t nat -A POSTROUTING -o eth1 -j SNAT --to 1.1.1.1
یا
Iranshell@iptables:~$ iptables -t nat -A POSTROUTING -o eth1 -j masquerade
در سیستمهای لینوکسی باید برای فعا سازی مسیریابی باید با استفاده یکی از دو راهکار زیر مقدار ip-forward به 1 تغییر دهیم.
راهکار اول
Iranshell@iptables:~$ echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward
راهکار دوم
Iranshell@iptables:~$ sudo nano /etc/sysctl.conf
net.ipv4.ip_forward=1
Iranshell@iptables:~$ sudo sysctl -p
Iranshell@iptables:~$ sudo sysctl --system
دیدگاهتان را بنویسید