من این مقاله را از منبع
http://forum.persiannetworks.com/f88/t10149.html کپی کردم به نظرم دوستان بیایند و به این مطلب بها بدن و مطلب را جامع کنند بهتر از اینه که بخوان کتاب ترجمه کنند.

پس در تکمیل ان بکوشید
در این مقاله به معرفی يكي از ابزارهاي قدرتمند تصفيه كننده بسته*ها به* نام IPtables مي*پردازيم. IPtables به عنوان نسل چهارم پياده*سازي شده از ابزارهاي تصفيه كننده سيستم*عامل لينوكس معرفي مي*شود. این مقاله شامل بخش*های زیر است.
* معرفي سيستم* تصفيه كننده بسته*ها
* تاريخچه حفاظ*های سيستم*عامل لينوکس
* زنجيرها، جداول* و قوانين IPtables
* قوانين IPtables
* پياده*سازی چند سياست ساده امنيتی
* راه*اندازي و استفاده از IPtables
* جهت مطالعه بيشتر
* مراجع
معرفی سيستم تصفيه کننده بسته*ها
يك سيستم تصفيه*كننده بسته*ها (همان*طور كه از نامش پيداست) براي كنترل ترافيك ورودي و خروجي بسته*ها بين يك شبكه داخلي و شبكه خارجي به* كار مي*رود. به كمك يك تصفيه كننده مي*توان:
1. دسترسي به اينترنت از طريق بعضي ماشين*ها را محدود كرد.
2. ترافيك ناخواسته و نيز پويش*هاي انجام شده از خارج را مسدود كرد.
3. از امكان ترجمه آدرس*هاي شبكه استفاده كرد. به كمك NAT مي*توان تعداد زيادي از كامپيوترهاي داخل شبكه را تنها با داشتن يك آدرس IP معتبر به شبكه خارجي متصل نمود.
4. استفاده از کارگزار Proxy را از ديد کاربران شفاف نمود(Redirect).
انواع سيستم*های تصفيه کننده بسته*ها
سيستم*های تصفيه کننده بسته*ها به* طور کلی به دو نوع تقسيم می*شوند:
1. سيستم*های بدون حالت : در اين سيستم*ها تصفيه هر بسته مستقل از بسته*های ديگر و اينکه متعلق به چه ارتباطی است، صورت می*گيرد.
2. سيستم*های مبتنی بر حالت: در اين سيستم*ها حافظه جداگانه*ای تاريخچه هر ارتباطی که به آن وارد، خارج يا از آن می*گذرد، را ثبت می*کند. اين ويژگی برای پيکربندی مؤثر FTP، DNS و ساير سرويس*های شبکه ضروری می*باشد. عموماً حفاظ*های مبتنی بر حالت از نمونه*های بدون حالت امن*تر می*باشند. چرا که با استفاده از آنها می*توان مجموعه قوانين سخت*تری برای کنترل ترافيک اعمال کرد.
تاريخچه
محصولات ارائه شده تحت عنوان تصفيه کننده بسته*ها چهار نسل تکامل را پشت سر گذاشته*اند:
* IPFW: اين نسخه يادآور اولين پشتيبانی لينوکس از سرويس تصفيه بسته*ها می*باشد که در داخل هسته 1.2 لينوکس تعبيه شده بود. IPFW ويژگي*های ابتدايی مورد انتظار از يک حفاظ را پياده*سازی کرده بود. بعضی از محدوديت*های آن عبارت بودند از:
o عمل تصفيه را تنها روی يک پورت انجام می*داد
o Mason از آن پشتيبانی نمی*کرد
o در محيط*های توزيع شده قابل استفاده نبود.
o مبتنی بر حالت نبود.
* IPFWADM: در هسته 2.0 لينوکس قرار داده شده است. تصفيه بسته*ها را از روی آدرس درگاه*های مبداء و مقصد انجام می*داد و امکان مخفی*سازی آدرس*های IP (ترجمه چند به يک) در آن قرار داده شده بود. با اين وجود يک حفاظ مبتنی بر حالت نبود و تنها از قراردادهای TCP، UDP و ICMP پشتيبانی می*کرد.
* IPChains: در هسته 2.2 لينوکس قرار داده شده بود. با وجود اينکه يک حفاظ مبتنی بر حالت نبود، ولی از زيرنوع*های ICMP و ساير قراردادها )علاوه بر از TCP، UDP و ICMP) پشتيبانی می*کرد.
* از هسته 2.4 لينوکس به بعد IPtables به عنوان حفاظ پيش فرض لينوکس همراه با آن نصب می*شد. IPtables نسبت به حفاظ*های نسل قبل خود چند تفاوت مهم داشت:
o يک حفاظ مبتنی بر حالت بود.
o از قرارداد اينترنت نسخه 6.0 پشتيبانی می*کرد.
o از طراحی پیمانه*ای برخوردار بود.
o علاوه بر جهش*های فوق، با نسخه*های دو نسل قبل خود، يعنی IPFWADM و ipchains مطابقت داشت. (Backward Compatibility)
جدول*ها و زنجیرها در IPtables
جدول و زنجیر دو مفهوم اساسی در IPtables هستند که شناخت اين ابزار و نحوه عملکرد آن و نوشتن قوانين مورد نظر مستلزم درک کامل اين مفاهيم می*باشد.
در IPtables جدول*ها مجموعه*ای از قوانين مرتبط را در برمی*گيرند. اين قوانين در ساختار ديگری تحت عنوان زنجیرها معنی پيدا می*کنند. زنجیرها انواع نحوه عبور بسته*ها از حفاظ را بيان می*کنند. بسته به اينکه هر بسته در ورود، خروج يا عبور از حفاظ چه مسيری را بپيمايد، بخشی از قوانين جدول*ها روی آن اعمال می*شود. نحوه اعمال قوانين جدول به اين صورت است که بسته*های رسيده با تک تک قوانين آن مقايسه می*شوند و اولين قانونی که با شرايط بسته مطابق باشد، در مورد آن اعمال می*شود. در غير اين صورت سياست پيش فرض حفاظ روی آن اعمال می شود. (قبوليا دور ریختن )
سه جدول عمده مورد استفاده در IPtables عبارتند از:
1. جدول تصفيه :
اين جدول تصفیه در واقع مجموعه قوانين مربوط به تصفيه بسته*ها را در برمی*گيرد. عمل تصميم*گيری درباره*ی تصفيه بسته*ها روی ويژگي*های خاصی از آنها صورت می*گيرد که در ادامه به*صورت کامل*تر به آنها اشاره خواهيم کرد. بايد به نحوی به حفاظ فهماند چه تصميمی درباره*ی بسته*هايی که در يک قانون صدق می*کنند، اتخاذ کند. مهمترين اعمال انجام شده روی يک بسته عبارتند از قبول و دور ريختن.
2. جدول ترجمه آدرس:
جدول ترجمه*ی آدرس برای ترجمه*ی آدرس بسته*ها به*کار می*رود که اصطلاحاً به آن NAT گفته می*شود. بسياري از شبكه*هاي داخلي سازمان*ها و حتي بسياري از فراهم *آورندگان خدمات اينترنتي تنها از يك IP معتبر براي اتصال مجموعه وسيعي از كامپيوترهاي خود به شبكه اينترنت استفاده مي*كنند. مكانيسمي كه اين امكان را براي آنها فراهم مي*آورد، NAT مي*باشد. برای استفاده از NAT حداقل به يک آدرس IP معتبر احتياج است که اين آدرس از طريق ISP به صورت پويا يا استيا به شبکه اختصاص داده می*شود. اين آدرس به عنوان آدرس خارجی دروازه شبکه مورد استفاده قرار می*گيرد و برای آدرس داخلی دروازه و ساير گره*های شبکه از مجموعه آدرس*های رزرو شده برای شبکه*های داخلی استفاده می*شود. به اين ترتيب آدرس همه بسته*های ايجاد شده در ماشين*های داخلی که به مقصدی خارج از شبکه محلی فرستاده می*شوند، در دروازه (که حفاظ روی آن در حال اجراست) ترجمه می*شوند. ترجمه*ی آدرس*ها به اين صورت است که جايگزين آدرس مقصد و شماره درگاه مورد استفاده در بسته اوليه آدرس IP معتبر دروازه و شماره درگاه جديد تخصيص داده شده می*شوند. در واقع ماشين خارجی يک بسته از جانب دروازه دريافت می*کند و بسته*های برگشتی را نيز به همان آدرس IP معتبر برمی*گرداند. اطلاعات ترجمه آدرس در يک جدول مراجعه در دروازه ذخيره می*شود تا بتوان با استفاده از آن، بسته*های برگشتی را به ماشين داخلی مورد نظر (که ايجاد کننده*ی اصلی بسته بوده) هدايت کرد. شکل زير نمونه*ای از پيکربندی شبکه داخلی برای اتصال به اينترنت با استفاده از NAT را نشان می*دهد:
شکل 1 : پيکربندی شبکه*ی داخلی با استفاده از NAT
اين کار در نهايت منجر به تغيير آدرس مبداء يا مقصد بسته*های گذرنده از حفاظ يا ايجاد شده در آن می*گردد. اعمال انجام شده روی بسته*ها در اين جدول عبارتند از:
* DNAT: اين گزينه برای تغيير آدرس مقصد بسته به*کار می*رود. اين نوع ترجمه*ی آدرس زمانی مفيد خواهد بود که با در اختيار داشتن تنها يک IP مجاز، بخواهيم بسته*های دريافت شده از شبکه اينترنت را به DMZ يا يک ماشين از شبکه داخلی خود بفرستيم.
* SNAT: عموماً برای تغيير آدرس مبداء بسته*ها به*کار می*رود. از اين نوع ترجمه برای مخفی کردن آدرس ماشين*های شبکه داخلی يا DMZ استفاده می*شود. مثلاً يک زمانی که آدرس بسته*های گذرنده از حفاظ از داخل شبکه به آدرس IP معتبر حفاظ ترجمه می*شود و از آن خارج می*شود نمونه*ای از این مورد کاربرد است. بديهی است که برای هدايت بسته*های برگشتی به گره*های مبداء، بايد از يک جدول مراجعه کمک گرفت.
* MASQUERADE: مورد استفاده اين گزينه تقريباً مشابه SNAT می*باشد. با اين تفاوت که به*جای ترجمه آدرس*ها به يک آدرس ثابت و مشخص، آدرس مورد نظر بايد محاسبه شود. در صورتي که يک فراهم*کننده خدمات اينترنتی هستيد و با استفاده از DHCP و به*صورت پويا به ماشين*های کاربران خود آدرس IP اختصاص می*دهيد، ناگزير به استفاده از اين نوع ترجمه*ی آدرس هستيد.
3. جدول Mangle:
جدول Mangle عموماً برای تغيير ويژگي*های خاصی از بسته*ها، از جمله TTL، ToS و يا برچسب زدن روی آنها به*کار می*رود. شکل زير ساختار کلی زنجیرهای استاندارد تعريف شده در IPtables و نحوه پيمايش بسته*ها از مسيرهای مختلف را نشان می*دهد.
شکل 2 - جريان هدايت بسته*ها از حفاظ IPtables
همانطور که از شکل پيداست، يک بسته ممکن است به سه صورت مختلف از زنجیرهای IPtables عبور کند.
1. بسته*هايی که آدرس مقصد آنها ماشينی است که حفاظ روی آن نصب شده است.
قبل از اينکه چنين بسته*ای از حفاظ عبور داده شود، از زنجیرهای زير می*گذرد و قوانين جداول زير روی آنها قابل اعمال است:
2. بسته*هايی که در ماشين محلی توليد می*شوند
قبل از اينکه چنين بسته*ای بتواند ماشين محلی را ترک کند، از زنجیرهای زير می*گذرد و قوانين جداول زير روی آنها قابل اعمال است:
3. بسته*هايی که از حفاظ عبور می*کنند
قبل از اينکه چنين بسته*ای بتواند از کارت واسط شبکه ورودی به کارت واسط شبکه خروجی منتقل شود، از زنجیرهای زير می*گذرد و قوانين جداول* زير روی آنها قابل اعمال است:
قوانين IPtables
قوانين ابزار اصلی کار با هر حفاظی را تشکيل می*دهند. پيچيده*ترين و پرهزينه*ترين سياست*های امنيتی يک سازمان در نهايت برای تصفيه بسته*ها به قوانين نه چندان پيچيده حفاظ تبديل می*شوند. فرمت کلی دستورات IPtables را می*توان به صورت زير بيان کرد:
iptables [-t table] Packet-Criteria-Specification target
گزينه –t برای مشخص کردن جدول حاوی دستور به*کار می*رود.
Packet-Criteria-Specification برای تعيين ويژگي*های بسته مورد استفاده قرار می*گيرد. target بيانگر عملی است که در صورت انطباق بسته با قانون مورد نظر، بايد روی آن انجام شود. در ادامه این گزارش فرمت کلی این دستور توضیح داده می*شود.
1. دستورات مهم و پایه*ای برای تغییر قوانین موجود در IPtable
* اضافه کردن قوانين
iptables –I chain [rulenum] rule-specification
دستور فوق يک قانون جديد قبل از قانون با شماره rulenum به زنجیر chain اضافه می*کند. اين قانون به صورت پيش*فرض به ابتدای قوانين اضافه می*شود.
* اضافه کردن قوانين (به انتهای قوانين قبلی)
iptables –A chain rule-specification
* جايگزينی قوانين
iptables –R chain rulenum rule-specification
* حذف قوانين
iptables –D chain rule-specification
* حذف دسته جمعی قوانين
iptables –F chain
* ايجاد يک زنجیر جديد
iptables –N newchain
* حذف زنجیر جديد ايجاد شده
iptables –X newchain
* مشاهده قوانين تعريف شده در يک زنجیر
iptables –L chain
در دستورات IPtables شماره اولين قانون 1 منظور می*شود.
2. پارامترهای مهم دستورات IPtable
بعضی از ويژگي*های بسته*ها که برای تعيين انطباق آنها در دستورات IPtables بکار می*رود، عبارتند از:
* قرارداد ارتباطی: قرارداد استفاده شده در انتقال بسته(TCP، UDP، ICMP، ...). برای مشخص کردن اين ويژگی از گزينه –p استفاده می*شود.
* آدرس مبداء: آدرس مبداء بسته را مشخص می*کند. با استفاده از آن می*توان آدرس نقاب شبکه را نيز مشخص کرد (مثلاً 192.168.0.0/16 معادل يک کلاس B با آدرس نقاب شبکه 255.255.0.0 می*باشد). با استفاده از علامت ! می*توان تفسير قانون را معکوس کرد. برای مشخص کردن آن از گزينه –s استفاده می**شود.
* آدرس مقصد: دارای امکاناتی مشابه آدرس مبداء می*باشد. برای مشخص کردن از علامت –d استفاده می*شود. بسته های ورودی از واسط شبکه: برای مشخص کردن کليه بسته*هايی که به واسط شبکه مشخصی وارد می*شوند، بکار می*رود. مثلاً بسته*های ورودی به کارت واسط شبکه eth0 را با –i eth0 نشان می*دهيم.
* بسته*های خروجی از واسط شبکه: مشابه دستور فوق.
در صورتيکه از قرارداد ارتباطی TCP يا UDP استفاده کنيم، به گزينه*های بيشتری برای تصفيه بسته*ها دسترسی داريم.
* تعيين محدوده شماره درگاه*ها :
--source-port [!] port[: port]
Examples:
--source-port 0: 1023
--source-port ! 80
-- destination- port [!] port[: port]
* تصفيه مبتنی بر حالت: همانطور که ذکر شد، IPtables يک حفاظ مبتنی بر حالت است. در IPtables، چهار حالت مختلف برای ارتباط*هایايجاد شده در نظر گرفته می*شود که با استفاده از آنها می*توان بسته*های متعلق به آنها را تصفيه کرد. حالت*های مختلف عبارتند از:
o New: مشخصه ارتباط*هايی است که تنها يک بسته در يک جهت ارسال کرده*اند. در واقع پس از ديدن اولين بسته از هر ارتباط (بسته*ای که پرچم SYN از سرآيند TCP آنها روشن باشد.)، وضعيت آن به New تغيير می*کند.
o Established: مشخصه ارتباط*هايی است که بسته در هر دو جهت از طريق آنها ارسال شده است. پس از ديدن اولين پاسخ به بسته ارسال شده (بسته*ای که پرچم ACK از سرآيند TCP آنها روشن باشد)، مشخصه ارتباط ايجاد شده از New به Established تغيير می*کند.
o Related: مشخصه ارتباط*هايی است که بسته جديدی ملاقات می*کنند، با اين تفاوت که بسته ايجاد شده به: ارتباط برقرار شده قبلی مرتبط است. يک مثال شناخته شده از اين نوع ارتباطات، ارتباط داده*ای در قرارداد FTP می*باشد که به ارتباط کنترلی از آن مربوط می*شود.
هدف*ها(targets)
* همانگونه که ذکر شد، target بيان کننده*ی عملی است که در صورت صدق کردن بسته مورد نظر در يکی از قوانين، روی آن انجام می*شود. برای مشخص کردن هدف*ها از گزينه*ی –j استفاده می*شود. بعضی از هدف*های پرکاربرد IPtables عبارتند از:
LOG: برای ثبت يک رويداد در رويدادنامه IPtables بکار میرود (گاهی فقط می*خواهيم ترافيک گذرنده از حفاظ را ثبت کنيم)
REJECT: يک پيغام خطا به عنوان پاسخ به مبداء بسته فرستاده می*شود و سپس دور انداخته می*شود.
DROP: بسته دور انداخته می*شود. بدون اينکه پاسخی برای فرستنده ارسال شود.
ACCEPT: بسته پذيرفته می*شود.
SNAT: آدرس مبداء بسته به آدرس جديدی ترجمه می*شود.
DNAT: آدرس مقصد به آدرس جديدی ترجمه می*شود.
MASQUERADE: آدرس مبداء جديد محاسبه شده و جايگزين آدرس فعلی می*شود.
REDIRECT: برای برگرداندن بسته*ها به ماشين محلی (که حفاظ روی آن نصب شده) مورد استفاده قرار می*گيرد. از اين امکان IPtables زمانی استفاده می*شود که بخواهيم سرويس*های نصب شده در ماشين حفاظ از ديد کاربران شفافباشد. فرض کنيد می*خواهيم در کنار http server از يک http proxy مثل squid استفاده کنيم. با استفاده از اين امکان براحتی می*توان، همه بسته*هايی که می*خواهند به درگاه 80 از ماشين حفاظ متصل شوند، را براحتی به سمت squid هدايت کرد. دستور زير اين هدف را برآورده می*کند:
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 3128
(3128 پورت استاندارد squid می باشد.)
Jump: همچنين هدف می*تواند پرش به يک زنجیر از پيش تعريف شده از همان جدول باشد.
پياده سازی چند سياست ساده امنيتی
در ادامه سعی می*کنيم با استفاده از قوانين معرفی شده در IPtables بعضی از سياست*های امنيتی ساده را پياده*سازی کنيم. در اين مثال*ها فرض کنيد که کارت واسط شبکه eth0 به LAN و کارت واسط شبکه eth1 به WAN متصل است. آدرس*های شبکه محلی دارای آدرس*های مجازی 192.168.x.y و آدرس IP حفاظ برابر 192.168.1.1 می*باشد.
1. می*خواهيم زنجیر جديدی تعريف کنيم که فقط بتوان از شبکه*ی داخلی به بيرون ارتباط جديدی برقرار کرد. (بسته*های رسيده از شبکه WAN فقط بسته*های پاسخ يا مرتبط با بسته*های قبلی باشند.)
iptables -N block
iptables -A block -m state -- state ESTABLISHED, RELATED -j ACCEPT
iptables -A block -m state -- state NEW -i ! eth1 -j ACCEPT
iptables -A block -j DROP
دستورات فوق عمل تصفيه بسته*ها را در داخل زنجیر تعريف شده block انجام می*دهند. تنها کافی است بسته*های گذرنده از حفاظ را به سمت اين زنجیر هدايت کنيم:
iptables -A INPUT -j block
iptables -A FORWARD -j block