温馨提示×

Linux Sniffer如何进行流量控制

小樊
33
2025-12-15 07:17:42
栏目: 智能运维

Linux Sniffer流量控制的正确思路

先明确概念与边界

  • Sniffer(嗅探器)tcpdump、Wireshark、tshark、ngrep 的职责是捕获与分析流量,并不具备真正的流量整形/限速能力。若需要限制带宽、整形或模拟网络劣化,应使用 Linux 内核的 tc(Traffic Control) 等工具。tc 可基于 HTB(Hierarchical Token Bucket) 等算法进行带宽分配与整形,常与 netem 配合模拟延迟、丢包、抖动、乱序等网络状况。

使用 tc 进行限速与整形

  • 典型目标:对网卡 eth0 的出方向限速为 5 Mbps,并允许短时突发到 6 Mbps
  • 步骤与命令:
    1. 清除旧规则
      • tc qdisc del dev eth0 root 2>/dev/null || true
    2. 添加根队列(HTB)与默认类
      • tc qdisc add dev eth0 root handle 1: htb default 30
      • tc class add dev eth0 parent 1: classid 1:1 htb rate 5mbit ceil 6mbit
    3. 为默认类添加公平队列,避免单一连接占满带宽
      • tc qdisc add dev eth0 parent 1:1 handle 10: sfq
    4. 如需按源/目的 IP、端口分流,再添加 filter(示例:按目的 IP)
      • tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip dst 192.168.1.100 flowid 1:1
  • 说明
    • HTB 用于带宽分配与整形(平均速率与突发),SFQ 用于队列公平,避免单流饥饿。
    • 以上规则作用于出队方向(egress),即对从本机发出的流量生效;对入队方向(ingress)的精细控制受限,通常需借助 ifb 等技巧或上游设备配合。

使用 netem 模拟网络劣化

  • 在已有限速基础上,加入 netem 可模拟广域网问题(注意:netem 也作用于出队方向):
    • 固定延迟 100ms
      • tc qdisc add dev eth0 parent 1:1 handle 20: netem delay 100ms
    • 延迟 100ms ± 10ms 的抖动
      • tc qdisc change dev eth0 parent 1:1 handle 20: netem delay 100ms 10ms
    • 随机丢包 1%
      • tc qdisc change dev eth0 parent 1:1 handle 20: netem loss 1%
    • 查看与删除
      • 查看:tc qdisc show dev eth0
      • 删除:tc qdisc del dev eth0 root
  • 组合示例:先限速 5 Mbps,再叠加 100ms 延迟与 1% 丢包,可用于弱网测试

按用户/进程/端口分流与标记

  • 思路:用 iptables 打标记(fwmark),再用 tc filter 按标记分流到不同 HTB 类,实现按用户、进程或端口的差异化限速。
  • 示例步骤:
    1. 对来自某 IP 的流量打标记
      • iptables -t mangle -A OUTPUT -d 203.0.113.10 -j MARK --set-mark 10
    2. 在 tc 中为标记 10 创建类与队列
      • tc class add dev eth0 parent 1: classid 1:10 htb rate 2mbit ceil 3mbit
      • tc qdisc add dev eth0 parent 1:10 handle 100: sfq
    3. 用 fwmark 将带标记的流量导入该类
      • tc filter add dev eth0 protocol ip parent 1:0 prio 1 handle 10 fw classid 1:10
  • 提示:也可结合 u32 等分类器做更细粒度匹配(如按端口、协议)。

监控与验证

  • 实时带宽观测
    • iftop:sudo iftop -i eth0
    • nload:sudo nload eth0
    • nethogs(按进程):sudo nethogs eth0
  • 抓包验证策略是否生效
    • 观察 RTT/丢包:sudo tcpdump -i eth0 -nn ‘icmp or port 80’
    • 导出分析:sudo tshark -i eth0 -w test.pcap
  • 性能基线测试
    • 使用 iperf3netperf 在限速前后做吞吐与时延对比,验证整形效果。

0