IPv6 Addresses

本页介绍 MikroTik RouterOS 中的 IPv6 寻址,涵盖其相较 IPv4 的优势、地址类型与语法、使用零压缩的简化表示、前缀记法,以及用组播取代广播地址的情况。

IPv6 地址

互联网协议第 6 版(IPv6)是互联网协议(IP)的更新版本。最初人们期望它能在足够短的时间内取代 IPv4,但目前看来,在未来可预见的时期内这两个版本将在互联网上共存。尽管如此,随着未分配 IPv4 地址池耗尽的日期临近,IPv6 正变得更加重要。

  • 四个主要优点:

  • 大得多的地址空间;

  • 支持无状态和有状态地址自动配置;

  • 内置安全性;

  • 新的报头格式(更快的转发)。

与 IPv4 的 4 字节地址相比,IPv6 使用 16 字节地址。IPv6 地址语法和类型在 RFC 4291 中有描述。

IPv6 有多种地址类型,可通过其前缀识别。RouterOS 区分以下几类:

  • 组播(前缀 ff00::/8)
  • 链路本地(前缀 fe80::/10)
  • 唯一本地地址(前缀 fc00::/7)
  • 环回(地址 ::1/128)
  • 未指定(地址 ::/128)
  • 其他(所有其他地址,包括已废弃的站点本地地址,以及 RFC 4193 唯一本地地址;它们都被视为全局单播)。

IPv6 与 IPv4 地址的一个区别是,IPv6 会为每个支持 IPv6 的活动接口自动生成一个链路本地 IPv6 地址。

IPv6 地址的表示方式与 IPv4 地址略有不同。对于 IPv6,128 位地址被分为八个 16 位块,每个 16 位块转换为 4 位十六进制数并用冒号分隔。所得表示形式称为冒号十六进制。

在下面的示例中,二进制格式的 IPv6 地址被转换为冒号十六进制表示

0010000000000001 0000010001110000 0001111100001001 0000000100110001
0000000000000000 0000000000000000 0000000000000000 0000000000001001
2001:0470:1f09:0131:0000:0000:0000:0009

通过去除每个块中的前导零,IPv6 地址可以进一步简化:

2001:470:1f09:131:0:0:0:9

如你所见,IPv6 地址可能有很长的连续零序列。这个连续序列可以压缩为 ::

2001:470:1f09:131::9

说明

零压缩只能使用一次。否则,你无法确定每个双冒号实例代表多少个 0 位 IPv6 前缀以地址/前缀长度格式书写。与 IPv4 不同,不能使用网络掩码的十进制表示。前缀示例:

2001:470:1f09:131::/64
2001:db8:1234::/48
2607:f580::/32
2000::/3

IPv6 网络中没有广播地址,广播功能已被组播完全取代。

单播地址

发往单播地址的数据包只被投递到单个接口。该组包括:

  • 全局唯一地址,可用于连接到任何位置的全局作用域地址;
  • 链路本地地址;
  • 唯一本地地址(ULA RFC4193)
  • 站点本地地址(FEC0::/10)—— 已废弃;
  • 特殊用途地址;
  • 兼容地址;

全局单播地址可以通过无状态地址自动配置自动分配给节点。

链路本地地址

每个启用 IPv6 的接口都需要一个链路本地地址,即使没有 IPv6 路由,应用也可能依赖链路本地地址的存在。这就是为什么每个活动接口都会使用其接口标识符(如果存在 MAC 地址,则根据它计算 EUI-64)自动生成链路本地地址。地址前缀始终是 FE80::/64,IPv6 路由器从不把链路本地流量转发到链路之外。

这些地址相当于 IPv4 中的自动配置地址 169.254.0.0/16。

IPv6 Neighbor Discovery 过程也需要链路本地地址。

信息

如果接口被设置为 bridge 端口,则该接口特定的链路本地地址会被移除,只保留 bridge 的链路本地地址

唯一本地地址

唯一本地地址(ULA)保留用于家庭和企业环境中的本地使用,不在公共地址空间中路由,相当于 IPv4 的私有地址范围。

保留地址范围是 fc00::/7

特殊用途地址

地址说明
未指定地址 (::/128)从不分配给接口,也不用作目的地址,仅用于表示地址缺失。相当于 IPv4 的 0.0.0.0 地址。
环回地址 (::1/128)用于标识环回接口,使节点能够向自己发送数据包。相当于 IPv4 的环回地址 127.0.0.1。
2002::/16该前缀用于 6to4 寻址。这里还使用来自 IPv4 网络 192.88.99.0/24 的地址。
2001:db8::/32为文档保留的地址范围。这些地址永远不应作为源或目的出现。
2001:0010::/28Orchid 固定期限实验。不应作为源或目的出现
2001:0002::/48用于基准测试,不应作为源或目的出现
2001:0000::/32Teredo

兼容地址

地址说明
IPv4 兼容地址由在 IPv4 基础设施上通过 IPv6 通信的双栈节点使用。当 IPv4 兼容地址被用作 IPv6 目的地时,IPv6 流量会自动封装在 IPv4 报头中,并通过 IPv4 基础设施发送到目的地。该地址的书写格式为 ::w.x.y.z,其中 w.x.y.z 是公有 IPv4 地址的点分十进制表示。
IPv4 映射地址用于向 IPv6 节点表示纯 IPv4 节点。它仅用于内部表示。IPv4 映射地址从不作为 IPv6 数据包的源或目的地址。IPv6 协议不支持使用 IPv4 映射地址。该地址的书写格式为:::ffff:w.x.y.z,其中 w.x.y.z 是公有 IPv4 地址的点分十进制表示。

组播地址

最重要的组播特性是:

  • 流量被发送到单个地址,但由多个主机处理;
  • 组成员关系是动态的,允许主机随时加入和离开组;
  • 在 IPv6 中,使用 Multicast Listener Discovery (MLD) 消息来确定网段(也称为链路或子网)上的组成员关系;
  • 主机可以向组的地址发送流量,而无需属于相应组。

单个 IPv6 组播地址标识每个组播组。每个组保留的 IPv6 地址由该组所有监听并接收发送到该组地址的任何 IPv6 消息的主机成员共享。

组播地址由以下部分组成:

  • 组播地址中的前 8 位始终是 1111 1111(十六进制为 FF)。
  • flag 使用第 9 到第 12 位,表示该组播地址是否为预定义(well-known)。如果是 well-known,则所有位均为 0。
  • Scope ID 表示组播地址属于哪个作用域,例如 Scope ID=2 是链路本地作用域。
  • group ID 用于指定组播组。有一些预定义的组 ID,例如 Group ID=1 —— 所有节点。因此,如果组播地址是 ff02::1,就意味着 Scope ID=2、Group ID=1,表示链路本地作用域中的所有节点。这类似于 IPv4 中的广播。

以下是保留用于组播的 IPv6 地址表:

地址说明
FF02::1all-nodes 地址,用于到达同一链路上的所有节点。
FF02::2all-routers 地址,用于到达同一链路上的所有路由器。
FF02::5all-Open Shortest Path First (OSPF) router 地址,用于到达同一链路上的所有 OSPF 路由器。
FF02::6all-OSPF-designated router 地址,用于到达同一链路上的所有 OSPF 指定路由器。
FF02::1:FFXX:XXXXsolicited-node 地址,用于地址解析过程,把链路本地节点的 IPv6 地址解析为其链路层地址。solicited-node 地址的最后 24 位(XX:XXXX)是 IPv6 单播地址的最后 24 位。

下表是保留用于 IPv6 组播并已在 Internet Assigned Numbers Authority (IANA) 注册的 IPv6 组播地址的部分列表。完整分配地址列表请阅读 IANA 文档。

组播地址可用于发现网络中的节点。例如,发现所有节点

mrz@bumba:/media/aaa/ver$ ping6 ff02::1%eth0
PING ff02::1%eth0(ff02::1) 56 data bytes
64 bytes from fe80::21a:4dff:fe5d:8e56: icmp_seq=1 ttl=64 time=0.037 ms
64 bytes from fe80::20c:42ff:fe0d:2c38: icmp_seq=1 ttl=64 time=4.03 ms (DUP!)
64 bytes from fe80::20c:42ff:fe28:7945: icmp_seq=1 ttl=64 time=5.59 ms (DUP!)
64 bytes from fe80::20c:42ff:fe49:fce5: icmp_seq=1 ttl=64 time=5.60 ms (DUP!)
64 bytes from fe80::20c:42ff:fe21:f1ec: icmp_seq=1 ttl=64 time=5.88 ms (DUP!)
64 bytes from fe80::20c:42ff:fe72:a1b0: icmp_seq=1 ttl=64 time=6.70 ms (DUP!)

发现所有路由器

mrz@bumba:/media/aaa/ver$ ping6 ff02::2%eth0
PING ff02::2%eth0(ff02::2) 56 data bytes
64 bytes from fe80::20c:42ff:fe28:7945: icmp_seq=1 ttl=64 time=0.672 ms
64 bytes from fe80::20c:42ff:fe0d:2c38: icmp_seq=1 ttl=64 time=1.44 ms (DUP!)

Anycast 地址

Anycast 地址是 IPv6 中引入的一种新地址类型。

Anycasting 是一种新的网络范式,支持面向服务的地址,可以把同一个地址分配给提供特定服务的多个节点。一个 anycast 数据包(目的地址为 anycast 地址的数据包)会被投递到拥有相同 anycast 地址的这些节点之一。

Anycast 地址没有分配特定的地址范围。它从单播地址范围中分配。

接口标识符

IPv6 地址的最后 64 位是接口标识符,在 IPv6 地址的 64 位前缀内唯一。确定接口标识符有几种方式:

  • EUI-64;
  • 随机生成以提供一定程度的匿名性;
  • 手动配置。

EUI-64

网络适配器的传统接口标识符是 48 位 MAC 地址。该地址由 24 位制造商 ID 和 24 位板卡 ID 组成。

IEEE EUI-64 是网络接口地址的新标准。公司 ID 长度仍为 24 位,但扩展 ID 为 40 位,为网络适配器创造了更大的地址空间。

要从接口 MAC 地址创建 EUI-64 地址:

  • 在制造商 ID 和板卡 ID 之间向 MAC 地址插入 0xFFFE。
  • 反转第一个字节的第 7 位。

我们以 MAC 地址 00:0C:42:28:79:45 为例。

上图展示了转换过程。当结果转换为冒号十六进制记法时,我们得到接口标识符 20C:42FF:FE28:7945。因此,对应的链路本地地址是

FE80::20C:42FF:FE28:7945/64

在 RouterOS 中,如果配置了地址的 EUI-64 参数,该地址的最后 64 位会使用接口标识符自动生成和更新。这种情况下最后几位必须配置为零。示例:

[admin@MikroTik] > ipv6 address add address=fc00:3::/64 interface=ether3 eui-64=yes
[admin@MikroTik] > ipv6 address print
Flags: X - disabled, I - invalid, D - dynamic, G - global, L - link-local
#    ADDRESS                                     INTERFACE                  ADVERTISE
...
5  G fc00:3::20c:42ff:fe1d:3d4/64                ether3                     yes
[admin@MikroTik] > interface ethernet set ether3 mac-address=10:00:00:00:00:01
[admin@MikroTik] > ipv6 address print
Flags: X - disabled, I - invalid, D - dynamic, G - global, L - link-local
#    ADDRESS                                     INTERFACE                  ADVERTISE
...
5  G fc00:3::1200:ff:fe00:1/64                   ether3                     yes

配置 IPv6 地址

本示例展示如何在两台路由器之间用全局 IPv6 地址设置简单的寻址。

R1 配置:

/ipv6 address
add address=2001:DB8::1/64 interface=ether1 advertise=no

R2 配置:

/ipv6 address
add address=2001:DB8::2/64 interface=ether1 advertise=no

查看地址列表:

[admin@R1] /ipv6 address> print
Flags: X - disabled, I - invalid, D - dynamic, G - global, L - link-local
#    ADDRESS                                     FROM-POOL INTERFACE     ADVERTISE
0  G 2001:db8::1/64                                        ether1        no
3 DL fe80::219:d1ff:fe39:3535/64                           ether1        no

注意我们添加的地址带有 G 标志,表示该地址可以全局路由。接口上还有一个链路本地地址,它是为每个支持 IPv6 的接口自动创建的。

测试连通性:

[admin@R1] /ipv6 address> /ping 2001:DB8::2
HOST                                     SIZE TTL TIME  STATUS
2001:db8::2                 56  64 12ms  echo reply
2001:db8::2                 56  64 0ms   echo reply
    sent=2 received=2 packet-loss=0% min-rtt=0ms avg-rtt=6ms max-rtt=12ms

SLAAC IPv6 地址

如果在 /ipv6/settings 菜单下启用了 accept-router-advertisements 选项,并且路由器收到 Router Advertisement 数据包,则 SLAAC IPv6 地址会被自动分配给收到该通告的接口。该地址带有 DG 标志,表示该地址是动态且全局的。此类地址会显示 valid 和 lifetime 参数。

[admin@R1] /ipv6/address/print detail where dynamic && global 
Flags: X - disabled, I - invalid, D - dynamic; G - global, L - link-local 
 0 DG address=2001:db8::ba69:f4ff:fe84:545/64 from-pool="" interface=ether1 
      actual-interface=test_fp eui-64=no advertise=no no-dad=no valid=4w2d 
      preferred=1w 

如果接受 SLAAC 地址,还会生成一条指向互联网的动态路由。如果通告数据包中指定了某些限制,它也会包含这些限制。例如 hop-limit 和 MTU。如果在同一接口上收到多个地址,则使用该接口 MTU 值中的最小值。

[admin@R1] /routing/route/print detail where slaac 
Flags: X - disabled, F - filtered, U - unreachable, A - active; 
c - connect, s - static, r - rip, b - bgp, o - ospf, d - dhcp, v - vpn, m - modem, a - ldp-address, l - ldp-mapping, g - slaac, y - bgp-mpls-vpn; 
H - hw-offloaded; + - ecmp, B - blackhole 
 Ag + afi=ip6 contribution=active dst-address=::/0 routing-table=main 
       pref-src="" gateway=fe80::ba69:f4ff:fe84:7b2%ether1
       immediate-gw=fe80::ba69:f4ff:fe84:7b2%ether1 distance=1 scope=30 
       target-scope=10 belongs-to="slaac" mtu=1400 hoplimit=10 
       debug.fwp-ptr=0x201C2C00