You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Debian 11环境下如何对WireGuard超限节点进行针对性带宽限速

Debian 11环境下如何对WireGuard超限节点进行针对性带宽限速

嗨,我来帮你搞定这个WireGuard节点的带宽管控问题!既然你已经实现了节点流量用量的监控,那完全不需要额外创建wg1接口——我们可以用tc(Traffic Control)结合iptables的流量标记功能,精准对单个超限节点进行限速,下面是具体的实现方案:

核心思路

  1. 给wg0接口搭建HTB(Hierarchical Token Bucket)队列框架,创建两个流量类:
    • 一个是不限速类:给未达流量上限的节点使用,直接跑满服务器100Mbit带宽
    • 一个是限速类:给超过100GB/month的节点使用,限制在2Mbit
  2. 通过iptables的mangle表,给不同WireGuard节点的IP流量打上专属标记
  3. 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.210.0.0.310.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

火山引擎 最新活动