在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.做默认流量分类
- 创建不限速的默认类:tc class add dev eth0 parent 1: classid 1:2 htb rate 1000mbit tc qdisc change dev eth0 root handle 1: htb default 2
- 仅限速标记流量:
- 确保过滤器仅将标记
1
的流量导向1:1
,其他流量进入1:2
。
- 确保过滤器仅将标记
整体逻辑
- 清除旧配置:删除
eth0
接口的现有流量控制规则。 - 设置 HTB 队列:创建分层队列,默认将所有未分类流量导向类
1:1
。 - 限速类定义:类
1:1
限制带宽为 512 kbit/s。 - 流量分类:通过防火墙标记
1
,将特定流量(源端口7003
)导向限速类。 - 标记流量:使用
iptables
标记目标流量。
通过以上配置,系统会将源端口 7003
的 TCP 流量限制为 512 kbit/s,而其他流量不受此限制。