Press "Enter" to skip to content

linux下使用iptables和tc限制速度

linux下使用iptables和tc限制速度的方法,记录一下。假设本地搭建了PPTPD服务,又或者有多个网卡,需要对其中一些接口做限速处理的情况,非常有用,本文基于CentOS 6.4 64bit。

1,初始配置

yum install /sbin/tc

vim /etc/sysctl.conf
修改net.ipv4.ip_forward = 1
sysctl -p

#清除原来的mangle表规则
iptables -t mangle -F

#加载sch_htb模块
modprobe sch_htb
echo "modprobe sch_htb" >> /etc/rc.local

2,TC限速设置

假设现在有两块网卡
eth0: xx.xx.xx.xx(外网的上网地址)
eth1: 172.16.44.1(做为内网的网关)

下载限速

下载限速要在eth1上面做,判断数据包的目的地址来做限制。tc包括三部分:队列、类、过滤器。我使用了htb方式去限制速度,也可以使用cbq,但cbq配置比较复杂一点,而且据说性能没htb好。

#删除原来的tc规则队列
/sbin/tc qdisc del dev eth1 root
#添加tc规则队列
/sbin/tc qdisc add dev eth1 root handle 10: htb default 256
#生成根类
/sbin/tc class add dev eth1 parent 10: classid 10:1 htb rate 100mbit ceil 100mbit
#支类列表用于限制速度
#这里的rate指的是保证带宽,ceil是最大带宽。
/sbin/tc class add dev eth1 parent 10:1 classid 10:10 htb rate 400kbps ceil 400kbps prio 1

#添加支类规则队列
#采用sfq伪随机队列,并且10秒重置一次散列函数。
/sbin/tc qdisc add dev eth1 parent 10:10 handle 101: sfq perturb 10

#建立网络包过滤器,设置fw。
/sbin/tc filter add dev eth1 parent 10: protocol ip prio 10 handle 1 fw classid 10:10

在iptables里面设定mark值,与上面的handle值对应

iptables -t mangle -A POSTROUTING -d 172.16.44.130 -j MARK --set-mark 1
iptables -t mangle -A POSTROUTING -d 172.16.44.130 -j RETURN

通过上面的代码就可以限制172.16.44.130这台机子的下载速度到400kbps。

需要注意的是:
1,172.16.44.130也可以写成网段的形式,例如172.16.44.0/24
2,这里的kbps实际上就是KB/S(每秒千字节),另一个单位是kbit,这个才是每秒千比特。

上传限速

上传限速的原理其实跟下载的差不多,只不过限制的网卡不同,要在eth0上过滤来源地址去限制。

#删除原来的tc规则队列
tc qdisc del dev eth0 root

#添加tc规则队列
tc qdisc add dev eth0 root handle 20: htb default 256

#生成根类
tc class add dev eth0 parent 20: classid 20:1 htb rate 100mbit ceil 100mbit

#支类列表用于限制速度
tc class add dev eth0 parent 20:1 classid 20:10 htb rate 40kbps ceil 40kbps prio 1

#添加支类规则队列
tc qdisc add dev eth0 parent 20:10 handle 201: sfq perturb 10

#建立网络包过滤器
tc filter add dev eth0 parent 20: protocol ip prio 100 handle 2 fw classid 20:10
iptables -t mangle -A PREROUTING -s 172.16.44.130 -j MARK --set-mark 2
iptables -t mangle -A PREROUTING -s 172.16.44.130 -j RETURN

跟下载不同的是POSTROUTING要改成PREROUTING,-d改成-s。

参考文章:
linux下使用iptables和tc限制流量笔记

Leave a Reply

Your email address will not be published. Required fields are marked *