مثال های عملی و کاربردی iptables

iptablesخب سلام دوستان عزیز امید وارم تا اینجا مفاهیم گفته شده رو یاد گرفته باشید تو این قسمت قرار یه سری مثال کاربردی بزنیم . خب شروع کنیم!!مثال اول: باز و بسته کردن پورت icmp هستش Drop Icmpiptables -A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT iptables -A INPUT -p icmp -m icmp --icmp-type 8 -j DROP iptables -P INPUT DROP iptables -A INPUT -p icmp -m icmp --icmp-type 8 -s 192.168.1.2,192.168.1.2 -j ACCEPTاولین قانون پورت icmp رو باز کردیم برای تایپ 8 که echo requests هستش تایپ های دیگه رو هم میتونید ست کنید یه تب بزند بعد از icmp-type-- بهتون تایپ ها رو نشون میده. در قانون بعدی icmp رو این دفعه بستیم میتونستید از تارگت REJECT هم استفاده کنید که یه پیغامی رو به کاربر نشون بده به شکل زیر iptables -A INPUT -p icmp -m icmp --icmp-type 8 -j REJECT --reject-with -icmp-port-unreachableبعد از reject-with-- یه تب بزنید پیام های دیگه ای که میتونید ست کنید رو بهتون نمایش میده.قانون سوم و چهارم که اضافه کردیم در واقع در اینجا میخواستم بگم که میتونید برای یه سری ip پورت icmp رو باز بزارید allow باشه و بقیه رو deny کنیدو برای اینکار شما دوتا راه دارید یا اینکه اول بیاید پالیسی دیفالت زنجیره INPUT داخل جدول filter رو DROP کنید بعد ip هایی که میخواید allow باشن رو ACCEPT کنید ( همین کاری که تو قانون 3 و 4 انجام دادیم ) یا اینکه بیاید یه زنجیره جدید درست کنید و یه قانون جدید اضافه کنید که پکت های زنجیره INPUT رو بفرسته تو زنجیره جدید که ساختید با j- تارگت زنجیره INPUT رو میزارید روی اون زنجیره ای که ساختید. به این شکل وقتی پکتی وارد زنجیره INPUT میشه اول میره تو اون زنجیره ای که ما ساختیم و با قوانین موجود در اون برسی میشه بعد قانون بعدی تو زنجیره INPUT اعمال میشه . از اونجایی که نمیشه پالیسی روی زنجیره هایی که کاربر میسازه گذاشت باید بگیم پکت هایی که میاد تو زنجیره ای که ساختیم رو DROP کن بعد میایم میگیم هر پکت icmp که اومد تو زنجیره INPUT و مبداشون اون ip هایی که ما گفتیم بود allow کن (تارگتشون رو روی accept قرار میدیم مثل قانون دوم) به همین سادگی. نکته : اگه ننویسید t filter- هم مشکلی پیش نمیاد دیفالت اگه چیزی ننویسید جدول فیلتر استفاده میشه .نکته : اگه خواستید تو iptables از یه لیست ip یا port استفاده کنید با ( , ) میتونید از هم جداشون کنید. البته برای مولتی پورت باید از ماژول multiport استفاده کنید، برای مولتی ip نیازی نیست.نکته : زنجیره ای که کاربر میسازه هیچ کاری انجام نمیده یعنی کلا نمیدونه رو پکت های ورودی قوانین که داخلش هست رو اعمال کنه یا پکت های خروجی برای اینکار باید یه قانون اضافه کنیم داخل زنجیره ای که لازم داریم و تارگتش رو بزاریم روی زنجیره ای که ساختیم اینجوری قوانین داخل زنجیره کاربر اعمال میشه.مثال دوم: ssh فورواردینگ.در این مثلا اگه کسی به سیستم ما ssh بزنه ما میتونیم ریدایرکتش کنیم به یه سیستم دیگه که ssh روش در حال اجرا هست و این اجازه رو به ما میده(یعنی قانون و... نداره که مانع کار ما بشه)‌ اینجا مثلا میتونید رو سیستم اصلی و ماشین مجازیتون تست کنید.iptables -t nat -A PREROUTING -i enp2s0 -p tcp --dport 22 -j DNAT --to 192.168.1.5:22 iptables -A FORWARD -p tcp --dst 192.168.1.5 --dport 22 -j ACCEPT iptables -t nat -A POSTROUTING -j MASQUERADE اولین قانون :در این مثال گفته شد iptables به زنجیره PREROUTING تو جدول nat یه قانون رو اضافه کن و با i- مخشص کردیم که فقط پکت هایی که از اون کارت شبکه رو پروتکل tcp و از پورت 22 به بیرون میرن رو لازم داریم و با j- تارگتش رو ست کردیم روی DNAT که برای تغیر مقصد اون پکت ها هستش و با to-- گفتیم اون پکت هایی که با این قوانین مچ هستن رو مقصدشون رو تغیر بده به فلان ip .دومین قانون : در قانون دوم میگیم iptables به زنجیره forward تو جدول filter یه قانون اضافه کن که هرموقع پکتی خواست فوروارد بشه از یه مبدا به مقصد دیگه ای و رو پروتکل tcp بودش و مقصدش اون ip که که ما گفتیم بودش و پورت 22 بود قبولش کن accept کن.سومین قانون : قانون سوم هم اگه شما از ip پرایوت استفاده میکنید و ip پابلیک ندارید باید از MASQUERADE استفاده کنید در غیر اینصورت لازم نیست قانون اخر رو استفاده کنید.نکته : ما میخواستیم ssh فورواردینگ انجام بدیم برای اینکار لازم بود که مقصد اون پکت رو دست کاری کنیم و بفرستیمش اون جایی که میخوایم برای همین از جدول NAT و Filter استفاده کردیم .مثال سوم : بایپس کردن لاگین نرم افزار packettracerخب اگه تا الان از پکت تریسر استفاده کرده باشید میدونید که بعد از نصبش باید لاگین کنید تا اکتیو شه وبتونید ازش استفاده کنید راه های زیادی برای اینکار وجود داره ولی با iptables هم میشه برای همین گفتم تو مثال ها بیارمش که ببینید چجوری و اینکه از iptables هم استفاده کرده باشیم.iptables -A OUTPUT -j DROP iptables -A OUTPUT --dst 46.140.72.219 -j DROP iptables -A OUTPUT --dst www.cisco.com -j DROPخب به 2 روش بالا میتونید استفاده کنید اصل قضیه اینه که شما باید پکتی که از سمت پکت تریسر میره رو DROP کنید تو این مثال حالت اول گفتیم همه پکت هایی که از کارت شبکه ما به بیرون میره رو DROP کن و تو این حالت خیلی راحت و سریع باز میشه و مشکلی نداره ولی شاید کسی نخواد کل پکت هایی که به بیرون از کارت شبکش میرن رو DROP کنه ، برای همین میتونید از کامند دوم در زمانی که vpn روشن هستش و سیستم تونل شده یا فقط پکت تریسر تونل... شده استفاده کنید و از کامند سوم هم زمانی که vpn روشن نیست و سیستم تونل نشده میتونید استفاده کنید . وقتی این قانون رو بنویسید و پکت تریسر رو اجرا کنید بین 1 الی 2 دیقه واردش میشه و مشکلی نداره.در قانون 2 و 3 گفتیم هر پکتی به اون 2 تا مقصد رفت رو DROP کن ولی ما اون دوتا مقصد رو از کجا اوردیم خب خیلی ساده میتونید با اسنیف کردن شبکتون بدستش بیارید مثلا ابزار tcpdump رو میتونید استفاده کنید یا حالا برنامه های دیگه ( Wireshark, Xplico ,NetworkMiner و ...)تو عکس زیر میتونید یه نمای کلی رو ببینید.packettracerمثال چهارم: لاگ گرفتن با iptables iptables -A OUTPUT --dst 4.2.2.4 -p icmp -m icmp --icmp-type 8 -m limit --limit 3/min --limit-burst 2 -j LOG --log-level info --log-prefix &quot ICMP LOG IPTABLES: &quotخب در اینجا گفتیم iptables هر پکت icmp که تایپش echo requests هستش و داره از کارت شبکه ما به سمت 4.2.2.4 میره رو لاگ کن تو لول info و prefix ش رو هم بزار ICMP LOG IPTABLES . در اینجا از ماژول limit استفاده کردیم میگه تو هر دقیقه 1 بار لاگ بنداز و با burst تعداد پکت های اولیه رو مشخص کردیم یعنی اولین لیمیتی که اعمال میشه 2 تا هستش و بعد از اون هر دقیقه 1 بار لاگ میندازه .میتونید برای لیمیت از روز، ساعت، دقیقه و ثانیه استفاده کنید .تو عکس زیر میتونید مشاهده کنید که به چه شکلی اجرا میشه ( تو قسمت اول راجب لاگینگ صحبت کردیم لول ها و..... اگه یادتون نمونده این لینک رو میتونید ببینید )‌.logمثال پنجم: دراپ کردن پکت های INVALIDiptables -A INPUT -m conntrack --ctstate INVALID -j DROPمیتونید به این شکل پکت های invalid رو دراپ کنید ولی یه مشکلی هست اگه تعداد این پکت ها زیاد بشه سرور فشار زیادی رو متحمل میشه برای همین ما میتونیم یه کار بهتری رو انجام بدیم!! بجای اینکه از زنجیره input استفاده کنیم بیایم از PREROUTING استفاده کنیم چون قبل از input هستش و اولین جا هستش برای برسی پکت های ورودی خب درسته که اینجوری بهتر ولی یادتونه که جدول فیلتر همچین زنجیره ای رو نداره برای همین باید از جدول mangle استفاده کنیم چون بیشتر زنجیره ها رو شامل میشه و بهتر.iptables -t mangle -A PREROUTING -m conntrack --ctstate INVALID -j DROPمثال ششم: جلوگیری از traceroute کردن شبکهtracerouteخب برای اینکار اول باید بدونید که traceroute به چه صورت هستش تا بعد بتونید جلوش رو بگیرید. سیستم عامل های مختلف و ابزار های مختلف عملکرده متفاوتی رو پیاده سازی میکنن برای traceroute کردن در ویندوز شما traceroute کنید بر روی پروتکل icmp با پکت های echo-requests میاد traceroute رو انجام میده ولی رو لینوکس مثلا رو پروتکل udp و رو پورت های 33434...33534 این عمل رو انجام میده برای همین متناسب با اون سیستم عامل میتونید جلوش رو بگیرید مثلا در لینوکس میتونید با دوتا قانون زیر جلوش رو بگیرید .iptables -t raw -A PREROUTING -p udp --dport 33434:33534 -j DROP iptables -t raw -A PREROUTING -p icmp --icmp-type 8 -j DROPقانون اول گفتیم هرپکتی بر روی پروتکل udp خواست وارد شبکه ما بشه اگر تو رنج پورت 33434 تا 33534 بود بیا دارپش کن و این کافیه اما اگر بر روی پروتکل tcp و با پکت های icmp سعی کنه traceroute رو انجام بده باز هم میتونه این کار رو انجام بده برای همین میایم در قانون دوم تایپ 8 icmp رو دراپ میکنیم که دیگه به پکتی با همچین مشخصه ای اجازه ورود داده نشه. مثال هفتم: لود بالانسینگ ترافیک ورودی وبLoad balancing iptables -t nat -A PREROUTING -p tcp --dport 443 -m state --state NEW -m statistic --mode nth --every 3 --packet 0 -j DNAT --to-destination 192.168.1.101:443 iptables -t nat -A PREROUTING -p tcp --dport 443 -m state --state NEW -m statistic --mode nth --every 3 --packet 1 -j DNAT --to-destination 192.168.1.102:443 iptables -t nat -A PREROUTING -p tcp --dport 443 -m state --state NEW -m statistic --mode nth --every 3 --packet 2 -j DNAT --to-destination 192.168.1.103:443 خب در مثال بالا ما اومدیم لود بالانسینگ رو بین 3 تا سرور انجام دادیم به شکلی که سرور اصلی پکت هایی که مقصدشون پورت 443 هستش رو توسط تارگت DNAT ریداریکت کردیم به مقصد سرور اول و دوم و سوم.در اینجا برای لود بالانسینگ از ماژولstatistic استفاده کردیم که این ماژول 2 تا mode داره یکیش random و اون یکی هم nth اینجا ما از nth استفاده کردیم که از الگوریتم Round Robin استفاده میکنه. به این شکل که برای سرور اولی با every 3-- مشخص کریدم که هر 3 پکت یک بار از پکت 0 (packet 0--) به بعد بفرسته برای سرور اولی و برای سرور دومی هم به همین شکل هر 3 پکت 1 بار از پکت دوم به بعدبفرسته برای سرور 2 و هر 3 پکت یک بار از پکت سوم به بعد رو بفرسته برای سرور 3وم.فک کنم متوجه شده باشید دیگه ! با every-- استپ هاش رو مشخص میکنیم که هر چند پکت این عمل رو انجام بده و با packet-- هم مشخص کردیم که از پکت چندم شروع کنه به فرستادن اینجوری بالانسینگ ایجاد میشه و به درستی بین سرور ها فشار بوجود اومده تقسیم میشه.تو این قسمت سعی کردم که مثال ها تا حد ممکن کاربردی باشه و اینکه از ماژول های مختلف استفاده بشه که ببینید به چه شکل استفاده میشن و البته که ماژول های بیشتری هم هستن که با توجه به نیازتون میتونید ازشون استفاده کنید(با سرچ کردن تو گوگل میتونید خیلی راحت برای نیازتون پیداشون کنید) این ماژول هایی که استفاده کریدم صرفا برای تیتر بالاشون که نوشتیم نیستن و میتونید هرجا که نیاز شد با ترکیب کردنشون قانون های بهتری رو بنویسید .قسمت دوم اموزش رو میتونید اینجا مشاهد کنید.