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 及具体调度器模块。通过以下步骤确认:

  1. 检查内核是否编译了 TC 框架
# 查看 /proc/config.gz 或 /boot/config-$(uname -r)
zgrep CONFIG_NET_SCHED /proc/config.gz
# 输出应为:CONFIG_NET_SCHED=y
  1. 列出当前已加载的 qdisc 模块
ls /lib/modules/$(uname -r)/kernel/net/sched/
# 常见文件:sch_htb.ko, sch_tbf.ko, sch_netem.ko, sch_fq_codel.ko 等
  1. 动态加载缺失模块(如需要)
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 限速前,必须确认实验节点网络基线正常。测试步骤:

  1. 查看当前网络接口与 IP
ip addr show
# 确认接口状态为 UP,记录接口名(如 eth0, ens33)和 IP 地址
  1. 测试到网关的连通性
ping -c 4 $(ip route | grep default | awk '{print $3}')
# 预期:0% packet loss,延迟 < 5ms(本地环境)
  1. 测试到外部公网(如 8.8.8.8)的连通性
ping -c 4 8.8.8.8
# 如果无公网访问,至少确保同网段另一节点可达
  1. 记录基线延迟与丢包率
# 使用 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 环境准备总览

下图展示实验环境的逻辑架构与关键组件:

TC 限速实验环境架构 实验节点(Ubuntu 22.04 VM / 特权容器) iproute2 (tc 命令) 版本 ≥ 5.15.0 内核 net/sched 模块 sch_htb, sch_netem, sch_fq_codel 网络接口 eth0 状态 UP, 已配置 IP 基础网络连通性 网关可达 · 公网可达 · 同网段节点可达 ⚠ 基线数据记录:限速前延迟、丢包率、吞吐量 保存至 /tmp/tc_baseline.txt,用于后续对比验证

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 限速规则的实际配置与验证。