Debian 11环境下如何对WireGuard超限节点进行针对性带宽限速
Debian 11环境下如何对WireGuard超限节点进行针对性带宽限速
嗨,我来帮你搞定这个WireGuard节点的带宽管控问题!既然你已经实现了节点流量用量的监控,那完全不需要额外创建wg1接口——我们可以用tc(Traffic Control)结合iptables的流量标记功能,精准对单个超限节点进行限速,下面是具体的实现方案:
核心思路
- 给wg0接口搭建HTB(Hierarchical Token Bucket)队列框架,创建两个流量类:
- 一个是不限速类:给未达流量上限的节点使用,直接跑满服务器100Mbit带宽
- 一个是限速类:给超过100GB/month的节点使用,限制在2Mbit
- 通过iptables的
mangle表,给不同WireGuard节点的IP流量打上专属标记 - 让
tc根据标记把流量导向对应的限速/不限速类
具体配置步骤
1. 初始化wg0的HTB根队列
先清理掉wg0上可能存在的旧队列规则,然后创建根队列:
tc qdisc del dev wg0 root 2>/dev/null tc qdisc add dev wg0 root handle 1: htb default 10
这里default 10表示默认流量走标记为10的类(我们后面把不限速类设为1:10)
2. 创建两个流量类
- 不限速类(对应未超限节点):
tc class add dev wg0 parent 1: classid 1:10 htb rate 100mbit ceil 100mbit
rate是保证带宽,ceil是最大带宽,这里都设为100Mbit,相当于不限速
- 限速类(对应超限节点):
tc class add dev wg0 parent 1: classid 1:20 htb rate 2mbit ceil 2mbit
这里把速率限制在2Mbit,上下行都生效
3. 用iptables标记节点流量
假设你的三个WireGuard节点IP分别是10.0.0.2、10.0.0.3、10.0.0.4:
- 对于未超限的节点,不需要额外标记(默认走1:10类)
- 当某个节点(比如
10.0.0.2)超限后,给它的进出流量打标记20:
# 标记节点的上行流量(从节点到服务器) iptables -t mangle -A PREROUTING -i wg0 -s 10.0.0.2 -j MARK --set-mark 20 # 标记节点的下行流量(从服务器到节点) iptables -t mangle -A POSTROUTING -o wg0 -d 10.0.0.2 -j MARK --set-mark 20
4. 让tc根据标记转发流量
添加规则,把标记为20的流量导向限速类1:20:
tc filter add dev wg0 parent 1: protocol ip prio 1 handle 20 fw flowid 1:20
动态调整限速
你可以把标记/取消标记的逻辑整合到你的流量监控脚本里:
- 当监控到节点流量超过100GB时,执行上面的iptables标记命令
- 当节点流量重置(比如每月清零)时,删除对应的标记规则:
iptables -t mangle -D PREROUTING -i wg0 -s 10.0.0.2 -j MARK --set-mark 20 iptables -t mangle -D POSTROUTING -o wg0 -d 10.0.0.2 -j MARK --set-mark 20
验证配置是否生效
- 查看wg0的tc类配置:
tc class show dev wg0
- 查看iptables的标记规则:
iptables -t mangle -L -n -v
- 测试限速效果:可以在节点上用
iperf3连接服务器,看带宽是否被限制在2Mbit以内
补充说明
这种方案的优势在于不需要改动WireGuard的接口配置,完全通过流量标记和队列控制实现精准限速,每个节点的限速状态可以独立调整,非常灵活。
备注:内容来源于stack exchange,提问作者Space




