新手也能学会的Linux服务器网络流量控制实战
新手也能学会的Linux服务器网络流量控制实战
Linux服务器网络流量控制是运维中经常遇到的需求,比如限制某个端口的出口带宽、控制某台虚拟机的网速、或者模拟网络延迟测试应用稳定性。
过去你可能觉得这很复杂,其实用系统自带的 tc(traffic control)工具就能完成。
本文从零开始,带你完成一次完整的流量控制实验。
什么时候需要流量控制
典型场景包括:
- 服务器出口带宽有限,需要为不同服务分配速率
- 测试应用在低带宽或高延迟下的表现
- 限制某个用户或容器消耗过多带宽
- 防止恶意流量挤占正常业务
这次我们以一个常见的需求为例:限制 eth0 网卡出口带宽为 1Mbps,并验证效果。
准备工作
操作前确认以下条件:
- 已通过 SSH 登录到你的 Linux 服务器(CentOS 7 / Ubuntu 20.04+ 均可)
- 使用 root 或具有 sudo 权限的用户
- 确认网卡名称:执行
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 eth0 和 tc -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。
效果验证与扩展
使用 nload 或 iptraf-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 filter 的 u32 匹配。
后续文章会做专题讲解。
总结
本文围绕 Linux服务器网络流量控制,通过 tc 命令实现了简单有效的出口带宽限制。
从准备到验证,每一步都有明确命令。
建议你先按本文步骤完整执行,再根据自己的环境做微调;
遇到异常时优先回看避坑和高频问题部分。
掌握了这个技能,日常运维中对于带宽分配、压力测试、故障模拟都能轻松应对。