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

关于基于nftables实现QoS以限制HTTP入站带宽的技术咨询

基于nftables实现QoS以限制HTTP入站带宽的技术咨询

Hey there! Great question—yes, you absolutely can enforce QoS for inbound HTTP traffic to cap it at 90% of your total bandwidth using nftables. The catch is that nftables handles traffic classification (marking the packets you care about), while you'll pair it with Linux's tc (traffic control) tool to do the actual bandwidth shaping. Let me walk you through how to set this up:

1. 用nftables标记入站HTTP/HTTPS流量

首先,我们要创建一个专门的nftables表和链,给所有入站的HTTP(80端口)和HTTPS(443端口)流量打上唯一标记。这个标记能让tc精准识别出需要限速的数据包。

运行以下命令(如果喜欢可以自定义表/链名称):

# 创建用于QoS操作的nftables表
nft add table ip qos
# 创建QoS过滤用的input链
nft add chain ip qos input { type filter hook input priority 0; policy accept; }
# 给所有入站HTTP/HTTPS流量打上0x1的标记
nft add rule ip qos input tcp dport {80, 443} meta mark set 0x1

要让这些规则重启后依然生效,保存你的nftables规则集:

nft list ruleset > /etc/nftables.conf

然后确保nftables服务已启用,以便开机时加载规则。

2. 用tc对标记流量进行带宽整形

接下来,我们用tc里的分层令牌桶(HTB)调度器来限制标记过的HTTP流量带宽。HTB很适合这类场景,因为它能让你结构化地分配带宽。

首先把eth0替换成服务器的公网网卡(可以用ip link show查看),再把rate值调整为总带宽的90%(比如总带宽100Mbps就用90mbit,1Gbps就用900mbit):

# 清除网卡上已有的tc规则(忽略不存在规则的报错)
tc qdisc del dev eth0 root 2>/dev/null
# 给网卡添加根HTB队列规则
tc qdisc add dev eth0 root handle 1: htb default 10
# 创建父类,分配总带宽的90%
tc class add dev eth0 parent 1: classid 1:1 htb rate 90mbit ceil 90mbit
# 创建子类,绑定我们用nftables标记的流量
tc class add dev eth0 parent 1:1 classid 1:10 htb rate 90mbit ceil 90mbit
# 添加过滤器,把标记为0x1的数据包导向子类
tc filter add dev eth0 parent 1: protocol ip prio 1 handle 1 fw flowid 1:10

关于入站流量整形的小说明

你可能会疑惑:怎么限制入站流量呢?Linux流量控制主要管理出站流量,但对于HTTP使用的TCP协议,我们可以通过控制发送回客户端的ACK包速率,间接限制入站流量。这会告诉客户端放慢数据传输速度,从而达到我们想要的入站带宽上限。

3. 让tc规则持久化

tc规则默认不会保存,所以你需要把它们加到开机脚本里。对于systemd系统,可以创建一个简单的服务文件(比如/etc/systemd/system/tc-qos.service):

[Unit]
Description=Apply tc QoS rules
After=network.target

[Service]
Type=oneshot
ExecStart=/path/to/your/tc-script.sh
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

然后给脚本添加可执行权限,启用并启动这个服务即可。


备注:内容来源于stack exchange,提问作者somenxavier

火山引擎 最新活动