IPv4 的 IPv6 表示法

IPv4 地址在 IPv6 中的四种写法——以及为什么它们都不是“你的 IPv6 地址”。

试试 8.8.8.8、192.168.1.1 或 127.0.0.1。

IPv4 地址并不存在对应的 IPv6 地址。 IPv6 地址由您的服务提供商分配,而不是从您已有的地址推导出来。下面是四种嵌入了 IPv4 地址的不同写法,各有各的用途 —— 没有一种可以写进 DNS 记录并指望它生效。

IPv4 映射地址

现行

::ffff:203.0.113.5

双栈套接字就是这样把一个 IPv4 对端呈现给纯 IPv6 应用的。在双栈机器的服务器日志里会看到它们 —— 写作 ::ffff:203.0.113.5 的一条记录是普通的 IPv4 连接,而不是 IPv6 连接。也写作 ::ffff:cb00:7105。

IPv4 兼容地址

已废弃

::203.0.113.5

早期的过渡机制,2006 年被 RFC 4291 废弃,现已无人实现。列在这里是因为它仍会出现在旧文档和配置文件中 —— 在那里应当把它当作缺陷,而不是照抄。

6to4 前缀

已废弃

2002:cb00:7105::/48

一种自动隧道,能让任何拥有公网 IPv4 地址的主机获得一个 /48 的 IPv6 空间。RFC 7526 已将其废弃 —— 它依赖公共中继,而中继质量无人保证,产生的连接一旦出问题,用户根本无从排查。

NAT64/知名前缀

仅在 NAT64 网络内部有效

64:ff9b::203.0.113.5

纯 IPv6 客户端就是这样经由 NAT64 网关访问纯 IPv4 服务器的。这一机制真实且仍在使用,但只有在部署了网关的网络内部才有意义 —— 在开放互联网上,这个地址什么也不代表。

地址本身

点分十进制
203.0.113.5
十六进制
0xCB007105
32 位整数
3,405,803,781
二进制
11001011.00000000.01110001.00000101

文档示例TEST-NET(RFC 5737)—— 保留给举例使用。公开发布无妨,永远不会被路由。

这个前提通常是错的,而这没关系

大多数搜索「IPv4 转 IPv6 转换器」的人,想找的是一样并不存在的东西:一个函数,输入你手上的地址,输出你该用的 IPv6 地址。没有这样的函数。IPv6 地址是分配来的——你的 ISP 或主机商从分给他们的地址块里划一块给你——而不是从你已经拥有的某个 IPv4 地址算出来的。

真正存在的,是若干把 IPv4 地址嵌进 IPv6 语法的记法,每一种都是为某个特定用途发明的。分清它们确实有用,因为你会在日志和配置文件里碰到它们。但把其中任何一种当成「你的 IPv6 地址」,就不对了。

你实际会见到的那一种

::ffff:203.0.113.5——IPv4 映射形式——几乎占了现实中所有的出现场合。当一个程序在 IPv6 套接字上监听、而一个 IPv4 客户端连了进来时,它就会出现:操作系统以这种形式把对端呈现给应用,好让应用只需处理一种地址类型。

实际后果会在两个地方咬人。期待点分四段格式的日志分析匹配不到这些行。而一个按字符串比对的白名单,会无法把 ::ffff:203.0.113.5203.0.113.5 对上——一条看起来没问题、评审也过得去、却从来不会生效的规则。比对之前先做归一化。

另外几种是什么

IPv4 兼容格式::203.0.113.5)是早期的一个过渡设想,2006 年被 RFC 4291 废弃,现在没有任何东西实现它。如果你在配置文件里发现一个,那是 bug,不是选择。

6to42002::/16)让任何拥有公网 IPv4 地址的人自动获得一个 /48 的 IPv6 空间,经由公共中继隧道传输。2015 年被 RFC 7526 废弃——那些中继没有可问责的运营者,而它造成的故障是最糟的那一类:时好时坏、缓慢,而且用户根本无从诊断。

NAT6464:ff9b::/96)是现行方案,而且天天在用。移动运营商尤其会运行纯 IPv6 网络并在边缘做转换,于是一台只有 IPv6 的手机就能这样访问只有 IPv4 的服务。它是真实存在的,但它是你所处的那个网络的一项属性,而不是一个你能拿出去给别人的地址。

为什么这两种协议不能直接对话

考虑到这场过渡已经三十年,这是个合理的问题。答案是:IPv6 并不是「地址更长的 IPv4」——它是另一种协议,有另一套报文头,一台处理其中一种的路由器根本无从转发另一种的报文。IPv4 的报文头里,压根没有地方放得下一个 128 位的地址。

所以两者之间的每一条路径,中间都得有点什么:一台同时跑两种协议的双栈主机,一个像 NAT64 这样的转换器,或者一个终结一条连接、再发起另一条的代理。这就是过渡如此缓慢的全部原因,也是为什么「我该怎么支持 IPv6?」的实际答案几乎总是「跑双栈」,而不是「转换点什么」。

相关

想知道你实际是通过哪种协议连上互联网的,IP 查询工具会报告你这条连接所用的地址族。至于给你手上的地址做子网划分,子网计算器覆盖了 IPv4 那一侧。

这个页面要回答的问题

我的 IPv4 地址对应的 IPv6 地址是什么?

没有这样一个地址,而这是本页最重要的一句话。IPv6 地址由为你提供连接的一方分配——它来自你的 ISP 或主机商,出自分配给他们的地址块。你无法从自己已有的 IPv4 地址推导出一个 IPv6 地址,就像你没法从一个邮寄地址推导出一个电话号码。这里的这些记法所做的,是为了特定的技术用途把一个 IPv4 地址嵌进 IPv6 的语法里,那是另一回事。

为什么我的服务器日志里出现 ::ffff:203.0.113.5?

因为套接字在 IPv6 上监听,而连接是通过 IPv4 来的。双栈套接字会以这种「IPv4 映射」形式把 IPv4 对端呈现给应用,好让代码只需处理一种地址类型。它就是一条普通的 IPv4 连接。如果你在解析日志或拿地址去比对白名单,请先去掉 ::ffff: 前缀——把它当成一个不同的地址,是规则悄无声息匹配失败的常见原因。

我应该使用 6to4 地址吗?

不应该。6to4 是一种自动隧道机制,它通过 2002::/16 前缀,让任何拥有公网 IPv4 地址的主机获得一个 /48 的 IPv6 空间。RFC 7526 已于 2015 年正式将其废弃,因为它依赖无人负责的公共中继路由器,产生的连接要么慢,要么以用户无法诊断的方式坏掉。如果你需要 IPv6,请向你的服务商索取,或者使用一家有明确责任主体的隧道代理商。

64:ff9b:: 是干什么的?

它是 NAT64 的知名前缀,定义在 RFC 6052 中。一个仅有 IPv6 的客户端若要访问仅有 IPv4 的服务器,就把数据发往 64:ff9b::,并把那个 IPv4 地址嵌在最后三十二位里;路径上的 NAT64 网关负责转换。它是现行方案,部署也很广泛——最典型的就是运行纯 IPv6 网络的移动运营商。不过它只在一个部署了这类网关的网络内部才有意义;这个地址在公共互联网上是不可路由的。

IPv4 和 IPv6 主机之间能直接通信吗?

不能。它们是两种独立的协议,报文格式不同,彼此没有直接互通——这正是这场过渡拖了三十年的原因。两者之间的通信总得在中间放点什么:一台同时会说两种协议的双栈主机,一个像 NAT64 这样的转换器,或者一个终结一端、再从另一端发起的代理。这也是为什么「把地址转换一下就行了」根本解决不了任何问题。

最后审校于 。发现有内容过时了? 告诉我们.