初识 IPv6

陪她去流浪 桃子 2023年03月20日 阅读次数:1751

因为最近自己在做智能家居设备,想要在手机上也可以控制家里设备(这次终于不是以要装监控为理由了)。 于是借机想要一个公网 IPv4 地址,打电话给中国电信(广东深圳)申请。 客服小姐姐告诉我:

  • 由于 IPv4 枯竭的问题,已经不能再申请“免费”的 IPv4 了。
  • 那怎么办呢?
  • 免费的没有,但是付费的是有的,就是有点小贵,100¥/月。
  • 可是我是‘高贵的’‘千兆’‘光纤’用户啊
  • 那也不行。
  • 那怎么办呢?
  • 你也可以试试 IPv6,现在中国电信已经默认为所有用户开启了 IPv6 支持。
  • ……

我原本非常信以为真地认为中国的运营商不给公网 IPv4 的目的是为了禁止普通用户对外提供服务。 可是仔细一下,人家也只是禁用了 80/443 端口,用其它端口提供服务也是可以的。 听她再这么一说,感觉真的是 IPv4 地址不够用了。可是在中国相当体量的用户都是给分配的内网 IPv4 地址啊。增长并不明显的。 算了,不纠结了。决定体验一下 IPv6,这个很多年都未真正普及的技术,这个我说了很多年都没有研究的技术。

出现的主要目的

我不太想谈 IPv6 技术的具体设计细节,我只想站在从使用者的角度来简要介绍一下。不一定全对。

众所周知,IPv4 是 32 位(4 字节),共有 $2^{32}$,也就是 42 亿个地址。 而 IPv6 是 128 位(16 字节),共有 $2^{128}$,也就是 $3.4×10^{38}$,也就是 $340,282,366,920,938,463,463,374,607,431,768,211,456$ 个。 对于 IPv4 地址,按照全球人口 50 亿、每人一台设备算,就已经远远不够用了,更别提一人多台设备,特别是物联网时代。 而如果是 IPv6,曾有人说道,能给地球上的每一粒沙子都分配一个唯一的 IPv6 地址,反正就是,真的用不完。

Like IPv4, IPv6 supports globally unique IP addresses. The design of IPv6 intended to re-emphasize the end-to-end principle of network design that was originally conceived during the establishment of the early Internet by rendering network address translation obsolete. Therefore, every device on the network is globally addressable directly from any other device.

In IPv6, the address space is deemed large enough for the foreseeable future, and a local area subnet always uses 64 bits for the host portion of the address, designated as the interface identifier, while the most-significant 64 bits are used as the routing prefix.

上面这两句话很能说明目的:保证互联网上的设备都可以端到端地直接访问,在可预见的未来,足够用了。

数量足够多,解决了不够用的问题,也因此不再需要因为不够用而引入很多复杂的技术,比如 NAT。见下一节。

为什么 IPv6 地址是全球唯一、可直接访问的?

首先说说 IPv4,通常来说,为了缓解 IPv4 枯竭的问题,引入了 NAT 技术。 按照绝大多数家庭用户的网络结构简单地说就是:运营商分配的公网 IPv4 地址给了路由器,路由器提供 LAN(局域网功能)+ DHCP(动态主机配置协议,为接入设备自动分配可用的 IPv4 内网地址)。 公网 IPv4 地址唯一,但是路由器分配的内网地址是固定范围段的、共享的。所有只能保证 公网 IPv4 地址 + 内网 IPv4 地址,才能确定到一台真实的设备(外加端口)。

如果在代码中发起对公网 IPv4 的连接,这是连接的路由器,没法连接到内网设备的服务。所以此时需要“端口转发”:把路由器的某个端口映射到内网的某 IPv4 地址的端口上。 端口转发是需要手动操作的,默认是没有。所以这就阻断了公网对内网的访问,所谓的“需要内网穿透”。

IPv4 地址大家都知道是由两部分组成的:subnet + host。比如 1.2.3.4 这样一个 IPv4 地址(假设子网掩码是 255.255.255.0), 那么这个 IPv4 地址的网段地址(subnet)是 1.2.3.0/24,包含 1.2.3.0~1.2.3.255 的主机地址。 运营商通常是自己购买一个网段,然后分配其中一个主机地址给用户。一个家庭一个主机地址(即公网 IPv4 地址),所以路由器后面的设备(手机、电脑),只有内网私有地址可用(通常是 192 或者 10 打头)。

IPv6 不一样,虽然 IPv6 也分 subnet + host,在不至于引起误会的情况下,可以认为 IPv6 是 subnet + subsubnet + host 组成的。 运营商购买 subnet,分配给我们 subsubnet,我们的路由器再分配 host 给设备。简单说就是,运营商分配给我们的是一个网段的范围。具体的 host 我们自己去分配。 由于 host 属于 IPv6 地址的一部分,并不是路由器分配的私有地址。所以对外来说,这就是唯一的。 外界的路由器只需要知道把属于这个(subnet + subsubnet)的地址路由给我们的路由器就行,由我们自己的路由器再路由给我们的 host 设备。 所有这之间都只有 IPv6 地址,没有地址的翻译,不存在不可访问的内网地址一说。

运营商分配的那一部分(即 subnet + subsubnet),有个术语,叫“Routing Prefix”,中文意思大概是“路由前缀”。比如下面这个真实的 IPv6 地址:

$ ifconfig br0
br0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.1.201  netmask 255.255.255.0  broadcast 192.168.1.255
        inet6 fe80::10dd:27ff:fe69:9466  prefixlen 64  scopeid 0x20<link>
        inet6 240e:3b7:3244:82b0:1e69:7aff:fe6d:272e  prefixlen 64  scopeid 0x0<global>
        ether 1c:69:7a:6d:27:2e  txqueuelen 1000  (Ethernet)
        ...

这里的路由前缀长度是 64 位,即运营商分配了 IPv6 地址中的前 64 位(240e:3b7:3244:82b0),它通过这前 64 位地址确定是哪个用户。 后面的 64 位用户自己分配(1e69:7aff:fe6d:272e)。IPv6 地址通常是成对的,一个是 global(全球唯一,公网),一个 link local(本地链路用的)。 公网 IPv6 地址前面部分比较固定

  • 中国电信(240e::/20
  • 中国移动(2409:8000::/20
  • 中国联通(2408:8000::/20

内网那个地址也比较固定,通常是 FE80::/10 打头:

All interfaces of IPv6 hosts require a link-local address, which have the prefix fe80::/10. This prefix is combined with a 64-bit suffix, which the host can compute and assign by itself without the presence or cooperation of an external network component like a DHCP server, in a process called link-local address autoconfiguration.[citation needed]

The lower 64 bits of the link-local address (the suffix) were originally derived from the MAC address of the underlying network interface card. As this method of assigning addresses would cause undesirable address changes when faulty network cards were replaced, and as it also suffered from a number of security and privacy issues, RFC 8064 has replaced the original MAC-based method with the hash-based method specified in RFC 7217.[citation needed]

总共 128 位,运营商 64 位,用户 64 位。是不是没那么够用了?也够用,$2^{64} / 50亿 ≈ 37 亿$。你有 37 亿台设备吗?显然没有。 另外,64 位的前缀长度也不是固定的。其实我觉得前缀长度长一点更好。

IPv4 和 IPv6 不能互通

从设计上,IPv4 和 IPv6 这两个 IP 协议的版本是不兼容的,更不能相互通信。 也即是说 IPv4 地址只能和 IPv4 地址通信;IPv6 地址只能和 IPv6 地址通信。 只有通信的双方需要使用相同版本的地址。

完全不兼容的两个协议推广起来肯定有难度,所以也有 IPv6 in IPv4 之类的 wrapper 协议(6to4,6in4)。这里不深究。

运营商分配的 IPv6 地址通常不是固定的

路由器每一次拨号后获得的 IPv6 地址都可能会变化,所以需要动态 DNS 技术。 可以打电话给运营商固定。有好有坏。以下来自 ChatGPT:

  • ISP(运营商)提供的IPv6是静态好还是动态好?

  • ISP 提供的 IPv6 地址可以是静态的或动态的,取决于 ISP 提供的服务和客户需要。下面是这两种方式的一些特点:

    静态 IPv6 地址:是指 ISP 分配给客户的 IPv6 地址是固定不变的,客户可以使用相同的 IPv6 地址长期不变。静态 IPv6 地址的优点是方便管理和维护,特别是对于需要远程访问设备、需要搭建服务器等需要静态 IP 的情况。缺点是如果 IPv6 地址遭到黑客攻击,攻击者可能通过这些恒定的地址追踪并攻击客户设备,因此客户需要进行额外的安全防护。

    动态 IPv6 地址:是指 ISP 分配给客户的 IPv6 地址是动态变化的,客户每次上线时都会分配一个不同的 IPv6 地址。动态 IPv6 地址的优点是安全性高,不容易被攻击和追踪。缺点是如果客户需要远程访问设备、搭建服务器等需要静态 IP 的情况,则需要额外的配置和操作。

    综上所述,静态 IPv6 地址和动态 IPv6 地址都有其适用的场景,取决于客户需要的具体业务场景,如果客户需要长期管理和维护,那么静态 IP 可能更为适合。如果客户需要更高的安全性,则动态 IP 更合适。

路由器的 IPv6 可能默认是关闭的

如果是采用 PPPoE 宽带账号拨号的用户,可以在路由器设置里面把 IPv6 打开。

  • 联机类型选择:Native
  • 接口:PPP
  • DHCP-PD:启用
  • Accept Default Route:启用

保存(并重启),应该可以在 IPv6 状态页面看到已经分配了 IPv6 地址。

防火墙默认是打开的

前面提到,家庭内的任何设备都有公网 IPv6 地址,相当于是“裸奔”在互联网上(虽然 IPv4 + NAT 挺不优雅,但是作为一个副作用,它解决了安全问题),所以防火墙是有必要打开的。

来自华硕路由器的关于“IPv6 防火墙”的说明:允许来自局域网中 IPv6 主机的所有传出流量及相关的传入流量。任何其他传入流量必须得到特别允许。

防火墙就是配置一下外部的 IPv6 地址可以访问哪些我们本地的 IPv6 地址端口。可以按需设置。

取决于不同的路由器,支持的能力不一样。比如我的华硕 RT-AC68U 就不支持按前缀或者后缀过设置规则。以至于我直接改路由器的 iptables,而不使用它的页面配置功能。

网卡的 IPv6 地址可能不止一个

这里说的是 IPv6 公网地址可能有多个的情况,但是又不是都可以用。这种情况多出现在路由器重启后。原因暂时未知。 我本想通过枚举网卡地址来获取我的 IPv6 地址,发现这样不靠谱。还是访问一个外部服务来告诉我比较可靠:比如:curl -6 ifconfig.co

结语

IPv6 使用起来比我预期的要简单很多,体验也确实好了很多:

  • 不需要申请就有公网地址
  • 不需要再买一个腾讯云/阿里云的公网机器作为内网穿透机器
    • 省了一大笔钱
    • 增加了大量带宽和流量
  • 不需要再配置端口转发
  • 接近无限个可用的公网 IPv6 地址可自由分配
  • ...

这篇文章是我对 IPv6 的最初印象。后续紧接着我会再写一篇关于我的最新的家庭网络拓扑情况的文章。

这篇文章的内容已被作者标记为“过时”/“需要更新”/“不具参考意义”。

标签:IPv6 · ChatGPT