بررسی فایروال Iptables بهمراه یکسری نکات و دستورات
Iptables چیست؟
Iptables یا Netfilter محبوب ترین و پر استفاده ترین فایروال لینوکسی مبتنی بر خط فرمان است. iptables خط اول دفاعی سرورهای لینوکس است و بسیاری از مدیران سرورها از آن برای کانفیگ و ایجاد تنظیمات در سرورهای لینوکس استفاده میکنند.
IPTables فایروال پیش فرض سیستم لینوکس می باشد، از قدرت بالایی بهره برداری میکند که پایداری بسیاری دارد که قبل از آن به اسم IPchange بود. با قدرتمند کردن و اضافه کردن بعضی از دستورات به IPTables تبدیل شد.
iptables بسته ها را درون پشته شبکه در داخل هسته لینوکس فیلتر میکند. iptables معمولا header هر بسته را بررسی می کند و به محتوای بسته اهمیتی نمی دهد بنابراین از سرعت بسیار زیادی برخوردار است و معمولا تاثیر چندانی در کاهش سرعت پاسخگویی سیستم ندارد، iptables همچنین قادر است یک رشته را درون بسته ها جستجو کند، البته این کار تاحدودی باعث کاهش سرعت سیستم خواهد شد.
iptables امکانات زیادی در اختیار یک مدیر سرور می دهد ، بوسیله iptables میتوان پکت ها را بر اساس پروتکل مورد استفاده در ارتباط ، شماره ip گیرنده و فرستنده ، شماره پورت مورد در ارتباط ، مک آدرس و آدرس فیزیکی سیستم ها ، دامنه ای از آدرس های ip ، زمان برقراری ارتباط ، بخش های مختلفی از بسته ها و تنظیمات IPSec ، طول بسته ها ، انتخاب تصادفی بسته ها ، انتخاب n امین بسته ، کاربر یا گروه ارسال کننده بسته ، پردازش ارسال کننده بسته ، بخش های TOS و TTL هدر ip و تعداد ارتباطات در یک بازه زمانی را کنترل و فیلتر کرد.
توسط iptables شما می توانید با توجه به نیاز های خود به ایجاد،حذف یا ویرایش قوانین فیلتر کردن بسته ها بپردازید و حتی میتوانید مجموعه قوانین جاری را بصورت لیست مشاهده کنید . iptables قابلیت انعطاف پذیری بالایی دارد و میتوان با استفاده از آن نتایج کار آن را بر اساس هر قانون مشاهده یا ویرایش کرد. iptables همچنین از قابلیت پشتیبان گیری و بازیابی قوانین با استفاده از فایل ها برخوردار است و از Load balancing نیز پشتیبانی می کند.
قوانین iptable بسته به نوع کاربرد در جداول filter table ، nat tableوmangling table و در زنجیر(chain)هایی از دستورات دسته بندی می شوند. وظیفه filter table سیاست گذاری و دادن مجوز برای ورود و خروج بسته های TCP/IP به سیستم است. این جدول شامل سه زنجیر INPUT برای ترافیک ورودی به سیستم ، OUTPUT برای ترافیک خروجی از سیستم و FORWARD برای ترافیک فوروارد شده از سیستم است.
وظیفه nat table سیاست گذاری و دادن مجوز عملیات routing است و قوانین مربوط به تغییر آدرس IP و یا پورت در جدول nat قرار می گیرند. این جدول شامل سه زنجیر PREROUTING برای شبکه مقصد در ترافیک ورودی به سیستم ، POSTROUTING برای شبکه مبدا ترافیک خروجی از سیستم و OUTPUT است.
از جدول mangle می توان برای مارک دار کردن بسته ها و عملیات بررسی بسته ها قبل از ورود به جداول بالاتر استفاده کرد . کلیه اعمال پیشرفته مربوط به دستکاری فیلدهای header در بسته های ارسالی در شبکه توسط قوانین موجود در این جدول صورت می گیرد.
قلاب یا hook
هر پکتی که وارد فرایند پردازش میشود با یکی از hook ها در kernel قلاب (hook) میشود. بسته به نوع هر پکت input, output و یا forward قلابی به آن اختصاص داده میشود.
در ادامه قلاب هاییکه در پشته پروتکلی شبکه تعریف می شوند به اختصار بیان شده است:
- NF_IP_PRE_ROUTING
این قلاب توسط هر ترافیک ورودی بلافاصله پس از وارد شدن به پشته شبکه ایجاد خواهد شد. این قلاب قبل از هر تصمیم گیری مسیریابی در مورد ارسال بسته ساخته شده و پردازش می شود.
- NF_IP_LOCAL_IN
این قلاب بر روی بسته هایی اعمال می شود که مقصد نهایی آنها سیستم لوکال (local) است (Input).
- NF_IP_FORWARD
این قلاب بر روی بسته هایی اعمال می شود که مقصد نهایی آنها هاست دیگری می باشد (forward).
- NF_IP_LOCAL_OUT
این قلاب بر روی بسته هایی خروجی از سیستم اعمال می شود (Output).
- NF_IP_POST_ROUTING
این قلاب بر روی بسته های خروجی یا forward شده درست قبل از خروج از سیستم اعمال می شود.
به منظور اولویت بندی اجرای ماژول های هسته بر روی قلاب ها می بایست یک شماره اولویتی برای هر قلاب متصل به آن تعیین شود.
فایروال iptables با استفاده از جداولی برای سازماندهی قوانین عمل میکند. این جداول قوانین را طبق نوع تصمیمات طبقه بندی میکند. به عنوان مثال، اگر یک قاعده مربوط به ترجمه آدرس شبکه باشد، آن را به nat table تبدیل می کند.
در هر جدول iptables، قوانین در زنجیره های (chain) جداگانه سازماندهی می شوند. در حالی که جداول iptables یک سری قوانین کلی را شامل می شوند، زنجیره های مرتبط با قلاب های netfilter نیز آنها را کنترل می کنند. به طور اساسی chain ها تعیین می کنند که قوانین چه زمانی ارزیابی شوند.
همانطور که در ادامه می توان دید، نام های هر chain در netfilter با نام hook آنها مرتبط است:
- PREROUTING
آغاز راه اندازی توسط قلاب NF_IP_PRE_ROUTING
- INPUT
آغاز راه اندازی توسط قلاب NF_IP_LOCAL_IN
- FORWARD
آغاز راه اندازی توسط قلاب NF_IP_FORWARD
- OUTPUT
آغاز راه اندازی توسط قلاب NF_IP_LOCAL_OUT
- POSTROUTING
آغاز راه اندازی توسط قلاب NF_IP_POST_ROUTING
تنها پنج hook در kernel مربوط به netfilter وجود دارد، بنابراین chain ای از Tableهای متعدد در هر یک از hook ها ثبت می شود.به عنوان مثال، سه Table دارای زنجیرهای PREROUTING هستند. هنگامی که این زنجیرها در hook NF_IP_PRE_ROUTING مربوطه ثبت می شوند، آنها یک اولویت را تعیین می کنند که هر کدام یک table’s PREROUTING chain نامیده می شود.
هر یک از قوانین درون زنجیره PREROUTING با بالاترین اولویت قبل از حرکت به زنجیره PREROUTING بعدی ارزیابی می شود
Table های مختلف iptables
- Filter Table
جدول filter یکی از جداول پرکاربرد در iptables است. Filter tables برای تصمیم گیری در مورد اینکه آیا به یک بسته اجازه داده شود همچنان به مقصد مورد نظر خود برود (ACCEPT) و یا برای انکار درخواست آن است (DROP). در فایروال، به عنوان “فیلتر کردن” بسته شناخته می شود.
- NAT Table
جدول nat برای استفاده از قوانین ترجمه آدرس شبکه مورد استفاده قرار می گیرد. همان طور که بسته ها به پشته شبکه وارد می شوند، قواعد در این جدول تعیین می کند که آیا و چگونه می توان آدرس های مبدا یا مقصد را تغییر داد. این جدول در تعیین مسیریابی بسته و هر نوع ترافیک شبکه استفاده می شود. این table معمولا برای هدایت بسته ها به شبکه ها زمانی که دسترسی مستقیم امکان پذیر نیست استفاده می شود.
- Mangle Table
جدول mangle برای تغییر header های پکت IP استفاده می شود. به عنوان مثال، شما می توانید مقدار TTL (زمان زندگی) یک بسته را تنظیم کنید. این table میتواند بصورت internal kernel برای پردازش بیشتر در جداول دیگر و سایر ابزارهای شبکه بصورت mark شده قرار گیرد.
به طور خلاصه
هسته لینوکس با استفاده از امکانات Netfilter به فیلتر کردن بسته، می پردازد و اجازه میدهد بعضی از بسته ها با استفاده از پسورد وارد شود و دیگر بسته اجازه وارد شدن نداشته باشند
که هسته آن از لینوکس درست شده که در آن پنج جدول از پیش طراحی شده که شامل:
Filter: این جدول به طور پیش فرض برای مدیریت بسته های شبکه است
NAT: برای تغییر بسته برای یک اتصال جدید کاربرد دارد مثلا تبدیل ای پی اینترنت به ای پی شبکه داخلی و برعکس مورد استفاده قرار میگیرد
Mangle: برای تغییر و مارک دار کردن انواع خاصی از بسته با توجه به پالیسی نوشته شده به کار میرود
Raw: عمدتا برای پیکربندی معافیت در طول ردیابی اتصال در ترکیب با هدف NOTRACK است
Security: برای کنترل دسترسی اجباری قوانین شبکه مورد استفاده قرار میگیرد
Filter table جدول های فیلتر شامل
Input chain کلیه بسته های ورودی به سیستم عامل
Output chain کلیه بسته های خروجی از سیستم عامل
Forward chain کلیه بسته هایی که از طریق این سیستم عامل بخواهد فوروارد شود
NAT table جدول نت
Pre-routing بسته های شبکه را زمانی که آنها می رسند تغییر می دهد و مغمولا برای برای destination network مورد استفاده قرار میگیرد
Output تغییر میدهد بسته های تولید شده در شبکه داخلی قبل از اینکه خارج شود
Post-routing تغییر می دهد بسته ها را قبل از اینکه از شبکه خارج شوند
Mangle table جدول های منگل
Input بسته های شبکه را برای میزبان تغییر می دهد (مارک دار می کند)
Output بسته های تولید شده از شبکه را قبل از فرستادن تغییر می دهد (مارک دار می کند)
Forward تغییر میدهد (مارک دار می کند) پاکت های شبکه که می خواهد روت شود به نقطه دیگر
Pre-routing تغییر میدهد (مارک دار می کند) پاکت های شبکه را قبل از اینکه روت شوند
Post-routing تغییر میدهد (مارک دار می کند) پاکت های شبکه را بعد از اینکه روت شوند
Raw table جدول های raw
Output اجرا پاکت های که در شبکه داخلی تولید شده اند قبل از اینکه خارج شوند
Pre-routing اجرای بسته های ورودی قبل از اینکه خارج شوند
Security table جدول های Security
Input اجرا روی پاکت های که به شبکه وارد می شوند
Output اجرا روی پاکت های که از شبکه خارج می شوند
Forward اجرا روی پاکت های که از شبکه می خواهند روت شوند به جای دیگری
سوئیچ ها و دستورات iptable
- A- برای افزودن دستور به انتهای یک زنجیره از جدول قوانین استفاده می شود.
- I- برای افزودن به مکان خاصی از زنجیره جدول قوانین استفاده می شود.
- D- برای حذف دستور از مکان خاصی از زنجیره جدول قوانین استفاده می شود.
- R- برای جایگزین کردن دستور جاری یا یک دستور در مکان خاصی از زنجیره جدول قوانین استفاده می شود.
- p- برای مشخص کردن نوع پروتکل مورد استفاده قرار میگیرد.
- t- برای مشخص کردن جدول مورد استفاده قرار میگیرد.
- s- یا source– برای مشخص کردن شماره ip مبدا مورد استفاده قرار میگیرد.
- d- یا destination– برای مشخص کردن شماره ip مقصد مورد استفاده قرار میگیرد.
- i- یا in-interface– برای مشخص کردن کارت شبکه ورودی مورد استفاده قرار میگیرد.
- o- یا out-interface– برای مشخص کردن کارت شبکه خروجی مورد استفاده قرار میگیرد.
- sport– برای مشخص کردن شماره پورت مبدا مورد استفاده قرار میگیرد.
- dport– برای مشحص کردن شماره پورت مقصد مورد استفاده قرار میگیرد.
- L- برای لیست کردن قوانین موجود در یک زنجیر مورد استفاده قرار میگیرد.
- N- برای ایجاد زنجیر جدید مورد استفاده قرار میگیرد.
- X- برای حذف یک زنجیر مورد استفاده قرار میگیرد.
- F- برای پاک کردن قوانین مورد استفاده قرار میگیرد.
- j- مشخص کردن نحوه برخورد با بسته مورد استفاده قرار میگیرد.این سویچ به معنی jump بوده و به موارد DROP ، LOG ، ACCEPT و REJECT اشاره می کند. در اینجا تفاوتی که بین DROP و REJECT وجود دارد و آ ن این است که در DROP برای فرستنده پیامی مبنی بر حذف بسته ارسال نمیکند ولی در REJECT به فرستنده یک بسته عدم پذیرش ترافیک ارسال خواهد شد
پشتیبان گیری از rule ها
# iptables-save > /etc/iptables.rules
برای پشتیبان گیری تنظیمات مورد استفاده قرار می¬گیرد.
# post-down iptables-save > /etc/iptables.rules
برای پشتیبان گیری تنظیمات قبل از هر خاموش شدن سیستم مورد استفاده قرار می¬گیرد.
# iptables-restore < /etc/iptables.rules
برای بازیابی تنظیمات مورد استفاده قرار می¬گیرد.
مهم ترین و پرکاربردترین دستورات و تنظیمات iptables
پاک کردن تمام تنظیمات جاری
# Iptables -F
ایجاد تنظیمات عمومی و مسدود کردن همه دسترسی ها
# iptables -P INPUT DROP
# iptables -P FORWARD DROP
# iptables -P OUTPUT DROP
مسدود کردن یک ip خاص
# iptables -A INPUT -s xxx.xxx.xxx.xxx -j DROP
بستن PING:
# iptables -A OUTPUT -p icmp - j REJECT
# iptables -A INPUT -p icmp - j REJECT
و برای حذف این دستور چنین عمل می کنیم:
# iptables -D OUTPUT -p icmp -j REJECT
باز کردن پورت SSH برای تمامی ارتباطات ورودی
# iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
# iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
باز کردن پورت ssh برای یک ip یا رنج ip خاص
# iptables -A INPUT -i eth0 -p tcp -s xxx.xxx.xxx.xxx/24 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
# iptables -A INPUT -i eth0 -p tcp -s xxx.xxx.xxx.xxx --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
# iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
باز کردن پورت http
# iptables -A INPUT -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
# iptables -A OUTPUT -o eth0 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT
باز کردن پورت https
# iptables -A INPUT -i eth0 -p tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT
# iptables -A OUTPUT -o eth0 -p tcp --sport 443 -m state --state ESTABLISHED -j ACCEPT
باز کردن چند پورت بصورت یکجا
# iptables -A INPUT -i eth0 -p tcp -m multiport --dports 22,80,443 -m state --state NEW,ESTABLISHED -j ACCEPT
# iptables -A OUTPUT -o eth0 -p tcp -m multiport --sports 22,80,443 -m state --state ESTABLISHED -j ACCEPT
باز کردن پورت برای ارتباط خروجی ssh
# iptables -A OUTPUT -o eth0 -p tcp -d 192.168.101.0/24 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
# iptables -A INPUT -i eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
باز کردن پورت https برای ارتباطات خروجی
# iptables -A OUTPUT -o eth0 -p tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT
# iptables -A INPUT -i eth0 -p tcp --sport 443 -m state --state ESTABLISHED -j ACCEPT
ایجاد امکانping از داخل به خارج
# iptables -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT
# iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT
ایجاد امکانping از خارج به داخل
# iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
# iptables -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT
ایجاد امکان دسترسی loopback
# iptables -A INPUT -i lo -j ACCEPT
# iptables -A OUTPUT -o lo -j ACCEPT
ایجاد امکان دسترسی به شبکه خارجیeth1 از شبکه داخلی eth0
# iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT
باز کردن دسترسی خروجی پورت dns
# iptables -A OUTPUT -p udp -o eth0 --dport 53 -j ACCEPT
# iptables -A INPUT -p udp -i eth0 --sport 53 -j ACCEPT
.بستن پورت 23برای همه ip ها
# iptables -t nat -A POSTROUTING -o eth1 -p tcp -m tcp --dport 23 -j DROP
..بستن پورت های 22 و 23 برای همه ip ها
# iptables -t nat -A POSTROUTING -o eth1 -p tcp -m tcp --dport 22:23 -j DROP
بستن پورت 22و 23 برای یک ip خاص
# iptables -t nat -A POSTROUTING -s 192.168.0.88 -o eth1 -p tcp -m tcp --dport 22:23 -j DROP
drop کردن تمامی Packet های یک IP خاص
# iptables -A INPUT -s 217.61.158.248 -j DROP
Drop کردن SSH packetهای یک Ip خاص
# iptables -A INPUT -s 217.61.158.248 -p tcp --dport 22 -j DROP
ذخیره تغییرات iptables
# service iptables save
or
# iptables-save
فعال کردن LOG در قوانین فایروال
برای اینکه مدیریت کامل تری به شبکه خود داشته باشیم و بتوانیم منابعی که در حال اسکن کردن سیستم ما هستند بیابیم و یا در هر حال گزارشی از عملکرد صحیح فایر وال داشته باشیم می توانیم به طرق ذیل Log فایل ها را برای موارد دلخواهمان فعال کنیم:
.فعال کردن Log برای دیدن بسته های ICMP:
# iptables -A OUTPUT -p icmp -j LOG --log-prefix "PING:> "
# iptables -A INPUT -p icmp -j LOG --log-prefix "PING:> "
برای دیدن این log ها به این مسیر بروید:
# less /var/log/messages
و خط هایی را که با
PING:> …..
شروع شده اند بررسی نمایید.( البته راه ساده تر آن استفاده از دستور فیلتر کننده grep و مختص کردن به log های فایروال می باشد)
فعال کردن Log برای دیدن Ftp:
# iptables -A OUTPUT -p tcp -s 0/0 --dport 21 -j LOG --log-prefix "FTP:> "
# iptables -A INPUT -p tcp -s 0/0 --dport 21 -j LOG --log-prefix "FTP:> "
و در لاگ فایل ها دنبال عبارت انتخابی می گردیم.
فعال کردن Log برای یک ip خاص:
# iptables -t nat POSTROUTING -s 192.168.0.88 -o eth1 -j LOG --log-prefix "SPICAIL_IP:>"
و در لاگ فایل ها دنبال عبارت انتخابی می گردیم.
redirect کردن پورت های مختلف
در این بخش redirect کردن پورت های مختلف را با هم بررسی می کنیم:
1-Transparent کردنSquid
# iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 3128
2-برای redirect کردن گروهی از پورتها:
# iptables -t nat -A PREROUTING -p tcp -d 203.145.184.246 --dport 20:23 -j DNAT --to 192.168.0.88:20-23
# iptables -A FORWARD -p tcp -d 192.168.0.88 --dport 20:23 -j ACCEPT
# iptables -t nat -A PREROUTING -p udp -d 203.145.184.246 --dport 20:23 -j DNAT --to 192.168.0.88:20-23
# iptables -A FORWARD -p udp -d 192.168.0.88 --dport 20:23 -j ACCEPT
3- برای redirect کردن تمامی درخواست های SMTP از اینترفیسeth0 به یک کامپیوتر دیگه داخل شبکه( LAN):
# iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 25 -j DNAT --to 192.168.0.88:25
# iptables -A FORWARD -p tcp -d 192.168.0.88 --dport 25 -j ACCEPT
Share کردن اینترنت
در این بخش با استفاده از سیاست MASQUERADE اینترنت را در شبکه به اشتراک می گزاریم:
با استفاده از دو کارت شبکه که یکی به اینترنت و دیگری به شبکه داخلی متصل است:
# iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
(توضیح اینکه در اینجا eth1 اینترفیسی است که به اینترنت متصل است. شما اسم اینترفیسی را بزارید که متصل به اینترنت هست)
لازم است که IP forwarding نیز فعال شده باشد برای فعال کردن IP Forwarding دستور زیر را وارد کنید
# echo "1" > /proc/sys/net/ipv4/ip_forward