هنگامی که یک کاربر از وبسایت بازدید میکند، یک یا چند درخواست به پورت ۸۰ سرور فرستاده میشود. اگر کاربری در زمان کوتاه، تعداد درخواستهای زیادی به سرور بفرستد، حالا از طریق پینگ کردن سایت و یا بازدید صفحات وبسایت و یا دیدگاه گذاشتن و غیره، بر حسب تنظیمات سرور ممکن است: هیچ اتفاقی نیافتد, زمان لود سرور بالا برود یا در بدترین حالت سرور 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 22 -m connlimit --connlimit-above 3 -j REJECT
کانکشن HTTP را برای هر IP محدود کنید.
در مثال زیر تعداد ۲۰ درخواست به HTTP برای هر IP امکان پذیر است.
/sbin/iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 20 -j REJECT --reject-with tcp-reset
در نظر داشته باشید باید IP پراکسی سرور خودتان برای مثال 1.2.3.4 را از این محدودیتها خارج کنید:
/sbin/iptables -A INPUT -p tcp --syn --dport 80 -d ! 1.2.3.4 -m connlimit --connlimit-above 20 -j REJECT --reject-with tcp-reset
محدودیت IPهای کلاس C
در مثال زیر میبینید که IPهای کلاس C تنها مجازند ۲۰ درخواست به HTTP ارسال کنند.:
/sbin/iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 20 --connlimit-mask 24 -j REJECT --reject-with tcp-reset
محدودیت بر اساس ثانیه
در مثال زیر میبینید اگر یک IP تعداد ۱۰ درخواست به HTTP را در زمان کمتر از ۱۰۰ ثانیه ارسال کند، دسترسیاش محدود میشود.
#!/bin/bash IPT=/sbin/iptables # Max connection in seconds SECONDS=100 # Max connections per IP BLOCKCOUNT=10 # .... # .. # default action can be DROP or REJECT DACTION="DROP" $IPT -A INPUT -p tcp --dport 80 -i eth0 -m state --state NEW -m recent --set $IPT -A INPUT -p tcp --dport 80 -i eth0 -m state --state NEW -m recent --update --seconds ${SECONDS} --hitcount ${BLOCKCOUNT} -j ${DACTION} # .... # ..
فایروال را چگونه تست کنید:
اسکریپت زیر را اجرا کنید. فرض کنید IP سرور/ سرور مجازی شما 202.1.2.3 است.
#!/bin/bash ip="202.1.2.3" port="80" for i in {1..100} do # do nothing just connect and exit echo "exit" | nc ${ip} ${port}; done
[…] […]