我有一个仅具有一个网络接口的 VPS ens3
(此外lo
)。
我在想我可以创建一个虚拟网络接口并使用令牌桶过滤器队列规则来限制该特定接口的带宽。因此,我tun0
在 Debian 12 测试服务器上创建了一个接口。(我知道tun0
它经常用于 OpenVPN,但我没有安装它。)
# ip tuntap add dev tun0 mode tun
# ip addr add 10.0.0.1/24 dev tun0
# ip link set up dev tun0
# iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to 10.0.0.1:80
# iptables -t nat -A POSTROUTING -o enp0s3 -s 10.0.0.0/24 -j MASQUERADE
# tc qdisc add dev tun0 root tbf rate 4mbit burst 128kbit latency 400ms
这里是tun0
(通知qdisc tbf
):
3: tun0: <NO-CARRIER,POINTOPOINT,MULTICAST,NOARP,UP> mtu 1500 qdisc tbf state DOWN group default qlen 500
link/none
inet 10.0.0.1/24 scope global tun0
valid_lft forever preferred_lft forever
我将nginx绑定到10.0.0.1:80,并确认。
# netstat -anpe46
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State User Inode PID/Program name
tcp 0 0 10.0.0.1:80 0.0.0.0:* LISTEN 0 14048 831/nginx: master p
我在另一台电脑上运行了 wget,预计下载速度只能达到 4mbps。不幸的是,我的下载速度达到了最高速度。
nload
显示了带宽使用情况的图表,但tun0
界面上没有任何显示。它只在界面上显示了网络带宽ens3
。这到底是为什么?!?
此外:
/sys/devices/virtual/net/tun0/statistics# cat tx_bytes rx_bytes
0
0
我的 VPS 上只有一个“物理”接口,该接口分配有公共 IP 地址。有没有什么办法可以使用虚拟网络来限制 VPS 上不同服务的带宽使用量?谢谢!
答案1
终于找到答案了!原来我不需要任何虚拟接口。
tc
能够在单个接口上过滤数据包并创建规则。
此资源帮助很大,让我从 TBF(令牌桶过滤)转向 HTB(分层令牌桶)。HTB 允许不同层次的层次结构和同级类之间的共享。
因此,这里有一个演示,将端口 80(Web 服务器 --> 互联网)限制为大约 8 MB/s(wget
LAN 测试中报告 7.34 MB/s):
tc qdisc add dev enp0s3 root handle 1: htb default 12
tc class add dev enp0s3 parent 1: classid 1:1 htb rate 1000mbps ceil 1000mbps
tc class add dev enp0s3 parent 1:1 classid 1:10 htb rate 5mbps ceil 8mbps
tc class add dev enp0s3 parent 1:1 classid 1:12 htb rate 1000mbps ceil 1000mbps
tc filter add dev enp0s3 protocol ip parent 1:0 prio 1 u32 match ip src 192.168.11.52 match ip sport 80 0xffff flowid 1:10
如果要删除类或过滤器,请将其替换add
为del
。您必须先删除过滤器,然后才能删除相应的类,否则会收到错误:RTNETLINK answers: Device or resource busy
。
例如,以下是拆除所有东西的正确顺序:
tc filter del dev enp0s3 protocol ip parent 1:0 prio 1 u32 match ip src 192.168.11.52 match ip sport 80 0xffff flowid 1:10
tc class del dev enp0s3 parent 1: classid 1:1 htb rate 1000mbps ceil 1000mbps
tc class del dev enp0s3 parent 1:1 classid 1:10 htb rate 5mbps ceil 8mbps
tc class del dev enp0s3 parent 1:1 classid 1:12 htb rate 1000mbps ceil 1000mbps
tc qdisc del dev enp0s3 root handle 1: htb default 12
您可以使用以下命令查看您的配置(假设您没有拆除所有内容):
# show your queue disciplines
tc -d qdisc show
# show your classes
tc -d class show dev enp0s3
# show statistics for your classes
tc -s class show dev enp0s3
其他有用链接: