在Linux实现端口级限速

最近在研究网络,发现网上没有很好的端口级的限速,下面分享的代码是用于在 Linux 系统中对网络流量进行带宽限制,具体流量从 eth0 接口发出、源端口为 7003 的 TCP 流量,将其带宽限制为 512 kbit/s。以下是解释:


1. 删除现有的流量控制规则

代码语言:bash复制
tc qdisc del dev eth0 root
  • 作用:删除 eth0 接口上的根队列规则(qdisc),主要用来删除原来配置。
  • 解释:清理现有配置,确保后续规则能正确应用。

2. 创建新的根队列规则(HTB 算法)

代码语言:bash复制
tc qdisc add dev eth0 root handle 1: htb default 1
  • 作用:在 eth0 接口上添加一个 HTB(Hierarchical Token Bucket) 队列规则。
  • 参数
    • handle 1::标识该队列规则的句柄为 1:
    • default 1:未分类的流量默认发送到类 1:1
  • 解释:HTB 支持分层流量分类,此处设置默认类为 1:1,后续所有未明确分类的流量会进入该类。

3. 创建带宽限制类

代码语言:bash复制
tc class add dev eth0 parent 1: classid 1:1 htb rate 512kBit
  • 作用:在父类 1:(根队列)下创建一个子类 1:1,并限制其带宽为 512 kbit/s
  • 参数
    • parent 1::父队列为根队列 1:
    • classid 1:1:子类的唯一标识符。
    • rate 512kBit:限制该类的带宽为 512 kbit/s。
  • 解释:所有进入该类的流量将被限速到 512 kbit/s。

4. 添加过滤器匹配流量

代码语言:bash复制
tc filter add dev eth0 parent 1:0 protocol ip handle 1 fw flowid 1:1
  • 作用:将防火墙标记(fw)为 1 的 IP 流量分类到 1:1 类。
  • 参数
    • parent 1:0:过滤器附加到根队列(1: 的另一种写法)。
    • handle 1:过滤器的标识符。
    • fw:匹配防火墙标记。
    • flowid 1:1:匹配的流量导向类 1:1
  • 解释:通过 iptables 标记的流量(后文)会被此过滤器识别并限速。

5. 使用 iptables 标记流量

代码语言:bash复制
iptables -A OUTPUT -t mangle -p tcp --sport 7003 -j MARK --set-mark 1
  • 作用:在 OUTPUT 链的 mangle 表中,对源端口为 7003 的 TCP 流量打上标记 1
  • 参数
    • -t mangle:修改数据包属性(如标记)。
    • --sport 7003:匹配源端口为 7003 的流量。
    • --set-mark 1:为匹配的流量设置标记 1
  • 解释:标记后的流量会被 tc filter 识别并分类到限速类 1:1

6.做默认流量分类

  1. 创建不限速的默认类:tc class add dev eth0 parent 1: classid 1:2 htb rate 1000mbit tc qdisc change dev eth0 root handle 1: htb default 2
  2. 仅限速标记流量
    • 确保过滤器仅将标记 1 的流量导向 1:1,其他流量进入 1:2


整体逻辑

  1. 清除旧配置:删除 eth0 接口的现有流量控制规则。
  2. 设置 HTB 队列:创建分层队列,默认将所有未分类流量导向类 1:1
  3. 限速类定义:类 1:1 限制带宽为 512 kbit/s。
  4. 流量分类:通过防火墙标记 1,将特定流量(源端口 7003)导向限速类。
  5. 标记流量:使用 iptables 标记目标流量。

通过以上配置,系统会将源端口 7003 的 TCP 流量限制为 512 kbit/s,而其他流量不受此限制。