也谈tcpdump抓包
shixudong163.com一、tcpdump和netfilter数据包接收环节的抓包点位于内核函数__netif_receive_skb_core此时数据包已经过GRO合并处理但尚未进入rx_handler环节如bridge至于netfilterPREROUTING被hook在协议层ip_rcv更是在rx_handler 环节之后。所以在收包环节DNAT以及netfilter 过滤规则并不会影响 tcpdump抓包譬如tcpdump只能抓到接收包DNAT前的目标IP而非DNAT后的目标IP。数据包发送环节的抓包点位于内核函数dev_queue_xmit_nit正好在网卡发包函数ndo_start_xmit之前此时数据包早已经过OUTPUT/DNAT和POSTROUTING/SNAT。因此在发包环节netfilter 过滤规则以及DNAT/SNAT必然影响tcpdump抓包譬如tcpdump只能抓到外出包SNAT后的源IP而非SNAT前的源IP对于OUTPUT/DNATtcpdump也只能抓到外出包DNAT后的目标IP而非DNAT前的目标IP。二、tcpdump和bridge如前所述数据包在接收环节首次抓包时尚未进入bridge属于物理网卡上的抓包。数据包经bridge处理后对于需要继续移交上层处理的数据包bridge将调用netif_receive_skb也意味着数据包再次进入接收环节抓包点即bridge网卡接收环节抓包点此时属于逻辑网卡上的抓包。至于那些经bridge处理后直接在二层转发出去的数据包除非bridge网卡开启PROMISC否则永远不会经过bridge网卡接收环节抓包点。数据包在发送环节将先后两次调用dev_queue_xmit_nit第一次将进入bridge网卡发送环节抓包点第二次将进入物理网卡发送环节抓包点。对于先前那些经bridge处理后直接在二层转发出去的数据包同样也永远不会经过bridge网卡发送环节抓包点。在bridge环境下如启用了br_netfilter将在二层提前进行三层netfilter处理经过bridge各种处理后包括netfilter处理只有需要继续移交上层处理的数据包才会进入bridge网卡接收环节抓包点。此时在bridge网卡接收方向上抓包也必然受到DNAT以及netfilter 过滤规则的影响譬如tcpdump只能抓到接收包DNAT后的目标IP而非DNAT前的目标IP以及抓不到那些本应在三层才被内核隐式DROP的数据包。因此为了便于精确跟踪调试数据包流向在bridge网卡上抓包时建议临时关闭br_netfilter或者直接在bridge下挂的物理网卡上抓包。三、tcpdump和PROMISC在《Linux二层包类型对网络功能的影响分析》一文中提到如网卡不开启PROMISC目标MAC为非本网卡MAC的数据包在网卡固件层面就被DROP压根不会进入接收环节。tcpdump抓包时默认开启被抓包网卡的PROMISC网卡开启PROMISC后网卡固件允许接收目标MAC为非本网卡MAC的数据包内核将其包类型标记为PACKET_OTHERHOST并被tcpdump抓包对于HUB环境该功能可以嗅探其他机器之间的数据包。但对于Switch环境即使网卡已开启PROMISC也压根收不到目标MAC为非本网卡MAC的数据包此时tcpdump抓包的主要目的是为了跟踪调试数据包流向。对于linux bridge来说加入bridge的物理网卡都强制开启了PROMISC用于接收和转发PACKET_OTHERHOST数据包。通常情况下这些 PACKET_OTHERHOST数据包并不会进入上层协议栈但如bridge网卡本身不小心也开启了PROMISC这些已二层直接转发出去的数据包还会同时提交上层协议栈由于ip_rcv将直接丢弃PACKET_OTHERHOST包此类数据包最终并不能被linux三层处理。显然在bridge网卡上开启PROMISC将对数据包流向产生一定影响不利于后续精确跟踪调试数据包流向因此针对bridge网卡本身抓包时建议使用-p参数non-promiscuous mode此后tcpdump就能精确抓取那些真正需要经由bridge和上层协议交互的数据包而不再抓取经由物理网卡直接转发出去的PACKET_OTHERHOST数据包。顺便提一下在已开启PROMISC的bridge物理网卡上使用-p参数抓包并不会关闭PROMISC。在Switch环境下linux bridge下挂的物理网卡因强制开启了PROMISC会出现PACKET_OTHERHOST数据包bridge网卡本身如手动开启了PROMISC后也会出现PACKET_OTHERHOST数据包。除此之外包括非桥接物理网卡以及bond在内的其他逻辑网卡即便主动开启了PROMISC理论上也不会出现PACKET_OTHERHOST数据包tcpdump在这些网卡上抓包时是否使用-p参数对抓包效果无任何影响。四、tcpdump和DNAT/SNAT对于PREROUTING/DNAT和POSTROUTING/SNAT如一所述虽然netfilter规则能够影响到发送环节tcpdump抓包例如数据包外出时发生了SNAT只能抓取SNAT后的源IP但返回包抓取发生在DNAT前抓包时返回包目标IP尚未经过DNAT转换仍是SNAT后的源IP这两个IP一致。也就是说通常情形下在数据包经过的任意一块网卡上抓包所抓数据包在进出两个方向上的IP地址和PORT都保持对称。如二所述bridge环境下启用br_netfilter后如发生了DNAT在bridge接收方向上只能抓到DNAT后的目标IP和PORT, 在bridge发送方向上则抓到SNAT后的源IP和PORT这两组IP和PORT是不一致的。这意味着对于需要DNAT的数据包来说在tcpdump看来数据包在bridge网卡进出两个方向上的IP地址和PORT将不再保持对称。抓包条件还必须额外匹配数据包DNAT后的目标IP和PORT才能抓全进出方向上的不对称包。如直接在bridge下挂的物理网卡上抓包则不存在该问题仍可通过常规匹配条件抓取进出方向上的对称包。对于OUTPUT/DNAT和INPUT/SNAT情形则略有不同发送环节抓包点同样只能抓取DNAT后的目标IP而返回包的源IP需要抵达三层INPUT链处才做相应的SNAT转换故不受bridge和br_netfilter影响。在bridge网卡接收环节抓包点由于返回包源IP尚未经过INPUT/SNAT转换只能抓到返回包SNAT前的源IP即发送包DNAT后的目标IP。这两个IP一致保证了所抓数据包在bridge网卡进出两个方向上IP地址和PORT的对称性。五、tcpdump和lo当对本机外出数据包进行OUTPUT/REDIRECT时全程使用lo网卡并不涉及bridge和br_netfilter但同样会出现如四所述现象即lo网卡上抓取REDIRECT的数据包来回链路上的IP地址和PORT也不对称。原因分析如下Linux在进行本机单播通信时使用lo网卡数据包同样需要经过发送和接收环节的抓包点。理论上在lo网卡上抓包时数据包一来一回之间应能抓到4个包但在显示抓包结果时会有一半的数据包看起来明显冗余因此tcpdump抓包库libpcap专门针对lo网卡进行了过滤仅在接收环节显示抓包结果所以tcpdump实际上只显示来回链路上2个接收环节的数据包去除了不必要的冗余。对于经过OUTPUT/REDIRECT处理的本机外出数据包实际上早在外出包的发送环节抓包点目标IP已更改lo网卡在接收环节显示抓包结果时自然也显示为REDIRECT后的目标IP。至于返回包源IP的SNAT转换由于为本机自发自收返回包在其发送环节POSTROUTING链处能匹配到先前外出包的DNAT记录并在此处完成了相应的SNAT转换而无需像第四部分OUTPUT链DNAT目标非本机那样直到INPUT链处才做SNAT转换。因此在返回包的接收环节抓包点显然只能抓到SNAT后的源IP对应外出包REDIRECT前的目标IP导致来回之间看起来也不对称。当lo网卡上有很多流量时也必须额外匹配外出包REDIRECT后的目标IP和PORT才能抓全来回链路上的不对称包。考虑到TPROXY也是全程使用lo网卡并且无需修改目标IP因此可用TPROXY取代REDIRECT即可在lo网卡上通过常规匹配条件抓取来回链路上的对称包。Linux为实现本机组播/广播通信在通过ip_mc_output对外发送组播/广播包时顺手调用dev_loopback_xmit发给自己一份在该函数中将包类型设置为PACKET_LOOPBACK然后直接调用netif_rx收包。因此对于本机组播/广播来说相当于跳过了发送环节抓包点虽然后续netif_rx收包时需要经过接收环节抓包点但内核抓包环节并不处理PACKET_LOOPBACK所以发给自己的组播/广播包全程无法抓包并且dev_loopback_xmit和netif_rx也只使用发送组播/广播IP时选定的网卡全程不使用lo网卡。六、tcpdump和数据包方向通常情况下tcpdump在指定网卡上抓包可通过源IPPORT和目标IPPORT的组合大致识别数据包流向无需刻意关注数据包在网卡上的进出方向。接口“any”可用于捕获来自所有网卡的数据包鉴于同一组合的数据包可在不同网卡上同时出现从v4.99起tcpdump支持LINKTYPE_LINUX_SLL2-iany能显示数据包在不同网卡上的进出方向之前版本无法显示网卡信息。此外tcpdump还可指定-Qin\out\inout来抓取特定方向的数据包。在《Linux二层包类型对网络功能的影响分析》一文中提到Linux网卡在接收数据包时网卡驱动调用eth_type_trans对数据包进行预处理该函数通过比较目标MAC地址判断二层包类型并进行标记PACKET_BROADCAST二层广播地址、PACKET_MULTICAST二层多播地址、PACKET_OTHERHOST目标MAC非本网卡MAC、PACKET_HOST目标MAC为本网卡MAC二层包类型标记将影响数据包在二层的后续流向和三层的后续处理。Linux网卡发送数据包时无需关心二层包类型标记但内核在数据包发送环节的抓包点dev_queue_xmit_nit针对外发数据包的二层包类型专门为抓包程序标记了PACKET_OUTGOING。Tcpdump在使用-iany显示数据包方向时对Linux二层包类型进行了转换In对应PACKET_HOSTB对应PACKET_BROADCASTM对应PACKET_MULTICASTP对应PACKET_OTHERHOSTOut对应PACKET_OUTGOING。根据前面分析In、B、M和P实际上都表示网卡的接收方向只有Out才表示网卡的发送方向。tcpdump在使用-Q参数指定数据包方向时-Qin也是包含了In、B、M和P。Linux的KVM在桥接外部网络时直接加入Linux网桥虚拟机之间以及虚拟机和外部网络的通信完全遵从linux网桥行为譬如在主机桥接网卡上抓包时就无法抓取虚拟机之间不经过该网卡的数据包。然而Linux上的Vmware或Virtualbox在桥接外部网络时没有使用linux网桥技术而是采用Hub技术直接桥接到主机网卡在主机桥接网卡上不仅能抓到虚拟机和外部网络的数据包还能抓到虚拟机之间的数据包并且这两种情形下都存在重复包。这些重复包实际上是虚拟机将数据包同时发到了主机网卡的发送和接收方向此时就可以借助-iany并结合源IPPORT、目标IPPORT的组合来识别虚拟机数据包在主机网卡上的进出方向。本文第五部分提到Linux在进行本机单播通信时使用lo网卡在使用-ilo进行抓包时一般情形下本机通信使用相同的源IP和目标IP127.0.0.1或本机网卡IP但源端口和目标端口并不相同抓包数据看起来有来有往宾主相欢。在使用TPROXY的情形下源IP和目标IP也不相同抓包数据就更加好看。然而当使用-iany加其他限定条件抓包后lo网卡上的数据包流向顿时原形毕露全部表现为清一色的In方向。当然事实上并非如此诚如第五部分所言只是为了去除不必要的显示冗余以及libpcap的处理方便针对lo网卡libpcap仅处理接收环节的数据包而已。

相关新闻

2027亚洲消费电子展官方预定!中外消费电子双向互通枢纽

2027亚洲消费电子展官方预定!中外消费电子双向互通枢纽

2027亚洲消费电子展(赛逸展)将于2027年6月26‑28日在北京亦创国际会展中心开展,官方预定通道全面开启。展会搭建中外消费电子产业双向互通枢纽,海外采购团携带批量采购需求对接整机与零部件厂商。 中外消费电子产业具备很强互补性…

2026/8/12 23:13:31 阅读更多 →
终极指南:使用 .NET Aspire 构建现代化电商微服务架构

终极指南:使用 .NET Aspire 构建现代化电商微服务架构

终极指南:使用 .NET Aspire 构建现代化电商微服务架构 【免费下载链接】eShop A reference .NET application implementing an eCommerce site 项目地址: https://gitcode.com/GitHub_Trending/es/eShop 想要快速掌握 .NET 微服务架构实战技巧吗?…

2026/8/12 18:22:20 阅读更多 →
RStartHere核心功能解析:为什么这些R包能成为数据科学家的首选?

RStartHere核心功能解析:为什么这些R包能成为数据科学家的首选?

RStartHere核心功能解析:为什么这些R包能成为数据科学家的首选? 【免费下载链接】RStartHere A guide to some of the most useful R Packages that we know about 项目地址: https://gitcode.com/gh_mirrors/rs/RStartHere RStartHere作为GitHub…

2026/8/11 17:58:24 阅读更多 →

最新新闻

从AI工具链到智能决策引擎:LangChain如何重塑企业AI应用架构

从AI工具链到智能决策引擎:LangChain如何重塑企业AI应用架构

从AI工具链到智能决策引擎:LangChain如何重塑企业AI应用架构 【免费下载链接】langchain The agent engineering platform. 项目地址: https://gitcode.com/GitHub_Trending/la/langchain 在当今AI技术快速发展的时代,企业面临着一个核心困境&…

2026/8/12 23:20:46 阅读更多 →
从零到一:如何利用AiPy资源库构建你的AI学习体系

从零到一:如何利用AiPy资源库构建你的AI学习体系

从零到一:如何利用AiPy资源库构建你的AI学习体系 【免费下载链接】AiPy Python机器学习、深度学习算法开发等学习资源分享 项目地址: https://gitcode.com/gh_mirrors/ai/AiPy 在人工智能快速发展的今天,如何系统性地学习AI技术成为许多开发者面临…

2026/8/12 23:20:46 阅读更多 →
告别Edge的三大难题:如何安全彻底地卸载微软浏览器

告别Edge的三大难题:如何安全彻底地卸载微软浏览器

告别Edge的三大难题:如何安全彻底地卸载微软浏览器 【免费下载链接】Remove-MS-Edge Uninstall Microsoft Edge with an executable or batch script. 项目地址: https://gitcode.com/gh_mirrors/re/Remove-MS-Edge 你是否曾经想要卸载Windows系统自带的Micr…

2026/8/12 23:20:46 阅读更多 →
Vivado工程自动化:Tcl脚本与命令行驱动的FPGA设计流程

Vivado工程自动化:Tcl脚本与命令行驱动的FPGA设计流程

1. 项目概述:为什么我们需要命令行和Tcl来创建Vivado工程? 如果你是一位FPGA工程师,或者正在学习Xilinx的Vivado设计套件,那么你大概率已经习惯了在Vivado的图形用户界面(GUI)里点击鼠标,通过“…

2026/8/12 23:20:46 阅读更多 →
Bambu Studio切片软件实战:从新手到专家的3D打印参数优化指南

Bambu Studio切片软件实战:从新手到专家的3D打印参数优化指南

Bambu Studio切片软件实战:从新手到专家的3D打印参数优化指南 【免费下载链接】BambuStudio PC Software for BambuLab and other 3D printers 项目地址: https://gitcode.com/GitHub_Trending/ba/BambuStudio Bambu Studio是一款基于PrusaSlicer开发的现代化…

2026/8/12 23:20:46 阅读更多 →
OpenClaw Skills安装指南与常见问题解决

OpenClaw Skills安装指南与常见问题解决

1. 为什么需要掌握OpenClaw Skills安装技能OpenClaw作为当前最热门的AI开发工具链之一,其Skills生态正在快速扩张。根据2024年Q2开发者调查报告,超过67%的AI项目都涉及OpenClaw Skills的集成使用。但新手常会在安装阶段遇到各种环境配置问题,…

2026/8/12 23:19:45 阅读更多 →

日新闻

Ubuntu 22.04安装与使用tree命令:高效管理Linux目录结构

Ubuntu 22.04安装与使用tree命令:高效管理Linux目录结构

1. 为什么需要一个“目录树”工具?在Linux世界里,尤其是Ubuntu这样的发行版,命令行是很多人的主战场。我们每天都要和文件、目录打交道。ls命令是查看目录内容的首选,它简洁、高效,能列出文件名、权限、大小等关键信息…

2026/8/12 9:33:34 阅读更多 →
博思AI智能体:意图识别、思考链与性能优化的工程实践

博思AI智能体:意图识别、思考链与性能优化的工程实践

在AI应用从“能用”走向“好用”的进程中,系统的响应速度、决策透明度与高并发稳定性是决定用户体验的关键。博思AI智能体近期完成了一次重要的专项优化,聚焦于意图识别、思考链展示与全链路压测三大核心领域,将系统从功能实现推向了工程卓越…

2026/8/12 9:33:34 阅读更多 →
子代理架构:AI智能体任务分解与协同执行的核心原理与实践

子代理架构:AI智能体任务分解与协同执行的核心原理与实践

1. 项目概述:为什么我们需要“子代理”?最近在折腾各种AI应用和自动化流程时,我越来越频繁地遇到一个瓶颈:单个AI智能体(Agent)的能力边界。无论是处理复杂的多步骤任务,还是需要同时调用多个专…

2026/8/12 9:33:34 阅读更多 →

周新闻

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁 【免费下载链接】baidupankey 在线查询网盘提取码(维护中 rm repo) 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 你是否曾经在深夜寻找一份重要资料&#x…

2026/8/12 1:11:09 阅读更多 →
如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南 【免费下载链接】chinese_license_plate_generator 中国车牌生成器 项目地址: https://gitcode.com/gh_mirrors/ch/chinese_license_plate_generator 中国车牌生成器是一个基于Python的开源项目&#xff0c…

2026/8/12 1:11:09 阅读更多 →
收藏!小白程序员轻松入门大模型,从Harness工程开始实践

收藏!小白程序员轻松入门大模型,从Harness工程开始实践

文章强调学习大模型不应只关注模型本身,而应重视模型外的系统搭建,即Harness。提出AgentModelHarness的实用公式,详细介绍Harness的四个层次:持久化层、执行层、控制层和观察与验证层。文章还探讨了上下文工程、工具设计、AGENTS.…

2026/8/12 1:11:08 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/11 17:09:45 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/12 1:11:10 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/11 17:09:45 阅读更多 →