设为首页 收藏本站
查看: 1053|回复: 0

[经验分享] iptables+tc实现isp级别每ip限速并限制会话数

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-10-20 07:23:16 | 显示全部楼层 |阅读模式

分类: LINUX




脚本1:

限制会话数

#!/bin/sh

INET=192.168.0.

IPS=1

IPE=253

IDEV=eth1

ODEV=eth0

COUNTER=$IPS

while [ $COUNTER -lt $IPE ]

do

iptables -A FORWARD -i $IDEV -s $INET$COUNTER -m iplimit --iplimit-above 2 -j REJECT

COUNTER=` expr $COUNTER + 1 `

done

限制穿透本机FORWARD链的192.168.0.0/24的每个IP并发连接数不超过2个,超过的被拒绝





脚本2:

针对每个ip限制带宽

#!/bin/bash

tc qdisc del dev eth0 root    2>/dev/null

tc qdisc del dev eth0 ingress 2>/dev/null

tc qdisc del dev eth1 root    2>/dev/null

tc qdisc del dev eth1 ingress 2>/dev/null

DOWNLOAD=128Kbit

UPLOAD=128Kbit

INET=192.168.0.

IPS=1

IPE=253

IDEV=eth1

ODEV=eth0

tc qdisc add dev eth1 root handle 10: cbq bandwidth 100Mbit avpkt 1000

tc qdisc add dev eth0 root handle 20: cbq bandwidth 100Mbit avpkt 1000

tc class add dev eth1 parent 10:0 classid 10:1 cbq bandwidth 100Mbit rate 100Mbit allot 1514 weight 1Mbit prio 8 maxburst 20 avpkt 1000

tc class add dev eth0 parent 20:0 classid 20:1 cbq bandwidth 100Mbit rate 100Mbit allot 1514 weight 1024Kbit prio 8 maxburst 20 avpkt 1000

COUNTER=$IPS

while [ $COUNTER -le $IPE ]

do

tc class add dev $IDEV parent 10:1 classid 10:1$COUNTER cbq bandwidth 100Mbit rate $DOWNLOAD allot 1514 weight 20Kbit prio 5 maxburst 20 avpkt 1000 bounded

tc qdisc add dev $IDEV parent 10:1$COUNTER sfq quantum 1514b perturb 15

tc filter add dev $IDEV parent 10:0 protocol ip prio 100 u32 match ip dst $INET$COUNTER flowid 10:1$COUNTER

COUNTER=` expr $COUNTER + 1 `

done

COUNTER=$IPS

while [ $COUNTER -le $IPE ]

do

tc class add dev $ODEV parent 20:1 classid 20:1$COUNTER cbq bandwidth 1Mbit rate $UPLOAD allot 1514 weight 4Kbit prio 5 maxburst 20 avpkt 1000 bounded

tc qdisc add dev $ODEV parent 20:1$COUNTER sfq quantum 1514b perturb 15

tc filter add dev $ODEV parent 20:0 protocol ip prio 100 handle $COUNTER fw classid 20:1$COUNTER

COUNTER=` expr $COUNTER + 1 `

done

COUNTER=$IPS

while [ $COUNTER -lt $IPE ]

do

iptables -t mangle -A PREROUTING -i $IDEV -s $INET$COUNTER -j MARK --set-mark $COUNTER

COUNTER=` expr $COUNTER + 1 `

done

---------------------------------------
总体思想很简单,为每个IP 打标,然后归入各自的tc 限速规则中去。

#!/bin/sh
# xiaoh www.linuxbyte.org
#  定义进出设备(eth0 内网,eth1外网)
IDEV="eth0"
ODEV="eth1"
#  定义总的上下带宽
UP="50mbit"
DOWN="50mbit"
#  定义每个受限制的IP上下带宽
#rate 起始带宽
UPLOAD="4mbit"
DOWNLOAD="5mbit"
#ceil 最大带宽
MUPLOAD="5mbit"
MDOWNLOAD="10mbit"
#内网IP段
INET="192.168.0."
# 受限IP范围,IPS 起始IP,IPE 结束IP。
IPS="1"
IPE="114"
# 清除网卡原有队列规则
tc qdisc del dev $ODEV root 2>/dev/null
tc qdisc del dev $IDEV root 2>/dev/null
# 定义最顶层(根)队列规则,并指定 default 类别编号
tc qdisc add dev $ODEV root handle 10: htb default 256
tc qdisc add dev $IDEV root handle 10: htb default 256
# 定义第一层的 10:1 类别 (上行/下行 总带宽)
tc class add dev $ODEV parent 10: classid 10:1 htb rate $UP ceil $UP
tc class add dev $IDEV parent 10: classid 10:1 htb rate $DOWN ceil $DOWN
#开始iptables 打标和设置具体规则
i=$IPS;
while [ $i -le $IPE ]
do
tc class add dev $ODEV parent 10:1 classid 10:2$i htb rate $UPLOAD ceil $MUPLOAD prio 1
tc qdisc add dev $ODEV parent 10:2$i handle 100$i: pfifo
tc filter add dev $ODEV parent 10: protocol ip prio 100 handle 2$i fw classid 10:2$i
tc class add dev $IDEV parent 10:1 classid 10:2$i htb rate $DOWNLOAD ceil $MDOWNLOAD prio 1
tc qdisc add dev $IDEV parent 10:2$i handle 100$i: pfifo
tc filter add dev $IDEV parent 10: protocol ip prio 100 handle 2$i fw classid 10:2$i
iptables -t mangle -A PREROUTING -s $INET$i -j MARK --set-mark 2$i
iptables -t mangle -A PREROUTING -s $INET$i -j RETURN
iptables -t mangle -A POSTROUTING -d $INET$i -j MARK --set-mark 2$i
iptables -t mangle -A POSTROUTING -d $INET$i -j RETURN
i=`expr $i + 1`
done
-----------------

之前的Iptables+tc 网吧每IP 限速脚本一文中有一个问题需要补充,如果同时使用squid
做透明代理会使该脚本失效。

做透明代理时有一条iptables规则

iptables -A PREROUTING -s 192.168.0.0/24 -i eth0 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 3128

这一规则把所有内网80端口的请求都转发到了网关,如此一来所有向外网的普通http 请求者都成了网关(192.168.0.254),而网关是不做限速的,所以所有http下载都不被限速了。



所以为了能现在http下载,我们要使用squid 的限速功能,配置命令如下:

acl LIMIT_IP src 192.168.0.0/25
delay_pools 1
delay_class 1 2
delay_access 1 allow LIMIT_IP
delay_parameters 1 -1/-1 500000/500000

squid 的限速控制不是很精确限速500000 bytes/sec 的浮动在4xx/KB 到8XX/KB 之间 -__-!

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-128847-1-1.html 上篇帖子: ptables的NAT功能设置和linux升级内核后遇到 can't initialize iptables table `nat': Table does n 下篇帖子: 四十九 iptables使用
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表