هنگامی که یک کاربر از وبسایت بازدید میکند، یک یا چند درخواست به پورت ۸۰ سرور فرستاده میشود. اگر کاربری در زمان کوتاه، تعداد درخواستهای زیادی به سرور بفرستد، حالا از طریق پینگ کردن سایت و یا بازدید صفحات وبسایت و یا دیدگاه گذاشتن و غیره، بر حسب تنظیمات سرور ممکن است: هیچ اتفاقی نیافتد, زمان لود سرور بالا برود یا در بدترین حالت سرور down شود.
اما چه تنظیماتی روی سرور باید انجام دهیم تا به مشکل خاصی برخورد نکنیم؟ به زبان ساده باید تعداد درخواستهای غیرمجاز IP را محدود کنیم. در این مطلب میخوانیم که چطور میتوانیم تعداد درخواستهای بیش از حد یک IP را از طریق Iptables محدود کنیم.
برای این کار نیاز دارید که ماژول connlimit را نصب کنید. این ماژول امکان محدود کردن چندین کانکشن TCP به سرور از یک IP را میدهد.
سینتکس دستور به شکل زیر است :
۱ |
/sbin/iptables -A INPUT -p tcp --syn --dport $port -m connlimit --connlimit-above N -j REJECT --reject-with tcp-reset |
کانکشن SSH را برای هر IP محدود کنید.
در مثال زیر به هر کلاینت فقط ۳ درخواست میتواند به SSH ارسال کند.
۱ |
/sbin/iptables -A INPUT -p tcp --syn --dport ۲۲ -m connlimit --connlimit-above ۳ -j REJECT |
کانکشن HTTP را برای هر IP محدود کنید.
در مثال زیر تعداد ۲۰ درخواست به HTTP برای هر IP امکان پذیر است.
۱ |
/sbin/iptables -A INPUT -p tcp --syn --dport ۸۰ -m connlimit --connlimit-above ۲۰ -j REJECT --reject-with tcp-reset |
در نظر داشته باشید باید IP پراکسی سرور خودتان برای مثال ۱.۲.۳.۴ را از این محدودیتها خارج کنید:
۱ |
/sbin/iptables -A INPUT -p tcp --syn --dport ۸۰ -d ! ۱.۲.۳.۴ -m connlimit --connlimit-above ۲۰ -j REJECT --reject-with tcp-reset |
محدودیت IPهای کلاس C
در مثال زیر میبینید که IPهای کلاس C تنها مجازند ۲۰ درخواست به HTTP ارسال کنند.:
۱ |
/sbin/iptables -A INPUT -p tcp --syn --dport ۸۰ -m connlimit --connlimit-above ۲۰ --connlimit-mask ۲۴ -j REJECT --reject-with tcp-reset |
محدودیت بر اساس ثانیه
در مثال زیر میبینید اگر یک IP تعداد ۱۰ درخواست به HTTP را در زمان کمتر از ۱۰۰ ثانیه ارسال کند، دسترسیاش محدود میشود.
۱ ۲ ۳ ۴ ۵ ۶ ۷ ۸ ۹ ۱۰ ۱۱ ۱۲ ۱۳ ۱۴ |
#!/bin/bash IPT=/sbin/iptables # Max connection in seconds SECONDS=۱۰۰ # Max connections per IP BLOCKCOUNT=۱۰ # .... # .. # default action can be DROP or REJECT DACTION="DROP" $IPT -A INPUT -p tcp --dport ۸۰ -i eth0 -m state --state NEW -m recent --set $IPT -A INPUT -p tcp --dport ۸۰ -i eth0 -m state --state NEW -m recent --update --seconds ${SECONDS} --hitcount ${BLOCKCOUNT} -j ${DACTION} # .... # .. |
فایروال را چگونه تست کنید:
اسکریپت زیر را اجرا کنید. فرض کنید IP سرور/ سرور مجازی شما ۲۰۲.۱.۲.۳ است.
۱ ۲ ۳ ۴ ۵ ۶ ۷ ۸ |
#!/bin/bash ip="۲۰۲.۱.۲.۳" port="۸۰" for i in {۱..۱۰۰} do # do nothing just connect and exit echo "exit" | nc ${ip} ${port}; done |
یک دیدگاه
Pingback: حمله Brute Force : یکی دیگر از روشهای کرک کردن رمزعبور - کنشتک