对Linux服务器的端口限速

本文讲解利用 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,执行以下命令,请替换你自己的外网网卡名称。

  1. 清理iptables Mangle规则

    iptables -t mangle -F
    
  2. 清理eth0上原有的队列类型

    tc qdisc del dev eth0 root
    
  3. 给eth0添加一个根规则

    tc qdisc add dev eth0 root handle 1: htb default 1
    
  4. 创建根类

    100mbps 可以替换成你自己服务器的实际带宽

    tc class add dev eth0 parent 1:0 classid 1:1 htb  rate 1000Mbit
    
  5. 创建支类限速

    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秒钟检查一次。

  6. 设置子类的排队规则

    tc qdisc add dev eth0 parent 1:5 handle 5: sfq perturb 10
    

    sfq是stochastic fairness queueing的简写,意为随机公平队列算法,它会按照会话为流量进行排序,然后循环发送每个会话的数据包

    perturb 10 表示多少秒后重新配置一次散列算法,这是因为sfq并不是真正意义上的随机公平算法,所以必须经常改变算法来保证公平性

  7. 创建过滤器

    tc filter add dev eth0 parent 1:0 protocol ip prio 1 handle 5 fw classid 1:5
    

    这里要注意的就是flowid 要和上一条的 classid对应起来

  8. iptables针对端口限速

    iptables -A OUTPUT -t mangle -p tcp --sport 80 -j MARK --set-mark 5
    

    80 就是 80 端口,这样就对 80 端口限制了速度了,当然你的iptables 得启动才行

  9. 限制多个端口

    例如限制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
    

转载请注明来源