4. TC 限速环境搭建:实验环境准备
TC 限速实验依赖 Linux 内核的 net/sched 子系统。本章指导你从零搭建可复现的限速验证环境,涵盖虚拟机/容器选型、工具链安装、内核模块确认及基础连通性测试。完成本步后,你将获得一个可直接执行 TC 命令的纯净实验节点。
4.1 环境选型:虚拟机 vs 容器
TC 操作需要修改网络接口的 qdisc(排队规则),对内核命名空间和网络栈有完整访问需求。下表对比两种常见方案:
| 对比维度 | 虚拟机(VM) | 容器(Container) |
|---|---|---|
| 内核隔离 | 独立内核,完全隔离 | 共享宿主机内核,需特权模式 |
| TC 模块支持 | 默认完整支持 | 需宿主机加载模块 + 容器特权 |
| 网络栈 | 独立 netns,操作 eth0 | 默认共享宿主机 netns,建议创建独立 netns |
| 资源开销 | 较高(GB 级内存) | 极低(MB 级) |
| 适用场景 | 生产级复现、多节点拓扑 | 快速验证、单节点限速 |
推荐方案:本课程使用 Ubuntu 22.04 LTS 虚拟机(内核 5.15+)作为主实验环境,同时提供容器命令作为备选。VM 可避免特权容器带来的安全风险,且 TC 模块默认全量加载。
4.2 安装 iproute2 工具包
TC 命令由 iproute2 包提供。大多数 Linux 发行版已预装,但最小化安装可能缺失。执行以下命令安装:
# Debian/Ubuntu
sudo apt update
sudo apt install -y iproute2
# CentOS/RHEL/Rocky
sudo yum install -y iproute
# 验证安装
tc -V
# 输出示例:tc utility, iproute2-5.15.0
版本要求:建议 iproute2 版本 ≥ 5.10.0,以支持最新的 qdisc 类型(如
fq_codel、bpf)。低于 4.20 的版本可能缺少 netem 或 htb 的某些参数。
4.3 确认内核支持 TC 模块
TC 依赖内核编译选项 CONFIG_NET_SCHED 及具体调度器模块。通过以下步骤确认:
- 检查内核是否编译了 TC 框架
# 查看 /proc/config.gz 或 /boot/config-$(uname -r)
zgrep CONFIG_NET_SCHED /proc/config.gz
# 输出应为:CONFIG_NET_SCHED=y
- 列出当前已加载的 qdisc 模块
ls /lib/modules/$(uname -r)/kernel/net/sched/
# 常见文件:sch_htb.ko, sch_tbf.ko, sch_netem.ko, sch_fq_codel.ko 等
- 动态加载缺失模块(如需要)
sudo modprobe sch_htb
sudo modprobe sch_netem
sudo modprobe sch_fq_codel
# 验证加载
lsmod | grep sch_
容器环境特别说明:容器内执行
modprobe 需要 --privileged 标志或 --cap-add=NET_ADMIN。如果宿主机未加载对应模块,容器内也无法使用。建议在宿主机先执行 modprobe sch_htb sch_netem。
4.4 基础网络连通性测试
在施加 TC 限速前,必须确认实验节点网络基线正常。测试步骤:
- 查看当前网络接口与 IP
ip addr show
# 确认接口状态为 UP,记录接口名(如 eth0, ens33)和 IP 地址
- 测试到网关的连通性
ping -c 4 $(ip route | grep default | awk '{print $3}')
# 预期:0% packet loss,延迟 < 5ms(本地环境)
- 测试到外部公网(如 8.8.8.8)的连通性
ping -c 4 8.8.8.8
# 如果无公网访问,至少确保同网段另一节点可达
- 记录基线延迟与丢包率
# 使用 mtr 或简单 ping 统计
ping -c 100 -i 0.01 192.168.1.1 | tail -3
# 输出示例:
# --- 192.168.1.1 ping statistics ---
# 100 packets transmitted, 100 received, 0% packet loss, time 1012ms
# rtt min/avg/max/mdev = 0.312/0.456/0.789/0.089 ms
基线数据用途:记录限速前的延迟、丢包、吞吐量。后续执行 TC 限速后,对比同一指标即可量化限速效果。建议将基线数据保存到
/tmp/tc_baseline.txt。
4.5 环境准备总览
下图展示实验环境的逻辑架构与关键组件:
4.6 快速验证脚本
将以下脚本保存为 check_tc_env.sh,一键验证环境完整性:
#!/bin/bash
# TC 实验环境快速检查脚本
echo "=== 1. 检查 iproute2 ==="
tc -V || { echo "FAIL: tc not found"; exit 1; }
echo "=== 2. 检查内核 TC 模块 ==="
for mod in sch_htb sch_netem sch_fq_codel sch_tbf; do
if lsmod | grep -q "$mod"; then
echo "OK: $mod loaded"
else
echo "WARN: $mod not loaded, try: sudo modprobe $mod"
fi
done
echo "=== 3. 检查网络接口 ==="
ip -br addr show | grep -v lo
IFACE=$(ip -br addr show | grep -v lo | awk '{print $1}')
if [ -z "$IFACE" ]; then
echo "FAIL: no active interface"
exit 1
fi
echo "=== 4. 测试网关连通性 ==="
GW=$(ip route | grep default | awk '{print $3}')
ping -c 2 -W 1 "$GW" &>/dev/null && echo "OK: gateway $GW reachable" || echo "WARN: gateway unreachable"
echo "=== 环境检查完成 ==="
执行方式:
chmod +x check_tc_env.sh && sudo ./check_tc_env.sh。脚本会输出每个检查项的状态,FAIL 项必须修复,WARN 项建议修复。
4.7 常见问题与解决
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
tc: command not found |
iproute2 未安装 | sudo apt install iproute2 |
RTNETLINK answers: Operation not supported |
内核未编译对应 qdisc 模块 | modprobe sch_htb 或重新编译内核 |
ping: connect: Network is unreachable |
接口未配置 IP 或路由错误 | ip addr add 配置 IP,ip route add default |
| 容器内 tc 执行无权限 | 缺少 NET_ADMIN capability | 启动容器加 --cap-add=NET_ADMIN |
完成以上步骤后,你的实验环境已就绪。下一阶段将进入 TC 限速规则的实际配置与验证。