با سلام:
قبل از ادامه تاپیک، اشاره به چند نکته:
1- درباره قوانینی که برای فایروال به جهت جلوگیری از حملات Cache Poisoning، درپست قبلی گفته شد، باید به این موضوع اشاره کرد که چون دراین حملات، مهاجم معمولا چندین درخواست query رو درمدت زمان کوتاهی ارسال میکنه (مثلا 10 درخواست در مدت 10 دقیقه یا حتی کمتر ازیک دقیقه) به کاربردن این قوانین باعث میشه فایروال، بسته ها با IP آدرس یکسان که
7 درخواست درمدت 660 ثانیه (11دقیقه) داشته باشن وبا بررسی درخواستهای اون IP آدرس درمموری فایل DNSTHROTTLE ، بهشون اجازه عبور نده و این بسته ها دور ریخته میشن (drop) وعملا حمله مهاجم، ناموفق خواهد بود و برای بسته سالم با استفاده از cache، با حداقل اجازه جستجو برای اون domain، به درخواست کاربر پاسخ داده میشه.
2- برای Domainهای زیاد، نمیشه ازراهکار قبلی استفاده کرد. چون درخواستهای سالم برای Domainهای زیاد، طبیعتا بیشترهستش و کاربرد این قوانین باعث میشه فایروال توانایی تشخیص بسته های سالم رو از بسته های ناسالم نداشته باشه.
در این حالت میشه از SNAT در iptables کمک گرفت:
چون درحملات آلوده کردن cache، پیش بینی پورت مبدا توسط مهاجم بعنوان شرط لازم برای تدارک دیدن این حملات محسوب میشه، پس اگربا iptables بتونیم پورت مبدا که توسط BIND استفاده میشه رو به پورت مبدا دیگه بصورت random تغییر بدیم، عملا کارمهاجم رو برای پیش بینی پورت مبدا، مشکل کردیم.
iptables میتونه اینکار رو با SNAT وبا استفاده از آپشن random-- براحتی انجام بده:
(SNAT توانایی تغییردادن پورتهای مبدا رو برای هم tcp وهم udp داره...)
کد:
# iptables -t nat -I POSTROUTING 1 -p udp -s "your DNS server IP" --dport 53 -j SNAT --to "your DNS server IP" --random
ولی مهاجم میتونه با استفاده از nmap، پورت مبدا تصادفی رو که SNAT برای درخواستهای یک domain اختصاص داده رو بدست بیاره، مثلا با این دستور:
کد:
# nmap --source-port 6666 -P0 -p 53 -sU "domain IP1" "domain IP2"
برای حل این مشکل میشه با تنظیم تایمرها (مثلا 30 ثانیه) در nf_ct_udp_timeout و
nf_ct_udp_timeout_stream در فایل net/netfilter/nf_conntrack_proto_udp.c/ باعث شد تا
SNAT پورت مبدا تصادفی برای درخواستهای یک domain خاص رو هر 30 ثانیه یکبار تغییر بده .