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::/28 | Orchid 固定期限实验。不应作为源或目的出现 |
| 2001:0002::/48 | 用于基准测试,不应作为源或目的出现 |
| 2001:0000::/32 | Teredo |
兼容地址
| 地址 | 说明 |
|---|---|
| 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::1 | all-nodes 地址,用于到达同一链路上的所有节点。 |
| FF02::2 | all-routers 地址,用于到达同一链路上的所有路由器。 |
| FF02::5 | all-Open Shortest Path First (OSPF) router 地址,用于到达同一链路上的所有 OSPF 路由器。 |
| FF02::6 | all-OSPF-designated router 地址,用于到达同一链路上的所有 OSPF 指定路由器。 |
| FF02::1:FFXX:XXXX | solicited-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