本文讲解利用 iptables 和 tc 对 某个或者某些端口做带宽限制
一、系统环境
检查一下是否有安装iptables和tc,如果没有则需要安装
iptables -V
tc -V
二、查看网卡
我们限速,只是对外网的网卡限速。所以,我们需要看看我的外网网卡是什么。
使用ifconfig
或者ip addr
三、单位换算
这个有必要说明一下。网速统计中的几个单位的换算。
Kbps:kbps 中的 p 是per的缩写,意思就是“每”。kbps = kb/s
KB/s: KB/s中的 B 是 Byte (字节数)
kb/s :kb/s中的 b 是 bit (位数)
计算机中 1Byte = 8bit,所以 1KB/s = 8kbps = 8kb/s
一般安装宽带讲的 20M 其实就是 20Mbps = 20Mb/s = (20/8) MB/s
Kbit:Kbit则是KB,1KB = 8Kbit
四、端口限速
演示的外网的网卡是 eth0,执行以下命令,请替换你自己的外网网卡名称。
清理iptables Mangle规则
iptables -t mangle -F
清理eth0上原有的队列类型
tc qdisc del dev eth0 root
给eth0添加一个根规则
tc qdisc add dev eth0 root handle 1: htb default 1
创建根类
100mbps 可以替换成你自己服务器的实际带宽
tc class add dev eth0 parent 1:0 classid 1:1 htb rate 1000Mbit
创建支类限速
tc class add dev eth0 parent 1:1 classid 1:5 htb rate 28Mbit ceil 30Mbit
rate 28Mbit 代表最大带宽28Mbit/s,改成你想要的带宽大小即可。
ceil 30Mbit 代表突发带宽30Mbit/s。
ceil >= rate
1:5 意思是每5秒钟检查一次。
设置子类的排队规则
tc qdisc add dev eth0 parent 1:5 handle 5: sfq perturb 10
sfq是stochastic fairness queueing的简写,意为随机公平队列算法,它会按照会话为流量进行排序,然后循环发送每个会话的数据包
perturb 10 表示多少秒后重新配置一次散列算法,这是因为sfq并不是真正意义上的随机公平算法,所以必须经常改变算法来保证公平性
创建过滤器
tc filter add dev eth0 parent 1:0 protocol ip prio 1 handle 5 fw classid 1:5
这里要注意的就是flowid 要和上一条的 classid对应起来
iptables针对端口限速
iptables -A OUTPUT -t mangle -p tcp --sport 80 -j MARK --set-mark 5
80 就是 80 端口,这样就对 80 端口限制了速度了,当然你的iptables 得启动才行
限制多个端口
例如限制80、443、8080
iptables -A OUTPUT -t mangle -p tcp --sport 80,443,8080-j MARK --set-mark 5
例如限制1000-2000端口段
iptables -A OUTPUT -t mangle -p tcp --sport 1000:2000 -j MARK --set-mark 5
转载请注明来源