你路由器上的 IPv6
本页简要介绍路由器(网关)上 IPv6 地址的获取和路由。
IPv6 地址类型
IPv6 有几种不同用途的地址。
| 类型 | 前缀 | 范围 | 用途 |
|---|---|---|---|
链路本地地址(LLA) | fe80::/10 | 同一链路(广播域) | 邻居发现、自动配置、局域网通信 |
全球单播地址(GUA) | 2000::/3 | 整个互联网 | 与互联网上的其他主机通信 |
唯一本地地址(ULA) | fc00::/7 | 本地网络内 | 本地网络内通信,不出公网 |
一个网络接口上会同时存在多个地址——比如至少有一个链路本地地址自动生成,再叠加运营商分配的一个或多个全球单播地址。
一个网络内如何自动分配 IPv6 地址
在同一个广播域里,网络主机从链路接入到获得 IPv6 全球单播地址通常会经历如下过程。
生成链路本地地址:网络接口一旦处于活动状态,主机将自动生成一个
fe80::开头的链路本地地址,通常使用EUI-64算法生成,也可以由用户手动指定或其他算法生成。此时网络主机就已成为链路本地网络中的一部分,可以进行基于 IPv6 的通信。邻居发现与路由器请求:邻居发现协议(
NDP)是一种基于ICMPv6的协议。主机通过向网络内广播发送路由请求(RS)报文来询问网络内是否存在路由器,路由器收到后会回复路由通告(RA)报文来声明自己的路由器身份,并携带所在网络的相关信息。根据路由通告报文决定后续行为:路由通告报文通常会包含网络前缀信息和一些标志位(开关),不同的标志位有不同的效果。
A(Autonomous):自行用前缀生成地址M(Managed):向DHCPv6服务端索取地址O(Other):向DHCPv6服务端索取其他配置(如 DNS)
这三个标志位可以组合使用。
- 只有
A:主机将仅进行无状态地址自动配置(SLAAC),不会发起DHCPv6。即,自行生成后缀与报文携带的前缀拼接形成 IPv6 地址并配置,通常要求前缀和后缀都是 64 位。 - 只有
M:主机将仅进行DHCPv6进行地址配置,不会进行SLAAC。 A+O:使用SLAAC进行地址配置,并且使用DHCPv6获取其他配置。
路由通告报文本身也可以携带网关地址和 DNS 等信息,所以理论上只靠路由通告就能为网络内的所有主机自动配置好 IPv6 网络。
TIP
大多数场景下,你只需要配置路由通告,不需要配置 DHCPv6。本文撰写时 Android 系统仍不支持 DHCPv6。
原生模式
家庭宽带路由器是个边界设备,一边是运营商网络(WAN),一边是局域网(LAN)。
IPv4 下,运营商只会给路由器分配一个地址,路由器做 NAT 让所有局域网终端共享这个地址出去。
IPv6 下,运营商除了会给路由器分配一个宽带接入网地址,还允许路由器通过 DHCPv6 前缀委派(PD)获取一个前缀,前缀长度通常是 60 或者更小。路由器拿到前缀后,切成 64 位长度的前缀分配给各个局域网子网,终端在这个子网里靠上述的流程(或者手动配置)获得自己的全球单播地址。
这意味着:
- 路由器的 WAN 口和 LAN 口上的全球单播地址前缀是不一样的(因为分别属于两个网络)
- 运营商的
DHCPv6服务器决定了你拿到什么前缀 - 运营商的路由器会将属于你申请到的前缀的数据包都路由到你的路由器上
- 每个终端都能拿到全球可达的全球单播地址,直接成为互联网的一部分,不再躲在一个地址后面
此时路由器的角色就是一个再普通、再正常不过的 IP 路由器,根据 IP 地址决定转发目的地,不做地址转换。有人称这种工作模式为原生模式(Native)。
非原生模式
原生模式有一个很苛刻的条件,就是路由器必须能够通过 DHCPv6 前缀委派申请到额外的可路由前缀,用于分配给局域网。这种条件通常只在你直接与运营商连接时才能满足,在校园网等环境里通常不满足。为了能够让局域网终端访问到 IPv6 互联网,还有一些别的变通方法。
- 桥 / Passthrough 模式:通过邻居发现代理(ND Proxy) 或选择性二层桥接,让 LAN 口侧的 IPv6 网络在逻辑或物理上连通 WAN 口侧的 IPv6 网络,就好像 LAN 口下的终端直接连接到了 WAN 口所处网络。
- NAT 模式:和 IPv4 NAT 网关路由类似,局域网终端没有全球单播地址,而是通过路由器分配的唯一本地地址以路由器为 NAT 网关访问外部 IPv6 网络,通常意义不大。