کنکوریا

کنکور

کنکوری

سایت کنکور

جزوه
دانلود

رتبه موضوع:
  • 0 رای - 0 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
تاپیک جامع آموزش iptables
#1
سلام دوستان

داخل این تاپیک نکات و آموزش های iptables رو مطرح می کنیم تا به مرور زمان یک مرجع کاملی برای خودمون داشته باشیم .

Heart

زمانی رو فرض کنید که یک سرویس فعال داریم به عنوان مثال سرویس ssh و یا apache و ...

اما قرار هست این سرویس فقط برای یک رنج آی پی خاص و یا حتی یک آی پی خاص و ... باز باشد . یعنی در کل گروهی دسترسی به این سرویس را داشته و گروهی دسترسی به این سرویس را نداشته باشند .

برای این منظور می توان به عنوان مثال از رول زیر استفاده کرد :

کد:
iptables -A INPUT -s 192.168.23.1 -p tcp --dport 22 -j DROP

در رول بالا تمامی درخواست های tcp روی پورت 22 که از 192.168.23.1 فرستاده می شود , Drop می شود .

با استفاده از رول بالا دسترسی آی پی 192.168.23.1 روی پورت 22 را کامل بستیم اما نکته ای که وجود دارد این جا است :

اگر آی پی 192.168.23.1 شروع به اسکن سرور ما کند , خروجی اسکن بر روی پورت 22 به صورت زیر در می آید : ( پویشگر = nmap )
کد:
PORT STATE SERVICE
22/tcp filtered ssh

از روی عبارت filtered می توان دریافت که اولا یک فایروال از این پورت محافظت می کند دوما سرویس ssh بر روی سرور ممکن است فعال باشد .

برای حل این مشکل کافیست دسترسی آی پی 192.168.23.1 را به شکل زیر محدود کنیم :

کد:
‫‪iptables –A INPUT –p tcp --dport 22 –s 192.168.23.1 –j REJECT --reject-with tcp-reset‬‬

با استفاده از رول بالا . اگر آی پی 192.168.23.1 بخواهد یک کانکشن روی پورت 22 برقرار کند , سریعا از طرف سرور با پکتی با مضمون reset که جهت پایان دادن به ارتباط است , مواجه می شود .

خروجی این رول را در عمل می توان به صورت زیر در nmap دید :

کد:
PORT STATE SERVICE
22/tcp closed ssh

توجه داشته باشید که موضوع فقط بر سر محدود کردن یک آی پی خاص نیست , بلکه گمراه کردن ( تا حدودی ) پویشگر نیز ملاک است .

نویسنده : e2ma3n
منبع : او اس لرن | http://OSLearn.ir
پاسخ
 سپاس شده توسط Mahdi ، N3td3v!l
#2
سلام مجدد

زمانی رو فرض کنید که سیستم گنو لینوکسی ما نقش یک روتر را بازی کند

و لازم داریم آی پی تمامی پکت ها و در خواست های سیستم های تحت شبکه به آی پی سیستم روتر ما تغییر پیدا کن و در نتیجه از روتر خارج شود .

برای این منظور از رول زیر استفاده می کنیم :

کد:
iptables -t nat -A POSTROUTING -o wlan0 -j SNAT --to 192.168.1.30

توجه داشته باشید که با استفاده از سویچ o- اینترفیس خروجی پکت ها رو مشخص کردیم
توجه داشته باشید که 192.168.1.30 همان آی پی اینترفیس wlan0 ما می باشد که خواستیم آی پی تمامی پکت ها به آن تغییر کند

[عکس: attachment.php?aid=29]

دلیل استفاده از این روش می تواند این باشد که Router 1 , سیستم گنو لینوکسی ما را به عنوان یک روتر نشناسد و به چشم یک کلاینت معمولی روی یک اینترفیس به آن نگاه کند . طبیعتا در چنین حالتی Router 1 نمی تواند با دیگر سیستم ها و شبکه ی زیر سیستم گنو لینوکسی ما ارتباط بر قرار کند .

توجه داشته باشید که تا قبل از استفاده از رول بالا , پکت ها از کلاینت ها به سمت Router 1 فرستاده می شوند اما در بازگشت دچار مشکل می شوند چرا که در Router 1 هیچ راهی برای بازگشت در نظر نگرفته شده است . در واقع Router 1 فقط سیستم گنو لینوکسی با آی پی 192.168.1.30 را می شناسد و می تواند پکت ها را تحویلش دهد .

لذا با استفاده از این رول Router 1 را مجاب به رساندن پکت های باز گشتی به سیستم گنو لینوکسی می کنیم . حال سیستم گنو لینوکسی آن پکت را rout می کند و به دست کلاینت و یا main server می رساند .

نکته : تمامی پکت های رسیده شده به Router 1 حاوی آدرس آی پی 192.168.1.30 می باشند . لذا مشخص کردن این که چه پکتی از کدام سیستم آمده است ( با استفاده از آی پی ) در Router 1 مقدور نیست .


Heart
نویسنده : e2ma3n
منبع : او اس لرن | http://OSLearn.ir


فایل‌های پیوست
.png   iptables001.png (اندازه 37/57 KB / تعداد دانلود: 55)
پاسخ
 سپاس شده توسط Mahdi ، AL1R3Z4 ، N3td3v!l
#3
سلام
ممنون از ایمان عزیز بابت باز کردن این تاپیک
منم به سهم خودم یه سری نکات رو عنوان میکنم
برای بستن telnet از بیرون به داخل از رول زیر میتونیم استفاده کنیم :
کد پی‌اچ‌پی:
iptables -A INPUT -p tcp --dport telnet -j REJECT 
میتونیم از داخل به بیرون ssh زدن رو غیر فعال کنیم :
کد پی‌اچ‌پی:
iptables -A OUTPUT -p tcp --dport ssh -j REJECT 
برای بستن کل ترافیک روی شبکه به جز ssh
کد پی‌اچ‌پی:
iptables -A INPUT -p tcp --dport ssh -j ACCEPT
iptables 
-A INPUT -j REJECT 
برای باز کردن ssh محدود به صاحب یک آی پی :
کد پی‌اچ‌پی:
iptables -A INPUT -p tcp -s 77.66.55.44 --dport ssh -j ACCEPT
iptables 
-A INPUT -p tcp --dport ssh -j REJECT 
برای محدود کردن ترافیک به ssh از طریق Mac Address
کد پی‌اچ‌پی:
iptables -A INPUT -m mac --mac-source 00:e0:4c:f1:41:6b -p tcp --dport ssh -j ACCEPT
iptables 
-A INPUT -p tcp --dport ssh -j REJECT 
برای بستن ترافیک روی یه اینترفیس برای یه رنج آی پی :
کد پی‌اچ‌پی:
iptables -A INPUT -i eth0 -s 10.3.105.0/24 -j DROP 
نکته ای که برای postrouting هست اینه که باید آی پی فورواردینگ فعال باشه روی سرور که از این طریق میشه فعالش کرد :
کد پی‌اچ‌پی:
echo "1" > /proc/sys/net/ipv4/ip_forward 
برخی مواقع هم که توی یه شبکه از لینوکس به عنوان روتر استفاده میکنید یا فایروالی دارید که به کنسولش دسترسی دارید برای بستن یه وب سایت خاص تو شبکه میتونید از این دستور استفاده کنید :
کد پی‌اچ‌پی:
iptables -A INPUT -s site.com -p tcp --sport www -j DROP 
امیدوارم که این مطالب هرچند خلاصه براتون مفید بوده باشه   Smile
پیروز و سربلند بشید .
نویسنده : N3td3v!l
منبع : او اس لرن دات آی آر
پاسخ
 سپاس شده توسط Mahdi ، E2MA3N
#4
سلام مجدد

ممنون از محمد عزیز  Heart

نکته ی بعدی رو از خلال  نکات محمد می کشیم بیرون  Big Grin

به جملات زیر توجه کنید :

نقل قول:برای بستن کل ترافیک روی شبکه به جز ssh

کد:
iptables -A INPUT -p tcp --dport ssh -j ACCEPT
iptables -A INPUT -j REJECT

حالا سوال رو مطرح می کنم : دلیل این که اول ssh رو ACCEPT کردیم سپس کل ترافیک رو REJECT کردیم چیست ؟ آیا می توان ابتدا کل ترافیک را REJECT کرد سپس ssh را باز کرد ؟! به طور کلی آیا رعایت هم چین ترتیب هایی اهمیت دارد ؟ یا iptables به صورت هوشمند عمل می کند ؟

در جواب باید گفت که ترافیک ssh جزیی از ترافیک کل حساب می شود . حال اگر ابتدا کل ترافیک را REJECT کنیم .
وقتی ترافیکی روی پورت 22 و ssh سعی میکنه داخل سرور بشه , از اون جایی که ابتدا کل ترافیک رو REJECT کردیم و از اون جایی که ssh هم جزیی از کل ترافیک محسوب میشه , اجازه ssh زدن به داخل سرور صادر نمیشه ! این در حالی است که در iptables عملا ssh را ACCEPT کردیم .

عکس این قضیه نیز صادق است . یعنی ابتدا ssh را ACCEPT کنیم و سپس کل ترافیک را REJECT کنیم

در این حالت به عنوان مثال پکت هایی روی پورت 80 سعی می کنن وارد سرور بشن و ابتدا با رول اولی که ست کردیم مقایسه می شن و چون یکی نیستند سپس با رول دوم مقایسه می شود و از اون جایی که ترافیک پورت 80 هم جزیی از کل ترافیک حساب می شه , در نتیجه ترافیک روی پورت 80 REJECT می شود .

حالا توی این مثال 2 رول به این شکل داشتیم اما زمانی هست که تعداد این جور رول ها بالا می ره و باید ترتیبشون رعایت بشه .

نویسنده : e2ma3n
منبع : او اس لرن | http://OSLearn.ir
پاسخ
 سپاس شده توسط N3td3v!l ، Mahdi
#5
سلام مجدد


سرویسی فعال مانند ssh را بر روی سرور فرض کنید . حال برای جلوگیری از حملات دیکشنری و یا بروت فرس از 2 رول زیر استفاده می کنیم :

کد:
iptables -t filter -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 3600 --hitcount 2 -j DROP

نکته : با استفاده از سویچ t- جدول مربوطه یعنی filter را انتخاب کردیم
نکته : به سویچ I- که مربوط به قرار دادن این رول در بالاترین اولویت است توجه کنید
نکته : با استفاده از سویچ p- پروتکل خودمون یعنی tcp رو معین کردیم
نکته : با استفاده از سویچ dport-- پورت مقصد رو مشخص کردیم
نکته : با استفاده از سویچ state-- و NEW یک کانکشن جدید را تعریف کردیم
نکته : با استفاده از سویچ m- و recent
نکته : با استفاده از سویچ update-- حافظه را آپدیت کردیم
نکته : با استفاده از سویچ seconds-- مدت زمان ban بودن آی پی را مشخص کردیم ( 1 ساعت )
نکته : با استفاده از سویچ hitcount-- تعداد کانکشن ها را مشخص کردیم ( به مثال 2 تا )

توجه : می توانیم از سویچ seconds-- جهت مشخص کردن مدت زمان ban بودن آی پی استفاده نکنیم

در مرحله ی بعد لازم به وارد کردن رول زیر می باشد :

کد:
iptables -t filter -A INPUT -p tcp -dport 22 -m state --state NEW -m recent --set

نکته : به سویچ A- و اضافه شدن این رول به انتهای جدول توجه کنید
نکته : با استفاده از سویچ set-- یک حافظه جدید ایجاد کردیم

توجه : با استفاده از این 2 رول . این پالیسی را برای تمامی ترافیک ورودی بر روی پورت 22 اعمل کردیم . طبیعتا می توان به طور هم زمان از 2 سویچ s- برای مشخص کردن مبدایی خاص و یا i- برای مشخص کردن اینترفیسی خاص استفاده کرد .


نتیجه : نتیجه ی اعمال این پالیسی این خواهد شد که هر آدرس آی پی فقط می تواند 2 کانکشن بر روی پورت 22 به سرور برقرار کند . حال این 2 کانکشن را می تواند صرف 2 با ssh زدن به سرور یا 2 بار اسکن سرور کند  Smile

نویسنده : e2ma3n
منبع : او اس لرن | http://OSLearn.ir
پاسخ
 سپاس شده توسط Mahdi
#6
سلام مجدد . آموزش شماره 6

در مثال های قبلی نحوه ی بستن یک پورت بررسی شد . اما زمانی هست که می خواهیم یک پروتکل را بر روی فایروال ببندیم . به عنوان مثال قصد داریم تا پینگ را بر روی سرور ببندیم .


یعنی از بیرون کسی نتونه سرور رو پینگ کنه . برای این منظور کافیست از رول زیر استفاده کنیم :

کد:
iptables -t filter -A INPUT -p icmp -j DROP


توجه : با استفاده از رول بالا تمامی پکت های icmp که قصد وارد شدن به سرور را دارند DROP می شوند اما نکته این جاست که این پکت ها می تواند از دو نوع زیر باشند :

1. پکت request
2. پکت reply

زمانی که کسی سرور را پینگ می کند , پکت های request هستند که وارد سرور می شوند و با توجه به رول بالا DROP می شوند
اما وقتی از داخل سرور , جایی رو پینگ کنیم . این پکت های reply از طرف مقصد هستند که قصد وارد شدن به سرور را دارند و چون از رول بالا استفاده کردیم , این پکت ها هم DROP می شوند

در واقع ما فقط می خواهیم کسی نتواند سرور ما را پینگ کند اما می خواهیم بتوانیم هر جایی را پینگ کنیم . پس برای جلوگیری از پینگ کردن سرور از بیرون , کافیست پکت های icmp از جنس request را DROP کنیم .

یعنی به طور دقیق تر از رول زیر استفاده کنیم :

کد:
iptables -t filter -A INPUT -p icmp --icmp-type echo-request -j DROP

همان طور که گفته شد , نتیجه ی این رول این خواهد شد که کسی نمی تواند سرور ما را پینگ کند اما ما می توانیم از داخل سرور , بقیه ی سرور ها و ... رو پینگ کنیم .

به عنوان مثال به شکل زیر توجه کنید :

[عکس: attachment.php?aid=31]

اگر رول بالا را بر روی سیستم 192.168.0.5 ست کنیم , نتیجه این خواهد شد که سیستم 192.168.0.3 نمی تواند ما را پینگ کند اما ما می توانیم آن را پینگ کنیم .

موفق باشید  Heart


نویسنده : E2MA3N
منبع : او اس لرن | http://OSLearn.ir


فایل‌های پیوست
.gif   PE_ping.gif (اندازه 8/83 KB / تعداد دانلود: 13)
پاسخ


پرش به انجمن:


کاربران در حال بازدید این موضوع: 1 مهمان

تماس با ما | انجمن تخصصی او اس لرن | بازگشت به بالا | | حالت آرشیو | پیوند سایتی آراِس‌اِس