0

0

Linux tc mirred 的流量镜像与容器网络诊断实践

冷炫風刃

冷炫風刃

发布时间:2026-02-16 14:08:53

|

673人浏览过

|

来源于php中文网

原创

tc mirred 镜不到容器流量,因docker bridge模式下出向流量走veth+docker0网桥,未经过宿主机物理网卡qdisc;需在docker0用clsact ingress或veth主机端配置mirred,并确保目标设备up且同命名空间。

linux tc mirred 的流量镜像与容器网络诊断实践

tc mirred 为什么镜不到容器里的流量

因为 tcmirred 动作作用在内核 qdisc 层,而容器(尤其是 Docker 默认 bridge 模式)的网络路径里,出向流量往往绕过宿主机的物理网卡 qdisc,直接走 veth 对 + docker0 网桥转发,根本没机会被 tc 触发。

实操上得先确认流量路径:用 tcpdump -i docker0tcpdump -i eth0 对比,如果只在 docker0 抓到包、eth0 没有对应出向包,说明流量压根没经过宿主机出口 qdisc —— 那在 eth0 上加 tc mirred 就是白忙。

  • 优先在 docker0 接口上挂 tc,但注意:网桥接口默认不支持 egress qdisc,需启用 echo 1 > /sys/class/net/docker0/bridge/stp 或改用 clsact + ingress(更可靠)
  • 若必须镜像到物理网卡,可把容器改用 host 网络模式,或通过 veth 主机端口(如 vethXXXXX)绑 tc,它比 docker0 更靠近容器出口
  • mirredegress 方向只能镜像本设备发出的包,不能镜入向;想镜双向,得分别在 ingress(用 clsact)和 egress 各配一套

mirred action 的 target 设备必须是 up 状态且同命名空间

常见错误是镜像目标设成 lo 或一个还没 ip link set up 的 dummy 接口,结果 tc filter add ... action mirred egress redirect dev lo 看似成功,但实际无包到达 —— 内核会静默丢弃发往 down 状态设备的镜像包。

另外,容器网络常涉及 network namespace,mirreddev 参数只认当前 namespace 下的设备名。比如你在宿主机想镜到容器内的 eth0,直接写 dev eth0 会失败,因为那个 eth0 不在宿主机 namespace 里。

  • ip link show 确认目标设备状态为 UP,且 mtu 足够(建议 ≥1500,避免分片干扰分析)
  • 跨 namespace 镜像要用 mirred + redirect 到 veth 对的主机端,再靠 netns 路由转发,不能直写容器内设备名
  • 目标设备最好专用(如 mirror0),避免复用业务接口,否则镜像流量可能触发防火墙规则或被其他工具误处理

clsact ingress 是唯一能镜入向流量的可靠方式

很多人试 tc qdisc add dev eth0 root ... 想镜入向包,失败是因为传统 qdisc 只支持 egress。真正能捕获入向原始包的,只有 clsact qdisc 的 ingress hook —— 它在进入协议栈前就截流,位置比 iptables INPUT 链还早。

360智图
360智图

AI驱动的图片版权查询平台

下载

但要注意:clsact 不是万能胶水,它不排队、不整形,纯做分类和动作,所以 mirred 必须搭配 clsact 使用,且只能挂 ingressegress,不能混用。

  • 加载方式: tc qdisc add dev eth0 clsact,然后用 tc filter add dev eth0 parent ffff: protocol ip ... action mirred egress redirect dev mirror0
  • ffff: 是 ingress 的固定 handle,别写错;parent ffff: 表示挂 ingress,parent :1 才是 egress
  • ingress 镜像对性能影响比 egress 大,尤其高吞吐场景,建议加 flowid 限速或只镜特定端口(如 ip dport 80

镜像流量进不了 tcpdump?检查 nf_hooks 和 offload

即使 tc mirred 配置正确,tcpdump -i mirror0 也可能收不到包,最常踩的两个坑是:网卡开启了 GRO/GSO/LRO 等卸载功能,导致镜像出来的包是“组装后”的大帧;或者包被 conntrack 提前标记为 INVALID,被 netfilter drop。

前者会让 tcpdump 解析失败(显示 malformed packet),后者则干脆没包——此时 cat /proc/net/nf_conntrack | grep INVALID 可验证。

  • 关掉卸载:ethtool -K mirror0 gro off gso off lro off,特别是 gro,它是镜像流量乱码的头号元凶
  • 临时绕过 conntrack:iptables -t raw -I PREROUTING -i mirror0 -j NOTRACK,避免连接状态干扰
  • 确认镜像设备没被其他 tc 规则二次处理,tc filter show dev mirror0 应为空,否则可能形成环路或丢包

复杂点在于,镜像本身不改变原路径,但一旦引入新设备和 netfilter 规则,就等于给诊断链路加了不可见跳点。越想看清流量,越要小心别让诊断工具自己成了故障源。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1465

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

383

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2223

2025.12.29

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

37

2026.01.19

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

417

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

589

2023.08.10

class在c语言中的意思
class在c语言中的意思

在C语言中,"class" 是一个关键字,用于定义一个类。想了解更多class的相关内容,可以阅读本专题下面的文章。

624

2024.01.03

python中class的含义
python中class的含义

本专题整合了python中class的相关内容,阅读专题下面的文章了解更多详细内容。

21

2025.12.06

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

145

2026.02.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 9.2万人学习

Git 教程
Git 教程

共21课时 | 3.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号