IPv6 地址

  • Unicast地址:48bit routing prefix + 16bit or fewer subnet id + 64bit interface identifier
  • Link local 地址:10bit prefix + 54bit zeros + 64bit interface identifier (前面 64bit 固定为 FE80:0:0:0)
  • Multicast 地址:8bit prefix + 4bit flag + 4 bit scope + 112bit group ID
IPv4 address IPv6 address
Multicast 224.0.0.0/4 Multicast FF00::/8
Unspecified address 0.0.0.0 Unspecified address ::
Loopback 127.0.0.1 Loopback ::1
Public IP address Global unicast address: 2000::/3 (2000::/16 ~ 3FFFF::/16 一共 8192 个前缀)
Private IP address 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16, 100.64.0.0/10 Unique local address: FC00::/7 (FC00:/8 ~ FD00::/8)
Automatic Private IP Address(APIPA) 169.254.0.0/16 Link local address: FE80::/10

IPv6 重要协议

  • 链路层

    • ARP -> NDP(Neighbor Discovery Protocol) -> SEND(SEcure Neighbor Discovery)

      • ARP 直接在 Ethernet 上,但 NDP 其实是利用 ICMPv6,所以数据包封装关系为 Ethernet -> IPv6 -> ICMPv6。

      • 严格来说 ARP 相当于 NDP 定义的 ICMPv6 Neighbor Solicitation(NS) 和 Neighbor Advertisement(NA) 消息类型,NDP 还有其它功能:

        • Router Solicitation, Router Advertisement,获取网关
        • 获取网络前缀
        • 获取 MTU
        • Redirect,重定向到其它网关
        • RDNSS,获取递归DNS查询服务器
        • Duplicate address detection(DAD)
      • SEND 可以防范 ARP Spoofing 等攻击,它使用一种类似 Bitcoin proof of work 的方式证明自己拥有一个 IP 地址,每个节点需要生成一对 RSA 密钥对。对 SEND 定义的 Router authorization,需要在主机上部署 CA 证书以验证 Router 的可信。目前各种设备和操作系统对 SEND 支持很差,SEND 的计算量很大,也非常消耗带宽,分发证书不便,因此目前最多在路由器之间使用。

      • SEND 的 CGA 算法的时间消耗 如下,Sec 是算法规定的安全级别,可以看到只有 sec=1 级别有实际意义,因为 NDP 的重复地址探测(DAD)算法要求在 1s 内响应。

      Device specifications Sec=0 Sec=1 Sec=2 Sec=3
      Modern PC(AMD64) N/A 0.2s 3.2 hours 理论上 24 years
      Machine with 2.67-GHz CPU 93.41ms 401.99ms 1.65 hours 理论上 12 years
      Duo2 (2.53-GHz) workstation 100us 60ms 2000s 理论上超过 3w hours
    • RARP -> IND(Inverse Neighbor Discovery)

  • IP 层

    • ICMP -> ICMPv6
    • IGMP -> MLD (Multicast Listener Discovery) + MRD(Multicast Router Discovery)

IPv6 配置方式

与 IPv4 分配单个 IP 不同的是,IPv6 里一般分配的是网段,并且往往是多个网段,比如三个网段,六个地址: global unique address(即公网) 的稳定 IP(/64)、临时 IP(/64)和动态 IP(/64),unique local address(即私网)的临时 IP(/64) 和稳定 IP(/64),以及 link local address 的稳定 IP(/64)。

IPv6 地址的配置方式有两类:

  1. SLAAC(Stateless Address Autoconfiguration)
    • 主机通过 NDP 发送 Router Solicitation,像 radvd、dnsmasq、odhcpd 这样的服务回应 Router Advertisement 消息,告知 link prefixes, MTU, hop limits。
    • 主机使用 prefix(最多 64bit 长) + 64 bit EUI-64 变换的 Mac 地址得到 128bit 的 IPv6 地址。
    • EUI-64 构造方式由于暴露了 Mac 地址,会被用于定位用户,所以 RFC4941 定义了 SLAAC 的隐私扩展方式,引入随机数构造末尾 64bit,这种方式得到的 IP 在 macOS 的 ifconfig 输出中标记为 “autoconf temporary”,macOS 在往外发起请求时,会优先使用这种地址。在 Linux 上,需要使用 sysctl 设置 net.ipv6.conf.all.use_tempaddr=2net.ipv6.conf.default.use_tempaddr=2。NDP 的 DAD 功能用于检查是否与其它主机地址重复。另外三个重要的 sysctl 参数:temp_prefered_lft,preferred lifetime, 默认一天,到期后新连接不再使用这个地址;temp_valid_lft,valid lifetime,默认七天,到期后删除地址;max_addresses,默认 16,一个网卡的临时地址最大数量。
    • RFC7217 中定义另一种方式,使用hash函数对一些固定参数计算 hash,拼接到 prefix 上得到 IPv6 地址,这种地址是稳定的,在 macOS 的 ifconfig 输出中标记为 “autoconf secured”,这种地址可以用于对外提供服务,但很遗憾北京联通宽带在重新拨号后 prefix 会变。
    • NDP 机制早期不支持提供 DNS server 信息,这个特性后来加入了,但有的设备不支持,比如 Windows, Android < 5.0。
  2. DHCPv6
    • 其作用跟 DHCPv4 类似,也支持获取 DNS server 信息,但是有些设备不支持(尤其是 Android)。
    • DHCPv6 分为 stateless 和 stateful 两种,前者指使用 SLAAC 的算法生成 IPv6 地址,只需要 DHCPv6 server 提供路由、前缀、DNS server 信息,后者指跟 DHCPv4 一样,需要 DHCPv6 server 从地址池中选一个 IPv6 地址给主机,由于 stateful DHCPv6 只分配一个 IPv6 地址,不是推荐的 IPv6 地址分配方式,所以 Google Android 拒绝支持 stateful DHCPv6,表示可以支持 DHCPv6-PD,后者可以分配地址段。
    • macOS 下通过 stateful DHCPv6 获取的地址会标记为 “dynamic”。

IETF 官方建议分配给终端用户的地址前缀为 /48,最少 /56,非常不推荐 /64,并且建议分配固定的前缀,但北京联通分配了 /64 前缀,而且重新拨号后前缀会改变。

OpenWrt 对 IPv6 支持非常完善,对于 WAN 它使用 odhcp6c 向 ISP 获取 IPv6 地址以及 prefix(通过 DHCPv6-PD协议,在 OpenWrt 的 Network -> Interface 页面中显示为 IPv6-PD,prefix delegation 指 ISP 将一个网段委托给终端路由继续分配),对于 LAN 它使用支持 Router Advertisement 以及 DHCPv6 的 odhcpd 向主机提供路由地址、地址前缀、DNS 服务地址。

dnsmasq 集成了 DHCP 和 DNS 功能,Windows、macOS、dhcpcd 都在发送 DHCP 请求时发送主机名,所以 dnsmasq 可以自动把主机名注册到 DNS 中,注意 ISC DHCP 客户端的 DHCP 请求不带主机名。

IPv6 实施规范

有一些 RFC 文档讲述支持 IPv6 网络的设备应该满足什么条件:

  • RFC7084 Basic Requirements for IPv6 Customer Edge Routers,OpenWrt 的 IPv6 支持遵从这个规范。
  • RFC8504 IPv6 Node Requirements
  • IPv4aaS Requirements for IPv6 Customer Edge Routers to Support IPv4 Connectivity as-a-Service

参考

  1. https://en.wikipedia.org/wiki/IPv6
  2. https://en.wikipedia.org/wiki/IPv6_address
  3. https://en.wikipedia.org/wiki/IPv6_transition_mechanism
  4. https://www.iana.org/assignments/ipv6-address-space/ipv6-address-space.xhtml
  5. https://en.wikipedia.org/wiki/Comparison_of_IPv6_support_in_operating_systems
  6. https://openwrt.org/docs/guide-user/network/ipv6/start
  7. http://egustafson.github.io/post/ipv6-tunneling/
  8. http://egustafson.github.io/post/ipv6-dhcpv6/
  9. http://www.ipsidixit.net/2012/08/09/ipv6-temporary-addresses-and-privacy-extensions/
  10. https://sites.google.com/site/ipv6center/ipv6-rfcs
  11. https://datatracker.ietf.org/wg/v6ops/documents/
  12. https://datatracker.ietf.org/wg/6man/documents/
  13. https://tools.ietf.org/html/rfc7084
  14. https://tools.ietf.org/html/draft-ietf-v6ops-transition-ipv4aas-15
  15. https://tools.ietf.org/html/rfc8504