新手也能学会的Linux服务器网络流量控制实战

新手也能学会的Linux服务器网络流量控制实战

Linux服务器网络流量控制是运维中经常遇到的需求,比如限制某个端口的出口带宽、控制某台虚拟机的网速、或者模拟网络延迟测试应用稳定性。
过去你可能觉得这很复杂,其实用系统自带的 tc(traffic control)工具就能完成。
本文从零开始,带你完成一次完整的流量控制实验。

什么时候需要流量控制

典型场景包括:

  • 服务器出口带宽有限,需要为不同服务分配速率
  • 测试应用在低带宽或高延迟下的表现
  • 限制某个用户或容器消耗过多带宽
  • 防止恶意流量挤占正常业务

这次我们以一个常见的需求为例:限制 eth0 网卡出口带宽为 1Mbps,并验证效果。

准备工作

操作前确认以下条件:

  1. 已通过 SSH 登录到你的 Linux 服务器(CentOS 7 / Ubuntu 20.04+ 均可)
  2. 使用 root 或具有 sudo 权限的用户
  3. 确认网卡名称:执行 ip link show,记下出口网卡名(通常是 eth0 或 ens33)。

先安装一个方便验证的工具——nload,用于实时查看网卡流量。

# CentOS/RHEL
sudo yum install epel-release -y && sudo yum install nload -y

# Ubuntu/Debian
sudo apt update && sudo apt install nload -y

核心操作:用 tc 限制出口带宽

第一步:清除之前的 qdisc 规则(避免冲突)
所有流量控制都基于队列规则(qdisc),先清空网卡上的旧配置。

sudo tc qdisc del dev eth0 root 2>/dev/null || true

第二步:创建根句柄并绑定 HTB 规则
HTB(Hierarchy Token Bucket)是常用的限速算法,支持层级设置。这里直接限制整块网卡出口。

sudo tc qdisc add dev eth0 root handle 1: htb default 30
sudo tc class add dev eth0 parent 1: classid 1:1 htb rate 1mbit

解释一下:

  • root 表示根节点;handle 1: 是自定义句柄;default 30 表示未分类的流量默认归入 classid 1:30(下面会建)。
  • 然后创建一个 class,parent 指向 1:,classid 为 1:1,rate 设置为 1mbit(1Mbps)。

第三步:创建一个默认走 class 1:1 的叶子队列
这样所有从 eth0 发出的流量都经过这个限速类。

sudo tc class add dev eth0 parent 1:1 classid 1:30 htb rate 1mbit
sudo tc qdisc add dev eth0 parent 1:30 handle 30: sfq perturb 10
  • sfq(Stochastic Fairness Queueing)保证公平排队,防止某个连接占满。

第四步:验证规则是否生效

tc -s qdisc show dev eth0tc -s class show dev eth0 查看发送字节数变化。
然后开启 nload 观察实时带宽。

nload eth0

在另一终端执行 wget http://speedtest.tele2.net/100MB.zip -O /dev/null 下载大文件,观察 nload 显示的出口速率是否接近 1Mbps。
如果速率被压制在 1Mbps 左右,说明限速成功。

常见问题与避坑指南

重启后规则消失?
tc 规则是临时生效,重启后需要重新加载。解决办法:将 tc 命令写入脚本或系统服务。推荐做法是将上述命令保存为 /usr/local/bin/tc_limit.sh,然后通过 systemd 设置开机自启,或直接加入 /etc/rc.local(记得赋予执行权限)。

为什么要先删旧规则?
网卡上只能有一个 root qdisc,如果不先清空,第二次执行会报错 RTNETLINK answers: File exists。所以习惯上先执行删除命令,2>/dev/null 忽略未绑定时的错误。

只限出口不管入口?
tc 默认控制出口(egress)。如果需要限制入口(ingress),需要借助 ifb 虚拟设备,过程稍复杂。新手可以先只管控出口,大多数场景够用。

限速不精准怎么办?
TCP 本身有拥塞控制,实际吞吐会略低于设定值。可以加入 burst 参数让带宽更平滑:rate 1mbit burst 32k cburst 32k

效果验证与扩展

使用 nloadiptraf-ng 实时监控是最直观的方法。
也可以做连续测试:

# 启动另一个终端,每秒统计一次流量
while true; do tc -s class show dev eth0 | grep -A3 'class htb 1:30'; sleep 2; done

观察输出中的 sent bytes 和 rate 是否稳定在 1Mbit 附近。

如果你需要更精细的控制(比如区分 IP 或端口),可以结合 iptables 的 tc filteru32 匹配。
后续文章会做专题讲解。

总结

本文围绕 Linux服务器网络流量控制,通过 tc 命令实现了简单有效的出口带宽限制。
从准备到验证,每一步都有明确命令。
建议你先按本文步骤完整执行,再根据自己的环境做微调;
遇到异常时优先回看避坑和高频问题部分。
掌握了这个技能,日常运维中对于带宽分配、压力测试、故障模拟都能轻松应对。

分享到:
上一篇
WordPress网站评论系统优化三步走
下一篇
Docker部署vue教程指南
1
系统公告

泽御云五一特惠活动🔥

泽御云持证合规运营,资质齐全可查,长久稳定! 五一限时多重福利同步开启: ✅ 香港 2 核 2G 云服务器超值拼团,低价入手团长免费 ✅ 4 核 4G 多机房年付拼团,性价比拉满 ✅ 内蒙古新区限时 7 折(zeyuyunnmg)特惠,专属优惠码锁价续费 ✅ 全站通用 75 折优惠,老用户充值享专属赠金 官方站点:zeyuyun.com 合规资质齐全|售后有保障|活动限时错过不再有
服务中心
客服
在线客服
24小时为您服务
咨询
联系我们
联系我们,为您的业务提供专属服务。
24/7 技术支持
如果您遇到寻求进一步的帮助,请过工单与我们进行联系。
24/7 即时支持
泽御云
售前客服
泽御云
泽御云
售后客服
泽御云
技术支持
评价
您对当前页面的整体感受是否满意?
😞
非常不满意
😕
不满意
😐
一般
🙂
满意
😊
非常满意