Linux重新路由和首次路由的区别
shixudong163.comLinux在发包前进行首次路由查找在《TPROXY与Wireguard》文末小插曲有提到unconnect方式只需一次路由查找connect方式需要两次路由查找然后根据路由查找结果设置数据包路由并修改待发送数据包的源IP初始源IP一般为0如匹配local路由将其修改为目标IP非local路由则修改为外出网卡IP和目标IP如初始目标IP为0将其修改为127.0.0.1。数据包在经过iptables的OUTPUT链时如在mangle表打上了mark或者在nat表通过DNAT修改了目标IP则需要调用ip_route_me_harder重新路由。Linux的重新路由机制使用同样的路由查找算法并根据路由查找结果重置数据包路由但不对数据包本身进行任何改变。下面通过3个例子来进一步考察两者之间的区别。第一个例子近日因某些原因需要block树莓派网关上外出的quic端口并且希望在nat表完成丢包动作然而nat表已不再支持DROP操作只能通过DNAT --to blackhole变相实现由于ipv4没有明确定义blackhole根据网上建议可用0.0.0.0或127.0.0.1代替。在使用127.0.0.1作为DNAT的blackhole时具体又可分为OUTPUT/DNAT和PREROUTING/DNAT。对于OUTPUT/DNAT本机外发数据包将直接进入本机接收环节如本机没有对应侦听端口UDP/TCP分别返回icmp-port-unreachable/tcp-reset可起到block作用发送端能接收并处理返回所以不是严格意义上的blackhole。如本机存在对应侦听端口对于TCP将和本机侦听端口建立连接起不到blackhole作用。至于UDP因属于无连接协议情况稍有点复杂取决于UDP服务的不同实现如UDP服务仅绑定了127.0.0.1或使用IP_PKTINFO获取了接收包的目标IP此时返回包源IP为127.0.0.1可被conntrack还原能和发送端双向通信同样起不到blackhole作用。否则UDP服务将根据路由查找算法选择返回包的源IP必然不是127.0.0.1后续不能被conntrack还原无法被发送端认可此种情形下仍可以起到blackhole作用。至于PREROUTING/DNAT由于默认没有启用route_localnet外来数据包将在ip_route_input_slow环节丢包完美实现了blackhole。如启用了route_localnet数据包可进入本机接收环节其行为和OUTPUT/DNAT的本机接收情况基本一致。在使用0.0.0.0作为DNAT的blackhole时对于PREROUTING/DNAT外来数据包也将在ip_route_input_slow环节丢包并且没有额外的开关控制可以完美实现blackhole。顺便提一下上述ip_route_input_slow丢包的两种情形都可以用sudo sysctl -w net.ipv4.conf.all.log_martians1验证也能在入口网卡处抓到相应的数据包。根据《也谈tcpdump抓包》一文在入口网卡处抓到的目标IP并非DNAT后的目标IP仍然是DNAT前的目标IP。对于OUTPUT/DNAT当在lo网卡接收环节抓到目标IP为0.0.0.0的数据包时令人感到很意外因为在mkroute_output环节不允许出现目标IP全0的情形。此外当本机直接向0.0.0.0发送数据包时如没有经过OUTPUT/DNAT环节目标IP将被替换为127.0.0.1也不会出现目标IP全0的情形。反复研读了几遍源码终于意识到了Linux重新路由和首次路由之间的区别两者共同调用的路由查找算法在发现目标IP全0时将其更改为源IP如源IP也全0则将目标IP和源IP一并更改为127.0.0.1并用更改后的数据去调用mkroute_output因此对于mkroute_output来说不会出现目标IP全0的情形。Linux在首次路由查找结束后除了设置数据包路由外还将上述临时更改结果同步到待发送数据包然而Linux重新路由只是根据路由查找结果重置数据包路由不会对数据包本身进行任何更改。基于上述原因目标IP为0.0.0.0的数据包只能出现在OUTPUT/DNAT后的重路由环节并且因为带有路由信息通过lo网卡自发自收时顺利跳过了ip_route_input_slow环节不会被内核丢包可以进入本机接收环节。如本机没有对应侦听端口对于UDP能返回源IP为0.0.0.0的icmp-port-unreachable经过conntrack还原后能原路返回UDP发送端实现block作用对于TCP由于返回的tcp-reset包源IP不是0.0.0.0不能被conntrack还原导致返回包不被TCP发送端认可虽然可起到blackhole作用但TCP发送端将多次重试本机增加了不必要的响应资源。如本机存在对应侦听端口除了TCP返回的SYNACK包源IP为0.0.0.0可被conntrack还原外其他TCP/UDP的返回包源IP都不是0.0.0.0不能被conntrack还原无法被发送端认可可以起到blackhole作用但也同样让本机增加了不必要的响应资源。综上PREROUTING/DNAT建议使用0.0.0.0作为blackhole由内核丢包无需考虑本机是否存在相应的侦听端口。OUTPUT/DNAT建议使用127.0.0.1作为blackhole同时本机不能侦听相应端口可以起到block端口的作用并且不会浪费本机资源。第二个例子以《TPROXY与Wireguard》文末小插曲为例该处有个小结论网关自身应用程序要想使用TPROXY功能只能通过OUTPUT链打mark的方式将数据包重新路由到TPROXY。如寄希望于通过应用程序自身打mark直接路由到TPROXY由于内核路由查找算法的瑕疵会引发各种稀奇古怪的路由问题导致无法使用TPROXY功能。当时由于没有意识到linux重新路由和首次路由的区别就没有进一步分析其成因只是简单地将其归类为内核路由查找算法的瑕疵实际上造成上述问题的根因就在于重新路由和首次路由的差异。Linux在发包前首次路由查找后必须根据路由查找结果修改数据包的源IP初始源IP一般为0如匹配local路由将其修改为目标IP非local路由则修改为外出网卡IP而Linux重路由机制虽然使用同样的路由查找算法但不对数据包进行任何改变。网关自身应用程序使用本机TPROXY功能恰恰就是充分利用了首次路由和重新路由的各自特点首次路由时无mark匹配非local路由将外出网卡IP作为源IP。重新路由时带mark匹配local路由此时local路由表能匹配源IP数据包可顺利使用该源IP和本机TPROXY之间双向通信。最后一个例子比较常见在《关于PREROUTING处理自发自收包的新认识》中就提到一个场景Linux主机在使用127.0.0.1访问Bridge模式Docker时需要通过OUTPUT链实现DNAT此处属于常规DNAT而非例一中的blackhole。还有一个多运营商线路接入的双网卡场景则需要通过OUTPUT链打mark、并使用策略路由将数据包导向不同的运营商。在这两种场景下外出数据包在首次路由时已根据初始目标IP选定了相应的外出网卡IP作为源IP但在OUTPUT链打mark或DNAT后重新路由时如实际外出网卡发生了变化将和数据包首次路由时获取的源IP不匹配导致该源IP并不是目标网络期望的源IP很有可能被目标网络丢包。由于重新路由并不能修改数据包因此还需要在POSTROUTING链添加配套的MASQUERADE规则修改源IP以匹配真实发送网卡确保数据包可顺利到达目标并能顺利返回。此外对于最后一例中的DNAT场景因初始目标IP为127.0.0.1故首次路由后源IP也被改为127.0.0.1然而经过DNAT转换后目标IP不再是本机IP此种情形源IP为127.0.0.1外出网卡非lo网卡还需要启用route_localnet否则重新路由时外出数据包将在mkroute_output环节返回错误压根起不到DNAT作用。最后顺便提一下路由查找算法主要任务是确定下一跳副产品是还可确定源IP和外出网卡源IP在首次路由后同步更新到待发送数据包但数据包的外出网卡信息无论是首次路由还是重新路由都不会被同步更新一直保持为null直到数据包进入ip_output环节才根据最新的下一跳信息设置其外出网卡可通过pwru --output-meta验证。由于数据包本身只带有单方向进入或外出的网卡信息因此用于匹配iptables规则所需的数据包外出网卡信息并不是来自数据包自带的网卡信息而是根据进入hook时数据包的下一跳信息获取到外出网卡信息。对于遍历OUTPUT链nat和filter表的数据包,总是使用进入hook点NF_INET_LOCAL_OUT时通过首次路由获得的外出网卡去匹配iptables规则。因此即使在OUTPUT链打mark或DNAT后立即重新路由并更改了外出网卡实际并未更改只是更改了下一跳也仍然使用首次路由获得的外出网卡而非重新路由后更改的外出网卡去匹配OUTPUT链/filter表规则。至于重新路由后更改的外出网卡信息何时作用于iptables规则需要到ip_output环节数据包进入hook点NF_INET_POST_ROUTING时才会根据最新的下一跳信息去获取更改后的外出网卡用来匹配数据包外出前最后的POSTROUTING链规则。

相关新闻

为什么SerenityOS值得深入探索?一个从零开始的操作系统构建之旅

为什么SerenityOS值得深入探索?一个从零开始的操作系统构建之旅

为什么SerenityOS值得深入探索?一个从零开始的操作系统构建之旅 【免费下载链接】serenity The Serenity Operating System 🐞 项目地址: https://gitcode.com/GitHub_Trending/se/serenity 想象一下,你正在寻找一个能让你真正理解操作…

2026/8/7 21:35:03 阅读更多 →
AnySplat vs 传统3D重建:为什么前馈式方法是下一代视觉技术的关键?

AnySplat vs 传统3D重建:为什么前馈式方法是下一代视觉技术的关键?

AnySplat vs 传统3D重建:为什么前馈式方法是下一代视觉技术的关键? 【免费下载链接】AnySplat [SIGGRAPH Asia 2025 (ACM TOG)] AnySplat: Feed-forward 3D Gaussian Splatting from Unconstrained Views 项目地址: https://gitcode.com/gh_mirrors/an…

2026/8/7 21:35:03 阅读更多 →
如何快速上手SerenityOS:复古与现代融合的完整入门指南

如何快速上手SerenityOS:复古与现代融合的完整入门指南

如何快速上手SerenityOS:复古与现代融合的完整入门指南 【免费下载链接】serenity The Serenity Operating System 🐞 项目地址: https://gitcode.com/GitHub_Trending/se/serenity SerenityOS是一个独特的开源操作系统,巧妙地将90年代…

2026/8/7 21:35:03 阅读更多 →

最新新闻

SMOTE-variants模型选择攻略:交叉验证与参数调优的最佳实践

SMOTE-variants模型选择攻略:交叉验证与参数调优的最佳实践

SMOTE-variants模型选择攻略:交叉验证与参数调优的最佳实践 【免费下载链接】smote_variants A collection of 85 minority oversampling techniques (SMOTE) for imbalanced learning with multi-class oversampling and model selection features 项目地址: htt…

2026/8/7 22:19:18 阅读更多 →
CPU的架构:x86是什么?arm又是哪儿来的?

CPU的架构:x86是什么?arm又是哪儿来的?

文章目录 ​C​P​U​架​构​​常​见​架​构​​x​8​6​​a​r​m​​R​I​S​C​-V​ ​比​较​​同​样​架​构​C​P​U​一​定​是​一​样​的​…​…​吗​?​​跨​平​台​​梳​理​​结​尾​ 本文由Jzwalliser原创,发布在CSDN平台上…

2026/8/7 22:19:18 阅读更多 →
硬件真题及答案解析4

硬件真题及答案解析4

目录 一、单选题 1、将十进制数13转换成二进制数,结果是 2、三极管处于放大状态时候,下列说法正确的是 3、USB3.2 Gen1 的传输速率是多少 4、如图为一个典型的晶振线路,如果发现此晶振线路的输出时钟精度偏离,请问该如何调整? 5、在实际的电路设计中,三极管的截…

2026/8/7 22:19:18 阅读更多 →
CC Switch深度链接:一键配置AI助手的终极解决方案

CC Switch深度链接:一键配置AI助手的终极解决方案

CC Switch深度链接:一键配置AI助手的终极解决方案 【免费下载链接】cc-switch A cross-platform desktop All-in-One assistant for Claude Code, Codex, OpenCode, OpenClaw, Grok Build & Hermes Agent. Only official website: ccswitch.io 项目地址: http…

2026/8/7 22:19:18 阅读更多 →
2026年PDF转换txt工具盘点:这7款覆盖了你常用的所有平台

2026年PDF转换txt工具盘点:这7款覆盖了你常用的所有平台

上个月帮部门整合供应商资质,七八份PDF合同和扫描版营业执照等着用,偏偏每份里都有几个关键条款要摘出来重新排版。甲方发来的文件里有文字版也有扫描件,我当时心想“直接转成txt把文字抠出来就行”,结果用电脑自带功能转了第一份…

2026/8/7 22:19:18 阅读更多 →
Java3 - 运算符

Java3 - 运算符

int a 3;int b 2;System.out.println(a b);System.out.println(a - b);System.out.println(a * b); //除法会下取整System.out.println(a / b); //进行乘法/取模运算时右操作数不能为0 报 Exception in thread "main" java.lang.ArithmeticException: / by zero 错…

2026/8/7 22:18:17 阅读更多 →

日新闻

为什么scrcpy成为Android投屏的终极解决方案:完整实战指南

为什么scrcpy成为Android投屏的终极解决方案:完整实战指南

为什么scrcpy成为Android投屏的终极解决方案:完整实战指南 【免费下载链接】scrcpy Display and control your Android device 项目地址: https://gitcode.com/GitHub_Trending/sc/scrcpy 想要将Android手机屏幕完美投射到电脑上,享受大屏操作的自…

2026/8/7 0:00:19 阅读更多 →
如何在5分钟内掌握Tom Select:打造现代化表单选择器的终极指南

如何在5分钟内掌握Tom Select:打造现代化表单选择器的终极指南

如何在5分钟内掌握Tom Select:打造现代化表单选择器的终极指南 【免费下载链接】tom-select Tom Select is a lightweight (~16kb gzipped) hybrid of a textbox and select box. Forked from selectize.js to provide a framework agnostic autocomplete widget wi…

2026/8/7 0:00:19 阅读更多 →
5分钟快速上手:NSZ压缩工具终极指南,轻松管理Switch游戏文件

5分钟快速上手:NSZ压缩工具终极指南,轻松管理Switch游戏文件

5分钟快速上手:NSZ压缩工具终极指南,轻松管理Switch游戏文件 【免费下载链接】nsz NSZ - Homebrew compatible NSP/XCI compressor/decompressor 项目地址: https://gitcode.com/gh_mirrors/ns/nsz 你是否在为Nintendo Switch游戏文件占用大量存储…

2026/8/7 0:00:19 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/6 22:02:27 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/6 22:02:27 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/6 22:02:27 阅读更多 →

月新闻

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

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

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

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

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

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

2026/8/6 22:02:28 阅读更多 →
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/7 17:02:36 阅读更多 →