关于PREROUTING链处理自发自收包的新认识

发布时间:2026/7/21 18:37:47

关于PREROUTING链处理自发自收包的新认识
shixudong163.com在《组播优化、multicast_query_use_ifaddr和multicast_router》一文中由于当时对Linux源码不是很熟以及受网上资料误导一直以为nat表PREROUTING链不能处理本机自发自收包是因为conntrack机制判断从loopback_dev收包不做跟踪处理而已。实际上根本不是这么回事自发自收包除了单播外组播和广播虽然也通过netif_rx收包但其关联网卡却是物理网卡。针对该文第四部分bridge的multicast_querier发出的igmp查询报文能被nat表PREROUTING链处理正确解读如下igmp querier专用软件在三层发组播包给自己时必须通过ip_local_out,自然也经由nf_conntrack_in在此处留了痕并在POSTROUTING链经由nf_conntrack_confirm加以确认。该包被本机自收并到达nat表PREROUTING链再次经由nf_conntrack_in时被识别为loopback or untracked故不再去匹配PREROUTING链LOG规则导致永远无LOG产生表面上看起来貌似没有被nat表PREROUTING链处理。multicast_querier在二层发包无需经由ip_local_out的nf_conntrack_in也就是说没有经过连接跟踪处理所以后续到达nat表PREROUTING链时属于首次进入nf_conntrack_in因为无conntrack记录故必然去匹配PREROUTING链LOG规则首次匹配产生LOG后续适用快速匹配机制不产生LOG。其实严格说来并没有nat表PREROUTING链不能处理本机自发自收包一说只是自发自收包比较特殊发送和接收各调用一次nf_conntrack_in并且loopback_xmit单播和dev_loopback_xmit多播/广播不像veth驱动那样对skb进行必要的清理操作由veth_xmit调用skb_scrub_packet实现。自发自收包在接收环节再次进入nf_conntrack_in时其conntrack状态并没有重置仍然保留着发送环节处理后的状态故被识别为loopback or untracked导致不再去查找conntrack表更不会去匹配PREROUTING链规则产生新的conntrack记录实际上也相当于untracked后续直接进入本机接收环节。虽然nat表PREROUTING链无法对自发自收包进行DNAT但nat表OUTPUT链同样可以实现本机外出包的DNAT两者组合完美实现了本机接收包和发送包的DNAT其逆转换SNAT则分别在其返回包的POSTROUTING链和INPUT链进行。此外PREROUTING链针对自发自收包的上述限制仅限于nat表mangle表则不存在上述限制。本机使用TPROXY功能就是利用了mangle表可以自发自收的特性先对本机外出包打mark并重新路由通过策略路由实现本机自发自收最终进入本机mangle表PREROUTING链进行TPROXY处理不象DNAT/SNATTPROXY只能在mangle表PREROUTING链处理。由于nat表PREROUTING链处理自发自收包的限制Linux主机在使用127.0.0.1访问Bridge模式Docker时只能通过OUTPUT链实现DNAT。同时由于发包前路由寻址时目标IP为127.0.0.1导致源IP也为127.0.0.1DNAT后重新路由时并不会改变源IP因此需要启用网桥docker0的route_localnet使得数据包可以顺利发送出去此外还需要针对源IP做MASQUERADE否则1、无法解析目标IP的MAC地址2、即使数据包能够到达Docker但由于源IP为127.0.0.1Docker默认关闭route_localnet内核同样无法接收3、即使Docker也启用了route_localnet数据包能被Docker接收也无法返回Linux主机。在WSL2mirrored和Docker配合使用时情形稍有不同。WSL2在使用127.0.0.1访问Docker时该127.0.0.1实际上对应Win11主机的127.0.0.1而非WSL2自身。在没有相应的OUTPUT链DNAT规则时数据包将先发往Win11主机然后重新转发到WSL2因此理论上也可以通过PREROUTING链实现DNAT。但实际情况是WSL2添加PREROUTING链DNAT规则后数据包在WSL2的接收环节再次进入nf_conntrack_in时事实上已经是新数据包其conntrack状态已经重置因而不会发生像Linux主机那样被识别为loopback or untracked的情形。然而后续查找conntrack表时能匹配到先前的外出记录故适用conntrack快速匹配机制。结果是不会产生新的conntrack记录并跳过了PREROUTING链DNAT规则直接进入本机接收环节通过代理模式访问Docker。针对WSL2mirrored的这种特殊情形可在WSL2的raw表PREROUTING链增加一条规则匹配条件和nat表PREROUTING链DNAT规则完全一致并将-j DNAT改为-j CT --zone-orig 1。由于增加了zone在数据包再次进入WSL2的接收环节查找conntrack表项时新数据包和原有外出记录将不再匹配而是根据DNAT规则产生新的conntrack记录此时WSL2就能顺利通过PREROUTING链DNAT而非OUTPUT链DNAT使用127.0.0.1访问Docker了如两种DNAT同时存在则只有OUTPUT链DNAT规则起作用此时数据包将不再发往Win11主机。至于Win11主机使用127.0.0.1访问WSL2mirrored里的Docker数据包在WSL2接收环节属于首次进入nf_conntrack_in因为无conntrack记录所以无需额外的raw表规则就能根据PREROUTING链DNAT规则产生新的conntrack记录。在WSL2的v2.3.11版本解决了Windows主机和WSL2的Docker之间路由互通问题后返回包就能原路返回Win11主机也能通过DNAT模式使用127.0.0.1访问WSL2的Docker。至于v2.3.11之前版本如果WSL2添加了PREROUTING链DNAT规则由于mirrored模式自带的策略路由未考虑到WSL2内部Docker等情形Docker的返回包无法原路返回Win11主机只能到达WSL2导致握手失败。该情形下为了使Win11主机仍能通过127.0.0.1访问WSL2的Docker只能使用代理模式并且WSL2不能添加PREROUTING链DNAT规则否则DNAT规则将优先于代理模式生效代理模式完全起不到作用。WSL2自身则不受v2.3.11之前版本影响仍可通过OUTPUT链的DNAT规则使用127.0.0.1访问Docker。最后顺便提一下WSL2在NAT或Bridged模式下默认启用了localhost转发功能Win11主机能和Mirrored模式一样使用127.0.0.1来访问WSL2资源在Win11主机看来两者似乎没有区别但在WSL2看来两者在网络层面表现完全不同。NAT或Bridged模式下Win11主机使用127.0.0.1访问WSL2里的Docker完全等价于WSL2自身使用127.0.0.1访问起作用的是WSL2的OUTPUT链DNAT规则。Mirrored模式下Win11主机使用127.0.0.1访问WSL2里的Docker则是Win11主机实实在在地通过网络访问起作用的是WSL2的PREROUTING链DNAT规则。事实上如关闭localhost转发功能WSL2mirrored将明确提示使用镜像网络模式时wsl2.localhostForwarding 设置无效。在NAT或Bridged模式下Win11主机此时无法使用127.0.0.1访问WSL2资源但Mirrored模式下的Win11主机则不受影响。另外无论是NAT或Bridged模式还是Mirrored模式要让Win11主机顺利使用127.0.0.1访问WSL2里的DockerWSL2里都必须在目标端口上开启哑侦听服务其目的是为了让该目标端口暴露给Win11主机使得Win11主机发出的数据包能够顺利传递给WSL2一旦数据包到达了WSL2就直接去匹配DNAT规则并发往Docker数据包压根不可能到达WSL2的哑侦听服务。

相关新闻

SSRS项目部署实战:从环境配置到模型训练完整指南

SSRS项目部署实战:从环境配置到模型训练完整指南

2026/7/21 18:37:47

SSRS项目部署实战:从环境配置到模型训练完整指南 【免费下载链接】SSRS Semantic Segmentation for Remote Sensing 项目地址: https://gitcode.com/gh_mirrors/ss/SSRS SSRS(Semantic Segmentation for Remote Sensing)是一个专注于遥…

DeepResearch(二):Vane、AutoResearchClaw、ROMA、SearchClaw、Perplexica、Kimi-Researcher

DeepResearch(二):Vane、AutoResearchClaw、ROMA、SearchClaw、Perplexica、Kimi-Researcher

2026/7/21 18:37:47

DeepResearch系列: DeepResearch(上):方法论、OpenAI Deep Research、SurfSence、MindSearch、morphik、Firesearch通义DeepResearch 本文继续汇总介绍几个开源或闭源深度研究项目。 Vane 开源(GitHub,…

阿里Agent生态现状与技术架构瓶颈分析

阿里Agent生态现状与技术架构瓶颈分析

2026/7/21 18:37:47

1. 阿里Agent生态的现状与挑战最近半年,阿里系Agent产品的发展轨迹确实让人有些摸不着头脑。作为国内最早布局智能Agent的科技巨头之一,阿里在2021年推出的"阿里小蜜"企业版曾一度被视为行业标杆,但如今在公开报道和产品迭代中却显…

Spring AI对话记忆管理:ChatMemory机制与实战配置

Spring AI对话记忆管理:ChatMemory机制与实战配置

2026/7/21 22:58:05

1. Spring AI对话短期记忆的核心价值 大型语言模型(LLM)本质上是无状态的——它们不会记住之前的对话内容。这种特性在需要连续对话的场景中会带来明显的局限性,比如当用户问"我刚才说了什么?"时,模型无法给…

SpringBoot+Vue超市管理系统毕业设计实战:从零搭建前后端分离项目

SpringBoot+Vue超市管理系统毕业设计实战:从零搭建前后端分离项目

2026/7/21 22:58:05

很多同学在做毕业设计时,面对一个完整的项目需求常常感到无从下手,尤其是需要整合前后端技术栈时。本文将手把手带你从零开始,完成一个功能完整、代码规范、可直接运行的“鲜享超市管理系统”。这个项目采用主流的SpringBoot后端和Vue前端&am…

警惕技术营销话术:识别虚构项目与误导性宣传

警惕技术营销话术:识别虚构项目与误导性宣传

2026/7/21 22:58:05

我不能按照该标题生成相关内容。原因如下:“OpenClaw”并非公开可查的主流开源项目、知名商业软件或广泛认可的技术产品,经多源交叉检索(GitHub、PyPI、Hugging Face、主流技术社区及学术论文库),未发现与之对应、具备…

Unity UGUI按钮透明区域点击穿透:原理、实现与性能优化

Unity UGUI按钮透明区域点击穿透:原理、实现与性能优化

2026/7/21 22:58:05

1. 项目概述:当按钮不再是“方块”在Unity UGUI的开发中,按钮(Button)组件是我们与用户交互最直接的桥梁。默认情况下,UGUI的按钮是一个完整的矩形区域,无论你为它设置了一张多么精美的、带有不规则透明边缘…

Node.js安全扫描Web界面:从可视化结果到高效修复的实战指南

Node.js安全扫描Web界面:从可视化结果到高效修复的实战指南

2026/7/21 22:58:05

1. 项目概述:为什么需要一个清晰的Web界面来解读Node.js安全扫描结果?如果你和我一样,长期在Node.js项目里摸爬滚打,那你肯定对安全扫描工具不陌生。nodejsscan作为一款专门针对Node.js和JavaScript生态的静态应用安全测试工具&am…

UE5新手避坑指南:Enhanced Input系统实现角色移动与视角控制

UE5新手避坑指南:Enhanced Input系统实现角色移动与视角控制

2026/7/21 22:48:05

1. 项目概述:为什么新手需要这份“避坑指南”?刚接触虚幻引擎5(UE5)的新手,尤其是从Unity或其他引擎转过来的朋友,常常会卡在人物移动和视角控制这个看似基础,实则暗藏玄关的环节上。你可能会发…

微服务进阶:服务网格与Istio

微服务进阶:服务网格与Istio

2026/7/21 5:45:57

541|微服务进阶:服务网格与Istio 上篇文章我们聊了微服务的基本概念和拆分方法。 但微服务多了,问题也多了: 服务之间怎么通信? 怎么监控每个服务的调用链路? 熔断、限流、重试怎么做? 安全认证怎么统一? 以前这些都靠SDK库(比如Hystrix、Feign),每个服务都要集成…

零售超级终端全域协同:ShareKit 碰一碰商品流转业务落地案例

零售超级终端全域协同:ShareKit 碰一碰商品流转业务落地案例

2026/7/21 9:56:14

一、零售门店全域协同业务背景与行业痛点 1.1 门店超级终端设备矩阵(连锁便利店/商超标准配置) 自助收银Kiosk一体机:顾客结算、自助核销优惠券、商品素材预览;运营折叠平板:店长后台商品上新、图片录入、活动配置、…

噗叽短视频界面分析

噗叽短视频界面分析

2026/7/21 3:09:32

1 和小红书类似,可以采用类似判断方法------------其实他比小红书好判断,因为他没有图片,控件位置几乎是固定的,都不用判断------------2 因为他没有点赞按钮------------而且几乎所有控件位置都是完全一样的,所以我就…

GraphRAG Local + Ollama:微软知识图谱本地化

GraphRAG Local + Ollama:微软知识图谱本地化

2026/7/21 0:06:35

普通 RAG 有个老毛病:你问它「这堆文档整体在讲什么」,它答不上来。因为它只会把问题切成向量,去几十个文本块里捞最相似的几段拼给模型看。可「整体讲什么」这种问题,答案根本不在任何单独一段里——它散在全篇的联系里。 微软的…

AI 数据产品化思考:让分析能力变成可售卖的数据服务

AI 数据产品化思考:让分析能力变成可售卖的数据服务

2026/7/21 0:06:35

AI 数据产品化思考:让分析能力变成可售卖的数据服务 大家好,我是朱大喜。这周一直在复盘具体的项目和技术,最后一篇聊点不一样的东西——数据产品化。做了这么多年数据分析,我发现一个规律:能卖出去的从来不是"分…

基于人机协作的 AI 研发新体系架构:从 Harness 工程到 Loop 工程实践

基于人机协作的 AI 研发新体系架构:从 Harness 工程到 Loop 工程实践

2026/7/21 0:06:35

本文完整呈现了企业级 AI Coding 落地的核心方法论:从 Harness 工程的微观/宏观定义,到 Loop 工程的六大构建模块,再到基于 SDD(规范驱动开发)的工程化落地路径。干货较多,建议收藏细读。 我从 22 年开始就…