网络流量控制对于保障服务稳定和优化用户体验至关重要。Linux内核内置了强大且灵活的流量控制机制,而tc命令正是配置和管理这套机制的核心工具。它允许管理员对网络接口的流量进行精细化的整形、调度和过滤,以应对带宽争用、延迟敏感应用保障以及网络攻击缓解等实际场景。掌握tc命令linux tc命令,是从根本上理解和解决Linux系统网络性能问题的关键一步。
Linux tc命令的基本工作原理是什么
Linux的流量控制(Traffic Control, TC)子系统主要通过队列规则(qdisc)、类别(class)和过滤器(filter)三个核心概念来工作。队列规则是附着在网络接口上的,它定义了数据包等待发送的基本策略,例如是简单的先进先出(FIFO)linux tc命令,还是更复杂的层级令牌桶(HTB)。数据包进入网络接口后,首先被交给根队列规则进行处理。
队列规则内部可以进行复杂的组织。我们可以创建多个类别,将流量进行分类,比如将HTTP流量、SSH流量和备份流量分到不同的类别中。过滤器则负责将数据包分类,它根据IP地址、端口号或协议等条件,将数据包定向到指定的类别中。每个类别可以关联自己的队列规则和参数,从而实现不同类别流量的差异化处理,如保证带宽、限制最高速率或设置优先级。
如何安装和确认tc命令工具
在绝大多数Linux发行版中,tc命令工具是iproute2软件包的一部分。该软件包通常已预装在系统中。你可以通过在终端输入tc -V或tc --version来检查其是否已安装及版本信息。如果系统提示“command not found”,则需要手动安装。

对于基于Debian/Ubuntu的系统,可以使用sudo apt update && sudo apt install iproute2进行安装。对于基于RHEL/CentOS/Fedora的系统,则使用sudo yum install iproute2或sudo dnf install iproute2。安装完成后,再次使用tc命令即可。此外红旗linux桌面版,确保你拥有root或sudo权限,因为tc命令需要高级权限才能修改内核的网络配置。
如何用tc命令限制网卡出口带宽
限制出口带宽是最常见的应用之一,通常使用令牌桶过滤器(tbf)或层级令牌桶(htb)队列规则。以限制eth0网卡出口带宽为10Mbps为例,使用htb是更推荐的方式。首先,我们需要清除接口上可能已有的队列规则:sudo tc qdisc del dev eth0 root(如果报错可忽略)。

添加htb作为根队列规则:sudo tc qdisc add dev eth0 root handle 1: htb default 11。这条命令创建了一个句柄为1:的根htb队列,并将未分类的默认流量指向句柄1:11的类别。然后,创建根类别并设置总带宽上限:sudo tc class add dev eth0 parent 1: classid 1:1 htb rate 10mbit ceil 10mbit。这定义了类1:1的保证速率和最大速率均为10Mbit。
如何用tc命令模拟网络延迟和丢包
在测试应用程序在网络不稳定环境下的表现时,模拟网络延迟和丢包非常有用。netem队列规则专门为此设计。例如,要为eth0接口的所有出口流量增加100毫秒的固定延迟,可以使用命令:sudo tc qdisc add dev eth0 root netem delay 100ms。
如果要模拟更复杂的状况,比如随机的丢包和波动延迟,可以使用更详细的参数。命令sudo tc qdisc change dev eth0 root netem delay 100ms 20ms 30% loss 5%表示:基础延迟100ms,有20ms的波动(即延迟在80ms到120ms之间随机),并且有30%的延迟相关包会被延迟这个波动值。同时,还有5%的随机丢包率。这对于测试音视频通话或实时游戏的健壮性至关重要。

如何用tc命令保障关键服务的带宽
在企业环境中,保障关键业务(如ERP系统、视频会议)的带宽是核心需求。这需要用到htb的类别和过滤器。假设我们总出口带宽为100Mbps,需要保障SSH服务(端口22)至少有5Mbps带宽,且最高不超过10Mbps。
首先建立根htb队列和根类别(100Mbps)。然后创建子类别:sudo tc class add dev eth0 parent 1:1 classid 1:10 htb rate 5mbit ceil 10mbit。这创建了类1:10,保证速率5Mbps,最大10Mbps。接下来linux 下载,使用过滤器将SSH流量导向此类:sudo tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip dport 22 0xffff flowid 1:10。这样,所有目标端口为22的TCP流量都会被分类到受保障的1:10类别中,即使在网络拥塞时也能获得最低5Mbps的带宽。
如何查看和清除现有的tc配置

在对网络进行调整或排错前,查看当前配置是第一步。使用sudo tc qdisc show dev eth0可以查看接口eth0上附加的队列规则。使用sudo tc class show dev eth0可以查看该接口上定义的所有流量类别。
要查看更详细的过滤器规则,使用sudo tc filter show dev eth0。这些信息能帮助你理清现有的流量控制结构。当需要清除所有配置,恢复接口到无控制的默认状态时,最直接的方法是删除根队列规则:sudo tc qdisc del dev eth0 root。如果配置了复杂的多级结构,此命令会一并清除所有附属的类别和过滤器。执行后,建议再次使用show命令确认接口已恢复为简单的pfifo_fast队列。
看完这些具体操作,你是否在实际工作中遇到过因带宽争用导致的服务问题?或者你有更巧妙的tc使用案例来应对特定的网络挑战吗?欢迎在评论区分享你的经验和见解,如果觉得本文有帮助,也请点赞和分享给更多需要的小伙伴。
