خیلی خوب .
یک راهنمای کلی میکنم . برای اطلاعات بیشتر به سایت netfilter مراجعه کنید :
ببینید :
سیستم قبل از اینکه رول های فایروال رو اجرا کنه policy موجود در فایروال رو بررسی میکنه :
کد :
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
همان طور که میبینید تمام Chain های فایروال روی جدول Filter به صورت Accept هستش . این بدین معنی هست که تمام درخواست هایی مقصدشان این سیستم هست و تمام درخواست هایی که از این سیستم ارسال میشه تایید میشه و دریافت و ارسال میشه . (در مورد Forward هم به همین صورت هستش)
حال شما شروع می کنید به نوشتن رول های مورد نیاز خودتون :
برای مثال ما فرض رو بر این میگیریم که این سیستم یک سرور Apache و SSH هست و می خواهیم یک سرور امن برای پورت های این دو سرویس داشته باشیم .
از آنحایی که در خواست ها به Destination این سیستم ارسال می شوند . یعنی Destination همین سرور هست . پس رول ها رو به این صورت می نویسیم :
کد :
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -j REJECT
دو تا رول اول به معنی تایید تمام در خواست های پورت ۸۰ و ۲۲ برای سرور هست و رول آخر هم هر چی در خواست دیگری به سمت سرور بیاد رو Reject می کنه .
خیلی خوب حالا شما می خواهید مثلا پورت 3306 سرویس MySQL رو هم روی سیستم تایید کنید .
چیزی که کاربران تازه کار در موردش اشتباه می کنند . اینجاست :
من این رول رو اجرا میکنم :
iptables -A INPUT -p tcp --dport 3306 -j ACCEPT
خوب مشکل اینجاست که این رول بعد از رول REJECT نوشته میشه و سیستم نمیتونه این رول رو اجرا کنه .
نکته :سیستم عامل لینوکس رول ها رو به ترتیب از بالا به پایین اجرا میکنه :
ببینید :
کد :
iptables -L -n
Chain INPUT (policy ACCEPT)
target prot opt source destination
DROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
DROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable
DROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:3306
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
همان طور که میبینید رول مربوط به سرویس MySQL اجرا نخواهد شد .
برای حل این مشکل یا باید رول Reject رو پاک کرده و بعد از گذاشتن رول MySQL اون رو از دوباره اجرا کنید .
راه حل دوم هم استفاده از گزینه I- (آی بزرگ) هست .
کد :
iptables -I INPUT -p tcp --dport 3306 -j ACCEPT
برای استفاده از راه حل اول هم باید از دستور زیر برای پاک کردن رول استفاده کنید :
کد :
iptables -D INPUT -j REJECT
تمام .
راهنما و داکیومنت های مورد نیازتون رو هم نیتونید از google و یا سایت netfilter تهیه کنید .