嘿嘿,在准备共享时就考虑过这个问题。
第一种就是通过 hashlimi 限制并发,但是限制并发一直是一种不好的方法,不建议,除非服务器有并发限制。下面的方法可以让 wget 由 40MB/s 下降到 500kb/s-1MB/s 左右。这样就浪费爆破的人的时间。。。
##-A INPUT -p tcp -m multiport --dport 80,1723,8080,8443,8843 -d xxx.62.112.147 -m hashlimit --hashlimit-name obfs --hashlimit 80/sec --hashlimit-burst 350 --hashlimit-mode srcip,srcport --hashlimit-htable-expire 300000 -j ACCEPT
##-A INPUT -p tcp -m multiport --dport 80,1723,8080,8443,8843 -d xxx.62.112.147 -j REJECT
=================
使用 iptables recent quota 每天对每 ip 流量进行限制。
预先在 iptables INPUT 获得访问用户的源 ip
iptables -I INPUT -p tcp -m multiport --dport 80,443,1723,8080,8443,8843 -d xxx.62.112.147 -m recent --name squota --rsource --set
然后用 cron 每 5 分钟调度
quota.sh */5 * * * * /tmp/
quota.sh在每天的 1701 点去除所有限制
根据 squota 列表获得源 ip 限制每个 ip 可以使用 2Gbytes 流量,但是用户可以通过更换 ip 继续获得 2Gbytes 流量
新建一个 quota40g 表用于计数用途,当天用完 40Gbytes 流量,服务器 DROP 所有的访问。
#/bin/sh
perip_traffic=2147483648 #2Gbytes
if [ $(date +"%H%M") = 1701 ];then
total_traffic=42949672960 #40Gbytes
#建立每天总流量 40G 限制
iptables -N quota40g
iptables -F quota40g #iptables -Z quota40g
iptables -Z OUTPUT
iptables -A quota40g -m quota --quota $total_traffic -j ACCEPT
iptables -A quota40g -j DROP
#去除过期限制
echo / >/proc/net/xt_recent/squota
echo / >/proc/net/xt_recent/bquota
echo "`(date +"%m/%d/%Y %T")` iptables_quota clear successfully_" >> /tmp/log
fi
#排除非限制 IP
echo -XXX.62.112.147 >/proc/net/xt_recent/squota
echo -XXX.78.0.25 >/proc/net/xt_recent/squota
#根据源 ip 列表做匹配添加每 ip 限制操作
cat /proc/net/xt_recent/squota|awk '{print $1}' |awk -F"=" '{print $2}'|awk '!i[$1]++'>/tmp/squota.tmp
iptables -S OUTPUT>/tmp/iptables.quota
for i in `cat /tmp/squota.tmp`;
do grep -q $i /tmp/iptables.quota
if [ $? -gt 0 ];then
#注意顺序不然可能会导致立刻 quota 又被立刻 unquota
iptables -I OUTPUT -o venet0 -d $i -m quota --quota $perip_traffic -j quota40g
iptables -A OUTPUT -o venet0 -d $i -m recent --name bquota --rdest --set
iptables -A OUTPUT -o venet0 -d $i -j REJECT
echo "`(date +"%m/%d/%Y %T")` iptables_quota $i successfully_" >> /tmp/log
fi;done