移动网络中的IPv6:464XLAT、NAT64与DNS64通俗解读
想象一个奇怪的画面。你打开手机上的IP检测服务,它显示一个IPv4地址。但如果你查看同一设备的网络接口设置,你会看到一个长长的IPv6地址。这是怎么回事?设备生活在IPv6世界中,而网站却自信地在其日志中记录四个用点分隔的十进制数字。偷梁换柱发生在哪里?
这不是Bug,也不是魔法。这是一个精心设计的翻译系统,全球运营商已部署了十多年。如果你从事移动代理、爬虫、多账户管理,或者只是想了解你的流量发生了什么,理解这套机制至关重要。
在本指南中,我们将跟踪数据包从手机上的应用程序到目标网站的完整路径。我们将逐一剖析464XLAT的组件,理解NAT64和DNS64的作用,看到输出IPv4地址究竟从哪里诞生,并学会亲手诊断连接栈。这不是泛泛而谈。这是一次深入探讨,适合那些不仅想知道发生了什么,还想知道如何发生以及为什么发生的人。
引言:为什么手机获取IPv6,而网站看到IPv4
我们先从悖论的本质开始。现代智能手机在大型运营商的移动网络中几乎肯定是通过IPv6连接的。更甚者,通常在无线电接口上根本没有真正的IPv4地址。运营商根本不分配它。这是一个有意的决定,源于地址空间的严重短缺。
但互联网并不统一。大量网站、API和服务仍然只能通过IPv4访问。它们没有AAAA记录,它们的服务器不监听IPv6。如果手机只会说IPv6,它将无法打开一半的互联网。于是出现矛盾:设备说新语言,而对话者只懂旧语言。
解决这个矛盾正是我们讨论的主题。名为464XLAT的技术,连同NAT64和DNS64机制,创建了一座隐形的桥梁。设备通过IPv6发送数据包,而在运营商网络的深处,这些数据包被转换为IPv4,并以真实的IPv4地址到达目标服务器。服务器回应,返回路径以镜像顺序经历相同的转换。
正因如此,目标网站看到的是IPv4。正因如此,基于真实手机或运营商调制解调器构建的移动代理对外显示IPv4地址,尽管设备内部是IPv6的世界。偷梁换柱发生在手机上吗?不。发生在网站上吗?也不。它发生在运营商网络中的一个中间节点,称为PLAT。
读完本文你将了解:
- IPv4地址短缺的成因,以及它如何迫使运营商转向IPv6
- APN类型是什么,IPv4v6与纯IPv6有何不同
- 464XLAT逐步工作原理,CLAT在哪里,PLAT在哪里
- NAT64和DNS64如何让没有AAAA记录的网站变得可用
- 移动代理的输出IPv4地址从何而来
- happy eyeballs如何导致检测服务时而显示IPv4,时而显示IPv6
- 连接栈诊断的实用命令
- 为什么/64子网被视为一个客户端,这对多账户意味着什么
我们先明确边界。我们只讨论网络机制。我们不探讨哪种协议更划算或商业上更好。这是一份工程指南,而非市场综述。
基础知识:IPv4短缺、转向IPv6以及APN类型
要理解整个结构,我们从基础开始。而这个基础只有一个——IPv4地址的灾难性短缺。
为什么IPv4耗尽了
IPv4协议使用32位地址,提供约43亿种唯一组合。1981年协议标准化时,这个数字看起来像天文数字。谁能想到设备数量会超过地球上的人口?
现实很残酷。智能手机、平板电脑、智能手表、冰箱、摄像头、汽车——一切都需要地址。到2010年代初,区域互联网注册机构开始耗尽空闲地址块。如今,获得大块公网IPv4地址几乎不可能,而在二级市场上它们每个售价高达几十美元。
对于拥有数千万用户的移动运营商来说,这是一个根本性问题。物理上不可能为每部智能手机分配一个独立的公共IPv4地址。地址根本不够用。
IPv6如何解决问题
IPv6协议使用128位地址。可能组合的数量大到人脑无法理解——大约是340 undecillion个地址。粗略地说,可以分配给地球表面每个原子好几个地址,还绰绰有余。
运营商从注册机构获得巨大的IPv6地址块,并以极其充裕的方式分配给用户。典型做法是为每个用户设备分配一个完整的/64子网。这,请注意,是18 quintillion个地址给一部手机。记住这一点,它将在多账户章节中发挥重要作用。
什么是APN,它的类型有什么用
APN代表接入点名称。它是一个配置模板,告诉手机如何连接到运营商的包交换网络。当智能手机建立数据连接时,它会请求网络创建一个特定协议类型的会话或PDP上下文。
有三种主要的PDN或PDP上下文类型:
- IPv4——设备只获取一个IPv4地址。经典的过时方案。它有效,但需要那些不存在的地址。
- IPv6——设备只获取一个IPv6前缀。接口上根本没有IPv4。对运营商来说最节省。
- IPv4v6——双栈。设备在一次会话中同时请求两种类型的地址。
这里有一个微妙之处。即使手机请求IPv4v6,运营商也可能只提供IPv6部分,而拒绝IPv4部分,或通过转换机制分配私有地址。许多大型运营商的配置是,用户默认获得纯IPv6,而与IPv4互联网的兼容性由已经描述的464XLAT技术提供。
一个有用的类比。想象全世界都换用了一种新语言交流,但许多旧机构只接受旧语言的文件。国家无法为每个公民签发单独的旧护照——数量不够。因此国家给所有人颁发新证件,并在旧机构的入口处设置翻译员。这个翻译员就是464XLAT。
深入解析:464XLAT的组件
现在我们准备好剖析这项技术本身了。名称464XLAT读作four-six-four translation。数字反映了本质:数据包在应用程序内以IPv4开始生命,通过网络以IPv6传输,然后在出口处再次变成IPv4。XLAT是translation的缩写。
其基础是IETF规范中描述的协议间地址转换标准。但464XLAT在此基础上增加了一个由两个协同工作的组件组成的架构。
CLAT——设备端的翻译器
CLAT代表Customer-side translator,即客户端侧的翻译器。它直接位于你的智能手机上,嵌入在操作系统中。在Android上,这个功能由特殊的守护进程实现;在其他系统中则是类似的模块。
CLAT的任务只有一个,但很重要。当手机上的应用程序想要发送IPv4数据包时——例如它硬编码使用IPv4套接字或直接访问IP地址——CLAT拦截这个IPv4数据包并将其封装到IPv6中。技术上,它执行无状态转换算法,将源和目标IPv4地址转换为对应的IPv6地址,使用预先知道的前缀。
CLAT在设备上创建一个虚拟网络接口,分配一个私有IPv4地址。应用程序看到这个地址,以为它们生活在正常的IPv4环境中。它们甚至不知道底层一切都早已迁移到IPv6。
PLAT——运营商网络中的翻译器
PLAT代表Provider-side translator,即提供商侧的翻译器。这是一个位于运营商网络核心的强大节点,实现NAT64功能。正是在这里发生最终的转换。
PLAT接收来自设备的IPv6数据包,提取有关原始IPv4目标的信息。然后它执行有状态转换:将IPv6数据包转换回IPv4数据包,将其源地址替换为运营商公共地址池中的一个IPv4地址,然后将数据包发送到常规的IPv4互联网。
关键词是“有状态”——即保持状态。PLAT维护一个映射表,以便来自服务器的返回数据包能够正确返回到发起连接的设备。这本质上与经典NAT相同的原理,只是在不同协议之间进行。
为什么需要两个翻译器
一个合理的问题是:既然PLAT最终会翻译一切,为什么还需要设备上的CLAT?答案在于那些不支持IPv6的应用程序。
许多应用程序硬编码使用IPv4。它们请求IPv4套接字,处理IPv4地址字面量,一些旧协议在负载中传输IP地址。如果设备上只有纯IPv6,这些应用程序就会崩溃。CLAT给它们一个完整IPv4环境的假象,同时保持透明。
因此,组合工作方式如下:CLAT解决设备上的兼容性问题,PLAT解决互联网上的兼容性问题。它们共同构成一座无缝的桥梁。
NAT64和DNS64:如何让没有AAAA记录的网站变得可用
我们了解了数据包转换。但还有一个根本问题——如果目标网站只存在于IPv4世界,根本没有IPv6记录,设备如何知道将IPv6数据包发送到哪里?
这里NAT64和DNS64这对搭档登场了。它们紧密合作,缺一不可。
缺失AAAA记录的问题
在域名系统中,不同协议的地址存储在不同类型的记录中。IPv4地址存储在A记录中。IPv6地址存储在AAAA记录中,发音为quad-A。
纯IPv6设备想打开一个网站时,它会向DNS请求AAAA记录。但如果网站没有IPv6基础设施,也就没有AAAA记录。只有A记录,包含IPv4地址。设备收到空响应,理论上应该报网站不可达。但得益于DNS64,这不会发生。
DNS64如何工作
DNS64是一个特殊的运营商DNS解析器,拥有超能力。当设备请求某个域名的AAAA记录,而真正的AAAA记录不存在时,DNS64不会放弃。它执行以下操作:
- 向权威服务器请求常规的A记录,得到网站的IPv4地址
- 取出这个IPv4地址,从它合成一个人工的AAAA记录
- 合成时,它将32位IPv4地址嵌入一个特殊的IPv6前缀中
- 它将这个合成的AAAA记录像什么都没发生一样返回给设备
设备得到一个有效的IPv6地址,然后愉快地向它发送数据包。它不知道也不必知道这个地址是人工的。
合成前缀 64:ff9b::/96
我们现在触及整个系统中最知名的工件之一。用于合成地址的是一个专门保留的前缀64:ff9b::/96。它被称为众所周知的(Well-Known Prefix)前缀,正是为NAT64转换而标准化的。
机制简单而优雅。前缀占用地址的前96位。剩下的32位正好是IPv4地址的大小。DNS64只需将网站的IPv4地址附加到前缀末尾。
例如,如果网站IPv4地址表示为四个十进制数字,合成的IPv6地址将以64:ff9b为前缀,最后32位编码这四个数字。当这样的数据包到达PLAT时,节点看到熟悉的前缀,意识到这是NAT64转换,提取最后32位,得到真实的目标IPv4地址。然后它发送一个普通的IPv4数据包。
一些运营商使用自己地址空间中的私有网络前缀而不是众所周知的。逻辑相同,只是前几个位的具体值不同。
这对工作如何一起完成
拼图拼上了。DNS64负责让设备获得一个IPv6地址以访问IPv4互联网。NAT64以PLAT的形式负责让数据包通过这个地址真正到达IPv4服务器。两者缺一不可:DNS64创建只有NAT64才能处理的地址,而NAT64只处理DNS64合成的地址。
那么,对于有真正AAAA记录的网站呢?更简单。DNS64看到真实的AAAA记录,就直接返回,不做任何合成。设备通过IPv6直接连接到网站,绕过整个转换机制。这是最佳的端到端路径。
数据包从应用程序到网站的路径(使用464XLAT):文字示意图
是时候将所有机制整合成一个逐步的路径图了。跟踪一个数据包从在应用程序中诞生到到达目标IPv4服务器再返回的整个旅程。这正是移动代理流量的路径。
正向路径:从手机到网站
- 步骤1. 应用程序想要连接。 手机上的应用程序决定打开一个只有IPv4的网站。它向DNS请求地址。
- 步骤2. DNS64合成地址。 运营商的解析器没有找到真正的AAAA记录,它获取A记录,将IPv4地址嵌入64:ff9b::/96前缀中,并返回合成的AAAA记录。
- 步骤3. 应用程序发送数据包。 有两种可能。如果应用程序使用IPv6,它直接向合成的地址发送IPv6数据包。如果应用程序硬绑定到IPv4,它向CLAT的虚拟接口发送IPv4数据包。
- 步骤4. CLAT将IPv4转换为IPv6。 对于IPv4应用程序,CLAT守护进程拦截数据包,并根据无状态转换规则将其转换为IPv6数据包,使用相同的NAT64前缀。
- 步骤5. 数据包通过无线电网络传输。 现在这是一个纯IPv6数据包。它通过基站和移动运营商核心网络。整个无线电部分内部只有IPv6。
- 步骤6. 数据包到达PLAT。 在网络核心中,有一个PLAT节点,带有NAT64功能。它看到目标以NAT64前缀开头的数据包。
- 步骤7. PLAT将IPv6转换为IPv4。 节点提取目标地址的最后32位——这是网站的真实IPv4。然后将源地址替换为自己的池中的一个公共IPv4,并在状态表中记录映射。
- 步骤8. 数据包进入互联网。 现在这是一个普通的IPv4数据包。它通过全球网络向目标服务器传输。
- 步骤9. 网站看到IPv4。 服务器接收到来自运营商公共IPv4地址的连接。在日志中,它记录这个IPv4。这是真相时刻:网站永远不会知道该数据包最初诞生于IPv6环境。
返回路径:从网站到手机
- 步骤10. 服务器回应。 网站向它看到的公共地址发送一个IPv4回应数据包。
- 步骤11. PLAT查找映射。 NAT64节点查看其状态表,确定该连接属于哪个设备,并恢复IPv6地址。
- 步骤12. 反向转换为IPv6。 PLAT将IPv4应答转换为IPv6数据包,并通过核心网络发送回手机。
- 步骤13. CLAT将IPv6返回给应用程序。 如果应用程序最初使用IPv4,设备上的CLAT将IPv6应答转换回IPv4,并通过虚拟接口将其交给应用程序。
- 步骤14. 应用程序接收到应答。 对应用程序而言,一切看起来像正常的IPv4交换。循环闭合。
花一秒钟感受这个构想的优雅。数据包四次改变协议身份,通过两个翻译器,而端点——应用程序和网站——毫不知情。每个端点只看到自己熟悉的IPv4世界。
这对代理意味着什么:输出地址从何而来
现在将所有理论应用于移动代理实践。这是那些处理流量的人最重要的部分。
输出地址从何而来
移动代理本质上是通过连接到运营商的真实移动设备或调制解调器进入网络的入口点。当你通过这样的代理路由流量时,它就像手机流量一样离开网络。
我们已经知道这个流量发生了什么。它经过464XLAT,到达PLAT,在那里被分配一个来自运营商池的公共IPv4地址。正是这个PLAT地址成为你的代理的输出地址。它不是诞生在设备上,也不是调制解调器上,而是在运营商网络核心的NAT64节点中。
这就是为什么移动输出通常是IPv4。设备本身生活在IPv6中,但流量离开到全球互联网(对于IPv4网站)的点是PLAT,它提供IPv4。
目标网站最终看到什么
目标网站看到运营商的公共IPv4地址。这是CGN或NAT64节点的地址,后面可能隐藏着许多用户。网站看不到设备的内部IPv6地址,也看不到CLAT接口的虚拟IPv4。只有PLAT的外部IPv4。
这是一个关键点。移动代理因其IPv4地址看起来像真实用户地址而受到重视——因为技术上确实如此。许多真实用户通过同一个PLAT共享同一个公共IPv4。从目标网站的角度来看,这样的地址与普通移动客户端没有区别。
什么时候网站可能看到IPv6
但输出地址并不总是IPv4。如果目标网站有真正的AAAA记录并具备完整的IPv6基础设施,设备将通过IPv6直接连接到它,绕过PLAT。在这种情况下,网站将看到运营商分配给用户的子网中的IPv6地址。
这就是为什么同一个移动代理可能向不同网站呈现不同类型的地址。对于没有IPv6的网站——通过NAT64的公共IPv4。对于有IPv6的网站——直接的真正IPv6。这不是故障,而是双栈系统的正常行为。
输出地址理解清单
- 设备在IPv6网络中——是的,大型运营商几乎总是这样
- 到IPv4网站的输出地址——运营商PLAT节点的公共IPv4
- 到IPv6网站的输出地址——用户子网中的真正IPv6
- 转换发生在哪里——网络核心的PLAT,而不是设备上
- IPv4网站看到什么——运营商共享的公共IPv4地址,由许多用户共享
双栈和happy eyeballs:为什么检测时而显示IPv4,时而显示IPv6
你可能遇到过这种情况:IP检测服务在重复请求时显示不同的地址——一会儿IPv4,一会儿IPv6。这令人困惑。我们来分析原因。
什么是双栈
双栈意味着设备同时拥有IPv4地址和IPv6地址,并且可以使用两种协议。在移动环境中,这通常通过IPv4v6 APN实现,或通过原生IPv6加上提供本地IPv4的CLAT的组合实现。
当客户端有两种协议可以选择时,问题来了:对特定连接使用哪一种?过去这很生硬,导致延迟。如果IPv6路径损坏,浏览器会等待超时,然后才回退到IPv4。用户忍受着缓慢的加载。
happy eyeballs算法
为了解决这个问题,人们发明了happy eyeballs算法,可以翻译为“快乐眼球”。其本质是不事先猜测哪种协议更好,而是让它们比赛。
大致工作原理如下:
- 客户端同时请求域名的A记录和AAAA记录
- 获得两种协议的地址后,它几乎并行地开始建立连接
- IPv6尝试通常领先几十或几百毫秒
- 如果IPv6连接快速建立,就使用它
- 如果IPv6缓慢或没有响应,客户端几乎立即切换到IPv4
- 比赛的赢家用于数据传输,失败的连接被关闭
该算法在IPv6工作良好时给予优先,但不会让其拖慢工作。因此得名——眼睛保持快乐,因为没有延迟。
为什么检测显示不同地址
现在清楚不稳定性从何而来了。当你打开IP检测服务时,会发生以下情况:
- 如果服务同时有A和AAAA记录,会触发happy eyeballs
- 根据特定时刻哪个连接赢得比赛,你会看到IPv4或IPv6
- 网络状况、负载、连接缓存——所有这些都影响比赛结果
- 在下一个请求时,比赛结果可能不同,地址变了
这不是代理错误或连接不稳定。这是双栈在happy eyeballs控制下的预期行为。如果你需要可预测的结果,必须强制固定协议版本——下一节会讲到。
实用洞察
许多人看到检测服务中跳变的地址就错误地认为移动代理不稳定。实际上这是现代网络的健康行为。如果你只想看到IPv4输出,请访问没有AAAA记录的服务,或在客户端强制使用IPv4。这样画面就会稳定。
实践:如何查看连接使用了哪种栈
没有实践的理论是死的。让我们配备具体命令,亲眼看看你的连接正在发生什么。所有工具都是标准的,大多数系统都可以使用。
查看接口地址
首先要做的是查看网络接口分配了什么地址。对于IPv6,使用命令:
- ip -6 addr——显示所有接口上的所有IPv6地址
- ip -4 addr——类似,针对IPv4
- ip addr——同时显示所有
注意地址类型。全局IPv6地址通常以2000::/3开头。链路本地地址以fe80开头,不可路由到外部。如果你看到全局IPv6,说明设备具有完整的IPv6连接。如果还在一个单独接口上看到私有IPv4,那很可能是CLAT接口。
通过ping测试可达性
使用ping检查特定协议是否工作:
- ping6 地址 或 ping -6 地址——检查IPv6连接
- ping -4 地址——检查IPv4连接
如果到全局节点的IPv6 ping成功,说明你有工作正常的IPv6连接。如果只有IPv4 ping成功,则IPv6要么未配置,要么不工作。
在curl中强制使用协议
诊断Web流量最强大的工具是带有强制协议选择键的curl:
- curl -4 地址——强制只使用IPv4
- curl -6 地址——强制只使用IPv6
- curl -v 地址——详细模式,显示实际连接到的地址
组合使用这些键,你可以准确知道远程站点看到什么地址。向返回你IP的服务发送带有-4的请求,你将看到纯IPv4输出。发送带有-6的请求,你将看到IPv6(如果可用)。这样你就隔离了happy eyeballs的影响,并看到每个协议的真实情况。
在仅IPv6的端点上测试
一个特别有价值的技巧是访问一个仅通过IPv6可用的服务,没有任何A记录。如果这样的连接能够建立,那么你肯定有原生IPv6连接,而不仅仅是转换。如果即使强制-6也连接不上,那么就没有真正的IPv6输出,你所有的IPv6活动都只限于NAT64前缀。
实际检测场景:
- 在仅IPv6端点上执行curl -6——测试原生IPv6连接
- 在IP检测服务上执行curl -4——通过PLAT查看输出IPv4
- 比较地址——如果IPv6输出来自用户子网,而IPv4来自运营商池,则说明存在完整的双栈并使用了464XLAT
如何判断是否存在NAT64前缀
要了解你的网络是否使用NAT64,可以查看合成的地址。请求一个肯定没有IPv6的域名的AAAA记录,然后看响应。如果返回的地址以64:ff9b开头,这是DNS64和NAT64工作的明确标志。一些系统具有内置的NAT64前缀检测机制,正是这样工作的:它们请求一个已知名称并查看响应的结构。
栈诊断清单
- ip -6 addr——是否有全局IPv6
- ip -4 addr——是否有IPv4,它是否是私有CLAT地址
- ping -6 到全局节点——IPv6连接是否工作
- curl -4 到IP检测服务——网站看到什么IPv4
- curl -6 到仅IPv6端点——是否有原生IPv6
- 对仅IPv4域名进行AAAA查询——是否看到64:ff9b前缀
兼容性:为什么/64子网被视为一个客户端
现在我们来讨论一个对所有从事多账户工作的人具有巨大实践意义的问题。即平台如何看待IPv6连接。
为什么某些平台对待IPv6更差
历史上,许多大型平台围绕IPv4构建了他们的反欺诈和地址信誉系统。积累的数据库、信誉评分、频率限制规则——一切都针对32位地址。IPv6出现较晚,并非所有系统都同样很好地适应了。
还有一个结构性原因。在IPv4中,每个地址都是稀缺资源,通常对应一个节点或一个NAT后的节点。在IPv6中,地址如此之多,以至于单个客户端可以在其子网内每小时轻松更换地址一千次。这打破了地址=客户端标识符的惯用逻辑。
因此,平台发展出对IPv6的特殊处理方法,理解这一点至关重要。
/64子网如何被解释
记住我们在基础部分说过的话:运营商为每个用户分配一个完整的/64子网。这是为一个设备准备的巨大数量地址。
聪明的信誉系统明白这一点。它们不会评估每个单独的IPv6地址,而是聚合整个/64子网并将其视为一个标识符。逻辑很简单:既然整个子网属于一个用户,那么应该把它当作一个客户端对待。
这意味着,对于这些平台,在一个/64子网内更换IPv6地址并不会创建新的标识符。你可以随意搅动地址的最后几位,但从平台的角度看,它仍然是同一个客户端,因为/64前缀没有改变。
这对多账户工作意味着什么
因此得出一个重要的实践结论。如果你试图通过在一个/64子网内使用不同的IPv6地址来分离账户,对于先进的平台,它们看起来仍是一个客户端。不同的地址不会提供分离,如果公共前缀相同。
与通过NAT64的IPv4行为比较。PLAT节点的公共IPv4由运营商的不同用户共享。从平台的角度看,一个IPv4后面可能站着几十个真实的人。这给出了完全不同的流量混合画面。
多账户的关键结论:
- 在一个/64子网内更改IPv6最后几位不会改变聪明平台的标识符
- IPv6的有效单位是/64前缀,而不是单个地址
- 分离应该发生在不同的/64子网级别,而不是子网内的地址
- 通过NAT64的IPv4将你与运营商的其他用户混合,提供了不同的信誉动态
- 始终了解你实际使用哪个协议与特定平台连接
控制协议的实用建议
考虑到所有这些,明智的做法是控制你的连接与目标平台使用的协议。如果你确切知道需要通过移动运营商使用IPv4输出,请在客户端强制使用IPv4。那么你保证会得到PLAT的共享公共IPv4地址,而不是绑定到你的设备的IPv6子网。
移动网络中IPv6的常见错误
现在我们把最常见的误解和错误汇总在一处。仔细研究它们——每一个都可能导致工作失败或得出错误结论。
错误一:认为手机上的IPv6地址意味着IPv6输出
许多人在接口上看到全局IPv6,就断定所有流量都通过IPv6。但实际到IPv4网站的流量仍然在PLAT上被转换为IPv4。设备上的IPv6是运营商网络内的传输层,并不保证到特定网站有IPv6输出。
错误二:混淆输出地址和接口地址
设备网络接口上的地址和网站看到的地址是两回事。它们之间隔着带有转换和NAT的CLAT和PLAT。永远不要根据ip addr显示的内容来判断输出地址。始终通过真实的外部服务进行验证。
错误三:因检测中地址跳变而恐慌
我们已经解析了happy eyeballs使双栈时而显示IPv4时而显示IPv6。这是正常的。不要把它当作代理故障的标志。如果需要稳定性,请强制使用协议。
错误四:认为在/64内更改IPv6会提供新标识符
这是多账户中代价最高的错误之一。聪明的平台会聚合整个/64。更改地址的最后几位对账户分离毫无意义。有效单位是前缀。
错误五:忽略APN类型
APN类型——IPv4、IPv6或IPv4v6——直接决定流量如何处理。不了解正在使用的类型,你就是在盲目工作。始终查明会话配置。
错误六:只测试一种协议
只测试IPv4或只测试IPv6会得到不完整的画面。真正的诊断需要使用-4和-6键分别测试两种协议,并访问仅IPv6端点。
错误七:把NAT64前缀当成真正的IPv6网站
带有64:ff9b前缀的合成地址看起来像IPv6,但它背后是IPv4服务器。如果你通过这样的地址连接,你实际上是通过NAT64到达IPv4服务器,而不是与真正的IPv6节点通信。不要根据合成地址判断网站是否支持原生IPv6。
错误八:认为CLAT和PLAT是同一回事
CLAT生活在设备上,为应用程序执行无状态转换。PLAT生活在运营商网络中,执行有状态NAT转换。它们是不同的组件,有不同的任务。混淆它们会妨碍你理解输出地址究竟从何而来。
处理协议栈的工具和资源
我们收集一套工具,帮助你诊断和理解移动环境中的网络栈。它们都是标准的,不需要稀奇古怪的东西。
命令行
- ip addr 及其变体 ip -4 addr, ip -6 addr——查看接口地址的基本工具
- ping 和 ping6——按特定协议测试连通性
- curl 带 -4 和 -6 键——诊断Web连接和检查输出地址的主要工具
- traceroute 和 traceroute6——路由追踪,有助于看到流量经过哪些节点
- dig 和 nslookup——DNS查询,检查A和AAAA记录,检测合成地址
- ip route——查看两种协议的路由表
在线检测服务
- 外部IP检测服务——显示远程站点看到什么
- 仅IPv6测试端点——检查原生IPv6连接
- 分别显示IPv4和IPv6的服务——帮助看到双栈
- 域名IPv6支持检查工具——显示是否存在AAAA记录
DNS诊断
DNS查询有助于了解DNS64是否在工作。向一个没有IPv6的域名请求AAAA记录,并查看响应的结构。如果出现64:ff9b前缀,就暴露了合成的工作。这是确认网络中是否存在NAT64机制的最直接方法。
系统栈诊断框架
我建议在初次接触任何移动网络时执行以下逐步框架:
- 地址盘点。 执行ip addr,确定是否存在全局IPv6以及IPv4的性质
- 识别CLAT。 找到带有私有IPv4的虚拟接口——这是464XLAT的标志
- 检查NAT64。 向仅IPv4域名请求AAAA,寻找64:ff9b前缀
- 测试原生IPv6。 curl -6 到仅IPv6端点
- 确定输出IPv4。 curl -4 到IP检测服务
- 确定输出IPv6。 curl -6 到支持IPv6的服务
- 分析双栈行为。 不强制协议的普通请求,观察happy eyeballs
完成这七个步骤后,你将获得一幅完整的画面:网络拥有哪种连接性,转换是否工作,不同类别的网站看到什么地址,以及双栈如何表现。这是你的标准审计。
案例与结果:真实场景分析
抽象机制在具体例子中更容易吸收。我们来分析几个典型的实战场景。
案例一:日志中网站看到许多客户端共享同一个IPv4
情景。分析师查看网站日志,注意到来自同一个IPv4地址的不同用户行为模式差异很大。第一反应——这可能是代理或僵尸网络。
分析。实际上,这是大型移动运营商NAT64或CGN节点的典型公共IPv4。这样一个地址背后确实站着数十乃至数百个真实用户。他们的流量通过同一个PLAT流出。这不是异常,而是在IPv4短缺条件下464XLAT的正常工作。
结论。仅凭IPv4地址评估移动客户端是低效的。在移动环境中,一个地址不等于一个用户。正是这个特点使得移动IPv4地址如此独特——大量真实用户共享一个地址。
案例二:检测服务的非确定性响应
情景。移动代理的运营商抱怨IP检测服务时而显示IPv4时而显示IPv6,并得出代理不稳定的结论。
分析。检测服务同时有A和AAAA记录。客户端运行在双栈上。每次请求触发happy eyeballs,根据比赛结果返回不同类型的地址。代理绝对稳定地工作,变化的只是算法选择的协议。
解决方案。通过curl -4或相应的客户端设置强制使用协议。固定IPv4后,地址变得可预测。不稳定的问题原来是虚假的。
}
案例三:尽管使用不同的IPv6,账户仍然关联
情景。通过IPv6进行多账户工作,每个账户分配一个独立的IPv6地址。但平台仍将这些账户关联起来。
分析。所有分配的地址都位于运营商分配给设备的同一个/64子网内。先进的信誉系统聚合了整个/64,并将其视为一个标识符。同一个前缀内的不同地址没有提供任何分离。
结论。对于IPv6,有效单位是/64前缀,而不是单个地址。分离需要不同的前缀。在这种情况下,更合理的做法是通过NAT64的IPv4输出来工作,因为流量与运营商的其他用户混合。
案例四:一个不支持IPv6的应用程序
情景。一个旧应用程序直接访问IPv4地址字面量,在纯IPv6网络中理应崩溃。但它却能工作。
分析。设备上运行着CLAT。应用程序向虚拟接口发送IPv4数据包,CLAT将其转换为IPv6,然后数据包通过PLAT进入IPv4互联网。应用程序生活在完整IPv4的幻象中,不知道转换的存在。这正是CLAT存在的意义。
结论。464XLAT透明地提供了与旧版应用程序的兼容性。正因如此,运营商向IPv6的迁移没有破坏IPv4软件生态系统。
常见问题解答
为什么我的手机显示IPv6,而网站日志记录的是IPv4?
因为偷梁换柱发生在运营商网络核心的PLAT节点。设备通过IPv6发送流量,但在到达IPv4网站时,NAT64节点将数据包转换为IPv4并替换为运营商的公共地址。网站看到的是这个输出IPv4,而不是设备的内部IPv6。
什么是64:ff9b前缀,它从哪里来?
这是一个标准化的NAT64转换众所周之前缀。DNS64使用它从没有AAAA记录的网站的IPv4地址合成人工IPv6地址。这样的地址的最后32位包含真实的IPv4,PLAT在转换时将其提取出来。
CLAT和PLAT有什么区别?
CLAT工作在设备上,为需要IPv4的应用程序执行从IPv4到IPv6的无状态转换。PLAT工作在运营商网络中,执行从IPv6到IPv4的有状态NAT转换,并分配公共地址。CLAT解决设备上的兼容性,PLAT解决与IPv4互联网的兼容性。
为什么IP检测服务在刷新时显示不同的地址?
由于双栈环境中的happy eyeballs算法。如果检测服务同时可通过IPv4和IPv6访问,客户端会引发连接比赛,不同时刻不同协议获胜。这是正常行为,而不是故障。为获得稳定结果,请使用键强制使用协议。
如何知道我是否有真正的IPv6输出而不仅仅是NAT64?
使用curl -6访问仅通过IPv6可用的端点。如果连接成功,你就有原生IPv6连接。如果即使强制-6也连接不上,那就没有真正的IPv6输出,你所有的IPv6活动都只涉及合成的NAT64前缀。
为什么更改IPv6地址不能帮助分离账户?
因为运营商为设备分配整个/64子网,先进的平台将整个子网聚合为一个标识符。更改地址的最后几位并不会改变前缀,因此对平台来说仍然是同一个客户端。有效单位是/64,而不是单个地址。
为什么移动代理通常输出IPv4而不是IPv6?
因为大多数目标网站没有IPv6基础设施,流量经过NAT64。PLAT节点将数据包转换为IPv4并分配运营商的公共地址。这个地址成为输出地址。对于有真正AAAA记录的网站,代理也可以直接通过IPv6输出。
如何强制客户端使用特定的协议版本?
在curl级别,使用-4键用于IPv4,-6键用于IPv6。许多应用程序和库也有类似的协议偏好设置。还可以通过系统地址策略优先级设置来控制。这会关闭happy eyeballs的非确定性,提供可预测的输出。
通过移动网络连接时,目标网站看到什么?
如果网站只有IPv4,它看到运营商NAT64节点的公共IPv4地址,由许多用户共享。如果网站有真正的IPv6,它看到分配给用户的子网中的IPv6地址。设备内部地址和虚拟CLAT地址网站永远不会看到。
APN类型是否影响网站看到的地址?
间接影响。APN类型决定设备可用的协议。对于IPv4v6或带CLAT的纯IPv6,上述转换机制都起作用。对于纯IPv4 APN,不需要转换,但大型运营商很少使用这种方案,因为地址短缺。
结论:移动网络中IPv6机制的要点
我们走了很长的路。从一个谜题开始——手机是IPv6,网站看到IPv4——现在完全解开了它。让我们巩固关键要点。
第一也是最重要的。IPv4地址短缺迫使运营商转向IPv6。设备生活在IPv6环境中,通常在无线电接口上没有公共IPv4。与旧IPv4互联网的兼容性由464XLAT技术提供。
第二。464XLAT由两个翻译器组成。设备上的CLAT将应用程序的IPv4流量转换为IPv6。运营商网络中的PLAT将IPv6转换回IPv4并分配公共地址。正是在PLAT中生成了网站看到的输出IPv4地址。
第三。NAT64和DNS64成对工作。DNS64使用64:ff9b前缀从没有AAAA记录的网站的IPv4地址合成IPv6地址。以PLAT为代表的NAT64将这些地址的数据包投递到真正的IPv4服务器。它们共同使整个IPv4互联网对纯IPv6设备可用。
第四。双栈和happy eyeballs解释了为什么检测时而显示一种协议时而显示另一种。客户端发起连接比赛,选择赢家。为了稳定性,使用-4或-6键强制协议。
第五。对于多账户,至关重要的是理解:/64子网被聪明平台视为一个客户端。在一个/64内更改地址对于分离毫无用处。通过NAT64的IPv4反而将你与运营商的其他用户混合。
下一步是什么?养成在新移动网络中按照我们的七步框架进行系统栈诊断的习惯。掌握带-4和-6键的curl作为主要工具。始终通过真实的外部服务验证输出地址,而不是通过设备接口。并记住设备所在之处与流量实际离开网络之处之间的区别。
理解这套机制将你从一个对跳变地址感到困惑的用户,转变为一个确切知道每个数据包发生什么事的工程师。而知识,众所周知,就是控制。让本文成为你了解移动网络中IPv6机制的桌面速查手册。每当你遇到下一个网络谜题时,回来查阅——它将不再是谜题。