澄清与总体思路
在 CentOS 上,所谓 Sniffer 是用于抓包与分析的被动工具(如 tcpdump、Wireshark、tshark、ngrep),本身不具备对带宽进行限速或整形(Traffic Shaping)的能力。若要实现流量整形,应使用内核的 tc(Traffic Control) 子系统;Sniffer 的角色是在整形前后进行流量观测与验证。常见抓包工具与用途可参考:tcpdump/tshark 抓包分析、iftop/nload/vnstat 实时监控与统计。
使用 tc 实现流量整形的标准做法
- 选择网卡与方向:明确是对 出口(egress) 还是 入口(ingress) 整形。出口用 HTB/TC 直接限速;入口限速在物理接口上受限,通常做法是在出口整形,或在入口侧使用 ifb 伪设备将入口流量重定向为“出口”再整形。
- 基本步骤(HTB 出口限速示例,限制为 1 Mbps):
- 创建根队列并设定默认类
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
- 创建子类(可再细分,这里示例与父级一致)
sudo tc class add dev eth0 parent 1:1 classid 1:10 htb rate 1mbit ceil 1mbit
- 将流量分类(示例:按源 IP 分流到子类 1:20)
sudo tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip src 192.168.1.100 flowid 1:20
- 查看与验证
- 队列/类/过滤器状态:tc -s qdisc ls dev eth0;tc -s class ls dev eth0;tc -s filter ls dev eth0
- 实时带宽观测:iftop、nload、vnstat
- 清理规则(按需)
sudo tc qdisc del dev eth0 root
- 要点
- rate 是承诺保证带宽,ceil 是突发上限;合理设置 burst 可改善短时突发体验。
- 过滤器可用 u32 按源/目的 IP、端口、协议分流,实现不同业务不同限速策略。
用 Sniffer 验证整形效果
- 抓包观察速率变化(示例抓取 eth0 的 80 端口并写入文件)
- 抓取:sudo tcpdump -i eth0 -w http.pcap port 80
- 读取统计:tcpdump -r http.pcap -q -nn
- 实时带宽观测
- iftop:sudo iftop -i eth0
- nload:sudo nload eth0
- vnstat:vnstat -l -i eth0
- 抓包过滤表达式建议
- 按主机:host 192.168.1.100
- 按端口:port 80 or port 443
- 按协议:icmp、tcp、udp
以上工具与过滤写法可用于在整形前后对比吞吐、并发与丢包等现象。
常见场景与命令模板
- 单主机限速(出口,HTB)
- 目标:限制主机 192.168.1.100 出口为 2 Mbps
- 命令:
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 2mbit
sudo tc class add dev eth0 parent 1:1 classid 1:10 htb rate 2mbit ceil 2mbit
sudo tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip src 192.168.1.100 flowid 1:10
- 端口限速(示例:限制本机 8080 端口总出口为 500 kbit)
- 命令:
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 500kbit
sudo tc class add dev eth0 parent 1:1 classid 1:20 htb rate 500kbit ceil 500kbit
sudo tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip dport 8080 0xffff flowid 1:20
- 入口限速思路
- 物理入口限速能力有限,常用方案为:加载 ifb 模块,将入口流量重定向到 ifb 接口,再对 ifb 出口应用与上文相同的 HTB 规则;验证仍用 iftop/nload/tcpdump。
注意事项
- 权限与系统要求:tc/ifb 操作通常需要 root;确保网卡名称(如 eth0)正确,且内核已启用相关模块(如 ifb)。
- 观测先行、变更谨慎:先用 iftop/nload/vnstat/tcpdump 建立基线,再逐步应用限速;变更后用同一组指标复核。
- 规则可维护性:复杂策略建议分文件保存与注释;变更前先导出当前规则(tc qdisc/ class/ filter ls dev eth0),便于回滚。
- 合法合规:抓包与限速仅可在拥有明确授权的网络与主机上实施,避免侵犯隐私或违反策略。